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