#! /bin/sh
#
### BEGIN INIT INFO
# Provides:          tinc
# Required-Start:    $remote_fs $network
# Required-Stop:     $remote_fs $network
# Should-Start:      $syslog $named
# Should-Stop:       $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Start tinc daemons
# Description:       Create a file $NETSFILE (/etc/tinc/nets.boot),
#                    and put all the names of the networks in there.
#                    These names must be valid directory names under
#                    $TCONF (/etc/tinc). Lines starting with a # will be
#                    ignored in this file.
### END INIT INFO
#
# Based on Lubomir Bulej's Redhat init script.

. /lib/lsb/init-functions

DAEMON="/usr/sbin/tincd"
NAME="tinc"
DESC="tinc daemons"
TCONF="/etc/tinc"
NETSFILE="$TCONF/nets.boot"
NETS=""

test -f $DAEMON || exit 0

[ -r /etc/default/tinc ] && . /etc/default/tinc

# foreach_net "what-to-say" action [arguments...]
foreach_net() {
  if [ ! -f $NETSFILE ] ; then
    echo "Please create $NETSFILE."
    exit 0
  fi
  echo -n "$1"
  shift
  egrep '^[ ]*[a-zA-Z0-9_-]+' $NETSFILE | while read net args; do
    echo -n " $net"
    "$@" $net $args
  done
  echo "."
}

signal_running() {
  for i in /var/run/tinc.*pid; do
    if [ -f "$i" ]; then
      head -1 $i | while read pid; do
        kill -$1 $pid
      done
    fi
  done
}

setlimits() {
  while [ $# -gt 0 ]; do
    parm=$1 ; shift
    if [ -n "$1" -a "${1#-}" = "$1" ]; then
      value=$1 ; shift
      ulimit $parm $value
    else
      ulimit $parm
    fi
  done
}

test -n "$LIMITS" && setlimits $LIMITS

start() {
  $DAEMON $EXTRA -n "$@"
}

stop() {
  [ -f /var/run/tinc.$1.pid ] || return
  read pid rest </var/run/tinc.$1.pid || return
  kill -0 "$pid" 2>/dev/null || return

  $DAEMON -n $1 -k || return

  i=0;
  /bin/sleep 0.5

  # Wait for the pidfile to disappear
  while [ -f /var/run/tinc.$1.pid ]; do
    # And check that there is an actual process running
    kill -0 "$pid" 2>/dev/null || return

    if [ $i = '10' ] ; then
      # It's still alive, kill it again and give up
        $DAEMON -n $1 -k && /bin/sleep 0.5
      break
    else
      echo -n "."
      i=$(($i+1))
    fi

    /bin/sleep 0.5
  done
}

reload() {
  $DAEMON -n $1 -kHUP
}

alarm() {
  $DAEMON -n $1 -kALRM
}

restart() {
  stop "$@"
  start "$@"
}

case "$1" in
  start)
    foreach_net "Starting $DESC:" start
  ;;
  stop)
    foreach_net "Stopping $DESC:" stop
  ;;
  reload|force-reload)
    foreach_net "Reloading $DESC configuration:" reload
  ;;
  restart)
    foreach_net "Restarting $DESC:" restart
  ;;
  alarm)
    signal_running ALRM
  ;;
  *)
    echo "Usage: /etc/init.d/$NAME {start|stop|reload|restart|force-reload|alarm}"
    exit 1
  ;;
esac

exit 0
