contrib/freifunk-policyrouting: Almost complete rewrite, use ip only (no firewall...
[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 "111" $tables`" ]; then
37 echo "111 olsr" >> $tables
38 fi
39 if [ -z "`grep "112" $tables`" ]; then
40 echo "112 olsr-default" >> $tables
41 fi
42 }
43
44 disable_dyngw() {
45 dyngwlib=`uci show olsrd |grep dyn_gw.so |awk {' FS="."; print $1"."$2 '}`
46 if [ -n "$dyngwlib" ]; then
47 uci set $dyngwlib.ignore=1
48 uci commit olsrd
49 fi
50
51 dyngwplainlib=`uci show olsrd |grep dyn_gw_plain |awk {' FS="."; print $1"."$2 '}`
52 if [ -n "$dyngwplainlib" ]; then
53 uci set $dyngwplainlib.ignore=1
54 uci commit olsrd
55 fi
56 }
57
58 restart_services() {
59 wifi
60 /etc/init.d/network restart
61 /etc/init.d/olsrd restart
62 }
63
64 boot() {
65 if [ "$enable" = "1" ]; then
66 [ -d /var/state ] || mkdir -p /var/state
67 touch /var/state/freifunk-policyrouting
68 start
69 else
70 olsrd_rmtables
71 fi
72 }
73 start() {
74 if [ $enable = "1" ]; then
75 logger -s -t policyrouting "Starting policy routing."
76 rt_tables
77 olsrd_intalltables
78 disable_dyngw
79
80 for p in $proto; do
81 if [ ! "$(ip -$p ru s | grep "1000: from all lookup olsr")" ]; then
82 ip -$p rule add lookup olsr prio 1000
83 if [ "$?" = "0" ]; then
84 logger -s -t policyrouting "Added rule: lookup olsr prio 1000 (IPv$p)"
85 else
86 logger -s -t policyrouting "Error! Could not add rule: lookup olsr prio 1000 (IPv$p)"
87 fi
88 fi
89 done
90
91 # add unreachable with high metric so packets stop here if they find no gateway
92 # in table olsr-default
93 if [ "$strict" != 0 ]; then
94 for p in $proto; do
95 [ ! "$(ip -$p r s t olsr-default |grep "unreachable default")" ] && {
96 ip -$p route add unreachable default table olsr-default metric 65535
97 if [ "$?" = "0" ]; then
98 logger -s -t policyrouting "Added route: unreachable default table olsr-default metric 65535 (IPv$p)"
99 else
100 logger -s -t policyrouting "Error! Could not add route: unreachable default table olsr-default metric 65535 (IPv$p)"
101 fi
102 }
103 done
104
105 fi
106 if [ "$fallback" = 1 ]; then
107 for p in $proto; do
108 [ ! "$(ip -$p ru s |grep "from all lookup olsr-default")" ] && {
109 ip -$p rule add lookup olsr-default prio 33000
110 if [ "$?" = "0" ]; then
111 logger -s -t policyrouting "Added rule: olsr-default prio 33000 (IPv$p)"
112 else
113 logger -s -t policyrouting "Error! Could not add rule: olsr-default prio 33000 (IPv$p)"
114 fi
115 }
116 done
117 fi
118 fi
119 }
120
121 stop() {
122 logger -s -t policyrouting "Stopping policy routing"
123 olsrd_rmtables
124 for p in $proto; do
125 ip -$p route flush table olsr-default
126 ip -$p rule del lookup olsr-default > /dev/null 2>&1
127 ip -$p rule del lookup olsr > /dev/null 2>&1
128 done
129 restart_services
130 echo "Hint: To completely disable freifunk-policyrouting set enable=0 in /etc/config/freifunk-policyrouting."
131 }
132
133 restart() {
134 logger -s -t policyrouting "Restarting policy routing"
135 olsrd_rmtables
136 for p in $proto; do
137 ip -$p route flush table olsr-default
138 ip -$p rule del lookup olsr-default > /dev/null 2>&1
139 ip -$p rule del lookup olsr > /dev/null 2>&1
140 done
141 start
142 restart_services
143 }