- #!/bin/sh
- SYSFS_NETCONSOLE="/sys/kernel/config/netconsole"
- NETCONSOLE_CONF="/etc/default/netconsole.conf"
- NETCONSOLE_PORT="514"
-
- netconsole_remove() {
- for sysfsnc in "${SYSFS_NETCONSOLE}/${interface:-}-"*
- do
- if [ -e "${sysfsnc}" ]
- then
- logger -t netconsole "remove ${sysfsnc}"
- rmdir "${sysfsnc}"
- fi
- done
- }
-
- netconsole_remote_mac()
- {
- neigh()
- {
- ip -4 -o neigh show to "${remote_ip}" dev "${interface}" | cut -d\ -f3
- }
- remote_mac="$(neigh)"
- if [ -n "${remote_mac:-}" ] && [ "${remote_mac:-}" != "INCOMPLETE" ]
- then
- if [ "${remote_mac:-}" != "FAILED" ]
- then
- echo "${remote_mac:-}"
- return 0
- fi
- else
- if ping -n -q -c 1 -w 1 -I "${interface}" "${remote_ip}" >/dev/null && remote_mac="$(neigh)" && [ -n "${remote_mac:-}" ]
- then
- echo "${remote_mac:-}"
- return 0
- fi
- fi
- return 1
- }
-
- netconsole_add() {
- netconsole() {
- iface="${1:-}"
- remote_ip="${2:-}"
- remote_mac="${3:-}"
-
- if [ "${iface:-}" = "${interface:-}" ] && [ -n "${remote_ip:-}" ]
- then
- logger -t netconsole "from ${new_ip_address:-}@${interface:-}"
- else
- return 1
- fi
- if [ -n "${remote_mac}" ] || remote_mac="$(netconsole_remote_mac)"
- then
- logger -t netconsole "to ${remote_ip} ${remote_mac}"
- else
- return 1
- fi
-
- sysfsnc="${SYSFS_NETCONSOLE}/${interface}-${remote_ip}"
-
- if [ -e "${sysfsnc}" ] && [ -z "${old_ip_address:-}" ]
- then
- old_ip_address="$(cat "${sysfsnc}/local_ip")"
- fi
-
- if [ "${old_ip_address:-}" != "${new_ip_address:-}" ] || ! [ -e "${sysfsnc}" ]
- then
- logger -t netconsole "setup netconsole"
- else
- return 1
- fi
-
- mkdir -p "${sysfsnc}"
- if [ "$(cat "${sysfsnc}/enabled")" != "0" ]
- then
- echo "0" > "${sysfsnc}/enabled"
- fi
-
- if [ -n "${new_ip_address:-}" ]
- then
- echo "${new_ip_address}" > "${sysfsnc}/local_ip"
- fi
- echo "${interface}" > "${sysfsnc}/dev_name"
- echo "${remote_mac}" > "${sysfsnc}/remote_mac"
- echo "${remote_ip}" > "${sysfsnc}/remote_ip"
- echo "${PORT:-${NETCONSOLE_PORT}}" > "${sysfsnc}/remote_port"
- echo "1" > "${sysfsnc}/enabled"
- return 0
- }
-
- if [ -f "${NETCONSOLE_CONF}" ]
- then
- modprobe netconsole
- mountpoint -q /sys/kernel/config || mount none -t configfs /sys/kernel/config
-
- if [ -e "${SYSFS_NETCONSOLE}" ]
- then
- (
- set -x
- set +e
- . "${NETCONSOLE_CONF}"
- ) ||:
- fi
- fi
- }
-
- netconsole_setup() {
- case ${reason:-} in
- BOUND|RENEW|REBIND|REBOOT)
- netconsole_add
- ;;
- EXPIRE|FAIL|RELEASE|STOP)
- netconsole_remove
- ;;
- PREINIT) : ;;
- *)
- if [ "${ADDRFAM:-}" = "inet" ] && [ "${METHOD:-}" = "static" ]
- then
- export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
- interface="${IFACE:-}"
- new_ip_address="${IF_ADDRESS:-}"
- case ${MODE:-} in
- start)
- netconsole_add
- ;;
- stop)
- netconsole_remove
- ;;
- *) : ;;
- esac
- fi
- esac
- }
-
- netconsole_setup
|