mwan3: support various interface tracking methods
[feed/packages.git] / net / mwan3 / files / usr / sbin / mwan3track
1 #!/bin/sh
2
3 . /lib/functions.sh
4
5 LOG="logger -t $(basename "$0")[$$] -p"
6 INTERFACE=""
7 DEVICE=""
8
9 IFDOWN_EVENT=0
10
11 clean_up() {
12 $LOG notice "Stopping mwan3track for interface \"${INTERFACE}\""
13 if [ "$(pgrep -f "mwan3track ${INTERFACE}")" = "" ]; then
14 rm -rf "/var/run/mwan3track/${INTERFACE}" &> /dev/null
15 fi
16 if [ -z "$(ls -A "/var/run/mwan3track")" ]; then
17 rm -rf "/var/run/mwan3track"
18 fi
19 exit 0
20 }
21
22 if_down() {
23 $LOG info "Detect ifdown event on interface ${INTERFACE} (${DEVICE})"
24 IFDOWN_EVENT=1
25 }
26
27 validate_track_method() {
28 case "$1" in
29 ping)
30 # Assume that ping is installed
31 ;;
32 arping)
33 which arping 1>/dev/null 2>&1 || {
34 $LOG warn "Missing arping. Please install iputils-arping package."
35 return 1
36 }
37 ;;
38 httping)
39 which httping 1>/dev/null 2>&1 || {
40 $LOG warn "Missing httping. Please install httping package."
41 return 1
42 }
43 ;;
44 *)
45 $LOG warn "Unsupported tracking method: $track_method"
46 return 2
47 ;;
48 esac
49 }
50
51 main() {
52 local reliability count timeout interval failure_interval
53 local recovery_interval down up size
54
55 [ -z "$3" ] && echo "Error: should not be started manually" && exit 0
56
57 INTERFACE=$1
58 DEVICE=$2
59 mkdir -p /var/run/mwan3track/$1
60 trap clean_up SIGINT SIGTERM
61 trap if_down SIGUSR1
62
63 config_load mwan3
64 config_get track_method $1 track_method ping
65 validate_track_method $track_method || {
66 $LOG warn "Using ping to track interface $INTERFACE avaliability"
67 track_method=ping
68 }
69 config_get reliability $1 reliability 1
70 config_get count $1 count 1
71 config_get timeout $1 timeout 4
72 config_get interval $1 interval 10
73 config_get down $1 down 5
74 config_get up $1 up 5
75 config_get size $1 size 56
76 config_get failure_interval $1 failure_interval $interval
77 config_get recovery_interval $1 recovery_interval $interval
78
79 local score=$(($down+$up))
80 local track_ips=$(echo $* | cut -d ' ' -f 4-99)
81 local host_up_count=0
82 local lost=0
83 local sleep_time=0
84 local turn=0
85
86 echo "offline" > /var/run/mwan3track/$1/STATUS
87 while true; do
88
89 sleep_time=$interval
90
91 for track_ip in $track_ips; do
92 case "$track_method" in
93 ping)
94 ping -I $2 -c $count -W $timeout -s $size -q $track_ip &> /dev/null ;;
95 arping)
96 arping -I $2 -c $count -w $timeout -q $track_ip &> /dev/null ;;
97 httping)
98 httping -y $3 -c $count -t $timeout -q $track_ip &> /dev/null ;;
99 esac
100 if [ $? -eq 0 ]; then
101 let host_up_count++
102 echo "up" > /var/run/mwan3track/$1/TRACK_${track_ip}
103 else
104 let lost++
105 echo "down" > /var/run/mwan3track/$1/TRACK_${track_ip}
106 fi
107 done
108
109 if [ $host_up_count -lt $reliability ]; then
110 let score--
111
112 if [ $score -lt $up ]; then
113 score=0
114 else
115 sleep_time=$failure_interval
116 fi
117
118 if [ $score -eq $up ]; then
119 echo "offline" > /var/run/mwan3track/$1/STATUS
120 $LOG notice "Interface $1 ($2) is offline"
121 env -i ACTION=ifdown INTERFACE=$1 DEVICE=$2 /sbin/hotplug-call iface
122 score=0
123 fi
124 else
125 if [ $score -lt $(($down+$up)) ] && [ $lost -gt 0 ]; then
126 $LOG info "Lost $(($lost*$count)) ping(s) on interface $1 ($2)"
127 fi
128
129 let score++
130 lost=0
131
132 if [ $score -gt $up ]; then
133 echo "online" > /var/run/mwan3track/$1/STATUS
134 score=$(($down+$up))
135 elif [ $score -le $up ]; then
136 sleep_time=$recovery_interval
137 fi
138
139 if [ $score -eq $up ]; then
140 $LOG notice "Interface $1 ($2) is online"
141 env -i ACTION=ifup INTERFACE=$1 DEVICE=$2 /sbin/hotplug-call iface
142 rm -rf "/var/run/mwan3track/${1}" &> /dev/null
143 exit 0
144 fi
145 fi
146
147 let turn++
148 mkdir -p "/var/run/mwan3track/${1}"
149 echo "${lost}" > /var/run/mwan3track/$1/LOST
150 echo "${score}" > /var/run/mwan3track/$1/SCORE
151 echo "${turn}" > /var/run/mwan3track/$1/TURN
152
153 host_up_count=0
154 sleep "${sleep_time}" &
155 wait
156
157 if [ "${IFDOWN_EVENT}" -eq 1 ]; then
158 score=0
159 echo "offline" > /var/run/mwan3track/$1/STATUS
160 IFDOWN_EVENT=0
161 fi
162 done
163 }
164
165 main "$@"