6 LOG
="logger -t $(basename "$0")[$$] -p"
13 $LOG notice
"Stopping mwan3track for interface \"${INTERFACE}\""
18 $LOG info
"Detect ifdown event on interface ${INTERFACE} (${DEVICE})"
22 validate_track_method
() {
25 which ping 1>/dev
/null
2>&1 ||
{
26 $LOG warn
"Missing ping. Please install iputils-ping package or enable ping util and recompile busybox."
31 which arping
1>/dev
/null
2>&1 ||
{
32 $LOG warn
"Missing arping. Please install iputils-arping package."
37 which httping
1>/dev
/null
2>&1 ||
{
38 $LOG warn
"Missing httping. Please install httping package."
41 [ -n "$2" -a "$2" != "0.0.0.0" -a "$2" != "::" ] ||
{
42 $LOG warn
"Cannot determine source IP for the interface which is required by httping."
47 which nping
1>/dev
/null
2>&1 ||
{
48 $LOG warn
"Missing nping. Please install nping package."
53 $LOG warn
"Unsupported tracking method: $track_method"
60 local reliability count timeout interval failure_interval
61 local recovery_interval down up size
62 local keep_failure_interval check_quality failure_latency
63 local recovery_latency failure_loss recovery_loss
64 local max_ttl httping_ssl
66 [ -z "$5" ] && echo "Error: should not be started manually" && exit 0
72 mkdir
-p /var
/run
/mwan3track
/$1
77 config_get track_method
$1 track_method
ping
78 config_get_bool httping_ssl
$1 httping_ssl
0
79 validate_track_method
$track_method $SRC_IP ||
{
81 if validate_track_method
$track_method; then
82 $LOG warn
"Using ping to track interface $INTERFACE avaliability"
84 $LOG err
"No track method avaliable"
88 config_get reliability
$1 reliability
1
89 config_get count
$1 count
1
90 config_get timeout
$1 timeout
4
91 config_get interval
$1 interval
10
92 config_get down
$1 down
5
94 config_get size
$1 size
56
95 config_get max_ttl
$1 max_ttl
60
96 config_get failure_interval
$1 failure_interval
$interval
97 config_get_bool keep_failure_interval
$1 keep_failure_interval
0
98 config_get recovery_interval
$1 recovery_interval
$interval
99 config_get_bool check_quality
$1 check_quality
0
100 config_get failure_latency
$1 failure_latency
1000
101 config_get recovery_latency
$1 recovery_latency
500
102 config_get failure_loss
$1 failure_loss
40
103 config_get recovery_loss
$1 recovery_loss
10
105 local score
=$
(($down+$up))
106 local track_ips
=$
(echo $
* | cut
-d ' ' -f 5-99)
107 local host_up_count
=0
116 if [ "$STATUS" = "offline" ]; then
117 echo "offline" > /var
/run
/mwan3track
/$1/STATUS
118 echo "0" > /var
/run
/mwan3track
/$1/ONLINE
119 echo "$(get_uptime)" > /var
/run
/mwan3track
/$1/OFFLINE
122 echo "online" > /var
/run
/mwan3track
/$1/STATUS
123 echo "0" > /var
/run
/mwan3track
/$1/OFFLINE
124 echo "$(get_uptime)" > /var
/run
/mwan3track
/$1/ONLINE
125 env
-i ACTION
="connected" INTERFACE
="$1" DEVICE
="$2" /sbin
/hotplug-call iface
131 for track_ip
in $track_ips; do
132 if [ $host_up_count -lt $reliability ]; then
133 case "$track_method" in
135 if [ $check_quality -eq 0 ]; then
136 ping -I $DEVICE -c $count -W $timeout -s $size -t $max_ttl -q $track_ip &> /dev
/null
139 ping_result
="$(ping -I $DEVICE -c $count -W $timeout -s $size -t $max_ttl -q $track_ip | tail -2)"
140 loss
="$(echo "$ping_result" | grep "packet loss
" | cut -d "," -f3 | awk '{print $1}' | sed -e 's/%//')"
141 if [ "$loss" -eq 100 ]; then
144 latency
="$(echo "$ping_result" | grep -E 'rtt|round-trip' | cut -d "=" -f2 | cut -d "/" -f2 | cut -d ".
" -f1)"
149 arping
-I $DEVICE -c $count -w $timeout -q $track_ip &> /dev
/null
153 if [ "$httping_ssl" -eq 1 ]; then
154 httping
-y $SRC_IP -c $count -t $timeout -q "https://$track_ip" &> /dev
/null
156 httping
-y $SRC_IP -c $count -t $timeout -q "http://$track_ip" &> /dev
/null
161 result
=$
(nping
-e $DEVICE -c $count $track_ip --tcp |
grep Lost |
awk '{print $12}')
164 result
=$
(nping
-e $DEVICE -c $count $track_ip --udp |
grep Lost |
awk '{print $12}')
167 result
=$
(nping
-e $DEVICE -c $count $track_ip --icmp |
grep Lost |
awk '{print $12}')
170 result
=$
(nping
-e $DEVICE -c $count $track_ip --arp |
grep Lost |
awk '{print $12}')
173 if [ $check_quality -eq 0 ]; then
174 if [ $result -eq 0 ]; then
176 echo "up" > /var
/run
/mwan3track
/$1/TRACK_
${track_ip}
177 if [ $score -le $up ]; then
178 $LOG info
"Check ($track_method) success for target \"$track_ip\" on interface $1 ($2)"
182 echo "down" > /var
/run
/mwan3track
/$1/TRACK_
${track_ip}
183 if [ $score -gt $up ]; then
184 $LOG info
"Check ($track_method) failed for target \"$track_ip\" on interface $1 ($2)"
188 if [ "$loss" -ge "$failure_loss" -o "$latency" -ge "$failure_latency" ]; then
190 echo "down" > /var
/run
/mwan3track
/$1/TRACK_
${track_ip}
191 echo "$latency" > /var
/run
/mwan3track
/$1/LATENCY_
${track_ip}
192 echo "$loss" > /var
/run
/mwan3track
/$1/LOSS_
${track_ip}
194 if [ $score -gt $up ]; then
195 $LOG info
"Check (${track_method}: latency=${latency}ms loss=${loss}%) failed for target \"$track_ip\" on interface $1 ($2)"
197 elif [ "$loss" -le "$recovery_loss" -a "$latency" -le "$recovery_latency" ]; then
199 echo "up" > /var
/run
/mwan3track
/$1/TRACK_
${track_ip}
200 echo "$latency" > /var
/run
/mwan3track
/$1/LATENCY_
${track_ip}
201 echo "$loss" > /var
/run
/mwan3track
/$1/LOSS_
${track_ip}
203 if [ $score -le $up ]; then
204 $LOG info
"Check (${track_method}: latency=${latency}ms loss=${loss}%) success for target \"$track_ip\" on interface $1 ($2)"
207 echo "skipped" > /var
/run
/mwan3track
/$1/TRACK_
${track_ip}
211 echo "skipped" > /var
/run
/mwan3track
/$1/TRACK_
${track_ip}
215 if [ $host_up_count -lt $reliability ]; then
218 if [ $score -lt $up ]; then
220 [ ${keep_failure_interval} -eq 1 ] && {
221 sleep_time
=$failure_interval
224 sleep_time
=$failure_interval
227 if [ $score -eq $up ]; then
228 echo "offline" > /var
/run
/mwan3track
/$1/STATUS
229 env
-i ACTION
=ifdown INTERFACE
=$1 DEVICE
=$2 /sbin
/hotplug-call iface
233 if [ $score -lt $
(($down+$up)) ] && [ $lost -gt 0 ]; then
234 $LOG info
"Lost $(($lost*$count)) ping(s) on interface $1 ($2)"
240 if [ $score -gt $up ]; then
241 echo "online" > /var
/run
/mwan3track
/$1/STATUS
243 elif [ $score -le $up ]; then
244 sleep_time
=$recovery_interval
247 if [ $score -eq $up ]; then
248 $LOG notice
"Interface $1 ($2) is online"
249 echo "online" > /var
/run
/mwan3track
/$1/STATUS
250 env
-i ACTION
=ifup INTERFACE
=$1 DEVICE
=$2 /sbin
/hotplug-call iface
256 mkdir
-p "/var/run/mwan3track/${1}"
257 echo "${lost}" > /var
/run
/mwan3track
/$1/LOST
258 echo "${score}" > /var
/run
/mwan3track
/$1/SCORE
259 echo "${turn}" > /var
/run
/mwan3track
/$1/TURN
260 echo "$(get_uptime)" > /var
/run
/mwan3track
/$1/TIME
263 sleep "${sleep_time}" &
266 if [ "${IFDOWN_EVENT}" -eq 1 ]; then
267 echo "offline" > /var
/run
/mwan3track
/$1/STATUS
268 echo "$(get_uptime)" > /var
/run
/mwan3track
/$1/OFFLINE
269 echo "0" > /var
/run
/mwan3track
/$1/ONLINE
270 $LOG notice
"Interface $1 ($2) is offline"
271 env
-i ACTION
="disconnected" INTERFACE
="$1" DEVICE
="$2" /sbin
/hotplug-call iface