You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

80 lines
1.5 KiB

#!/bin/sh
LOG="/usr/bin/logger -t $(basename "$0")[$$] -p"
INTERFACE=""
clean_up() {
$LOG notice "Stopping mwan3track for interface \"${INTERFACE}\""
rm "/var/run/mwan3track-${INTERFACE}.pid" &> /dev/null
exit 0
}
main() {
[ -z "$12" ] && echo "Error: should not be started manually" && exit 0
INTERFACE=$1
echo "$$" > /var/run/mwan3track-$1.pid
trap clean_up SIGINT SIGTERM
local score=$(($7+$8))
local track_ips=$(echo $* | cut -d ' ' -f 12-99)
local host_up_count=0
local lost=0
local sleep_time=0
while true; do
sleep_time=$6
for track_ip in $track_ips; do
ping -I $2 -c $4 -W $5 -s $9 -q $track_ip &> /dev/null
if [ $? -eq 0 ]; then
let host_up_count++
else
let lost++
fi
done
if [ $host_up_count -lt $3 ]; then
let score--
if [ $score -lt $8 ]; then
score=0
else
sleep_time=$10
fi
if [ $score -eq $8 ]; then
$LOG notice "Interface $1 ($2) is offline"
env -i ACTION=ifdown INTERFACE=$1 DEVICE=$2 /sbin/hotplug-call iface
score=0
fi
else
if [ $score -lt $(($7+$8)) ] && [ $lost -gt 0 ]; then
$LOG info "Lost $(($lost*$4)) ping(s) on interface $1 ($2)"
fi
let score++
lost=0
if [ $score -gt $8 ]; then
score=$(($7+$8))
elif [ $score -le $8 ]; then
sleep_time=$11
fi
if [ $score -eq $8 ]; then
$LOG notice "Interface $1 ($2) is online"
env -i ACTION=ifup INTERFACE=$1 DEVICE=$2 /sbin/hotplug-call iface
rm /var/run/mwan3track-$1.pid
exit 0
fi
fi
host_up_count=0
sleep $sleep_time
done
}
main "$@"