net/mwan3: add mwan3_init function
[feed/packages.git] / net / mwan3 / files / usr / sbin / mwan3
1 #!/bin/sh
2
3 . /lib/functions.sh
4 . /lib/functions/network.sh
5 . /lib/mwan3/mwan3.sh
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 currently active policy
20 connected Show directly connected networks
21 rules Show active rules
22 status Show all status
23
24 EOF
25 }
26
27 ifdown()
28 {
29 if [ -z "$1" ]; then
30 echo "Error: Expecting interface. Usage: mwan3 ifdown <interface>" && exit 0
31 fi
32
33 if [ -n "$2" ]; then
34 echo "Error: Too many arguments. Usage: mwan3 ifdown <interface>" && exit 0
35 fi
36
37 ACTION=ifdown INTERFACE=$1 /sbin/hotplug-call iface
38
39 kill $(pgrep -f "mwan3track $1 $2") &> /dev/null
40 mwan3_track_clean $1
41 }
42
43 ifup()
44 {
45 local device enabled
46
47 config_load mwan3
48
49 if [ -z "$1" ]; then
50 echo "Expecting interface. Usage: mwan3 ifup <interface>" && exit 0
51 fi
52
53 if [ -n "$2" ]; then
54 echo "Too many arguments. Usage: mwan3 ifup <interface>" && exit 0
55 fi
56
57 config_get_bool enabled globals 'enabled' 0
58 [ ${enabled} -gt 0 ] || {
59 echo "Warning: mwan3 is global disabled. Usage: /etc/init.d/mwan3 start"
60 exit 0
61 }
62
63 config_get enabled "$1" enabled 0
64
65 device=$(uci -p /var/state get network.$1.ifname) &> /dev/null
66
67 if [ -n "$device" ] ; then
68 [ "$enabled" -eq 1 ] && ACTION=ifup INTERFACE=$1 DEVICE=$device /sbin/hotplug-call iface
69 fi
70 }
71
72 interfaces()
73 {
74 config_load mwan3
75
76 echo "Interface status:"
77 config_foreach mwan3_report_iface_status interface
78 echo -e
79 }
80
81 policies()
82 {
83 echo "Current ipv4 policies:"
84 mwan3_report_policies_v4
85 echo -e
86 echo "Current ipv6 policies:"
87 mwan3_report_policies_v6
88 echo -e
89 }
90
91 connected()
92 {
93 echo "Directly connected ipv4 networks:"
94 mwan3_report_connected_v4
95 echo -e
96 echo "Directly connected ipv6 networks:"
97 mwan3_report_connected_v6
98 echo -e
99 }
100
101 rules()
102 {
103 echo "Active ipv4 user rules:"
104 mwan3_report_rules_v4
105 echo -e
106 echo "Active ipv6 user rules:"
107 mwan3_report_rules_v6
108 echo -e
109 }
110
111 status()
112 {
113 interfaces
114 policies
115 connected
116 rules
117 }
118
119 start()
120 {
121 local enabled
122
123 config_load mwan3
124 config_get_bool enabled globals 'enabled' 0
125 [ ${enabled} -gt 0 ] || {
126 echo "Warning: mwan3 is global disabled. Usage: /etc/init.d/mwan3 start"
127 exit 0
128 }
129
130 config_foreach ifup interface
131 }
132
133 stop()
134 {
135 local ipset route rule table IP IPT pid
136
137 for pid in $(pgrep -f "mwan3track"); do
138 kill -TERM "$pid" > /dev/null 2>&1
139 sleep 1
140 kill -KILL "$pid" > /dev/null 2>&1
141 done
142
143 config_load mwan3
144 config_foreach mwan3_track_clean interface
145
146 for IP in "$IP4" "$IP6"; do
147
148 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
149 $IP route flush table $route &> /dev/null
150 done
151
152 for rule in $($IP rule list | egrep '^[1-2][0-9]{3}\:' | cut -d ':' -f 1); do
153 $IP rule del pref $rule &> /dev/null
154 done
155 done
156
157 for IPT in "$IPT4" "$IPT6"; do
158
159 $IPT -D PREROUTING -j mwan3_hook &> /dev/null
160 $IPT -D OUTPUT -j mwan3_hook &> /dev/null
161
162 for table in $($IPT -S | awk '{print $2}' | grep mwan3 | sort -u); do
163 $IPT -F $table &> /dev/null
164 done
165
166 for table in $($IPT -S | awk '{print $2}' | grep mwan3 | sort -u); do
167 $IPT -X $table &> /dev/null
168 done
169 done
170
171 for ipset in $($IPS -n list | grep mwan3_); do
172 $IPS -q destroy $ipset
173 done
174
175 for ipset in $($IPS -n list | grep mwan3 | grep -E '_v4|_v6'); do
176 $IPS -q destroy $ipset
177 done
178
179 mwan3_lock_clean
180 rm -rf $MWAN3_STATUS_DIR $MWAN3TRACK_STATUS_DIR
181 }
182
183 restart() {
184 stop
185 start
186 }
187
188 case "$1" in
189 ifup|ifdown|interfaces|policies|connected|rules|status|start|stop|restart)
190 mwan3_init
191 $*
192 ;;
193 *)
194 help
195 ;;
196 esac
197
198 exit 0