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