fix olsrd cflags handling, add new init script and config by Alina Friedrichsen
[openwrt/svn-archive/archive.git] / net / olsrd / files / olsrd.init
1 #!/bin/sh /etc/rc.common
2 START=50
3
4 BIN=olsrd
5 CONF_F=/var/etc/olsrd.conf
6 USE_CONF_F=
7 DEFAULT=/etc/default/olsrd
8 RUN_D=/var/run
9 PID_F=$RUN_D/$BIN.pid
10
11 format_olsr_option() {
12 local str="$*"
13 echo -n "$str" | tr -d '\n\r\t\v '
14 }
15
16 format_olsr_value() {
17 local str="$*"
18 echo -n "$str" | tr -d '\n\r\v'
19 }
20
21 format_olsr_param() {
22 local str="$*"
23 echo -n "$str" | tr -d '\n\r\v"'
24 }
25
26 format_uci_varname() {
27 local str="$*"
28 echo -n "$str" | sed -e 's/[^a-zA-Z0-9_]//g'
29 }
30
31 foreach_olsr() {
32 local cfg="$1"
33 local option
34 local value
35
36 for option in $CONFIG_OPTIONS
37 do
38 config_get value "$cfg" "$option"
39 option=$(format_olsr_option "$option")
40 value=$(format_olsr_value "$value")
41
42 if [ -n "$value" -a "$option" != "ConfigFile" ]; then
43 echo "$option $value" >> "$CONF_F"
44 fi
45 done
46 echo >> "$CONF_F"
47 }
48
49 foreach_Hna4() {
50 local cfg="$1"
51 local netaddr
52 local netmask
53
54 config_get netaddr "$cfg" NetAddr
55 config_get netmask "$cfg" NetMask
56 netaddr=$(format_olsr_option "$netaddr")
57 netmask=$(format_olsr_option "$netmask")
58
59 if [ -n "$netaddr" -a -n "$netmask" ]; then
60 if [ "$HNA4_COUNT" -le 0 ]; then
61 echo "Hna4" >> "$CONF_F"
62 echo "{" >> "$CONF_F"
63 fi
64
65 echo " $netaddr $netmask" >> "$CONF_F"
66 HNA4_COUNT=$((HNA4_COUNT + 1))
67 fi
68 }
69
70 write_Hna4() {
71 if [ "$HNA4_COUNT" -gt 0 ]; then
72 echo "}" >> "$CONF_F"
73 echo >> "$CONF_F"
74 fi
75 }
76
77 foreach_Hna6() {
78 local cfg="$1"
79 local netaddr
80 local netmask
81
82 config_get netaddr "$cfg" NetAddr
83 config_get prefix "$cfg" Prefix
84 netaddr=$(format_olsr_option "$netaddr")
85 prefix=$(format_olsr_option "$prefix")
86
87 if [ -n "$netaddr" -a -n "$prefix" ]; then
88 if [ "$HNA6_COUNT" -le 0 ]; then
89 echo "Hna6" >> "$CONF_F"
90 echo "{" >> "$CONF_F"
91 fi
92
93 echo " $netaddr $prefix" >> "$CONF_F"
94 HNA6_COUNT=$((HNA6_COUNT + 1))
95 fi
96 }
97
98 write_Hna6() {
99 if [ "$HNA6_COUNT" -gt 0 ]; then
100 echo "}" >> "$CONF_F"
101 echo >> "$CONF_F"
102 fi
103 }
104
105 foreach_IpcConnect() {
106 local cfg="$1"
107 local option
108 local value
109 local c
110
111 echo "IpcConnect" >> "$CONF_F"
112 echo -n "{" >> "$CONF_F"
113
114 for option in $CONFIG_OPTIONS
115 do
116 config_get value "$cfg" "$option"
117 option=$(format_olsr_option "$option")
118 value=$(format_olsr_value "$value")
119
120 if [ -n "$value" ]; then
121 if [ "$option" = "Host" ]; then
122 for item in $value
123 do
124 echo >> "$CONF_F"
125 echo -n " $option $item" >> "$CONF_F"
126 done
127 elif [ "$option" = "Net" ]; then
128 c=0
129 for item in $value
130 do
131 if [ $((c % 2)) -eq 0 ]; then
132 echo >> "$CONF_F"
133 echo -n " $option $item" >> "$CONF_F"
134 else
135 echo -n " $item" >> "$CONF_F"
136 fi
137 c=$((c + 1))
138 done
139 else
140 echo >> "$CONF_F"
141 echo -n " $option $value" >> "$CONF_F"
142 fi
143 fi
144 done
145
146 echo >> "$CONF_F"
147 echo "}" >> "$CONF_F"
148 echo >> "$CONF_F"
149 }
150
151 foreach_LoadPlugin() {
152 local cfg="$1"
153 local library
154 local option
155 local value
156 local is_ip_addr
157 local item
158 local c
159
160 config_get library "$cfg" Library
161 library=$(format_olsr_param "$library")
162
163 if [ -n "$library" ]; then
164 echo "LoadPlugin \"$library\"" >> "$CONF_F"
165 echo -n "{" >> "$CONF_F"
166
167 for option in $CONFIG_OPTIONS
168 do
169 config_get value "$cfg" "$option"
170 option=$(format_olsr_param "$option")
171 value=$(format_olsr_param "$value")
172
173 if [ -n "$value" ]; then
174 option=$(echo "$option" | sed -e y/[_]/[-]/)
175
176 is_ip_addr=$(echo "$option" | sed -e 's/[^-]//g')
177 if [ "$is_ip_addr" = "---" ]; then
178 option=$(echo "$option" | sed -e y/[-]/[.]/)
179 fi
180
181 if [ "$option" = "Ping" -o "$option" = "redistribute" -o "$option" = "Host" -o "$option" = "NonOlsrIf" -o "$option" = "name" -o "$is_ip_addr" = "---" ]; then
182 for item in $value
183 do
184 echo >> "$CONF_F"
185 echo -n " PlParam \"$option\" \"$item\"" >> "$CONF_F"
186 done
187 elif [ "$option" = "Net" -o "$option" = "HNA" ]; then
188 c=0
189 for item in $value
190 do
191 if [ $((c % 2)) -eq 0 ]; then
192 echo >> "$CONF_F"
193 echo -n " PlParam \"$option\" \"$item" >> "$CONF_F"
194 else
195 echo -n " $item\"" >> "$CONF_F"
196 fi
197 c=$((c + 1))
198 done
199 elif [ "$option" != "Library" ]; then
200 echo >> "$CONF_F"
201 echo -n " PlParam \"$option\" \"$value\"" >> "$CONF_F"
202 fi
203 fi
204 done
205
206 echo >> "$CONF_F"
207 echo "}" >> "$CONF_F"
208 echo >> "$CONF_F"
209 fi
210 }
211
212 foreach_Interface() {
213 local cfg="$1"
214 local interfaces
215 local interface
216 local ifname
217 local option
218 local value
219 local item
220 local c
221
222 config_get interfaces "$cfg" Interface
223
224 if [ -n "$interfaces" ]; then
225 echo -n "Interface" >> "$CONF_F"
226
227 for interface in $interfaces
228 do
229 interface=$(format_uci_varname "$interface")
230 config_get ifnames "$interface" ifname
231 for ifname in $ifnames
232 do
233 ifname=$(format_olsr_param "$ifname")
234 echo -n " \"$ifname\"" >> "$CONF_F"
235 done
236 done
237
238 echo >> "$CONF_F"
239 echo -n "{" >> "$CONF_F"
240
241 for option in $CONFIG_OPTIONS
242 do
243 config_get value "$cfg" "$option"
244 option=$(format_olsr_option "$option")
245 value=$(format_olsr_value "$value")
246
247 if [ -n "$value" ]; then
248 if [ "$option" = "LinkQualityMult" ]; then
249 c=0
250 for item in $value
251 do
252 if [ $((c % 2)) -eq 0 ]; then
253 echo >> "$CONF_F"
254 echo -n " $option $item" >> "$CONF_F"
255 else
256 echo -n " $item" >> "$CONF_F"
257 fi
258 c=$((c + 1))
259 done
260 elif [ "$option" != "Interface" ]; then
261 echo >> "$CONF_F"
262 echo -n " $option $value" >> "$CONF_F"
263 fi
264 fi
265 done
266
267 echo >> "$CONF_F"
268 echo "}" >> "$CONF_F"
269 fi
270 }
271
272 write_config() {
273 include /lib/network
274 scan_interfaces
275 config_load /var/state/network
276
277 config_cb() {
278 local cfgtype="$1"
279 local name="$2"
280 CONFIG_TYPE="$cfgtype"
281 }
282
283 option_cb() {
284 local varname="$1"
285 local value="$2"
286
287 if [ "$CONFIG_TYPE" = "OLSR" -a "$varname" = "ConfigFile" ]; then
288 USE_CONF_F="$value"
289 fi
290
291 if ! echo "$CONFIG_OPTIONS" | grep " $varname " > /dev/null; then
292 CONFIG_OPTIONS="$CONFIG_OPTIONS $varname "
293 fi
294 }
295
296 CONFIG_OPTIONS=""
297 config_load olsr
298
299 if [ -n "$USE_CONF_F" ]; then
300 return 0
301 else
302 USE_CONF_F="$CONF_F"
303 fi
304
305 mkdir -p $(dirname "$CONF_F")
306 > "$CONF_F"
307 config_foreach foreach_olsr olsr
308 HNA4_COUNT=0
309 config_foreach foreach_Hna4 Hna4
310 write_Hna4
311 HNA6_COUNT=0
312 config_foreach foreach_Hna6 Hna6
313 write_Hna6
314 config_foreach foreach_IpcConnect IpcConnect
315 config_foreach foreach_LoadPlugin LoadPlugin
316 config_foreach foreach_Interface Interface
317 }
318
319 start() {
320 [ -z "$USE_CONF_F" ] && write_config
321
322 [ -f $DEFAULT ] && . $DEFAULT
323 $BIN -f "$USE_CONF_F" -nofork $OPTIONS &
324
325 # write pid file (but strip out own pid ($$))
326 mkdir -p $RUN_D
327 PID=`pidof $BIN`
328 echo ${PID%$$} > $PID_F
329 }
330
331 stop() {
332 killall olsrd
333 }