contrib/freifunk-policyrouting: Use a new table 'localnets' for locally attached...
[project/luci.git] / contrib / package / freifunk-policyrouting / files / etc / init.d / freifunk-policyrouting
1 #!/bin/sh /etc/rc.common
2
3 START=15
4 . /lib/functions/network.sh
5 . /lib/functions.sh
6
7 proto="4"
8 [ -f /proc/net/ipv6_route ] && proto="4 6"
9
10 config_load freifunk-policyrouting
11 config_get enable pr enable
12 config_get fallback pr fallback
13 config_get zones pr zones
14
15 olsrd_rmtables() {
16         # Remove custom routing tables from olsrd
17         if [ "`uci -q get olsrd.@olsrd[0].RtTable`" == "111" ] || [ "`uci -q get olsrd.@olsrd[0].RtTableDefault`" == "112" ]; then
18                 uci delete olsrd.@olsrd[0].RtTable
19                 uci delete olsrd.@olsrd[0].RtTableDefault
20                 uci commit
21         fi
22 }
23
24 olsrd_intalltables() {
25         if [ ! "`uci -q get olsrd.@olsrd[0].RtTable`" == "111" ] || [ ! "`uci -q get olsrd.@olsrd[0].RtTableDefault`" == "112" ]; then
26                 uci set olsrd.@olsrd[0].RtTable='111'
27                 uci set olsrd.@olsrd[0].RtTableDefault='112'
28                 uci commit olsrd
29                 /etc/init.d/olsrd restart
30         fi
31 }
32
33
34 rt_tables() {
35         tables="/etc/iproute2/rt_tables"
36         if [ -z "`grep "110" $tables`" ]; then
37                 echo "110 localnets" >> $tables
38         fi
39         if [ -z "`grep "111" $tables`" ]; then
40                 echo "111 olsr" >> $tables
41         fi
42         if [ -z "`grep "112" $tables`" ]; then
43                 echo "112 olsr-default" >> $tables
44         fi
45
46 }
47
48 disable_dyngw() {
49         dyngwlib=`uci show olsrd |grep dyn_gw.so |awk {' FS="."; print $1"."$2 '}`
50         if [ -n "$dyngwlib" ]; then
51                 uci set $dyngwlib.ignore=1
52                 uci commit olsrd
53         fi
54
55         dyngwplainlib=`uci show olsrd |grep dyn_gw_plain |awk {' FS="."; print $1"."$2 '}`
56         if [ -n "$dyngwplainlib" ]; then
57                 uci set $dyngwplainlib.ignore=1
58                 uci commit olsrd
59         fi
60 }
61
62 restart_services() {
63         wifi
64         /etc/init.d/network restart
65         /etc/init.d/olsrd restart
66 }
67
68 boot() {
69         if [ "$enable" = "1" ]; then
70                 [ -d /var/state ] || mkdir -p /var/state
71                 touch /var/state/freifunk-policyrouting
72                 start
73         else
74                 olsrd_rmtables
75         fi
76 }
77 start() {
78         if [ $enable = "1" ]; then
79                 logger -s -t policyrouting "Starting policy routing."
80                 rt_tables
81                 olsrd_intalltables
82                 disable_dyngw
83
84                 for p in $proto; do
85                         if [ ! "$(ip -$p ru s | grep "1000:     from all lookup olsr")" ]; then
86                                 ip -$p rule add lookup olsr prio 1000
87                                 # add table for routes to local networks
88                                 ip -$p rule add lookup localnets prio 2000
89
90                                 if [ "$?" = "0" ]; then
91                                         logger -s -t policyrouting "Added rule: lookup olsr prio 1000 (IPv$p)"
92                                 else
93                                         logger -s -t policyrouting "Error! Could not add rule: lookup olsr prio 1000 (IPv$p)"
94                                 fi
95                         fi
96                 done
97
98                 # add unreachable with high metric so packets stop here if they find no gateway
99                 # in table olsr-default
100                 if [ "$strict" != 0 ]; then
101                         for p in $proto; do
102                                 [ ! "$(ip -$p r s t olsr-default |grep "unreachable default")" ] && {
103                                         ip -$p route add unreachable default table olsr-default metric 65535
104                                         if [ "$?" = "0" ]; then
105                                                 logger -s -t policyrouting "Added route: unreachable default table olsr-default metric 65535 (IPv$p)"
106                                         else
107                                                 logger -s -t policyrouting "Error! Could not add route: unreachable default table olsr-default metric 65535 (IPv$p)"
108                                         fi
109                                 }
110                         done
111
112                 fi
113                 if [ "$fallback" = 1 ]; then
114                         for p in $proto; do
115                                 [ ! "$(ip -$p ru s |grep "from all lookup olsr-default")" ] && {
116                                         ip -$p rule add lookup olsr-default prio 33000
117                                         if [ "$?" = "0" ]; then
118                                                 logger -s -t policyrouting "Added rule: olsr-default prio 33000 (IPv$p)"
119                                         else
120                                                 logger -s -t policyrouting "Error! Could not add rule: olsr-default prio 33000 (IPv$p)"
121                                         fi
122                                 }
123                         done
124                 fi
125         fi
126 }
127
128 stop() {
129         logger -s -t policyrouting "Stopping policy routing"
130         olsrd_rmtables
131         for p in $proto; do
132                 ip -$p route flush table olsr-default   
133                 ip -$p rule del lookup olsr-default > /dev/null 2>&1
134                 ip -$p rule del lookup olsr     > /dev/null 2>&1
135         done
136         restart_services
137         echo "Hint: To completely disable freifunk-policyrouting set enable=0 in /etc/config/freifunk-policyrouting."
138 }
139
140 restart() {
141         logger -s -t policyrouting "Restarting policy routing"
142         olsrd_rmtables
143         for p in $proto; do
144                 ip -$p route flush table olsr-default   
145                 ip -$p rule del lookup olsr-default > /dev/null 2>&1
146                 ip -$p rule del lookup olsr     > /dev/null 2>&1
147         done
148         start
149         restart_services
150 }