#!/bin/sh /etc/rc.common # Copyright (C) 2006-2008 OpenWrt.org START=90 USE_PROCD=1 PID_FILE="/var/run/stunnel.pid" CONF_FILE="/tmp/stunnel.conf" BIN="/usr/bin/stunnel" SERVICE_SECTION_FOUND=0 global_defs() { local debug compression config_get alt_config_file 'globals' alt_config_file [ -z "$alt_config_file" ] || return 0 # Set default settings printf "foreground = yes\n" >> "$CONF_FILE" printf "pid = %s\n" "$PID_FILE" >> "$CONF_FILE" printf "syslog = yes\n" >> "$CONF_FILE" config_get debug 'globals' debug '5' printf "debug = %s\n" "$debug" >> "$CONF_FILE" config_get compression 'globals' compression [ -z "$compression" ] || printf "compression = %s\n" "$compression" >> "$CONF_FILE" } print_options() { local config=$1 shift for opt in "$@"; do local $opt local value local is_boolean=0 if [ "${opt:0:5}" == "bool_" ]; then opt="${opt:5}" is_boolean=1 fi config_get "value" "$config" "$opt" [ -z "$value" ] || { if [ "$value" = '1' ] && [ "$is_boolean" -eq "1" ]; then value="yes" elif [ "$value" = '0' ] && [ "$is_boolean" -eq "1" ] ; then value="no" fi printf "%s = %s\n" "$opt" "$value" >> "$CONF_FILE" } done } print_list() { local config=$1 shift for opt in "$@"; do local $opt local elements config_get "elements" "$config" "$opt" for element in $elements; do printf "%s = %s\n" "$opt" "$element" >> "$CONF_FILE" done done } print_list_colon() { local config=$1 local value shift for opt in "$@"; do local $opt local elements config_get "elements" "$config" "$opt" for element in $elements; do value="${value}:${element}" done printf "%s = %s\n" "$opt" "${value#*:}" >> "$CONF_FILE" done } service_section() { local cfg="$1" local accept_host accept_port enabled config_get_bool enabled "$cfg" 'enabled' '1' [ ${enabled} -gt 0 ] || return 0 SERVICE_SECTION_FOUND=1 printf "\n" >> "$CONF_FILE" printf "[%s]\n" "$cfg" >> "$CONF_FILE" config_get accept_host "$cfg" accept_host 'localhost' config_get accept_port "$cfg" accept_port printf "accept = %s:%s\n" "$accept_host" "$accept_port" >> "$CONF_FILE" print_options "$cfg" CApath \ CAfile \ cert \ CRLpath \ CRLfile \ curve \ logId \ debug \ engineId \ engineNum \ failover \ ident \ key \ local \ PSKidentity \ PSKsecrets \ sslVersion \ TIMEOUTbusy \ TIMEOUTclose \ TIMEOUTconnect \ TIMEOUTidle \ bool_delay \ bool_libwrap \ bool_reset \ bool_requireCert \ bool_verifyChain \ bool_verifyPeer \ bool_client print_list "$cfg" checkEmail \ checkHost \ checkIP \ connect \ options print_list_colon "$cfg" ciphers } process_config() { local alt_config_file rm -f "$CONF_FILE" # First line printf "; STunnel configuration file generated by uci\n" > "$CONF_FILE" printf "; Written %s\n\n" "$(date +'%c')" >> "$CONF_FILE" [ -f /etc/config/stunnel ] || return 0 config_load stunnel global_defs # If "alt_config_file" specified, use that instead [ -n "$alt_config_file" ] && [ -f "$alt_config_file" ] && { rm -f "$CONF_FILE" # Symlink "alt_config_file" since it's a bit easier and safer ln -s "$alt_config_file" "$CONF_FILE" # Set section found to start service user hopfully knows what you does SERVICE_SECTION_FOUND=1 return 0 } config_foreach service_section service } service_triggers() { procd_add_reload_trigger "stunnel" } start_service() { process_config if [ "$SERVICE_SECTION_FOUND" = 1 ]; then procd_open_instance procd_set_param command "$BIN" procd_append_param command "$CONF_FILE" procd_set_param respawn procd_set_param file "$CONF_FILE" procd_close_instance else logger -t stunnel -p daemon.info "No uci service section enabled or found!" fi }