diff options
Diffstat (limited to 'net.Linux/arping.sh')
-rw-r--r-- | net.Linux/arping.sh | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/net.Linux/arping.sh b/net.Linux/arping.sh new file mode 100644 index 00000000..763cb4ce --- /dev/null +++ b/net.Linux/arping.sh @@ -0,0 +1,111 @@ +# Copyright 2004-2007 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 + +arping_depend() { + program /sbin/arping + before interface +} + +arping_address() { + local ip=${1%%/*} mac="$2" foundmac= i= w= opts= + + # We only handle IPv4 addresses + case "${ip}" in + 0.0.0.0|0) return 1 ;; + *.*.*.*) ;; + *) return 1 ;; + esac + + # We need to bring the interface up to test + _exists "${iface}" || return 1 + _up "${iface}" + + eval w=\$arping_wait_${IFVAR} + [ -z "${w}" ] && w=${arping_wait:-5} + + [ -z "$(_get_inet_address)" ] && opts="${opts} -D" + + foundmac="$(arping -w "${w}" ${opts} -f -I "${IFACE}" "${ip}" 2>/dev/null | \ + sed -n -e 'y/abcdef/ABCDEF/' -e 's/.*\[\([^]]*\)\].*/\1/p')" + [ -z "${foundmac}" ] && return 1 + + if [ -n "${mac}" ] ; then + if [ "${mac}" != "${foundmac}" ] ; then + vewarn "Found ${ip} but MAC ${foundmac} does not match" + return 1 + fi + fi + + return 0 +} + +arping_start() { + local gateways= x= conf= i= + einfo "Pinging gateways on ${IFACE} for configuration" + + eval $(_get_array "gateways_${IFVAR}") + if [ -z "$@" ] ; then + eerror "No gateways have been defined (gateways_${IFVAR}=\"...\")" + return 1 + fi + + eindent + + for x in "$@"; do + eval set -- "${x}" + local ip=$1 mac=$2 extra= + + if [ -n "${mac}" ] ; then + mac="$(echo "${mac}" | tr '[:lower:]' '[:upper:]')" + extra="(MAC ${mac})" + fi + + vebegin "${ip} ${extra}" + if arping_address "${ip}" "${mac}" ; then + local OIFS=$IFS SIFS=${IFS-y} + IFS=. + for i in ${ip} ; do + if [ "${#i}" = "2" ] ; then + conf="${conf}0${i}" + elif [ "${#i}" = "1" ] ; then + conf="${conf}00${i}" + else + conf="${conf}${i}" + fi + done + if [ "${SIFS}" = "y" ] ; then + IFS=$OFIS + else + unset IFS + fi + [ -n "${mac}" ] && conf="${conf}_$(echo "${mac}" | sed -e 's/://g')" + + veend 0 + eoutdent + veinfo "Configuring ${IFACE} for ${ip} ${extra}" + _configure_variables "${conf}" + + # Call the system module as we've aleady passed it by .... + # And it *has* to be pre_start for other things to work correctly + system_pre_start + + # Ensure that we have a valid config - ie arping is no longer there + eval $(_get_array "config_${IFVAR}") + for i in "$@" ; do + if [ "${i}" = "arping" ] ; then + veend 1 "No config found for ${ip} (config_${conf}=\"...\")" + continue 2 + fi + done + + _load_config + return 0 + fi + veend 1 + done + + eoutdent + return 1 +} + +# vim: set ts=4 : |