Add luci to packages/ instead of using a feed
[librecmc/librecmc.git] / package / luci / contrib / package / freifunk-policyrouting / files / etc / hotplug.d / iface / 30-policyrouting
1 #!/bin/sh
2
3 . /lib/functions.sh
4 . /lib/functions/network.sh
5
6 proto="4"
7 [ -f /proc/net/ipv6_route ] && proto="4 6"
8
9 config_load freifunk-policyrouting
10 config_get enable pr enable
11 config_get fallback pr fallback
12 config_get strict pr strict
13 config_get zones pr zones
14
15 if [ "$ACTION" = "ifup" ] && [ "$enable" = "1" ]; then
16         network_get_subnet net $INTERFACE
17         network_get_subnet6 net6 $INTERFACE
18         network_get_physdev dev $INTERFACE
19
20         if [ "$net" != "" -a -n "$dev" ]; then
21                 eval $(/bin/ipcalc.sh $net)
22                 if [ "$PREFIX" != "0" -a "$NETWORK" != "127.0.0.0" ]; then
23                         if [ ! "$(ip r s t localnets |grep "$NETWORK/$PREFIX dev")" ]; then
24                                 cmd="ip r a $NETWORK/$PREFIX dev $dev table localnets"
25                                 $cmd
26                                 if [ "$?" = 0 ]; then
27                                         logger -s -t policyrouting "Add route: $cmd"
28                                 else
29                                         logger -s -t policyrouting "Error! Could not add route: $cmd"
30                                 fi
31                         fi
32
33                 fi
34
35                 if [ -n "$net6" ]; then
36                         cmd="ip -6 r a $net6 dev $dev table localnets"
37                         $cmd 2>&1 > /dev/null
38                         if [ "$?" = 0 ]; then
39                                 logger -s -t policyrouting "Add route: $cmd (IPv6)"
40                         fi
41
42                 fi
43
44                 networks=""
45                 for z in $zones; do
46                         network_zone="$(uci -q get firewall.zone_${z}.network)"
47                         if [ -z "$network_zone" ]; then
48                                 network_zone="$z"
49                         fi
50                         networks="$networks $network_zone"
51                 done
52                 for n in $networks; do
53                         if [ "$INTERFACE" = "$n" ]; then
54                                 for p in $proto; do
55                                         if [ ! "$(ip -$p ru s | grep "from all iif $dev lookup olsr-default")" ]; then
56                                                 ip -$p rule add dev "$dev" lookup olsr-default prio 20000
57                                                 if [ "$strict" != 0 ]; then
58                                                         ip -$p rule add dev "$dev" unreachable prio 20001
59                                                 fi
60                                                 if [ "$?" = 0 ]; then
61                                                         logger -s -t policyrouting "Use mesh gateway for interface $dev (IPv$p)"
62                                                         if [ -z "$(uci -P /var/state get freifunk-policyrouting.${INTERFACE})" ]; then
63                                                                 uci -P /var/state set freifunk-policyrouting.${INTERFACE}="state"
64                                                         fi
65                                                         uci -P /var/state set freifunk-policyrouting.${INTERFACE}.device="$dev"
66                                                 else
67                                                         logger -s -t policyrouting "Error: Could not add rule: dev "$dev" lookup olsr-default prio 20000 (IPv$p)"
68                                                 fi
69                                         fi
70                                 done
71                         fi
72                 done
73         fi
74
75 fi
76
77 if [ "$ACTION" = "ifdown" ]; then
78         dev="$(uci -q -P /var/state get freifunk-policyrouting.${INTERFACE}.device)"
79         if [ -n "$dev" ]; then
80                 networks=""
81                 for z in $zones; do
82                         network_zone="$(uci -q get firewall.zone_${z}.network)"
83                         if [ -z "$network_zone" ]; then
84                                 network_zone="$z"
85                         fi
86                         networks="$networks $network_zone"
87                 done
88                 for n in $networks; do
89                         if [ "$INTERFACE" = "$n" ]; then
90                                 for p in $proto; do
91                                         if [ "$(ip -$p ru s | grep "from all iif $dev lookup olsr-default")" ]; then
92                                                 ip -$p rule del dev "$dev" lookup olsr-default prio 20000
93                                                 ip -$p rule del dev "$dev" unreachable prio 20001
94                                                 if [ "$?" = 0 ]; then
95                                                         logger -s -t policyrouting "Remove rule: dev "$dev" lookup olsr-default prio 20000 (IPv$p)"
96                                                 else
97                                                         logger -s -t policyrouting "Error! Could not remove rule: dev "$dev" lookup olsr-default prio 20000 (IPv$p)"
98                                                 fi
99                                         fi
100                                 done
101                         fi
102                 done
103         fi
104 fi