#! /bin/sh
### BEGIN INIT INFO
# Provides:          anytun
# Required-Start:    $network $named $syslog
# Required-Stop:     
# 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=/usr/sbin/anytun
ANYTUNCONFIG=/usr/bin/anytun-config
CONTROLDAEMON=/usr/bin/anytun-controld
NAME=anytun
DESC=anytun
CONFIG_DIR=/etc/anytun
VARCONFIG_DIR=/var/run/anytun-controld
VARRUN_DIR=/var/run/$NAME/

test -x $DAEMON || exit 0

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

start_vpn () {
  STATUS="OK"
  if [ -f $CONFIG_DIR/$NAME/config ] ; then
    POSTUP=''
    test -f  $CONFIG_DIR/$NAME/post-up.sh && POSTUP="-x $CONFIG_DIR/$NAME/post-up.sh"
    CHROOTDIR=`grep '^chroot' < $CONFIG_DIR/$NAME/config | sed 's/chroot\s*//'`
    if [ -n "$CHROOTDIR" ] ; then
      test -d $CHROOTDIR || mkdir -p $CHROOTDIR
    fi
    test -d $VARRUN_DIR || mkdir -p $VARRUN_DIR
    DAEMONARG=`sed 's/#.*//' < $CONFIG_DIR/$NAME/config | grep -e '\w' | sed  's/^/--/' | tr '\n' ' '`
    $DAEMON --write-pid $VARRUN_DIR/$NAME.pid $POSTUP \
      $DAEMONOPTS $DAEMONARG || STATUS="FAILED"
  else
    STATUS="no config found"
  fi
  start_configd
  echo -n "($STATUS)"
}
stop_vpn () {
  kill `cat $PIDFILE` || true
  rm $PIDFILE
  stop_configd
}

start_configd () {
  if [ -d $CONFIG_DIR/$NAME/conf.d ] ; then
    test -d $VARCONFIG_DIR || mkdir -p $VARCONFIG_DIR
    chmod 700 $VARCONFIG_DIR
    rm -f $VARCONFIG_DIR/$NAME 2>/dev/null
    KDPRF=`sed 's/#.*//'  <  $CONFIG_DIR/$NAME/config | grep -e 'kd-prf' | sed  's/^/ --/' | xargs echo`
    for CLIENTNAME in `ls $CONFIG_DIR/$NAME/conf.d`; do
      echo -n " ($CLIENTNAME)"
      DAEMONARG=`sed 's/#.*//'  <  $CONFIG_DIR/$NAME/conf.d/$CLIENTNAME | grep -e '\w' | sed  's/^/ --/' | xargs echo`
      $ANYTUNCONFIG $DAEMONARG $CIPHER $AUTHALGO $KDPRF >> $VARCONFIG_DIR/$NAME
    done
    CONTROLHOST=`sed 's/#.*//'  <  $CONFIG_DIR/$NAME/config | grep -e 'control-host' | sed  's/^/ --/' | xargs echo`
    $CONTROLDAEMON -f $VARCONFIG_DIR/$NAME $DAEMONOPTS $CONTROLHOST \
      --write-pid $VARCONFIG_DIR/$NAME.pid
    # rm -f $VARCONFIG_DIR/$NAME
  fi
}
stop_configd () {
  if [ -d $CONFIG_DIR/$NAME/conf.d ] ; then
    echo -n " ($NAME-controlld)"
    kill `cat $VARCONFIG_DIR/$NAME.pid` || true
    rm $VARCONFIG_DIR/$NAME.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
      done
    else
      echo "no config found"
      exit 1;
    fi
  else
    while shift ; do
      [ -z "$1" ] && break
      NAME=$1
      echo -n " $NAME"
      start_vpn
    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
    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
      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
        start_vpn
      else
        stop_configd
        start_configd
      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
          start_vpn
        else
          stop_configd
          start_configd
        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
      sleep 1
      start_vpn
    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
        sleep 1
        start_vpn
      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/$NAME
  echo "Usage: $N {start|stop|restart|reload|force-reload}" >&2
  exit 1
  ;;
esac

exit 0
