contrib/freifunk-policyrouting: Use a new table 'localnets' for locally attached...
[project/luci.git] / 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 zones pr zones
13
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 [ "$?" = 0 ]; then
58                                                         logger -s -t policyrouting "Use mesh gateway for interface $dev (IPv$p)"
59                                                         if [ -z "$(uci -P /var/state get freifunk-policyrouting.${INTERFACE})" ]; then
60                                                                 uci -P /var/state set freifunk-policyrouting.${INTERFACE}="state"
61                                                         fi
62                                                         uci -P /var/state set freifunk-policyrouting.${INTERFACE}.device="$dev"
63                                                 else
64                                                         logger -s -t policyrouting "Error: Could not add rule: dev "$dev" lookup olsr-default prio 20000 (IPv$p)"
65                                                 fi
66                                         fi
67                                 done
68                         fi
69                 done
70         fi
71
72 fi
73
74 if [ "$ACTION" = "ifdown" ]; then
75         dev="$(uci -q -P /var/state get freifunk-policyrouting.${INTERFACE}.device)"
76         if [ -n "$dev" ]; then
77                 networks=""
78                 for z in $zones; do
79                         network_zone="$(uci -q get firewall.zone_${z}.network)"
80                         if [ -z "$network_zone" ]; then
81                                 network_zone="$z"
82                         fi
83                         networks="$networks $network_zone"
84                 done
85                 for n in $networks; do
86                         if [ "$INTERFACE" = "$n" ]; then
87                                 for p in $proto; do
88                                         if [ "$(ip -$p ru s | grep "from all iif $dev lookup olsr-default")" ]; then
89                                                 ip -$p rule del dev "$dev" lookup olsr-default prio 20000
90                                                 if [ "$?" = 0 ]; then
91                                                         logger -s -t policyrouting "Remove rule: dev "$dev" lookup olsr-default prio 20000 (IPv$p)"
92                                                 else
93                                                         logger -s -t policyrouting "Error! Could not remove rule: dev "$dev" lookup olsr-default prio 20000 (IPv$p)"
94                                                 fi
95                                         fi
96                                 done
97                         fi
98                 done
99         fi
100 fi