#!/bin/sh /etc/rc.common # Copyright (C) 2008 Alina Friedrichsen # Copyright (C) 2011 OpenWrt.org START=50 USE_PROCD=1 PROG="/usr/sbin/siproxd" CONF_DIR="/var/etc/siproxd" REG_DIR="/var/lib/siproxd" PID_DIR="/var/run/siproxd" PLUGIN_DIR="/usr/lib/siproxd/" SIPROXD_UID="nobody" SIPROXD_GID="nogroup" # Some options need special handling or conflict with procd/jail setup. append CONF_SKIP "interface_inbound interface_outbound chrootjail" append CONF_SKIP "daemonize user plugindir registration_file pid_file" # Check if a UCI option is set, or else apply a provided default. 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 config_set "$sec" "$opt" "$default" append_conf "$opt" = "$default" } append_conf() { echo $* >> "$CONF_DIR/siproxd-$sec.conf" } # Use user-friendly network names (e.g. "wan", "lan") from options # 'interface_inbound' and 'interface_outbound', but use standard siproxd # parameters 'if_inbound' and 'if_outbound' if explicitly set. setup_networks() { local sec="$1" local _int_inbound _int_outbound local _dev_inbound _dev_outbound config_get _int_inbound "$sec" interface_inbound config_get _int_outbound "$sec" interface_outbound . /lib/functions/network.sh network_get_physdev _dev_inbound $_int_inbound network_get_physdev _dev_outbound $_int_outbound default_conf if_inbound $_dev_inbound default_conf if_outbound $_dev_outbound } # Apply default values to key options if unset in user's UCI config. apply_defaults() { local sec="$1" default_conf sip_listen_port 5060 default_conf autosave_registrations 300 default_conf rtp_port_low 7070 default_conf rtp_port_high 7089 default_conf rtp_timeout 300 default_conf rtp_dscp 46 default_conf tcp_timeout 600 default_conf tcp_keepalive 20 default_conf default_expires 600 default_conf daemonize 0 default_conf user "$SIPROXD_UID" default_conf registration_file "$REG_DIR/siproxd-$sec.reg" default_conf plugindir "$PLUGIN_DIR" } # Handle activities at start of a new 'siproxd' section. # Initialize section processing and save section name. section_start() { local sec="$1" rm -f "$CONF_DIR/siproxd-$sec.conf" append_conf "# config auto-generated from /etc/config/siproxd" } # Handle activities at close of a 'siproxd' section. # Parse OpenWRT interface names (e.g. "wan"), apply defaults and # set up procd jail. section_end() { local sec="$1" local conf_file="$CONF_DIR/siproxd-$sec.conf" local pid_file="$PID_DIR/siproxd-$sec.pid" local reg_file plugin_dir setup_networks "$sec" apply_defaults "$sec" config_get plugin_dir "$sec" plugindir config_get reg_file "$sec" registration_file procd_open_instance "$sec" procd_set_param command "$PROG" --config "$conf_file" procd_set_param pidfile "$pid_file" procd_set_param respawn procd_add_jail siproxd log procd_add_jail_mount /etc/passwd /etc/group /etc/TZ /dev/null procd_add_jail_mount "$conf_file" [ -d "$plugin_dir" ] && procd_add_jail_mount "$plugin_dir" # Ensure registration file exists for jail [ -f "$reg_file" ] || touch "$reg_file" chown "$SIPROXD_UID:$SIPROXD_GID" "$reg_file" procd_add_jail_mount_rw "$reg_file" procd_close_instance } # Setup callbacks for parsing siproxd sections, options, and lists. # This avoids hardcoding all supported siproxd configuration parameters. siproxd_cb() { config_cb() { # Section change: close any previous section. [ -n "$cur_sec" ] && section_end "$cur_sec" case "$1" in # New 'siproxd' section: begin processing. "siproxd") cur_sec="$2" section_start "$cur_sec" ;; # Config end or unknown section: ignore. *) cur_sec="" ;; esac } option_cb() { local sec="$cur_sec" [ -z "$sec" ] && return list_contains CONF_SKIP "$1" && return [ -n "$2" ] && append_conf "$1" = "$2" } list_cb() { option_cb "$@" } } service_triggers() { procd_add_reload_trigger "siproxd" } start_service() { mkdir -p "$CONF_DIR" "$REG_DIR" "$PID_DIR" chmod 755 "$CONF_DIR" "$REG_DIR" "$PID_DIR" chown "$SIPROXD_UID:$SIPROXD_GID" "$REG_DIR" siproxd_cb config_load 'siproxd' }