#!/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