10cb4454d538b554abb9303d1cd0117222a4f482
[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                 rttable="$(uci -q get $dyngwplainlib.RtTable)"
57                 if [ -z "$rttable" ] || [ "$rttable" = "254" ]; then 
58                         uci set $dyngwplainlib.ignore=1
59                         uci commit olsrd
60                 fi
61         fi
62 }
63
64 restart_services() {
65         logger -s -t policyrouting -p info "Restarting services"
66         /etc/init.d/network restart 2&> /dev/null
67         /etc/init.d/olsrd restart 2&> /dev/null
68 }
69
70 boot() {
71         if [ "$enable" = "1" ]; then
72                 [ -d /var/state ] || mkdir -p /var/state
73                 touch /var/state/freifunk-policyrouting
74                 start noservicerestart
75         else
76                 olsrd_rmtables
77         fi
78 }
79
80 add_lookup_rule() {
81         name=${1/-/_}
82         lookup=$2
83         prio=$3
84
85         if [ -z "$name" -o -z "$lookup" -o -z "$prio" ]; then
86                 logger -s -t policyrouting "Missing parameters for add_rule!"
87         else
88                 for p in $proto; do
89                         if [ "$p" = "6" ]; then
90                                 rule="rule6"
91                         else
92                                 rule="rule"
93                         fi
94
95                         uci batch <<- EOF
96                                 set network.${name}ipv${p}="$rule"
97                                 set network.${name}ipv${p}.lookup="$lookup"
98                                 set network.${name}ipv${p}.priority="$prio"
99                         EOF
100                 done
101         fi
102 }
103
104 del_lookup_rule() {
105         name=${1/-/_}
106         for p in $proto; do
107                 uci -q delete network.${name}ipv${p}
108         done
109 }
110
111 start() {
112         if [ $enable = "1" ]; then
113                 logger -s -t policyrouting "Starting policy routing."
114                 rt_tables
115                 olsrd_intalltables
116                 disable_dyngw
117
118                 add_lookup_rule olsr olsr 1000
119                 add_lookup_rule localnets localnets 2000
120
121                 if [ "$fallback" = 1 ]; then
122                         add_lookup_rule olsr-default olsr-default 100000
123                 fi
124         fi
125         uci commit network
126         if [ ! "$1" = "noservicerestart" ]; then
127                 restart_services
128         fi
129 }
130
131 stop() {
132         logger -s -t policyrouting "Stopping policy routing"
133         olsrd_rmtables
134         del_lookup_rule olsr-default
135         del_lookup_rule olsr
136         del_lookup_rule localnets
137         uci commit network
138         restart_services
139         echo "Hint: To completely disable freifunk-policyrouting set enable=0 in /etc/config/freifunk-policyrouting."
140 }
141
142 restart() {
143         logger -s -t policyrouting "Restarting policy routing"
144         olsrd_rmtables
145         del_lookup_rule olsr-default
146         del_lookup_rule olsr
147         del_lookup_rule localnets
148         uci commit network
149         start
150 }