net/mwan3: add status track ubus interface
[feed/packages.git] / net / mwan3 / files / usr / sbin / mwan3track
1 #!/bin/sh
2
3 . /lib/functions.sh
4
5 LOG="/usr/bin/logger -t $(basename "$0")[$$] -p"
6 INTERFACE=""
7
8 clean_up() {
9 $LOG notice "Stopping mwan3track for interface \"${INTERFACE}\""
10 rm "/var/run/mwan3track-${INTERFACE}.pid" &> /dev/null
11 rm -rf "/var/run/mwan3track/${INTERFACE}" &> /dev/null
12 if [ -z "$(ls -A "/var/run/mwan3track")" ]; then
13 rm -rf "/var/run/mwan3track"
14 fi
15 exit 0
16 }
17
18 main() {
19 local reliability count timeout interval failure_interval
20 local recovery_interval down up size
21
22 [ -z "$3" ] && echo "Error: should not be started manually" && exit 0
23
24 INTERFACE=$1
25 echo "$$" > /var/run/mwan3track-$1.pid
26 mkdir -p /var/run/mwan3track/$1
27 trap clean_up SIGINT SIGTERM
28
29 config_load mwan3
30 config_get reliability $1 reliability 1
31 config_get count $1 count 1
32 config_get timeout $1 timeout 4
33 config_get interval $1 interval 10
34 config_get down $1 down 5
35 config_get up $1 up 5
36 config_get size $1 size 56
37 config_get failure_interval $1 failure_interval $interval
38 config_get recovery_interval $1 recovery_interval $interval
39
40 local score=$(($down+$up))
41 local track_ips=$(echo $* | cut -d ' ' -f 3-99)
42 local host_up_count=0
43 local lost=0
44 local sleep_time=0
45 local turn=0
46
47 echo "offline" > /var/run/mwan3track/$1/STATUS
48 while true; do
49
50 sleep_time=$interval
51
52 for track_ip in $track_ips; do
53 ping -I $2 -c $count -W $timeout -s $size -q $track_ip &> /dev/null
54 if [ $? -eq 0 ]; then
55 let host_up_count++
56 echo "up" > /var/run/mwan3track/$1/TRACK_${track_ip}
57 else
58 let lost++
59 echo "down" > /var/run/mwan3track/$1/TRACK_${track_ip}
60 fi
61 done
62
63 if [ $host_up_count -lt $reliability ]; then
64 let score--
65
66 if [ $score -lt $up ]; then
67 score=0
68 else
69 sleep_time=$failure_interval
70 fi
71
72 if [ $score -eq $up ]; then
73 echo "offline" > /var/run/mwan3track/$1/STATUS
74 $LOG notice "Interface $1 ($2) is offline"
75 env -i ACTION=ifdown INTERFACE=$1 DEVICE=$2 /sbin/hotplug-call iface
76 score=0
77 fi
78 else
79 if [ $score -lt $(($down+$up)) ] && [ $lost -gt 0 ]; then
80 $LOG info "Lost $(($lost*$count)) ping(s) on interface $1 ($2)"
81 fi
82
83 let score++
84 lost=0
85
86 if [ $score -gt $up ]; then
87 echo "online" > /var/run/mwan3track/$1/STATUS
88 score=$(($down+$up))
89 elif [ $score -le $up ]; then
90 sleep_time=$recovery_interval
91 fi
92
93 if [ $score -eq $up ]; then
94 $LOG notice "Interface $1 ($2) is online"
95 env -i ACTION=ifup INTERFACE=$1 DEVICE=$2 /sbin/hotplug-call iface
96 rm /var/run/mwan3track-$1.pid
97 rm -rf "/var/run/mwan3track/${1}" &> /dev/null
98 exit 0
99 fi
100 fi
101
102 let turn++
103 echo "${lost}" > /var/run/mwan3track/$1/LOST
104 echo "${score}" > /var/run/mwan3track/$1/SCORE
105 echo "${turn}" > /var/run/mwan3track/$1/TURN
106
107 host_up_count=0
108 sleep $sleep_time
109 done
110 }
111
112 main "$@"