Merge pull request #4853 from StevenHessing/noddos
[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 enabled "$1" enabled 0
58
59 device=$(uci -p /var/state get network.$1.ifname) &> /dev/null
60
61 if [ -n "$device" ] ; then
62 [ "$enabled" -eq 1 ] && ACTION=ifup INTERFACE=$1 DEVICE=$device /sbin/hotplug-call iface
63 fi
64 }
65
66 interfaces()
67 {
68 config_load mwan3
69
70 echo "Interface status:"
71 config_foreach mwan3_report_iface_status interface
72 echo -e
73 }
74
75 policies()
76 {
77 echo "Current ipv4 policies:"
78 mwan3_report_policies_v4
79 echo -e
80 echo "Current ipv6 policies:"
81 mwan3_report_policies_v6
82 echo -e
83 }
84
85 connected()
86 {
87 echo "Directly connected ipv4 networks:"
88 mwan3_report_connected_v4
89 echo -e
90 echo "Directly connected ipv6 networks:"
91 mwan3_report_connected_v6
92 echo -e
93 }
94
95 rules()
96 {
97 echo "Active ipv4 user rules:"
98 mwan3_report_rules_v4
99 echo -e
100 echo "Active ipv6 user rules:"
101 mwan3_report_rules_v6
102 echo -e
103 }
104
105 status()
106 {
107 interfaces
108 policies
109 connected
110 rules
111 }
112
113 start()
114 {
115 config_load mwan3
116 config_foreach ifup interface
117 }
118
119 stop()
120 {
121 local ipset route rule table IP IPT
122
123 killall mwan3track &> /dev/null
124
125 config_load mwan3
126 config_foreach mwan3_track_clean interface
127
128 for IP in "$IP4" "$IP6"; do
129
130 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
131 $IP route flush table $route &> /dev/null
132 done
133
134 for rule in $($IP rule list | egrep '^[1-2][0-9]{3}\:' | cut -d ':' -f 1); do
135 $IP rule del pref $rule &> /dev/null
136 done
137 done
138
139 for IPT in "$IPT4" "$IPT6"; do
140
141 $IPT -D PREROUTING -j mwan3_hook &> /dev/null
142 $IPT -D OUTPUT -j mwan3_hook &> /dev/null
143
144 for table in $($IPT -S | awk '{print $2}' | grep mwan3 | sort -u); do
145 $IPT -F $table &> /dev/null
146 done
147
148 for table in $($IPT -S | awk '{print $2}' | grep mwan3 | sort -u); do
149 $IPT -X $table &> /dev/null
150 done
151 done
152
153 for ipset in $($IPS -n list | grep mwan3_); do
154 $IPS -q destroy $ipset
155 done
156
157 for ipset in $($IPS -n list | grep mwan3 | grep -E '_v4|_v6'); do
158 $IPS -q destroy $ipset
159 done
160
161 mwan3_lock_clean
162 rm -rf $MWAN3_STATUS_DIR $MWAN3TRACK_STATUS_DIR
163 }
164
165 restart() {
166 stop
167 start
168 }
169
170 case "$1" in
171 ifup|ifdown|interfaces|policies|connected|rules|status|start|stop|restart)
172 $*
173 ;;
174 *)
175 help
176 ;;
177 esac
178
179 exit 0