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 }