| #!/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' |
| } |