#! /bin/sh
### BEGIN INIT INFO
# Provides:          anytun
# Required-Start:    $remote_fs $network $named $syslog
# Required-Stop:     $remote_fs
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Start anycast tunneling daemon at boot time
# Description:       Enables networking over vpn tunnel interfaces
### END INIT INFO
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DAEMON=anytun
LAUNCHER=/usr/local/lib/$DAEMON-launcher
DESC="secure anycast tunneling daemon"
CONFIG_DIR=/usr/local/etc/$DAEMON
VARCONTROL_DIR=/var/run/$DAEMON-controld
VARRUN_DIR=/var/run/$DAEMON/

# Include anytun defaults if available
if [ -f /etc/default/anytun ] ; then
  . /etc/default/anytun
fi

. /lib/lsb/init-functions

start_vpn () {
  STATUS="OK"
  if [ -f $CONFIG_DIR/$1/config ] ; then
    $LAUNCHER vpn $1 || STATUS="FAILED"
  else
    STATUS=" no config found"
  fi
  start_configd $1
  echo -n "($STATUS)"
}
stop_vpn () {
  kill `cat $PIDFILE` || true
  rm $PIDFILE
  stop_configd $1
}

start_configd () {
  $LAUNCHER configd $1
}
stop_configd () {
  if [ -d $CONFIG_DIR/$1/conf.d ] ; then
    echo -n " ($1-controlld)"
    kill `cat $VARCONTROL_DIR/$1.pid` || true
    rm $VARCONTROL_DIR/$1.pid
  fi
}

set -e
case "$1" in
  start)
    echo -n "Starting $DESC:"
    if test -z "$2" ; then
      if [ -f $CONFIG_DIR/autostart ] ; then
        for NAME in `sed 's/#.*//'  <  $CONFIG_DIR/autostart | grep -e '\w'`; do
          echo -n " $NAME"
          start_vpn $NAME
        done
      else
        echo "no config found"
        exit 1;
      fi
    else
      while shift ; do
        [ -z "$1" ] && break
        echo -n " $1"
        start_vpn $1
      done
    fi
    echo "."
    ;;
  stop)
    echo -n "Stoping $DESC:"
    if test -z "$2" ; then
      for PIDFILE in `ls $VARRUN_DIR/*.pid 2> /dev/null`; do
        NAME=`basename $PIDFILE`
        NAME=${NAME%%.pid}
        echo -n " $NAME"
        stop_vpn $NAME
      done
    else
      while shift ; do
        [ -z "$1" ] && break
        if test -e $VARRUN_DIR/$1.pid ; then
          PIDFILE=`ls $VARRUN_DIR/$1.pid 2> /dev/null`
          NAME=`basename $PIDFILE`
          NAME=${NAME%%.pid}
          echo -n " $NAME"
          stop_vpn $NAME
        else
          echo -n " (failure: No such tunnel is running: $1)"
        fi
      done
    fi
    echo "."
    ;;
  reload)
    echo -n "Reloading $DESC:"
    if test -z "$2" ; then
      for PIDFILE in `ls $VARRUN_DIR/*.pid 2> /dev/null`; do
        NAME=`basename $PIDFILE`
        NAME=${NAME%%.pid}
        echo -n " $NAME"
        if [ -d $CONFIG_DIR/$NAME/conf.d ] ; then
          stop_vpn $NAME
          start_vpn $NAME
        else
          stop_configd $NAME
          start_configd $NAME
        fi
      done
    else
      while shift ; do
        [ -z "$1" ] && break
        if test -e $VARRUN_DIR/$1.pid ; then
          PIDFILE=`ls $VARRUN_DIR/$1.pid 2> /dev/null`
          NAME=`basename $PIDFILE`
          NAME=${NAME%%.pid}
          echo -n " $NAME"
          if [ -d $CONFIG_DIR/$NAME/conf.d ] ; then
            stop_vpn $NAME
            start_vpn $NAME
          else
            stop_configd $NAME
            start_configd $NAME
          fi
        else
          echo -n " (failure: No such tunnel is running: $1)"
        fi
      done
    fi
    echo "."
    ;;
  force-reload)
    echo -n "Restarting $DESC:"
    if test -z "$2" ; then
      for PIDFILE in `ls $VARRUN_DIR/*.pid 2> /dev/null`; do
        NAME=`basename $PIDFILE`
        NAME=${NAME%%.pid}
        echo -n " $NAME"
        stop_vpn $NAME
        sleep 1
        start_vpn $NAME
      done
    else
      while shift ; do
        [ -z "$1" ] && break
        if test -e $VARRUN_DIR/$1.pid ; then
          PIDFILE=`ls $VARRUN_DIR/$1.pid 2> /dev/null`
          NAME=`basename $PIDFILE`
          NAME=${NAME%%.pid}
          echo -n " $NAME"
          stop_vpn $NAME
          sleep 1
          start_vpn $NAME
        else
          echo -n " (failure: No such tunnel is running: $1)"
        fi
      done
    fi
    echo "."
    ;;
  restart)
    SCRIPT=$0
    shift
    $SCRIPT stop $*
    sleep 1
    $SCRIPT start $*
    ;;
  *)
    N=/etc/init.d/$DAEMON
    echo "Usage: $N {start|stop|restart|reload|force-reload}" >&2
    exit 1
    ;;
esac

exit 0
