From 35d46693cae16387feb6befc0094ceee10e69433 Mon Sep 17 00:00:00 2001 From: Bill Nottingham Date: Mon, 16 Apr 2007 21:56:54 +0000 Subject: add netconsole init script (#223742) --- initscripts.spec | 2 + rc.d/init.d/netconsole | 147 +++++++++++++++++++++++++++++++++++++++++++++++++ sysconfig/netconsole | 20 +++++++ 3 files changed, 169 insertions(+) create mode 100644 rc.d/init.d/netconsole create mode 100644 sysconfig/netconsole diff --git a/initscripts.spec b/initscripts.spec index 42cbebbd..e87b81a0 100644 --- a/initscripts.spec +++ b/initscripts.spec @@ -68,11 +68,13 @@ chmod 600 /var/log/btmp /sbin/chkconfig --add netfs /sbin/chkconfig --add network +/sbin/chkconfig --add netconsole %preun if [ $1 = 0 ]; then /sbin/chkconfig --del netfs /sbin/chkconfig --del network + /sbin/chkconfig --del netconsole fi %triggerun -- initscripts < 7.62 diff --git a/rc.d/init.d/netconsole b/rc.d/init.d/netconsole new file mode 100644 index 00000000..ba99e2cb --- /dev/null +++ b/rc.d/init.d/netconsole @@ -0,0 +1,147 @@ +#!/bin/bash +# +# netconsole This loads the netconsole module with the configured parameters. +# +# chkconfig: - 50 50 +# description: Initializes network console logging +# config: /etc/sysconfig/netconsole +# +# Copyright 2002 Red Hat, Inc. +# +# Based in part on a shell script by +# Andreas Dilger Sep 26, 2001 + +PATH=/sbin:/usr/sbin:$PATH +RETVAL=0 +SERVER_ADDRESS_RESOLUTION= + +# Check that networking is up. +. /etc/sysconfig/network +if [ ${NETWORKING} = "no" ] +then + exit 0 +fi + +# Source function library. +. /etc/rc.d/init.d/functions + +# Default values +LOCALPORT=6666 +DEV= + +SYSLOGADDR= +SYSLOGPORT=514 +SYSLOGMACADDR= + +kernel=`uname -r | cut -d. -f1-2` + +[ -f /etc/sysconfig/netconsole ] || exit 0 +. /etc/sysconfig/netconsole + +[ -z "$SYSLOGADDR" ] && exit 0 + +usage () +{ + echo $"Usage: $0 {start|stop|status|restart|condrestart}" 1>&2 + RETVAL=1 +} + +print_address_info () +{ + local host=$1 + local route via target + + route=$(LANG=C ip -o route get to $host/32) + + [ -z "$DEV" ] && DEV=$(echo $route | sed "s|.* dev \([^ ]*\).*|\1|") + echo "DEV=$DEV" + echo "LOCALADDR=$(echo $route | sed "s|.* src \([^ ]*\).*|\1|")" + if echo $route | grep -q " via " ; then + via=$(echo $route | sed "s|.* via \([^ ]*\).*|\1|") + target=$via + else + target=$host + fi + if [ -z "$SYSLOGMACADDR" ]; then + arp=$(LANG=C arping -c 1 -I $DEV $target 2>/dev/null | awk '/ reply from .*[.*]/ { print gensub(".* reply from .* \\[(.*)\\].*","\\1","G") }') + [ -n "$arp" ] && echo "SYSLOGMACADDR=$arp" + fi +} + +netconsole_failure () +{ + echo -n "$1" + failure + echo + exit 1 +} + +start () +{ + SYSLOGOPTS= + # syslogd server, if any + if ! [[ "$SYSLOGADDR" =~ "^([0-9]{1,3}\.){3}[0-9]{1,3}$" ]]; then + SYSLOGADDR=$(LANG=C host $SYSLOGADDR 2>/dev/null | awk '/has address / { print $NF }') + fi + if [ -z "$SYSLOGADDR" ] ; then + echo $"Server address not specified in /etc/sysconfig/netconsole" 1>&2 + exit 1 + fi + eval $(print_address_info $SYSLOGADDR) + + if [ -z "$SYSLOGMACADDR" ]; then + echo $"netconsole: can't resolve MAC address of $SYSLOGADDR" 1>&2 + netconsole_failure "syslog server address resolution" + fi + + SYSLOGOPTS="netconsole=$LOCALPORT@$LOCALADDR/$DEV,$SYSLOGPORT@$SYSLOGADDR/$SYSLOGMACADDR " + + logger -p daemon.info -t netconsole: inserting netconsole module with arguments \ + $SYSLOGOPTS + if [ -n "$SYSLOGOPTS" ]; then + action $"Initializing netconsole" modprobe netconsole \ + $SYSLOGOPTS + fi + touch /var/lock/subsys/netconsole +} + +stop () +{ + if /sbin/lsmod | grep netconsole >/dev/null 2>&1 ; then + action $"Disabling netconsole" rmmod netconsole; + fi + + rm -f /var/lock/subsys/netconsole +} + +status () +{ + if /sbin/lsmod | grep netconsole >/dev/null 2>&1 ; then + echo $"netconsole module loaded" + else + echo $"netconsole module not loaded" + fi +} + + +restart () +{ + stop + start +} + +condrestart () +{ + [ -e /var/lock/subsys/netconsole ] && restart +} + + +case "$1" in + stop) stop ;; + status) status ;; + start|restart|reload) restart ;; + condrestart) condrestart ;; + *) usage ;; +esac + +exit $RETVAL diff --git a/sysconfig/netconsole b/sysconfig/netconsole new file mode 100644 index 00000000..7b9d96e5 --- /dev/null +++ b/sysconfig/netconsole @@ -0,0 +1,20 @@ +# This is the configuration file for the netconsole service. By starting +# this service you allow a remote syslog daemon to record console output +# from this system. + +# The local port number that the netconsole module will use +# LOCALPORT=6666 + +# The ethernet device to send console messages out of (only set this if it +# can't be automatically determined) +# DEV= + +# The IP address of the remote syslog server to send messages to +# SYSLOGADDR= + +# The listening port of the remote syslog daemon +# SYSLOGPORT=514 + +# The MAC address of the remote syslog server (only set this if it can't +# be automatically determined) +# SYSLOGMACADDR= -- cgit v1.2.1