[packages] olsrd: init: cleanup an expensive/forky call
[openwrt/svn-archive/archive.git] / net / olsrd / files / olsrd.init
1 #!/bin/sh /etc/rc.common
2 # Copyright (C) 2008-2012 OpenWrt.org
3
4 START=65
5
6 SERVICE_DAEMONIZE=1
7 SERVICE_WRITE_PID=1
8
9 CONF=/var/etc/olsrd.conf
10 PID=/var/run/olsrd.pid
11 PID6=/var/run/olsrd.ipv6.pid
12
13 OLSRD_OLSRD_SCHEMA='ignore:internal config_file:internal DebugLevel=0 AllowNoInt=yes'
14 OLSRD_IPCCONNECT_SCHEMA='ignore:internal Host:list Net:list2'
15 OLSRD_LOADPLUGIN_SCHEMA='ignore:internal library:internal Host4:list Net4:list2 Host:list Net:list2 Host6:list Net6:list2 Ping:list redistribute:list NonOlsrIf:list name:list lat lon latlon_infile HNA:list2 hosts:list2'
16 OLSRD_INTERFACE_SCHEMA='ignore:internal interface:internal AutoDetectChanges:bool'
17 OLSRD_INTERFACE_DEFAULTS_SCHEMA='AutoDetectChanges:bool'
18
19 T=' '
20 N='
21 '
22
23 log()
24 {
25 logger -t olsrd -p daemon.info -s "$1"
26 }
27
28 validate_varname() {
29 local varname="$1"
30 [ -z "$varname" -o "$varname" != "${varname%%[!A-Za-z0-9_]*}" ] && return 1
31 return 0
32 }
33
34 validate_olsrd_option() {
35 local str="$1"
36 [ -z "$str" -o "$str" != "${str%%[! 0-9A-Za-z./|:_-]*}" ] && return 1
37 return 0
38 }
39
40 system_config() {
41 local cfg="$1"
42 local cfgt
43 local hostname
44 local latlon
45
46 config_get cfgt "$cfg" TYPE
47
48 if [ "$cfgt" = "system" ]; then
49 config_get hostname "$cfg" hostname
50 hostname="${hostname:-OpenWrt}"
51 SYSTEM_HOSTNAME="$hostname"
52 fi
53
54 if [ -z "$SYSTEM_LAT" -o -z "$SYSTEM_LON" ]; then
55 config_get latlon "$cfg" latlon
56 IFS=" ${T}${N},"
57 set -- $latlon
58 unset IFS
59 SYSTEM_LAT="$1"
60 SYSTEM_LON="$2"
61 fi
62
63 if [ -z "$SYSTEM_LAT" -o -z "$SYSTEM_LON" ]; then
64 config_get latlon "$cfg" latitude
65 SYSTEM_LAT="$latlon"
66 config_get latlon "$cfg" longitude
67 SYSTEM_LON="$latlon"
68 fi
69 }
70
71 olsrd_find_config_file() {
72 local cfg="$1"
73 validate_varname "$cfg" || return 0
74
75 config_get_bool ignore "$cfg" ignore 0
76 [ "$ignore" -ne 0 ] && return 0
77 config_get OLSRD_CONFIG_FILE "$cfg" config_file
78
79 return 0
80 }
81
82 warning_invalid_value() {
83 local funcname="warning_invalid_value"
84 local package="$1"
85 validate_varname "$package" || package=
86 local config="$2"
87 validate_varname "$config" || config=
88 local option="$3"
89 validate_varname "$option" || option=
90
91 if [ -n "$package" -a -n "$config" ]; then
92 log "$funcname() in option '$package.$config${option:+.}$option', skipped"
93 else
94 log "$funcname() skipped"
95 fi
96
97 return 0
98 }
99
100 olsrd_write_option() {
101 local param="$1"
102 local cfg="$2"
103 validate_varname "$cfg" || return 1
104 local option="$3"
105 validate_varname "$option" || return 1
106 local value="$4"
107 local option_type="$5"
108
109 if [ "$option_type" = bool ]; then
110 case "$value" in
111 1|on|true|enabled|yes) value=yes;;
112 0|off|false|disabled|no) value=no;;
113 *) warning_invalid_value olsrd "$cfg" "$option"; return 1;;
114 esac
115 fi
116
117 if ! validate_olsrd_option "$value"; then
118 warning_invalid_value olsrd "$cfg" "$option"
119 return 1
120 fi
121
122 if [ "$value" != "${value%%[G-Zg-z_-]*}" ]; then
123 if [ "$option" != "Ip6AddrType" -a "$option" != "LinkQualityMult" -a "$value" != "yes" -a "$value" != "no" ]; then
124 value="\"$value\""
125 fi
126 fi
127
128 echo -n "${N}$param$option $value"
129
130 return 0
131 }
132
133 olsrd_write_plparam() {
134 local funcname="olsrd_write_plparam"
135 local param="$1"
136 local cfg="$2"
137 validate_varname "$cfg" || return 1
138 local option="$3"
139 validate_varname "$option" || return 1
140 local value="$4"
141 local option_type="$5"
142 local _option
143
144 if [ "$option_type" = bool ]; then
145 case "$value" in
146 1|on|true|enabled|yes) value=yes;;
147 0|off|false|disabled|no) value=no;;
148 *) warning_invalid_value olsrd "$cfg" "$option"; return 1;;
149 esac
150 fi
151
152 if ! validate_olsrd_option "$value"; then
153 warning_invalid_value olsrd "$cfg" "$option"
154 return 1
155 fi
156
157 IFS='-_'
158 set -- $option
159 option="$*"
160 unset IFS
161 _option="$option"
162 if [ "$option" = 'hosts' ]; then
163 set -- $value
164 option="$1"
165 shift
166 value="$*"
167 fi
168 if [ "$option" = 'NonOlsrIf' ]; then
169 if validate_varname "$value"; then
170 if network_get_device ifname "$value"; then
171 log "$funcname() Info: mdns Interface '$value' ifname '$ifname' found"
172 else
173 log "$funcname() Warning: mdns Interface '$value' not found, skipped"
174 fi
175 else
176 warning_invalid_value olsrd "$cfg" "NonOlsrIf"
177 fi
178 [ -z "$ifname" ] || value=$ifname
179 fi
180
181 echo -n "${N}${param}PlParam \"$option\" \"$value\""
182
183 return 0
184 }
185
186 config_update_schema() {
187 unset IFS
188 local schema_varname="$1"
189 validate_varname "$schema_varname" || return 1
190 local command="$2"
191 validate_varname "$command" || return 1
192 local option="$3"
193 validate_varname "$option" || return 1
194 local value="$4"
195 local schema
196 local cur_option
197
198 case "$varname" in
199 *_LENGTH) return 0;;
200 *_ITEM*) return 0;;
201 esac
202
203 eval "export -n -- \"schema=\${$schema_varname}\""
204
205 for cur_option in $schema; do
206 [ "${cur_option%%[:=]*}" = "$option" ] && return 0
207 done
208
209 if [ "$command" = list ]; then
210 set -- $value
211 if [ "$#" -ge "3" ]; then
212 schema_entry="$option:list3"
213 elif [ "$#" -ge "2" ]; then
214 schema_entry="$option:list2"
215 else
216 schema_entry="$option:list"
217 fi
218 else
219 schema_entry="$option"
220 fi
221
222 append "$schema_varname" "$schema_entry"
223
224 return 0
225 }
226
227 config_write_options() {
228 unset IFS
229 local schema="$1"
230 local cfg="$2"
231 validate_varname "$cfg" || return 1
232 local write_func="$3"
233 [ -z "$write_func" ] && output_func=echo
234 local write_param="$4"
235 local schema_entry
236 local option
237 local option_length
238 local option_type
239 local default
240 local value
241 local list_size
242 local list_item
243 local list_value
244 local i
245 local position
246
247 for schema_entry in $schema; do
248 default="${schema_entry#*[=]}"
249 [ "$default" = "$schema_entry" ] && default=
250 option="${schema_entry%%[=]*}"
251 IFS=':'
252 set -- $option
253 unset IFS
254 option="$1"
255 option_type="$2"
256 validate_varname "$option" || continue
257 [ -z "$option_type" ] || validate_varname "$option_type" || continue
258 [ "$option_type" = internal ] && continue
259 config_get value "$cfg" "$option"
260
261 if [ -z "$value" ]; then
262 IFS='+'
263 set -- $default
264 unset IFS
265 value=$*
266 elif [ "$value" = '-' -a -n "$default" ]; then
267 continue
268 fi
269
270 [ -z "$value" ] && continue
271
272 case "$option_type" in
273 list) list_size=1;;
274 list2) list_size=2;;
275 list3) list_size=3;;
276 *) list_size=0;;
277 esac
278
279 if [ "$list_size" -gt 0 ]; then
280 config_get option_length "$cfg" "${option}_LENGTH"
281 if [ -n "$option_length" ]; then
282 i=1
283 while [ "$i" -le "$option_length" ]; do
284 config_get list_value "$cfg" "${option}_ITEM$i"
285 "$write_func" "$write_param" "$cfg" "$option" "$list_value" "$option_type" || break
286 i=$((i + 1))
287 done
288 else
289 list_value=
290 i=0
291 for list_item in $value; do
292 append "list_value" "$list_item"
293 i=$((i + 1))
294 position=$((i % list_size))
295 if [ "$position" -eq 0 ]; then
296 "$write_func" "$write_param" "$cfg" "$option" "$list_value" "$option_type" || break
297 list_value=
298 fi
299 done
300 [ "$position" -ne 0 ] && "$write_func" "$write_param" "$cfg" "$option" "$list_value" "$option_type"
301 fi
302 else
303 "$write_func" "$write_param" "$cfg" "$option" "$value" "$option_type"
304 fi
305 done
306
307 return 0
308 }
309
310 olsrd_write_olsrd() {
311 local cfg="$1"
312 validate_varname "$cfg" || return 0
313 local ignore
314
315 config_get_bool ignore "$cfg" ignore 0
316 [ "$ignore" -ne 0 ] && return 0
317
318 [ "$OLSRD_COUNT" -gt 0 ] && return 0
319
320 config_get ipversion "$cfg" IpVersion
321 if [ "$ipversion" = "6and4" ]; then
322 OLSRD_IPVERSION_6AND4=1
323 config_set "$cfg" IpVersion '6'
324 fi
325 config_get smartgateway "$cfg" SmartGateway
326 config_get smartgatewayuplink "$cfg" SmartGatewayUplink
327
328 config_write_options "$OLSRD_OLSRD_SCHEMA" "$cfg" olsrd_write_option
329 echo
330 OLSRD_COUNT=$((OLSRD_COUNT + 1))
331 return 0
332 }
333
334 olsrd_write_ipcconnect() {
335 local cfg="$1"
336 validate_varname "$cfg" || return 0
337 local ignore
338
339 config_get_bool ignore "$cfg" ignore 0
340 [ "$ignore" -ne 0 ] && return 0
341
342 [ "$IPCCONNECT_COUNT" -gt 0 ] && return 0
343
344 echo -n "${N}IpcConnect${N}{"
345 config_write_options "$OLSRD_IPCCONNECT_SCHEMA" "$cfg" olsrd_write_option "${T}"
346 echo "${N}}"
347 IPCCONNECT_COUNT=$((IPCCONNECT_COUNT + 1))
348
349 return 0
350 }
351
352 olsrd_write_hna4() {
353 local cfg="$1"
354 validate_varname "$cfg" || return 0
355 local ignore
356
357 config_get_bool ignore "$cfg" ignore 0
358 [ "$ignore" -ne 0 ] && return 0
359
360 config_get netaddr "$cfg" netaddr
361 if ! validate_olsrd_option "$netaddr"; then
362 warning_invalid_value olsrd "$cfg" "netaddr"
363 return 0
364 fi
365
366 config_get netmask "$cfg" netmask
367 if ! validate_olsrd_option "$netmask"; then
368 warning_invalid_value olsrd "$cfg" "netmask"
369 return 0
370 fi
371
372 [ "$HNA4_COUNT" -le 0 ] && echo -n "${N}Hna4${N}{"
373 echo -n "${N}${T}${T}$netaddr $netmask"
374 HNA4_COUNT=$((HNA4_COUNT + 1))
375
376 return 0
377 }
378
379 olsrd_write_hna6() {
380 local cfg="$1"
381 validate_varname "$cfg" || return 0
382 local ignore
383
384 config_get_bool ignore "$cfg" ignore 0
385 [ "$ignore" -ne 0 ] && return 0
386
387 config_get netaddr "$cfg" netaddr
388 if ! validate_olsrd_option "$netaddr"; then
389 warning_invalid_value olsrd "$cfg" "netaddr"
390 return 0
391 fi
392
393 config_get prefix "$cfg" prefix
394 if ! validate_olsrd_option "$prefix"; then
395 warning_invalid_value olsrd "$cfg" "prefix"
396 return 0
397 fi
398
399 [ "$HNA6_COUNT" -le 0 ] && echo -n "${N}Hna6${N}{"
400 echo -n "${N}${T}${T}$netaddr $prefix"
401 HNA6_COUNT=$((HNA6_COUNT + 1))
402
403 return 0
404 }
405
406 olsrd_write_loadplugin() {
407 local funcname="olsrd_write_loadplugin"
408 local cfg="$1"
409 validate_varname "$cfg" || return 0
410 local ignore
411 local name
412 local suffix
413 local lat
414 local lon
415 local latlon_infile
416
417 config_get_bool ignore "$cfg" ignore 0
418 [ "$ignore" -ne 0 ] && return 0
419
420 config_get library "$cfg" library
421 if ! validate_olsrd_option "$library"; then
422 warning_invalid_value olsrd "$cfg" "library"
423 return 0
424 fi
425 if ! [ -x "/lib/$library" -o -x "/usr/lib/$library" -o -x "/usr/local/lib/$library" ]; then
426 log "$funcname() Warning: Plugin library '$library' not found, skipped"
427 return 0
428 fi
429
430 case "$library" in
431 olsrd_nameservice.*)
432 config_get name "$cfg" name
433 [ -z "$name" ] && config_set "$cfg" name $SYSTEM_HOSTNAME
434
435 config_get suffix "$cfg" suffix
436 [ -z "$suffix" ] && config_set "$cfg" suffix '.olsr'
437
438 config_get lat "$cfg" lat
439 config_get lon "$cfg" lon
440 config_get latlon_infile "$cfg" latlon_infile
441 if [ \( -z "$lat" -o -z "$lat" \) -a -z "$latlon_infile" ]; then
442 if [ -f '/var/run/latlon.txt' ]; then
443 config_set "$cfg" lat ''
444 config_set "$cfg" lon ''
445 config_set "$cfg" latlon_infile '/var/run/latlon.txt'
446 else
447 config_set "$cfg" lat "$SYSTEM_LAT"
448 config_set "$cfg" lon "$SYSTEM_LON"
449 fi
450 fi
451
452 for f in latlon_file hosts_file services_file resolv_file macs_file; do
453 config_get $f "$cfg" $f
454 done
455
456 [ -z "$latlon_file" ] && config_set "$cfg" latlon_file '/var/run/latlon.js'
457 ;;
458 olsrd_watchdog.*)
459 config_get wd_file "$cfg" file
460 ;;
461 esac
462
463 echo -n "${N}LoadPlugin \"$library\"${N}{"
464 config_write_options "$OLSRD_LOADPLUGIN_SCHEMA" "$cfg" olsrd_write_plparam "${T}"
465 echo "${N}}"
466
467 return 0
468 }
469
470 olsrd_write_interface() {
471 local funcname="olsrd_write_interface"
472 local cfg="$1"
473 validate_varname "$cfg" || return 0
474 local ignore
475 local interfaces
476 local interface
477 local ifnames
478
479 config_get_bool ignore "$cfg" ignore 0
480 [ "$ignore" -ne 0 ] && return 0
481
482 ifnames=
483 config_get interfaces "$cfg" interface
484 for interface in $interfaces; do
485 if validate_varname "$interface"; then
486 if network_get_device IFNAME "$interface"; then
487 ifnames="$ifnames \"$IFNAME\""
488 ifsglobal="$ifsglobal $IFNAME"
489 else
490 log "$funcname() Warning: Interface '$interface' not found, skipped"
491 fi
492 else
493 warning_invalid_value olsrd "$cfg" "interface"
494 fi
495 done
496
497 [ -z "$ifnames" ] && return 0
498
499 echo -n "${N}Interface$ifnames${N}{"
500 config_write_options "$OLSRD_INTERFACE_SCHEMA" "$cfg" olsrd_write_option "${T}"
501 echo "${N}}"
502 INTERFACES_COUNT=$((INTERFACES_COUNT + 1))
503
504 return 0
505 }
506
507 olsrd_write_interface_defaults() {
508 local cfg="$1"
509 validate_varname "$cfg" || return 0
510
511 echo -n "${N}InterfaceDefaults$ifnames${N}{"
512 config_write_options "$OLSRD_INTERFACE_DEFAULTS_SCHEMA" "$cfg" olsrd_write_option "${T}"
513 echo "${N}}"
514
515 return 1
516 }
517
518 olsrd_update_schema() {
519 local command="$1"
520 validate_varname "$command" || return 0
521 local varname="$2"
522 validate_varname "$varname" || return 0
523 local value="$3"
524 local cfg="$CONFIG_SECTION"
525 local cfgt
526 local cur_varname
527
528 config_get cfgt "$cfg" TYPE
529 case "$cfgt" in
530 olsrd) config_update_schema OLSRD_OLSRD_SCHEMA "$command" "$varname" "$value";;
531 IpcConnect) config_update_schema OLSRD_IPCCONNECT_SCHEMA "$command" "$varname" "$value";;
532 LoadPlugin) config_update_schema OLSRD_LOADPLUGIN_SCHEMA "$command" "$varname" "$value";;
533 Interface) config_update_schema OLSRD_INTERFACE_SCHEMA "$command" "$varname" "$value";;
534 InterfaceDefaults) config_update_schema OLSRD_INTERFACE_DEFAULTS_SCHEMA "$command" "$varname" "$value";;
535 esac
536
537 return 0
538 }
539
540 olsrd_write_config() {
541 OLSRD_IPVERSION_6AND4=0
542 OLSRD_COUNT=0
543 config_foreach olsrd_write_olsrd olsrd
544 IPCCONNECT_COUNT=0
545 config_foreach olsrd_write_ipcconnect IpcConnect
546 HNA4_COUNT=0
547 config_foreach olsrd_write_hna4 Hna4
548 [ "$HNA4_COUNT" -gt 0 ] && echo "${N}}"
549 HNA6_COUNT=0
550 config_foreach olsrd_write_hna6 Hna6
551 [ "$HNA6_COUNT" -gt 0 ] && echo "${N}}"
552 config_foreach olsrd_write_loadplugin LoadPlugin
553 INTERFACES_COUNT=0
554 config_foreach olsrd_write_interface_defaults InterfaceDefaults
555 config_foreach olsrd_write_interface Interface
556 echo
557
558 return 0
559 }
560
561 get_wan_ifnames()
562 {
563 local wanifnames word catch_next
564
565 which ip >/dev/null || return 1
566
567 set -- $( ip route list exact 0.0.0.0/0 table all )
568 for word in $*; do
569 case "$word" in
570 dev)
571 catch_next="true"
572 ;;
573 *)
574 [ -n "$catch_next" ] && {
575 case "$wanifnames" in
576 *" $word "*)
577 ;;
578 *)
579 wanifnames="$wanifnames $word "
580 ;;
581 esac
582
583 catch_next=
584 }
585 ;;
586 esac
587 done
588
589 echo "$wanifnames"
590 }
591
592 olsrd_setup_smartgw_rules() {
593 local funcname="olsrd_setup_smartgw_rules"
594 # Check if ipip is installed
595 [ -e /etc/modules.d/[0-9]*-ipip ] || {
596 log "$funcname() Warning: kmod-ipip is missing. SmartGateway will not work until you install it."
597 return 1
598 }
599
600 local wanifnames="$( get_wan_ifnames )"
601
602 if [ -z "$wanifnames" ]; then
603 nowan=1
604 else
605 nowan=0
606 fi
607
608 IP4T=$(which iptables)
609 IP6T=$(which ip6tables)
610
611 # Delete smartgw firewall rules first
612 for IPT in $IP4T $IP6T; do
613 while $IPT -D forwarding_rule -o tnl_+ -j ACCEPT 2> /dev/null; do :;done
614 for IFACE in $wanifnames; do
615 while $IPT -D forwarding_rule -i tunl0 -o $IFACE -j ACCEPT 2> /dev/null; do :; done
616 done
617 for IFACE in $ifsglobal; do
618 while $IPT -D input_rule -i $IFACE -p 4 -j ACCEPT 2> /dev/null; do :; done
619 done
620 done
621 while $IP4T -t nat -D postrouting_rule -o tnl_+ -j MASQUERADE 2> /dev/null; do :;done
622
623 if [ "$smartgateway" == "yes" ]; then
624 log "$funcname() Notice: Inserting firewall rules for SmartGateway"
625 if [ ! "$smartgatewayuplink" == "none" ]; then
626 if [ "$smartgatewayuplink" == "ipv4" ]; then
627 # Allow everything to be forwarded to tnl_+ and use NAT for it
628 $IP4T -I forwarding_rule -o tnl_+ -j ACCEPT
629 $IP4T -t nat -I postrouting_rule -o tnl_+ -j MASQUERADE
630 # Allow forwarding from tunl0 to (all) wan-interfaces
631 if [ "$nowan"="0" ]; then
632 for IFACE in $wanifnames; do
633 $IP4T -A forwarding_rule -i tunl0 -o $IFACE -j ACCEPT
634 done
635 fi
636 # Allow incoming ipip on all olsr-interfaces
637 for IFACE in $ifsglobal; do
638 $IP4T -I input_rule -i $IFACE -p 4 -j ACCEPT
639 done
640 elif [ "$smartgatewayuplink" == "ipv6" ]; then
641 $IP6T -I forwarding_rule -o tnl_+ -j ACCEPT
642 if [ "$nowan"="0" ]; then
643 for IFACE in $wanifnames; do
644 $IP6T -A forwarding_rule -i tunl0 -o $IFACE -j ACCEPT
645 done
646 fi
647 for IFACE in $ifsglobal; do
648 $IP6T -I input_rule -i $IFACE -p 4 -j ACCEPT
649 done
650 else
651 for IPT in $IP4T $IP6T; do
652 $IPT -I forwarding_rule -o tnl_+ -j ACCEPT
653 $IPT -t nat -I postrouting_rule -o tnl_+ -j MASQUERADE
654 if [ "$nowan"="0" ]; then
655 for IFACE in $wanifnames; do
656 $IPT -A forwarding_rule -i tunl0 -o $IFACE -j ACCEPT
657 done
658 fi
659 for IFACE in $ifsglobal; do
660 $IPT -I input_rule -i $IFACE -p 4 -j ACCEPT
661 done
662 done
663 fi
664 fi
665 fi
666 }
667
668 error() {
669 log "error() ${initscript}: $@"
670 }
671
672 start() {
673 SYSTEM_HOSTNAME=
674 SYSTEM_LAT=
675 SYSTEM_LON=
676 config_load system
677 config_foreach system_config system
678
679 option_cb() {
680 olsrd_update_schema "option" "$@"
681 }
682
683 list_cb() {
684 olsrd_update_schema "list" "$@"
685 }
686
687 . /lib/functions/network.sh
688
689 config_load olsrd
690 reset_cb
691
692 OLSRD_CONFIG_FILE=
693 config_foreach olsrd_find_config_file olsrd
694
695 if [ -z "$OLSRD_CONFIG_FILE" ]; then
696 mkdir -p -- /var/etc/
697 olsrd_write_config > /var/etc/olsrd.conf
698 if [ "$INTERFACES_COUNT" -gt 0 -a "$OLSRD_COUNT" -gt 0 ]; then
699 OLSRD_CONFIG_FILE=/var/etc/olsrd.conf
700 fi
701 fi
702
703 [ -z "$OLSRD_CONFIG_FILE" ] && return 1
704
705 local bindv6only='0'
706 if [ "$OLSRD_IPVERSION_6AND4" -ne 0 ]; then
707 bindv6only="$(sysctl -n net.ipv6.bindv6only)"
708 sysctl -w net.ipv6.bindv6only=1 > /dev/null
709 sed -e '/[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}/d' < "$OLSRD_CONFIG_FILE" > /var/etc/olsrd.conf.ipv6
710 sed -e 's/^IpVersion[ ][ ]*6$/IpVersion 4/' -e 's/^\t\t[A-Fa-f0-9.:]*[:][A-Fa-f0-9.:]*[ ][0-9]*$//' < "$OLSRD_CONFIG_FILE" > /var/etc/olsrd.conf.ipv4
711 rm $OLSRD_CONFIG_FILE
712
713 # some filenames should get the suffix .ipv6
714 for file in $latlon_file $hosts_file $services_file $resolv_file $macs_file $wd_file;do
715 f=$(echo $file|sed 's/\//\\\//g')
716 sed -i "s/$f/$f.ipv6/g" /var/etc/olsrd.conf.ipv6
717 done
718
719 SERVICE_PID_FILE="$PID6"
720 if service_check /usr/sbin/olsrd; then
721 error "there is already an IPv6 instance of olsrd running (pid: '$(cat $PID6)'), not starting."
722 else
723 service_start /usr/sbin/olsrd -f /var/etc/olsrd.conf.ipv6 -nofork
724 fi
725
726 SERVICE_PID_FILE="$PID"
727 if service_check /usr/sbin/olsrd; then
728 error "there is already an IPv4 instance of olsrd running (pid: '$(cat $PID)'), not starting."
729 else
730 service_start /usr/sbin/olsrd -f /var/etc/olsrd.conf.ipv4 -nofork
731 fi
732
733 sleep 3
734 sysctl -w net.ipv6.bindv6only="$bindv6only" > /dev/null
735
736 else
737
738 if [ "$ipversion" = "6" ]; then
739 sed -i '/[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}/d' "$OLSRD_CONFIG_FILE"
740 fi
741
742 SERVICE_PID_FILE="$PID"
743 if service_check /usr/sbin/olsrd; then
744 error "there is already an IPv4 instance of olsrd running (pid: '$(cat $PID)'), not starting."
745 return 1
746 else
747 service_start /usr/sbin/olsrd -f "$OLSRD_CONFIG_FILE" -nofork
748 fi
749 fi
750 olsrd_setup_smartgw_rules
751 }
752
753 stop() {
754 SERVICE_PID_FILE="$PID"
755 service_stop /usr/sbin/olsrd
756
757 SERVICE_PID_FILE="$PID6"
758 service_stop /usr/sbin/olsrd
759 }