Skip to content

Commit

Permalink
babeld: Generate a configuration file instead of passing cmdline argu…
Browse files Browse the repository at this point in the history
…ments

This is the first step toward fixing issue openwrt#33.

This still lacks some features:

- no support for "ignore" options
- no backward compatibility for option names
- no support for default interface options
  • Loading branch information
Baptiste Jonglez authored and cjkoenig committed Sep 3, 2014
1 parent 68b27d9 commit 8bebfee
Showing 1 changed file with 63 additions and 69 deletions.
132 changes: 63 additions & 69 deletions babeld/files/babeld.init
@@ -1,18 +1,31 @@
#!/bin/sh /etc/rc.common

. /lib/functions/network.sh

START=70

pidfile='/var/run/babeld.pid'
CONFIGFILE='/var/etc/babeld.conf'
OTHERCONFIGFILE="/etc/babeld.conf"
EXTRA_COMMANDS="status"
EXTRA_HELP=" status Dump Babel's table to the log file."

listen_ifname() {
local ifname=$(uci_get_state network "$1" ifname "$1")
local switch="$2"
append args "$switch $ifname"
append interfaces "$ifname"
# Append a line to the configuration file
cfg_append() {
local value="$1"
echo "$value" >> $CONFIGFILE
}

cfg_append_option() {
local section="$1"
local option="$2"
local value
config_get value "$section" "$option"
# babeld convention for options is '-', not '_'
[ -n "$value" ] && cfg_append "${option//_/-} $value"
}

# Append to the "$buffer" variable
append_ifname() {
local section="$1"
local option="$2"
Expand All @@ -21,7 +34,7 @@ append_ifname() {
config_get _name "$section" "$option"
[ -z "$_name" ] && return 0
local ifname=$(uci_get_state network "$_name" ifname "$_name")
append args "$switch $ifname"
append buffer "$switch $ifname"
}

append_bool() {
Expand All @@ -30,13 +43,7 @@ append_bool() {
local value="$3"
local _loctmp
config_get_bool _loctmp "$section" "$option" 0
[ "$_loctmp" -gt 0 ] && append args "$value"
}

append_switch() {
local value="$1"
local switch="$2"
append args "$switch $value"
[ "$_loctmp" -gt 0 ] && append buffer "$value"
}

append_parm() {
Expand All @@ -46,7 +53,7 @@ append_parm() {
local _loctmp
config_get _loctmp "$section" "$option"
[ -z "$_loctmp" ] && return 0
append args "$switch $_loctmp"
append buffer "$switch $_loctmp"
}

babel_filter() {
Expand All @@ -56,9 +63,8 @@ babel_filter() {
local _ignored
config_get_bool _ignored "$cfg" 'ignore' 0
[ "$_ignored" -eq 1 ] && return 0

append args "-C '"

unset buffer
append_parm "$cfg" 'type' ''

append_bool "$cfg" 'local' 'local'
Expand All @@ -75,69 +81,57 @@ babel_filter() {

append_parm "$cfg" 'action' ''

append args ' ' "'"
cfg_append "$buffer"
}

babel_addif() {
local cfg="$1"

local _ignored
config_get_bool _ignored "$cfg" 'ignore' 0
[ "$_ignored" -eq 1 ] && return 0

listen_ifname "$cfg" "-C 'interface"

append_parm "$cfg" 'wired' 'wired'
append_parm "$cfg" 'link_quality' 'link-quality'
append_parm "$cfg" 'split_horizon' 'split-horizon'
append_parm "$cfg" 'rxcost' 'rxcost'
append_parm "$cfg" 'hello_interval' 'hello-interval'
append_parm "$cfg" 'update_interval' 'update-interval'
append_parm "$cfg" 'enable_timestamps' 'enable-timestamps'
append_parm "$cfg" 'max_rtt_penalty' 'max-rtt-penalty'
append_parm "$cfg" 'rtt_decay' 'rtt-decay'
append_parm "$cfg" 'rtt_min' 'rtt-min'
append_parm "$cfg" 'rtt_max' 'rtt-max'

append args ' ' "'"
# Only one of babeld's options is allowed multiple times, "import-table".
# We just append it multiple times.
list_cb() {
option_cb "$@"
}

babel_config() {
local cfg="$1"

append_bool "$cfg" 'carrier_sense' '-l'
append_bool "$cfg" 'assume_wireless' '-w'
append_bool "$cfg" 'no_split_horizon' '-s'
append_bool "$cfg" 'keep_unfeasible' '-u'
append_bool "$cfg" 'random_router_id' '-r'

append_parm "$cfg" 'multicast_address' '-m'
append_parm "$cfg" 'port' '-p'
append_parm "$cfg" 'state_file' '-S'
append_parm "$cfg" 'hello_interval' '-h'
append_parm "$cfg" 'wired_hello_interval' '-H'
append_parm "$cfg" 'diversity' '-z'
append_parm "$cfg" 'smoothing_half_time' '-M'
append_parm "$cfg" 'kernel_priority' '-k'
append_parm "$cfg" 'duplication_priority' '-A'
append_parm "$cfg" 'debug' '-d'
append_parm "$cfg" 'local_server' '-g'
append_parm "$cfg" 'export_table' '-t'
config_list_foreach "$cfg" 'import_table' append_switch '-T'
append_parm "$cfg" 'conf_file' '-c'
append_parm "$cfg" 'log_file' '-L'
config_cb() {
local type="$1"
local section="$2"
case "$type" in
"general")
option_cb() {
local option="$1"
local value="$2"
cfg_append "${option//_/-} $value"
}
;;
"interface")
unset interface
network_get_device interface "$section" || interface="$section"
option_cb() {
local option="$1"
local value="$2"
cfg_append "interface $interface ${option//_/-} $value"
}
# Also include an empty "interface $interface" statement, so
# that babeld operates on this interface.
cfg_append "interface $interface"
;;
*)
# Don't use reset_cb, this would also reset config_cb
option_cb() { return; }
;;
esac
}

start() {
mkdir -p /var/lib
# Start by emptying the generated config file
>"$CONFIGFILE"
# Parse general and interface sections thanks to the "config_cb()"
# callback. This allows to loop over all options without having to
# know their name in advance.
config_load babeld
unset args
unset interfaces
config_foreach babel_config general
config_foreach babel_addif interface
# Parse filters separately, since we know which options we expect
config_foreach babel_filter filter
[ -z "$interfaces" ] && return 0
eval "/usr/sbin/babeld -D -I $pidfile $args $interfaces"
# Using multiple config files is supported since babeld 1.5.1
/usr/sbin/babeld -D -I "$pidfile" -c "$OTHERCONFIGFILE" -c "$CONFIGFILE"
}

stop() {
Expand Down

0 comments on commit 8bebfee

Please sign in to comment.