05a75407d8c0bdc729d4d7b8d62cd5c9cffcd2f5
[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 [ -f /etc/config/olsrd ] && cfgs="olsrd"
10 [ -f /etc/config/olsrd6 ] && cfgs="$cfgs olsrd6"
11
12 config_load freifunk-policyrouting
13 config_get enable pr enable
14 config_get fallback pr fallback
15 config_get zones pr zones
16
17
18 olsrd_rmtables() {
19         for cfg in $cfgs; do
20                 # Remove custom routing tables from olsrd 
21                 if [ "`uci -q get $cfg.@olsrd[0].RtTable`" == "111" ] || [ "`uci -q get $cfg.@olsrd[0].RtTableDefault`" == "112" ]; then
22                         uci delete $cfg.@olsrd[0].RtTable
23                         uci delete $cfg.@olsrd[0].RtTableDefault
24                         uci commit
25                 fi
26         done
27 }
28
29 olsrd_intalltables() {
30         for cfg in $cfgs; do
31                 if [ ! "`uci -q get $cfg.@olsrd[0].RtTable`" == "111" ] || [ ! "`uci -q get $cfg.@olsrd[0].RtTableDefault`" == "112" ]; then
32                         uci set $cfg.@olsrd[0].RtTable='111'
33                         uci set $cfg.@olsrd[0].RtTableDefault='112'
34                         uci commit $cfg
35                         /etc/init.d/$cfg restart 2&> /dev/null
36                 fi
37         done
38 }
39
40 rt_tables() {
41         tables="/etc/iproute2/rt_tables"
42         if [ -z "`grep "110" $tables`" ]; then
43                 echo "110 localnets" >> $tables
44         fi
45         if [ -z "`grep "111" $tables`" ]; then
46                 echo "111 olsr" >> $tables
47         fi
48         if [ -z "`grep "112" $tables`" ]; then
49                 echo "112 olsr-default" >> $tables
50         fi
51
52 }
53
54 disable_dyngw() {
55         for cfg in $cfgs; do
56                 local dyngwlib=`uci show $cfg |grep dyn_gw.so |awk {' FS="."; print $1"."$2 '}`
57                 if [ -n "$dyngwlib" ]; then
58                         uci set $dyngwlib.ignore=1
59                         uci commit $cfg
60                 fi
61
62                 dyngwplainlib=`uci show $cfg |grep dyn_gw_plain |awk {' FS="."; print $1"."$2 '}`
63                 if [ -n "$dyngwplainlib" ]; then
64                         rttable="$(uci -q get $dyngwplainlib.RtTable)"
65                         if [ -z "$rttable" ] || [ "$rttable" = "254" ]; then 
66                                 uci set $dyngwplainlib.ignore=1
67                                 uci commit $cfg
68                         fi
69                 fi
70         done
71 }
72
73 restart_services() {
74         logger -s -t policyrouting -p info "Restarting services"
75         /etc/init.d/network restart 2&> /dev/null
76         for cfg in $cfgs; do
77                 /etc/init.d/$cfg restart 2&> /dev/null
78         done
79 }
80
81 boot() {
82         if [ "$enable" = "1" ]; then
83                 [ -d /var/state ] || mkdir -p /var/state
84                 touch /var/state/freifunk-policyrouting
85                 start noservicerestart
86         else
87                 olsrd_rmtables
88         fi
89 }
90
91 add_lookup_rule() {
92         name=${1/-/_}
93         lookup=$2
94         prio=$3
95
96         if [ -z "$name" -o -z "$lookup" -o -z "$prio" ]; then
97                 logger -s -t policyrouting "Missing parameters for add_rule!"
98         else
99                 for p in $proto; do
100                         if [ "$p" = "6" ]; then
101                                 rule="rule6"
102                         else
103                                 rule="rule"
104                         fi
105
106                         uci batch <<- EOF
107                                 set network.${name}ipv${p}="$rule"
108                                 set network.${name}ipv${p}.lookup="$lookup"
109                                 set network.${name}ipv${p}.priority="$prio"
110                         EOF
111                 done
112         fi
113 }
114
115 del_lookup_rule() {
116         name=${1/-/_}
117         for p in $proto; do
118                 uci -q delete network.${name}ipv${p}
119         done
120 }
121
122 start() {
123         if [ $enable = "1" ]; then
124                 logger -s -t policyrouting "Starting policy routing."
125                 rt_tables
126                 olsrd_intalltables
127                 disable_dyngw
128
129                 add_lookup_rule olsr olsr 1000
130                 add_lookup_rule localnets localnets 2000
131
132                 if [ "$fallback" = 1 ]; then
133                         add_lookup_rule olsr-default olsr-default 100000
134                 fi
135         fi
136         uci commit network
137         if [ ! "$1" = "noservicerestart" ]; then
138                 restart_services
139         fi
140 }
141
142 stop() {
143         logger -s -t policyrouting "Stopping 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         restart_services
150         echo "Hint: To completely disable freifunk-policyrouting set enable=0 in /etc/config/freifunk-policyrouting."
151 }
152
153 restart() {
154         logger -s -t policyrouting "Restarting policy routing"
155         olsrd_rmtables
156         del_lookup_rule olsr-default
157         del_lookup_rule olsr
158         del_lookup_rule localnets
159         uci commit network
160         start
161 }