siproxd: use UCI callback processing, reduce code size

Switch to using callback functions for UCI config processing, and remove
the unnecessary scan_interfaces() call together with related code.

Instead of explicitly handling every possible siproxd config option, use
callbacks to deal with those defined in the UCI config file, and directly
handle only selected options with desired default values. This shrinks
the init code by ~3.5 KB and simplifies updating to future siproxd
versions with new options.

(Note: this change exposed some long-standing, broken aspects of UCI
callback handling, fixed in https://github.com/openwrt/openwrt/pull/805.)

Signed-off-by: Tony Ambardar <itugrok@yahoo.com>
This commit is contained in:
guidosarducci 2018-03-03 14:15:41 -08:00
parent 25bb8873b7
commit 09f32fb1a5

View file

@ -13,192 +13,140 @@ siproxd_registration_dir="/var/lib/siproxd"
siproxd_registration_prefix="$siproxd_registration_dir/siproxd-" siproxd_registration_prefix="$siproxd_registration_dir/siproxd-"
siproxd_pid_dir="/var/run/siproxd" siproxd_pid_dir="/var/run/siproxd"
append_conf_if_set() {
local _val=$(eval "echo \$`echo $1`") # Check if a UCI option is set, or else apply a provided default.
[ -n "$_val" ] &&
echo "$1" = "$_val" >> "$siproxd_conf_prefix$cfg.conf" default_conf() {
local opt="$1"
local default="$2"
local val
config_get "$opt" "$sec" "$opt"
eval "val=\"\${$opt}\""
[ -z "$val" ] || return 0
[ -n "$default" ] || return 0
echo "$opt" = "$default" >> "$siproxd_conf_prefix$sec.conf"
} }
deal_with_lists () { # Use user-friendly network names (e.g. "wan", "lan") from options
echo "$2" = "$1" >> "$siproxd_conf_prefix$cfg.conf" # 'interface_inbound' and 'interface_outbound', but use standard siproxd
} # parameters 'if_inbound' and 'if_outbound' if explicitly set.
start_instance() { setup_networks() {
local cfg="$1" local sec="$1"
local _int_inbound local _int_inbound
local _int_outbound local _int_outbound
local _dev_inbound local _dev_inbound
local _dev_outbound local _dev_outbound
config_get _int_inbound "$cfg" interface_inbound config_get _int_inbound "$sec" interface_inbound
config_get _int_outbound "$cfg" interface_outbound config_get _int_outbound "$sec" interface_outbound
scan_interfaces
network_get_physdev _dev_inbound $_int_inbound network_get_physdev _dev_inbound $_int_inbound
network_get_physdev _dev_outbound $_int_outbound network_get_physdev _dev_outbound $_int_outbound
config_load 'siproxd' default_conf if_inbound $_dev_inbound
config_get if_inbound "$cfg" if_inbound $_dev_inbound default_conf if_outbound $_dev_outbound
config_get if_outbound "$cfg" if_outbound $_dev_outbound }
config_get host_outbound "$cfg" host_outbound # Apply default values to key options if unset in user's UCI config.
config_get hosts_allow_reg "$cfg" hosts_allow_reg
config_get hosts_allow_sip "$cfg" hosts_allow_sip
config_get hosts_deny_sip "$cfg" hosts_deny_sip
config_get sip_listen_port "$cfg" sip_listen_port 5060
config_get_bool daemonize "$cfg" daemonize 1
config_get silence_log "$cfg" silence_log 1
config_get user "$cfg" user nobody
config_get chrootjail "$cfg" chrootjail
config_get registration_file "$cfg" registration_file "$siproxd_registration_prefix$cfg.reg"
config_get autosave_registrations "$cfg" autosave_registrations 300
config_get pid_file "$cfg" pid_file "$siproxd_pid_dir/siproxd-$cfg.pid"
config_get_bool rtp_proxy_enable "$cfg" rtp_proxy_enable 1
config_get rtp_port_low "$cfg" rtp_port_low 7070
config_get rtp_port_high "$cfg" rtp_port_high 7089
config_get rtp_timeout "$cfg" rtp_timeout 300
config_get rtp_dscp "$cfg" rtp_dscp 46
config_get sip_dscp "$cfg" sip_dscp 0
config_get rtp_input_dejitter "$cfg" rtp_input_dejitter 0
config_get rtp_output_dejitter "$cfg" rtp_output_dejitter 0
config_get tcp_timeout "$cfg" tcp_timeout 600
config_get tcp_connect_timeout "$cfg" tcp_connect_timeout 500
config_get tcp_keepalive "$cfg" tcp_keepalive 20
config_get default_expires "$cfg" default_expires 600
config_get proxy_auth_realm "$cfg" proxy_auth_realm
config_get proxy_auth_passwd "$cfg" proxy_auth_passwd
config_get proxy_auth_pwfile "$cfg" proxy_auth_pwfile
config_get debug_level "$cfg" debug_level 0x00000000
config_get debug_port "$cfg" debug_port 0
config_get mask_host "$cfg" mask_host
config_get masked_host "$cfg" masked_host
config_get ua_string "$cfg" ua_string Siproxd-UA
config_get use_rport "$cfg" use_rport 0
config_get outbound_proxy_host "$cfg" outbound_proxy_host
config_get outbound_proxy_port "$cfg" outbound_proxy_port
if [ -f "$siproxd_conf_prefix$cfg.conf" ]; then apply_defaults() {
rm "$siproxd_conf_prefix$cfg.conf" local sec="$1"
fi
echo "# auto-generated config file from /etc/config/siproxd" > "$siproxd_conf_prefix$cfg.conf"
append_conf_if_set if_inbound default_conf sip_listen_port 5060
append_conf_if_set if_outbound default_conf daemonize 1
append_conf_if_set host_outbound default_conf silence_log 1
append_conf_if_set hosts_allow_reg default_conf user nobody
append_conf_if_set hosts_allow_sip default_conf registration_file "$siproxd_registration_prefix$sec.reg"
append_conf_if_set hosts_deny_sip default_conf autosave_registrations 300
append_conf_if_set sip_listen_port default_conf pid_file "$siproxd_pid_dir/siproxd-$sec.pid"
append_conf_if_set daemonize default_conf rtp_proxy_enable 1
append_conf_if_set silence_log default_conf rtp_port_low 7070
append_conf_if_set user default_conf rtp_port_high 7089
if [ -n "$chrootjail" ]; then default_conf rtp_timeout 300
if [ ! -d "$chrootjail" ]; then default_conf rtp_dscp 46
mkdir -p "$chrootjail" default_conf sip_dscp 0
chmod 0755 "$chrootjail" default_conf rtp_input_dejitter 0
fi default_conf rtp_output_dejitter 0
append_conf_if_set chrootjail default_conf tcp_timeout 600
fi default_conf tcp_connect_timeout 500
append_conf_if_set registration_file default_conf tcp_keepalive 20
append_conf_if_set autosave_registrations default_conf default_expires 600
default_conf debug_level 0x00000000
default_conf debug_port 0
default_conf ua_string Siproxd-UA
default_conf use_rport 0
default_conf plugindir "/usr/lib/siproxd/"
}
append_conf_if_set pid_file # Setup callbacks for parsing siproxd sections, options, and lists.
append_conf_if_set rtp_proxy_enable # This avoids hardcoding all supported siproxd configuration parameters.
append_conf_if_set rtp_port_low
append_conf_if_set rtp_port_high
append_conf_if_set rtp_timeout
append_conf_if_set rtp_dscp
append_conf_if_set sip_dscp
append_conf_if_set rtp_input_dejitter
append_conf_if_set rtp_output_dejitter
append_conf_if_set tcp_timeout
append_conf_if_set tcp_connect_timeout
append_conf_if_set tcp_keepalive
append_conf_if_set default_expires
append_conf_if_set proxy_auth_realm
append_conf_if_set proxy_auth_passwd
append_conf_if_set proxy_auth_pwfile
append_conf_if_set debug_level
append_conf_if_set debug_port
append_conf_if_set mask_host
append_conf_if_set masked_host
append_conf_if_set ua_string
append_conf_if_set use_rport
append_conf_if_set outbound_proxy_host
append_conf_if_set outbound_proxy_port
config_list_foreach "$cfg" 'outbound_domain_name' deal_with_lists "outbound_domain_name"
config_list_foreach "$cfg" 'outbound_domain_host' deal_with_lists "outbound_domain_host"
config_list_foreach "$cfg" 'outbound_domain_port' deal_with_lists "outbound_domain_port"
# handle plugins siproxd_cb() {
config_get plugindir "$cfg" plugindir "/usr/lib/siproxd/" config_cb() {
append_conf_if_set plugindir local _int_inbound
local _int_outbound
local _dev_inbound
local _dev_outbound
config_list_foreach "$cfg" 'load_plugin' deal_with_lists "load_plugin" case "$1" in
# Initialize section processing and save section name.
"siproxd")
sec="$2"
if [ -f "$siproxd_conf_prefix$sec.conf" ]; then
rm "$siproxd_conf_prefix$sec.conf"
fi
echo "# auto-generated config file from /etc/config/siproxd" > \
"$siproxd_conf_prefix$sec.conf"
;;
# Parse OpenWRT interface names (e.g. "wan") and apply defaults,
# using saved section name.
"")
local chrootjail
local pid_file
# plugin_demo.so setup_networks "$sec"
config_get plugin_demo_string "$cfg" plugin_demo_string apply_defaults "$sec"
append_conf_if_set plugin_demo_string
# plugin_shortdial.so config_get chrootjail "$sec" chrootjail
config_get plugin_shortdial_akey "$cfg" plugin_shortdial_akey if [ -n "$chrootjail" ]; then
append_conf_if_set plugin_shortdial_akey if [ ! -d "$chrootjail" ]; then
config_list_foreach "$cfg" 'plugin_shortdial_entry' deal_with_lists "plugin_shortdial_entry" mkdir -p "$chrootjail"
chmod 0755 "$chrootjail"
fi
fi
# plugin_defaulttarget.so config_get pid_file "$sec" pid_file
config_get_bool plugin_defaulttarget_log "$cfg" plugin_defaulttarget_log SERVICE_PID_FILE="$pid_file" service_start \
append_conf_if_set plugin_defaulttarget_log $siproxd_bin --config "$siproxd_conf_prefix$sec.conf"
config_get plugin_defaulttarget_target "$cfg" plugin_defaulttarget_target ;;
append_conf_if_set plugin_defaulttarget_target esac
return 0
}
# plugin_fix_bogus_via.so option_cb() {
config_get plugin_fix_bogus_via_networks "$cfg" plugin_fix_bogus_via_networks # These 2 OpenWRT-specific options are handled in post-processing.
append_conf_if_set plugin_fix_bogus_via_networks case "$1" in
"interface_inbound"|"interface_outbound") return 0 ;;
esac
# Other options match siproxd docs, so write directly to config.
[ -n "$2" ] && echo "$1" = "$2" >> "$siproxd_conf_prefix$sec.conf"
return 0
}
# plugin_stun.so list_cb() {
config_get plugin_stun_server "$cfg" plugin_stun_server # All list items match siproxd docs, so write directly to config.
append_conf_if_set plugin_stun_server [ -n "$2" ] && echo "$1" = "$2" >> "$siproxd_conf_prefix$sec.conf"
config_get plugin_stun_port "$cfg" plugin_stun_port return 0
append_conf_if_set plugin_stun_port }
config_get plugin_stun_period "$cfg" plugin_stun_period
append_conf_if_set plugin_stun_period
# plugin_prefix.so
config_get plugin_prefix_akey "$cfg" plugin_prefix_akey
append_conf_if_set plugin_prefix_akey
# plugin_regex.so
config_list_foreach "$cfg" 'plugin_regex_desc' deal_with_lists "plugin_regex_desc"
config_list_foreach "$cfg" 'plugin_regex_pattern' deal_with_lists "plugin_regex_pattern"
config_list_foreach "$cfg" 'plugin_regex_replace' deal_with_lists "plugin_regex_replace"
# plugin_stripheader.so
config_list_foreach "$cfg" 'plugin_stripheader_remove' deal_with_lists "plugin_stripheader_remove"
# plugin_codecfilter.so
config_list_foreach "$cfg" 'plugin_codecfilter_blacklist' deal_with_lists "plugin_codecfilter_blacklist"
# plugin_siptrunk.so
config_list_foreach "$cfg" 'plugin_siptrunk_name' deal_with_lists "plugin_siptrunk_name"
config_list_foreach "$cfg" 'plugin_siptrunk_account' deal_with_lists "plugin_siptrunk_account"
config_list_foreach "$cfg" 'plugin_siptrunk_numbers_regex' deal_with_lists "plugin_siptrunk_numbers_regex"
# plugin_fix_DTAG.so
config_get plugin_fix_DTAG_networks "$cfg" plugin_fix_DTAG_networks
append_conf_if_set plugin_fix_DTAG_networks
# plugin_fix_fbox_anoncall.so
config_get plugin_fix_fbox_anoncall_networks "$cfg" plugin_fix_fbox_anoncall_networks
append_conf_if_set plugin_fix_fbox_anoncall_networks
SERVICE_PID_FILE="$pid_file" \
service_start $siproxd_bin --config "$siproxd_conf_prefix$cfg.conf"
} }
stop_instance() { stop_instance() {
local cfg="$1" local sec="$1"
config_get pid_file "$cfg" pid_file "$siproxd_pid_dir/siproxd-$cfg.pid" config_get pid_file "$sec" pid_file "$siproxd_pid_dir/siproxd-$sec.pid"
SERVICE_PID_FILE="$pid_file" \ SERVICE_PID_FILE="$pid_file" \
service_stop $siproxd_bin service_stop $siproxd_bin
@ -216,10 +164,9 @@ start() {
chmod 700 "$siproxd_pid_dir" chmod 700 "$siproxd_pid_dir"
chown nobody:nogroup "$siproxd_pid_dir" chown nobody:nogroup "$siproxd_pid_dir"
include /lib/network
. /lib/functions/network.sh . /lib/functions/network.sh
siproxd_cb
config_load 'siproxd' config_load 'siproxd'
config_foreach start_instance 'siproxd'
} }
stop() { stop() {