treewide: avoid double-escaping CBI section labels
[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 handle_disable_dyngw() {
55 local cfg="$1"
56 local olsrd_cfg="$2"
57 config_get library "$cfg" library
58 case "$library" in
59 olsrd_dyn_gw_plain*)
60 config_get RtTable "$cfg" RtTable
61 if [ -z "$RtTable" ] || [ "$RtTable" = "254" ]; then
62 config_set "$cfg" ignore '1'
63 uci set $olsrd_cfg.$cfg.ignore="1"
64 uci commit $olsrd_cfg
65 logger -s -t policyrouting -p info "dyngw_plain plugin disabled."
66 fi
67 ;;
68 olsrd_dyn_gw.so*)
69 logger -s -t policyrouting -p info "$cfg"
70 uci set $olsrd_cfg.$cfg.ignore="1"
71 uci commit $olsrd_cfg
72 logger -s -t policyrouting -p info "dyngw plugin disabled."
73 ;;
74 esac
75 }
76
77 disable_dyngw() {
78 for olsrd_cfg in $cfgs; do
79 config_load $olsrd_cfg
80 config_foreach handle_disable_dyngw LoadPlugin $olsrd_cfg
81 done
82 }
83
84 restart_services() {
85 logger -s -t policyrouting -p info "Restarting services"
86 /etc/init.d/network restart 2&> /dev/null
87 for cfg in $cfgs; do
88 /etc/init.d/$cfg restart 2&> /dev/null
89 done
90 }
91
92 boot() {
93 if [ "$enable" = "1" ]; then
94 [ -d /var/state ] || mkdir -p /var/state
95 touch /var/state/freifunk-policyrouting
96 start noservicerestart
97 else
98 olsrd_rmtables
99 fi
100 }
101
102 add_lookup_rule() {
103 name=${1/-/_}
104 lookup=$2
105 prio=$3
106
107 if [ -z "$name" -o -z "$lookup" -o -z "$prio" ]; then
108 logger -s -t policyrouting "Missing parameters for add_rule!"
109 else
110 for p in $proto; do
111 if [ "$p" = "6" ]; then
112 rule="rule6"
113 else
114 rule="rule"
115 fi
116
117 uci batch <<- EOF
118 set network.${name}ipv${p}="$rule"
119 set network.${name}ipv${p}.lookup="$lookup"
120 set network.${name}ipv${p}.priority="$prio"
121 EOF
122 done
123 fi
124 }
125
126 del_lookup_rule() {
127 name=${1/-/_}
128 for p in $proto; do
129 uci -q delete network.${name}ipv${p}
130 done
131 }
132
133 start() {
134 if [ $enable = "1" ]; then
135 logger -s -t policyrouting "Starting policy routing."
136 rt_tables
137 olsrd_intalltables
138 disable_dyngw
139
140 add_lookup_rule olsr olsr 1000
141 add_lookup_rule localnets localnets 2000
142
143 if [ "$fallback" = 1 ]; then
144 add_lookup_rule olsr-default olsr-default 100000
145 fi
146 fi
147 uci commit network
148 if [ ! "$1" = "noservicerestart" ]; then
149 restart_services
150 fi
151 }
152
153 stop() {
154 logger -s -t policyrouting "Stopping 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 restart_services
161 echo "Hint: To completely disable freifunk-policyrouting set enable=0 in /etc/config/freifunk-policyrouting."
162 }
163
164 restart() {
165 logger -s -t policyrouting "Restarting policy routing"
166 olsrd_rmtables
167 del_lookup_rule olsr-default
168 del_lookup_rule olsr
169 del_lookup_rule localnets
170 uci commit network
171 start
172 }