noddos: Noddos v0.5.0 with mDNS / DNS-SD support
[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 main() {
28 local reliability count timeout interval failure_interval
29 local recovery_interval down up size
30
31 [ -z "$3" ] && echo "Error: should not be started manually" && exit 0
32
33 INTERFACE=$1
34 DEVICE=$2
35 mkdir -p /var/run/mwan3track/$1
36 trap clean_up SIGINT SIGTERM
37 trap if_down SIGUSR1
38
39 config_load mwan3
40 config_get reliability $1 reliability 1
41 config_get count $1 count 1
42 config_get timeout $1 timeout 4
43 config_get interval $1 interval 10
44 config_get down $1 down 5
45 config_get up $1 up 5
46 config_get size $1 size 56
47 config_get failure_interval $1 failure_interval $interval
48 config_get recovery_interval $1 recovery_interval $interval
49
50 local score=$(($down+$up))
51 local track_ips=$(echo $* | cut -d ' ' -f 3-99)
52 local host_up_count=0
53 local lost=0
54 local sleep_time=0
55 local turn=0
56
57 echo "offline" > /var/run/mwan3track/$1/STATUS
58 while true; do
59
60 sleep_time=$interval
61
62 for track_ip in $track_ips; do
63 ping -I $2 -c $count -W $timeout -s $size -q $track_ip &> /dev/null
64 if [ $? -eq 0 ]; then
65 let host_up_count++
66 echo "up" > /var/run/mwan3track/$1/TRACK_${track_ip}
67 else
68 let lost++
69 echo "down" > /var/run/mwan3track/$1/TRACK_${track_ip}
70 fi
71 done
72
73 if [ $host_up_count -lt $reliability ]; then
74 let score--
75
76 if [ $score -lt $up ]; then
77 score=0
78 else
79 sleep_time=$failure_interval
80 fi
81
82 if [ $score -eq $up ]; then
83 echo "offline" > /var/run/mwan3track/$1/STATUS
84 $LOG notice "Interface $1 ($2) is offline"
85 env -i ACTION=ifdown INTERFACE=$1 DEVICE=$2 /sbin/hotplug-call iface
86 score=0
87 fi
88 else
89 if [ $score -lt $(($down+$up)) ] && [ $lost -gt 0 ]; then
90 $LOG info "Lost $(($lost*$count)) ping(s) on interface $1 ($2)"
91 fi
92
93 let score++
94 lost=0
95
96 if [ $score -gt $up ]; then
97 echo "online" > /var/run/mwan3track/$1/STATUS
98 score=$(($down+$up))
99 elif [ $score -le $up ]; then
100 sleep_time=$recovery_interval
101 fi
102
103 if [ $score -eq $up ]; then
104 $LOG notice "Interface $1 ($2) is online"
105 env -i ACTION=ifup INTERFACE=$1 DEVICE=$2 /sbin/hotplug-call iface
106 rm -rf "/var/run/mwan3track/${1}" &> /dev/null
107 exit 0
108 fi
109 fi
110
111 let turn++
112 mkdir -p "/var/run/mwan3track/${1}"
113 echo "${lost}" > /var/run/mwan3track/$1/LOST
114 echo "${score}" > /var/run/mwan3track/$1/SCORE
115 echo "${turn}" > /var/run/mwan3track/$1/TURN
116
117 host_up_count=0
118 sleep "${sleep_time}" &
119 wait
120
121 if [ "${IFDOWN_EVENT}" -eq 1 ]; then
122 score=0
123 echo "offline" > /var/run/mwan3track/$1/STATUS
124 IFDOWN_EVENT=0
125 fi
126 done
127 }
128
129 main "$@"