#! /bin/sh -e
### BEGIN INIT INFO
# Provides:          stunnel
# Required-Start:    $local_fs $remote_fs
# Required-Stop:     $local_fs $remote_fs
# Should-Start:      $syslog
# Should-Stop:       $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Start or stop stunnel 4.x (SSL tunnel for network daemons)
# Description:       Starts or stops all configured SSL network tunnels. Each *.conf file in
#                    /etc/stunnel/ will spawn a separate stunnel process. The list of files
#                    can be overriden in /etc/default/stunnel, and that same file can be used
#                    to completely disable *all* tunnels.
### END INIT INFO

. /lib/lsb/init-functions

DEFAULTPIDFILE="/var/run/stunnel.pid"
DAEMON=@bindir@/stunnel
NAME=stunnel
DESC="SSL tunnels"
OPTIONS=""
ENABLED=0

get_opt() {
  sed -e "s;^[[:space:]]*;;" -e "s;[[:space:]]*$;;" \
    -e "s;[[:space:]]*=[[:space:]]*;=;" "$1" |
    grep -i "^$2=" | sed -e "s;^[^=]*=;;"
}

get_pidfile() {
  local file=$1
  if [ -f $file ]; then
    CHROOT=`get_opt $file chroot`
    PIDFILE=`get_opt $file pid`
    if [ "$PIDFILE" = "" ]; then
      PIDFILE=$DEFAULTPIDFILE
    fi
    echo "$CHROOT/$PIDFILE"
  fi
}

startdaemons() {
  local res file args pidfile warn status

  if ! [ -d /var/run/stunnel ]; then
    rm -rf /var/run/stunnel
    install -d -o stunnel -g stunnel /var/run/stunnel
  fi
  if [ -n "$RLIMITS" ]; then
    ulimit $RLIMITS
  fi
  res=0
  for file in $FILES; do 
    if [ -f $file ]; then
      echo -n " $file: "
      args="$file $OPTIONS"
      pidfile=`get_pidfile $file`
      if egrep -qe '^pid[[:space:]]*=' "$file"; then
        warn=''
      else
        warn=' (no pid=pidfile specified!)'
      fi
      status=0
      start_daemon -p "$pidfile" "$DAEMON" $args || status=$?
      if [ "$status" -eq 0 ]; then
        echo -n "started$warn"
      else
        echo "failed$warn"
        echo "You should check that you have specified the pid= in you configuration file"
        res=1
      fi
    fi
  done;
  echo ''
  return "$res"
}

killdaemons()
{
  local sig file pidfile status

  sig=${1:-TERM}
  res=0
  for file in $FILES; do
    echo -n " $file: "
    pidfile=`get_pidfile $file`
    if [ ! -e "$pidfile" ]; then
      echo -n "no pid file"
    else
      status=0
      killproc -p "$pidfile" "$DAEMON" "$sig" || status=$?
      if [ "$status" -eq 0 ]; then
        echo -n 'stopped'
      else
        echo -n 'failed'
        res=1
      fi
    fi
  done
  echo ''
  return "$res"
}

querydaemons()
{
  local res file pidfile status

  res=0
  for file in $FILES; do
    echo -n " $file: "
    pidfile=`get_pidfile "$file"`
    if [ ! -e "$pidfile" ]; then
      echo -n 'no pid file'
      res=1
    else
      status=0
      pidofproc -p "$pidfile" "$DAEMON" >/dev/null || status="$?"
      if [ "$status" = 0 ]; then
        echo -n 'running'
      elif [ "$status" = 4 ]; then
        echo "cannot access the pid file $pidfile"
        res=1
      else
        echo -n 'stopped'
        res=1
      fi
    fi
  done
  echo ''
  exit "$res"
}

if [ "x$OPTIONS" != "x" ]; then
  OPTIONS="-- $OPTIONS"
fi

[ -f @sysconfdir@/default/stunnel ] && . /etc/default/stunnel
if [ "$ENABLED" = "0" ] ; then
  echo "$DESC disabled, see @sysconfdir@/default/stunnel"
  exit 0
fi

# If the user want to manage a single tunnel, the conf file's name
# is in $2. Otherwise, respect /etc/default/stunnel4 setting. If no
# setting there, use /etc/stunnel/*.conf
if [ -n "${2:-}" ]; then
  if [ -e "@sysconfdir@/stunnel/$2.conf" ]; then
    FILES="@sysconfdir@/stunnel/$2.conf"
  else
    echo >&2 "@sysconfdir@/stunnel/$2.conf does not exist."
    exit 1
  fi
else
  if [ -z "$FILES" ]; then
    FILES="@sysconfdir@/stunnel/*.conf"
  fi
fi

[ -x $DAEMON ] || exit 0

set -e

res=0
case "$1" in
  start)
    echo -n "Starting $DESC:"
    startdaemons
    res=$?
    ;;
  stop)
    echo -n "Stopping $DESC:"
    killdaemons
    res=$?
    ;;
  reopen-logs)
    echo -n "Reopening log files $DESC:"
    killdaemons USR1
    res=$?
    ;;
  force-reload|reload)
    echo -n "Reloading configuration $DESC:"
    killdaemons HUP
    res=$?
    ;;  
  restart)
    echo -n "Restarting $DESC:"
    killdaemons && startdaemons
    res=$?
    ;;
  status)
    echo -n "$DESC status:"
    querydaemons
    res=$?
    ;;
  *)
    N=@sysconfdir@/init.d/$NAME
    echo "Usage: $N {start|stop|status|reload|reopen-logs|restart} [<stunnel instance>]" >&2
    res=1
    ;;
esac

exit "$res"
