c4ae38d9723a7f89f5907b95054ab5e32c2abe69
[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 if [ "$ACTION" = "ifup" ] && [ "$enable" = "1" ]; then
15         network_get_subnet net $INTERFACE
16         network_get_subnet6 net6 $INTERFACE
17         network_get_physdev dev $INTERFACE
18
19         if [ "$net" != "" -a -n "$dev" ]; then
20                 eval $(/bin/ipcalc.sh $net)
21                 if [ "$PREFIX" != "0" ]; then
22                         if [ ! "$(ip r s t olsr-default |grep "throw $NETWORK/$PREFIX")" ]; then
23                                 ip r a throw $NETWORK/$PREFIX table olsr-default
24                                 if [ "$?" = 0 ]; then
25                                         logger -s -t policyrouting "Add route: throw $NETWORK/$PREFIX table olsr-default"
26                                 else
27                                         logger -s -t policyrouting "Error! Could not add route: throw $NETWORK/$PREFIX table olsr-default"
28                                 fi
29                         fi
30                 fi
31
32                 if [ -n "$net6" ]; then
33                         if [ ! "$(ip -6 r s t olsr-default |grep "throw $net6")" ]; then
34                                 rule="throw $net6 table olsr-default dev $dev"
35                                 ip -6 r a $rule
36                                 if [ "$?" = 0 ]; then
37                                         logger -s -t policyrouting "Add route: $rule (IPv6)"
38                                 else
39                                         logger -s -t policyrouting "Error! Could not add route: $rule (IPv6)"
40                                 fi
41                         fi
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 fi
72
73 if [ "$ACTION" = "ifdown" ]; then
74         dev="$(uci -q -P /var/state get freifunk-policyrouting.${INTERFACE}.device)"
75         if [ -n "$dev" ]; then
76                 networks=""
77                 for z in $zones; do
78                         network_zone="$(uci -q get firewall.zone_${z}.network)"
79                         if [ -z "$network_zone" ]; then
80                                 network_zone="$z"
81                         fi
82                         networks="$networks $network_zone"
83                 done
84                 for n in $networks; do
85                         if [ "$INTERFACE" = "$n" ]; then
86                                 for p in $proto; do
87                                         if [ "$(ip -$p ru s | grep "from all iif $dev lookup olsr-default")" ]; then
88                                                 ip -$p rule del dev "$dev" lookup olsr-default prio 20000
89                                                 if [ "$?" = 0 ]; then
90                                                         logger -s -t policyrouting "Remove rule: dev "$dev" lookup olsr-default prio 20000 (IPv$p)"
91                                                 else
92                                                         logger -s -t policyrouting "Error! Could not remove rule: dev "$dev" lookup olsr-default prio 20000 (IPv$p)"
93                                                 fi
94                                         fi
95                                 done
96                         fi
97                 done
98         fi
99 fi