contrib/freifunk-policyrouting: User higher prio for fallback ip rule so that this...
[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 2&> /dev/null
30 fi
31 }
32
33 rt_tables() {
34 tables="/etc/iproute2/rt_tables"
35 if [ -z "`grep "110" $tables`" ]; then
36 echo "110 localnets" >> $tables
37 fi
38 if [ -z "`grep "111" $tables`" ]; then
39 echo "111 olsr" >> $tables
40 fi
41 if [ -z "`grep "112" $tables`" ]; then
42 echo "112 olsr-default" >> $tables
43 fi
44
45 }
46
47 disable_dyngw() {
48 dyngwlib=`uci show olsrd |grep dyn_gw.so |awk {' FS="."; print $1"."$2 '}`
49 if [ -n "$dyngwlib" ]; then
50 uci set $dyngwlib.ignore=1
51 uci commit olsrd
52 fi
53
54 dyngwplainlib=`uci show olsrd |grep dyn_gw_plain |awk {' FS="."; print $1"."$2 '}`
55 if [ -n "$dyngwplainlib" ]; then
56 uci set $dyngwplainlib.ignore=1
57 uci commit olsrd
58 fi
59 }
60
61 restart_services() {
62 logger -s -t policyrouting -p info "Restarting services"
63 /etc/init.d/network restart 2&> /dev/null
64 /etc/init.d/olsrd restart 2&> /dev/null
65 }
66
67 boot() {
68 if [ "$enable" = "1" ]; then
69 [ -d /var/state ] || mkdir -p /var/state
70 touch /var/state/freifunk-policyrouting
71 start noservicerestart
72 else
73 olsrd_rmtables
74 fi
75 }
76
77 add_lookup_rule() {
78 name=${1/-/_}
79 lookup=$2
80 prio=$3
81
82 if [ -z "$name" -o -z "$lookup" -o -z "$prio" ]; then
83 logger -s -t policyrouting "Missing parameters for add_rule!"
84 else
85 for p in $proto; do
86 if [ "$p" = "6" ]; then
87 rule="rule6"
88 else
89 rule="rule"
90 fi
91
92 uci batch <<- EOF
93 set network.${name}ipv${p}="$rule"
94 set network.${name}ipv${p}.lookup="$lookup"
95 set network.${name}ipv${p}.priority="$prio"
96 EOF
97 done
98 fi
99 }
100
101 del_lookup_rule() {
102 name=${1/-/_}
103 for p in $proto; do
104 uci -q delete network.${name}ipv${p}
105 done
106 }
107
108 start() {
109 if [ $enable = "1" ]; then
110 logger -s -t policyrouting "Starting policy routing."
111 rt_tables
112 olsrd_intalltables
113 disable_dyngw
114
115 add_lookup_rule olsr olsr 1000
116 add_lookup_rule localnets localnets 2000
117
118 if [ "$fallback" = 1 ]; then
119 add_lookup_rule olsr-default olsr-default 100000
120 fi
121 fi
122 uci commit network
123 if [ ! "$1" = "noservicerestart" ]; then
124 restart_services
125 fi
126 }
127
128 stop() {
129 logger -s -t policyrouting "Stopping policy routing"
130 olsrd_rmtables
131 del_lookup_rule olsr-default
132 del_lookup_rule olsr
133 del_lookup_rule localnets
134 uci commit network
135 restart_services
136 echo "Hint: To completely disable freifunk-policyrouting set enable=0 in /etc/config/freifunk-policyrouting."
137 }
138
139 restart() {
140 logger -s -t policyrouting "Restarting policy routing"
141 olsrd_rmtables
142 del_lookup_rule olsr-default
143 del_lookup_rule olsr
144 del_lookup_rule localnets
145 uci commit network
146 start
147 }