diff options
Diffstat (limited to 'net.Linux/arping.sh')
| -rw-r--r-- | net.Linux/arping.sh | 57 | 
1 files changed, 33 insertions, 24 deletions
| diff --git a/net.Linux/arping.sh b/net.Linux/arping.sh index 68d04216..4bfb151c 100644 --- a/net.Linux/arping.sh +++ b/net.Linux/arping.sh @@ -2,12 +2,12 @@  # Distributed under the terms of the GNU General Public License v2  arping_depend() { -	program /sbin/arping +	program /sbin/arping /usr/sbin/arping2  	before interface  }  arping_address() { -	local ip=${1%%/*} mac="$2" foundmac= i= w= opts= +	local ip=${1%%/*} mac="$2" spoof="$3" foundmac= i= w= opts=  	# We only handle IPv4 addresses  	case "${ip}" in @@ -23,10 +23,20 @@ arping_address() {  	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')" +	if type arping2 >/dev/null 2>&1; then +		[ -z "$(_get_inet_address)" ] && opts="${opts} -0" +		[ -n "${spoof}" ] && opts="${opts} -S ${spoof}" +		while [ ${w} -gt 0 -a -z "${foundmac}" ]; do +			foundmac="$(arping2 ${opts} -r -c 1 -0 -i "${IFACE}" "${ip}" 2>/dev/null | \ +			sed -e 'y/abcdef/ABCDEF/')" +			w=$((${w} - 1)) +		done +	else +		[ -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')" +	fi  	[ -z "${foundmac}" ] && return 1  	if [ -n "${mac}" ] ; then @@ -41,7 +51,7 @@ arping_address() {  _arping_in_config() {  	_get_array "config_${IFVAR}" | while read i; do -		[ "${i}" = "arping" ] && return 0 +		[ "${i}" = "arping" ] && return 1  	done  	return 1  } @@ -51,7 +61,7 @@ arping_start() {  	einfo "Pinging gateways on ${IFACE} for configuration"  	eval gateways=\$gateways_${IFVAR} -	if [ -n "${gateways}" ] ; then +	if [ -z "${gateways}" ] ; then  		eerror "No gateways have been defined (gateways_${IFVAR}=\"...\")"  		return 1  	fi @@ -61,7 +71,7 @@ arping_start() {  	for x in ${gateways}; do  		local IFS=,  		set -- ${x} -		local ip=$1 mac=$2 extra= +		local ip=$1 mac=$2 spoof=$3 extra=  		unset IFS  		if [ -n "${mac}" ] ; then @@ -70,9 +80,8 @@ arping_start() {  		fi  		vebegin "${ip} ${extra}" -		if arping_address "${ip}" "${mac}" ; then -			local OIFS=$IFS SIFS=${IFS-y} -			IFS=. +		if arping_address "${ip}" "${mac}" "${spoof}" ; then +			local IFS=.  			for i in ${ip} ; do  				if [ "${#i}" = "2" ] ; then  					conf="${conf}0${i}" @@ -82,28 +91,28 @@ arping_start() {  					conf="${conf}${i}"  				fi  			done -			if [ "${SIFS}" = "y" ] ; then -				IFS=$OFIS -			else -				unset IFS -			fi +			unset IFS  			[ -n "${mac}" ] && conf="${conf}_$(echo "${mac}" | sed -e 's/://g')" -			veend 0 +			eend 0  			eoutdent  			veinfo "Configuring ${IFACE} for ${ip} ${extra}" -			_configure_variables "${conf}" +			_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 -			if _arping_in_config; then -				veend 1 "No config found for ${ip} (config_${conf}=\"...\")" -				continue 2 -			fi - +			local IFS="$__IFS" +			for i in $(_get_array "config_${IFVAR}"); do +				if [ "${i}" = "arping" ]; then +					eend 1 "No config found for ${ip} (config_${conf}=\"...\")" +					continue 2 +				fi +			done +			unset IFS +			  			_load_config  			return 0  		fi | 
