mwan3: update to version 1.5-10
[feed/packages.git] / net / mwan3 / files / usr / sbin / mwan3
1 #!/bin/sh
2 . /lib/functions.sh
3
4 IP="/usr/sbin/ip -4"
5 IPT="/usr/sbin/iptables -t mangle -w"
6
7 help()
8 {
9 cat <<EOF
10 Syntax: mwan3 [command]
11
12 Available commands:
13 start Load iptables rules, ip rules and ip routes
14 stop Unload iptables rules, ip rules and ip routes
15 restart Reload iptables rules, ip rules and ip routes
16 ifup <iface> Load rules and routes for specific interface
17 ifdown <iface> Unload rules and routes for specific interface
18 interfaces Show interfaces status
19 policies Show policies status
20 rules Show rules status
21 status Show all status
22
23 EOF
24 }
25
26 ifdown()
27 {
28 if [ -z "$1" ]; then
29 echo "Error: Expecting interface. Usage: mwan3 ifdown <interface>" && exit 0
30 fi
31
32 if [ -n "$2" ]; then
33 echo "Error: Too many arguments. Usage: mwan3 ifdown <interface>" && exit 0
34 fi
35
36 if [ -e /var/run/mwan3track-$1.pid ] ; then
37 kill $(cat /var/run/mwan3track-$1.pid)
38 rm /var/run/mwan3track-$1.pid
39 fi
40
41 ACTION=ifdown INTERFACE=$1 /sbin/hotplug-call iface
42 }
43
44 ifup()
45 {
46 local device enabled
47
48 config_load mwan3
49
50 if [ -z "$1" ]; then
51 echo "Expecting interface. Usage: mwan3 ifup <interface>" && exit 0
52 fi
53
54 if [ -n "$2" ]; then
55 echo "Too many arguments. Usage: mwan3 ifup <interface>" && exit 0
56 fi
57
58 config_get enabled "$1" enabled 0
59
60 device=$(uci get -p /var/state network.$1.ifname) &> /dev/null
61
62 if [ -n "$device" ] ; then
63 [ "$enabled" -eq 1 ] && ACTION=ifup INTERFACE=$1 DEVICE=$device /sbin/hotplug-call iface
64 fi
65 }
66
67 interfaces()
68 {
69 local device enabled iface_id tracking
70
71 config_load mwan3
72
73 echo "Interface status:"
74
75 check_iface_status()
76 {
77 let iface_id++
78 device=$(uci get -p /var/state network.$1.ifname) &> /dev/null
79
80 if [ -z "$device" ]; then
81 echo "Interface $1 is unknown"
82 return 0
83 fi
84
85 config_get enabled "$1" enabled 0
86
87 if [ -n "$(ps -w | grep mwan3track | grep -v grep | sed '/.*\/usr\/sbin\/mwan3track \([^ ]*\) .*$/!d;s//\1/' | awk '$1 == "'$1'"')" ]; then
88 tracking="active"
89 else
90 tracking="down"
91 fi
92
93 if [ -n "$($IP rule | awk '$5 == "'$device'"')" -a -n "$($IPT -S mwan3_iface_$1 2> /dev/null)" -a -n "$($IP route list table $iface_id default dev $device 2> /dev/null)" ]; then
94 if [ -n "$(uci get -p /var/state mwan3.$1.track_ip 2> /dev/null)" ]; then
95 echo "Interface $1 is online (tracking $tracking)"
96 else
97 echo "Interface $1 is online"
98 fi
99 elif [ -n "$($IP rule | awk '$5 == "'$device'"')" -o -n "$($IPT -S mwan3_iface_$1 2> /dev/null)" -o -n "$($IP route list table $iface_id default dev $device 2> /dev/null)" ]; then
100 echo "Interface $1 error"
101 else
102 if [ "$enabled" -eq 1 ]; then
103 if [ -n "$(uci get -p /var/state mwan3.$1.track_ip 2> /dev/null)" ]; then
104 echo "Interface $1 is offline (tracking $tracking)"
105 else
106 echo "Interface $1 is offline"
107 fi
108 else
109 echo "Interface $1 is disabled"
110 fi
111 fi
112 }
113 config_foreach check_iface_status interface
114 echo -e
115 }
116
117 policies()
118 {
119 local percent policy share total_weight weight iface
120
121 for policy in $($IPT -S | awk '{print $2}' | grep mwan3_policy_ | sort -u); do
122 echo "Policy $policy:" | sed 's/mwan3_policy_//'
123
124 [ -n "$total_weight" ] || total_weight=$($IPT -S $policy | cut -s -d'"' -f2 | head -1 | awk '{print $3}')
125
126 if [ ! -z "${total_weight##*[!0-9]*}" ]; then
127 for iface in $($IPT -S $policy | cut -s -d'"' -f2 | awk '{print $1}'); do
128 weight=$($IPT -S $policy | cut -s -d'"' -f2 | awk '$1 == "'$iface'"' | awk '{print $2}')
129 percent=$(($weight*100/$total_weight))
130 echo " $iface ($percent%)"
131 done
132 else
133 echo " $($IPT -S $policy | sed '/.*--comment \([^ ]*\) .*$/!d;s//\1/;q')"
134 fi
135
136 echo -e
137
138 unset iface
139 unset total_weight
140 done
141 }
142 rules()
143 {
144 if [ -n "$($IPT -S mwan3_connected 2> /dev/null)" ]; then
145 echo "Known networks:"
146 echo "destination policy hits" | awk '{ printf "%-19s%-19s%-9s%s\n",$1,$2,$3}' | awk '1; {gsub(".","-")}1'
147 $IPT -L mwan3_connected -n -v 2> /dev/null | tail -n+3 | sed 's/mark.*//' | sed 's/mwan3_policy_//' | awk '{printf "%-19s%-19s%-9s%s\n",$9,"default",$1}'
148 echo -e
149 fi
150
151 if [ -n "$($IPT -S mwan3_rules 2> /dev/null)" ]; then
152 echo "Active rules:"
153 echo "source destination proto src-port dest-port policy hits" | awk '{ printf "%-19s%-19s%-7s%-14s%-14s%-16s%-9s%s\n",$1,$2,$3,$4,$5,$6,$7}' | awk '1; {gsub(".","-")}1'
154 $IPT -L mwan3_rules -n -v 2> /dev/null | tail -n+3 | sed 's/mark.*//' | sed 's/mwan3_policy_//' | awk '{ printf "%-19s%-19s%-7s%-14s%-14s%-16s%-9s%s\n",$8,$9,$4,$12,$15,$3,$1}'
155 echo -e
156 fi
157 }
158
159 status()
160 {
161 interfaces
162 policies
163 rules
164 }
165
166 start()
167 {
168 config_load mwan3
169 config_foreach ifup interface
170 }
171
172 stop()
173 {
174 local route rule table
175
176 killall mwan3track &> /dev/null
177 rm /var/run/mwan3track-* &> /dev/null
178
179 for route in $($IP route list table all | sed 's/.*table \([^ ]*\) .*/\1/' | awk '{print $1}' | awk '{for(i=1;i<=NF;i++) if($i+0>0) if($i+0<255) {print;break}}'); do
180 $IP route flush table $route &> /dev/null
181 done
182
183 for rule in $($IP rule list | egrep '^[1-2][0-9]{3}\:' | cut -d ':' -f 1); do
184 $IP rule del pref $rule &> /dev/null
185 done
186
187 $IPT -D PREROUTING -j mwan3_hook &> /dev/null
188 $IPT -D OUTPUT -j mwan3_hook &> /dev/null
189 $IPT -D OUTPUT -j mwan3_output_hook &> /dev/null
190
191 for table in $($IPT -S | awk '{print $2}' | grep mwan3 | sort -u); do
192 $IPT -F $table &> /dev/null
193 done
194
195 for table in $($IPT -S | awk '{print $2}' | grep mwan3 | sort -u); do
196 $IPT -X $table &> /dev/null
197 done
198 }
199
200 restart() {
201 stop
202 start
203 }
204
205 case "$1" in
206 ifup|ifdown|interfaces|policies|rules|status|start|stop|restart)
207 $*
208 ;;
209 *)
210 help
211 ;;
212 esac
213
214 exit 0