diff options
Diffstat (limited to 'rc.d/init.d')
-rw-r--r-- | rc.d/init.d/netconsole | 147 |
1 files changed, 147 insertions, 0 deletions
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 <adilger@turbolinux.com> 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 |