1 #!/bin/sh /etc/rc.common
2 # Copyright (C) 2008 Alina Friedrichsen <x-alina@gmx.net>
3 # Special thanks to bittorf wireless ))
6 OLSRD_OLSRD_SCHEMA
='ignore:internal config_file:internal DebugLevel=0 IpVersion=4 AllowNoInt:bool=1 Pollrate=0.025 TcRedundancy=2 MprCoverage=3 LinkQualityFishEye=1 LinkQualityWinSize=100 LinkQualityDijkstraLimit=0+9.0 LinkQualityLevel=2 UseHysteresis:bool=0 FIBMetric=flat ClearScreen:bool=1 Willingness=3 LinkQualityAging=0.1 LinkQualityAlgorithm=etx_fpm'
7 OLSRD_IPCCONNECT_SCHEMA
='ignore:internal Host:list Net:list2'
8 OLSRD_LOADPLUGIN_SCHEMA
='ignore:internal library:internal Host:list Net:list2 Ping:list redistribute:list NonOlsrIf:list name:list lat lon latlon_infile HNA:list2 hosts:list2'
9 OLSRD_INTERFACE_SCHEMA
='ignore:internal interface:internal AutoDetectChanges:bool Ip4Broadcast=255.255.255.255 HelloInterval=2.0 HelloValidityTime=40.0 TcInterval=5.0 TcValidityTime=100.0 MidInterval=18.0 MidValidityTime=324.0 HnaInterval=18.0 HnaValidityTime=108.0'
17 [ -z "$varname" -o "$varname" != "${varname%%[!A-Za-z0-9_]*}" ] && return 1
23 [ -z "$ifname" -o "$ifname" != "${ifname%%[!A-Za-z0-9.:_-]*}" ] && return 1
27 validate_olsrd_option
() {
29 [ -z "$str" -o "$str" != "${str%%[! 0-9A-Za-z./:_-]*}" ] && return 1
36 validate_varname
"$interface" ||
return 1
39 config_get ifname
"$interface" ifname
40 validate_ifname
"$ifname" ||
return 1
52 config_get cfgt
"$cfg" TYPE
54 if [ "$cfgt" = "system" ]; then
55 config_get hostname
"$cfg" hostname
56 hostname
=${hostname:-OpenWrt}
57 SYSTEM_HOSTNAME
=$hostname
60 if [ -z "$SYSTEM_LAT" -o -z "$SYSTEM_LON" ]; then
61 config_get latlon
"$cfg" latlon
70 olsrd_find_config_file
() {
72 validate_varname
"$cfg" ||
return 0
74 config_get_bool ignore
"$cfg" ignore
0
75 [ "$ignore" -ne 0 ] && return 0
76 config_get OLSRD_CONFIG_FILE
"$cfg" config_file
81 warning_invalid_value
() {
83 validate_varname
"$package" || package
=
85 validate_varname
"$config" || config
=
87 validate_varname
"$option" || option
=
89 echo -n "Warning: Invalid value" 1>&2
91 if [ -n "$package" -a -n "$config" ]; then
92 echo -n " in option '$package.$config${option:+.}$option'" 1>&2
100 olsrd_write_option
() {
103 validate_varname
"$cfg" ||
return 1
105 validate_varname
"$option" ||
return 1
109 if [ "$option_type" = bool
]; then
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;;
117 if ! validate_olsrd_option
"$value"; then
118 warning_invalid_value olsrd
"$cfg" "$option"
122 if [ "$value" != "${value%%[G-Zg-z_-]*}" ]; then
123 if [ "$value" != "yes" -a "$value" != "no" ]; then
128 echo -n "${N}$param$option $value"
133 olsrd_write_plparam
() {
136 validate_varname
"$cfg" ||
return 1
138 validate_varname
"$option" ||
return 1
143 if [ "$option_type" = bool
]; then
145 1|on|true|enabled|
yes) value
=yes;;
146 0|off|false|disabled|no
) value
=no
;;
147 *) warning_invalid_value olsrd
"$cfg" "$option"; return 1;;
151 if ! validate_olsrd_option
"$value"; then
152 warning_invalid_value olsrd
"$cfg" "$option"
161 if [ "$option" = 'hosts' ]; then
168 echo -n "${N}${param}PlParam \"$option\" \"$value\""
173 config_update_schema
() {
175 local schema_varname
=$1
176 validate_varname
"$schema_varname" ||
return 1
178 validate_varname
"$command" ||
return 1
180 validate_varname
"$option" ||
return 1
190 eval "export -n -- \"schema=\${$schema_varname}\""
192 for cur_option
in $schema; do
193 [ "${cur_option%%[:=]*}" = "$option" ] && return 0
196 if [ "$command" = list
]; then
198 if [ "$#" -ge "3" ]; then
199 schema_entry
="$option:list3"
200 elif [ "$#" -ge "2" ]; then
201 schema_entry
="$option:list2"
203 schema_entry
="$option:list"
206 schema_entry
="$option"
209 append
"$schema_varname" "$schema_entry"
214 config_write_options
() {
218 validate_varname
"$cfg" ||
return 1
220 [ -z "$write_func" ] && output_func
=echo
234 for schema_entry
in $schema; do
235 default
=${schema_entry#*[=]}
236 [ "$default" = "$schema_entry" ] && default
=
237 option
=${schema_entry%%[=]*}
243 validate_varname
"$option" ||
continue
244 [ -z "$option_type" ] || validate_varname
"$option_type" ||
continue
245 [ "$option_type" = internal
] && continue
246 config_get value
"$cfg" "$option"
248 if [ -z "$value" ]; then
253 elif [ "$value" = '-' -a -n "$default" ]; then
257 [ -z "$value" ] && continue
259 case "$option_type" in
266 if [ "$list_size" -gt 0 ]; then
267 config_get option_length
"$cfg" "${option}_LENGTH"
268 if [ -n "$option_length" ]; then
270 while [ "$i" -le "$option_length" ]; do
271 config_get list_value
"$cfg" "${option}_ITEM$i"
272 "$write_func" "$write_param" "$cfg" "$option" "$list_value" "$option_type" ||
break
278 for list_item
in $value; do
279 append
"list_value" "$list_item"
281 position
=$
((i
% list_size
))
282 if [ "$position" -eq 0 ]; then
283 "$write_func" "$write_param" "$cfg" "$option" "$list_value" "$option_type" ||
break
287 [ "$position" -ne 0 ] && "$write_func" "$write_param" "$cfg" "$option" "$list_value" "$option_type"
290 "$write_func" "$write_param" "$cfg" "$option" "$value" "$option_type"
297 olsrd_write_olsrd
() {
299 validate_varname
"$cfg" ||
return 0
302 config_get_bool ignore
"$cfg" ignore
0
303 [ "$ignore" -ne 0 ] && return 0
305 [ "$OLSRD_COUNT" -gt 0 ] && return 0
307 config_write_options
"$OLSRD_OLSRD_SCHEMA" "$cfg" olsrd_write_option
309 OLSRD_COUNT
=$
((OLSRD_COUNT
+ 1))
314 olsrd_write_ipcconnect
() {
316 validate_varname
"$cfg" ||
return 0
319 config_get_bool ignore
"$cfg" ignore
0
320 [ "$ignore" -ne 0 ] && return 0
322 [ "$IPCCONNECT_COUNT" -gt 0 ] && return 0
324 echo -n "${N}IpcConnect${N}{"
325 config_write_options
"$OLSRD_IPCCONNECT_SCHEMA" "$cfg" olsrd_write_option
"${T}"
327 IPCCONNECT_COUNT
=$
((IPCCONNECT_COUNT
+ 1))
334 validate_varname
"$cfg" ||
return 0
337 config_get_bool ignore
"$cfg" ignore
0
338 [ "$ignore" -ne 0 ] && return 0
340 config_get netaddr
"$cfg" netaddr
341 if ! validate_olsrd_option
"$netaddr"; then
342 warning_invalid_value olsrd
"$cfg" "netaddr"
346 config_get netmask
"$cfg" netmask
347 if ! validate_olsrd_option
"$netmask"; then
348 warning_invalid_value olsrd
"$cfg" "netmask"
352 [ "$HNA4_COUNT" -le 0 ] && echo -n "${N}Hna4${N}{"
353 echo -n "${N}${T}$netaddr $netmask"
354 HNA4_COUNT
=$
((HNA4_COUNT
+ 1))
361 validate_varname
"$cfg" ||
return 0
364 config_get_bool ignore
"$cfg" ignore
0
365 [ "$ignore" -ne 0 ] && return 0
367 config_get netaddr
"$cfg" netaddr
368 if ! validate_olsrd_option
"$netaddr"; then
369 warning_invalid_value olsrd
"$cfg" "netaddr"
373 config_get prefix
"$cfg" prefix
374 if ! validate_olsrd_option
"$prefix"; then
375 warning_invalid_value olsrd
"$cfg" "prefix"
379 [ "$HNA6_COUNT" -le 0 ] && echo -n "${N}Hna6${N}{"
380 echo -n "${N}${T}$netaddr $prefix"
381 HNA6_COUNT
=$
((HNA6_COUNT
+ 1))
386 olsrd_write_loadplugin
() {
388 validate_varname
"$cfg" ||
return 0
396 config_get_bool ignore
"$cfg" ignore
0
397 [ "$ignore" -ne 0 ] && return 0
399 config_get library
"$cfg" library
400 if ! validate_olsrd_option
"$library"; then
401 warning_invalid_value olsrd
"$cfg" "library"
404 if ! [ -x "/lib/$library" -o -x "/usr/lib/$library" -o -x "/usr/local/lib/$library" ]; then
405 echo "Warning: Plugin library '$library' not found, skipped" 1>&2
411 config_get name
"$cfg" name
412 [ -z "$name" ] && config_set
"$cfg" name
$SYSTEM_HOSTNAME
414 config_get suffix
"$cfg" suffix
415 [ -z "$suffix" ] && config_set
"$cfg" suffix
'.olsr'
417 config_get lat
"$cfg" lat
418 config_get lon
"$cfg" lon
419 config_get latlon_infile
"$cfg" latlon_infile
420 if [ \
( -z "$lat" -o -z "$lat" \
) -a -z "$latlon_infile" ]; then
421 if [ -f '/var/run/latlon.txt' ]; then
422 config_set
"$cfg" lat
''
423 config_set
"$cfg" lon
''
424 config_set
"$cfg" latlon_infile
'/var/run/latlon.txt'
426 config_set
"$cfg" lat
"$SYSTEM_LAT"
427 config_set
"$cfg" lon
"$SYSTEM_LON"
431 config_get latlon_file
"$cfg" latlon_file
432 [ -z "$latlon_file" ] && config_set
"$cfg" latlon_file
'/var/run/latlon.js'
436 echo -n "${N}LoadPlugin \"$library\"${N}{"
437 config_write_options
"$OLSRD_LOADPLUGIN_SCHEMA" "$cfg" olsrd_write_plparam
"${T}"
443 olsrd_write_interface
() {
445 validate_varname
"$cfg" ||
return 0
451 config_get_bool ignore
"$cfg" ignore
0
452 [ "$ignore" -ne 0 ] && return 0
455 config_get interfaces
"$cfg" interface
456 for interface
in $interfaces; do
457 if validate_varname
"$interface"; then
458 if get_ifname
"$interface"; then
459 ifnames
="$ifnames \"$IFNAME\""
461 echo "Warning: Interface '$interface' not found, skipped" 1>&2
464 warning_invalid_value olsrd
"$cfg" "interface"
468 [ -z "$ifnames" ] && return 0
470 echo -n "${N}Interface$ifnames${N}{"
471 config_write_options
"$OLSRD_INTERFACE_SCHEMA" "$cfg" olsrd_write_option
"${T}"
473 INTERFACES_COUNT
=$
((INTERFACES_COUNT
+ 1))
478 olsrd_update_schema
() {
480 validate_varname
"$command" ||
return 0
482 validate_varname
"$varname" ||
return 0
484 local cfg
="$CONFIG_SECTION"
488 config_get cfgt
"$cfg" TYPE
490 olsrd
) config_update_schema OLSRD_OLSRD_SCHEMA
"$command" "$varname" "$value";;
491 IpcConnect
) config_update_schema OLSRD_IPCCONNECT_SCHEMA
"$command" "$varname" "$value";;
492 LoadPlugin
) config_update_schema OLSRD_LOADPLUGIN_SCHEMA
"$command" "$varname" "$value";;
493 Interface
) config_update_schema OLSRD_INTERFACE_SCHEMA
"$command" "$varname" "$value";;
499 olsrd_write_config
() {
501 config_foreach olsrd_write_olsrd olsrd
503 config_foreach olsrd_write_ipcconnect IpcConnect
505 config_foreach olsrd_write_hna4 Hna4
506 [ "$HNA4_COUNT" -gt 0 ] && echo "${N}}"
508 config_foreach olsrd_write_hna6 Hna6
509 [ "$HNA6_COUNT" -gt 0 ] && echo "${N}}"
510 config_foreach olsrd_write_loadplugin LoadPlugin
512 config_foreach olsrd_write_interface Interface
523 config_foreach system_config system
526 olsrd_update_schema
"option" "$@"
530 olsrd_update_schema
"list" "$@"
539 config_foreach olsrd_find_config_file olsrd
541 if [ -z "$OLSRD_CONFIG_FILE" ]; then
542 mkdir
-p -- /var
/etc
/
543 olsrd_write_config
> /var
/etc
/olsrd.conf
544 if [ "$INTERFACES_COUNT" -gt 0 -a "$OLSRD_COUNT" -gt 0 ]; then
545 OLSRD_CONFIG_FILE
=/var
/etc
/olsrd.conf
549 [ -z "$OLSRD_CONFIG_FILE" ] && return 1
551 olsrd
-f "$OLSRD_CONFIG_FILE" -nofork < /dev
/null
> /dev
/null
&