#!/bin/sh
### BEGIN INIT INFO
# Provides:          pdns
# Required-Start:    $network $remote_fs $syslog
# Required-Stop:     $network $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Should-Start:      slapd
# Should-Stop:       slapd
# Short-Description: PDNS is a versatile high performance authoritative nameser
### END INIT INFO

PATH=/bin:/sbin:/usr/bin:/usr/sbin
BINARYPATH=/usr/bin
SBINARYPATH=/usr/sbin
SOCKETPATH=/var/run

ODESC="PowerDNS Authoritative Name Server"
DESC="$ODESC"
NAME=pdns
DAEMON=/usr/sbin/pdns_server
DAEMON_ARGS=""
PIDFILE=/var/run/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME

[ -x "$DAEMON" ] || exit 0

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

# Make sure that /var/run exists
mkdir -p $SOCKETPATH
cd $SOCKETPATH

# Handle instance scripts
suffix=$(basename $0 | cut -d- -f2- -s)

if [ $suffix ]; then
	SUFFIX="--config-name=$suffix"
	DAEMON_ARGS="$DAEMON_ARGS $SUFFIX"
	NAME="$NAME-$suffix"
	DESC="$DESC (config name $suffix)"
	PIDFILE="/var/run/$NAME-$suffix.pid"
fi

# Define LSB log_* functions.
. /lib/lsb/init-functions

# function to invoke properly parametrized pdns_control
doPC()
{
	pdns_control $SUFFIX $1 $2 2> /dev/null
	return $?
}

isrunning()
{
	doPC ping > /dev/null
	return $?
}

#
# Function that starts the daemon/service
#
do_start()
{
        # Return
        #   0 if daemon has been started
        #   1 if daemon was already running
        #   2 if daemon could not be started
	if isrunning; then
		return 1
	fi
        start-stop-daemon --start --quiet \
		--pidfile $PIDFILE --exec $DAEMON -- \
                $DAEMON_ARGS --daemon --guardian=yes \
                || return 2
}

#
# Function that stops the daemon/service
#
do_stop()
{
        # Return
        #   0 if daemon has been stopped
        #   1 if daemon was already stopped
        #   2 if daemon could not be stopped
        #   other if a failure occurred
        doPC quit >/dev/null
	RETVAL="2"
	for sec in $(seq 1 5); do
		if ! isrunning; then
			RETVAL="0"
			break
		fi
		sleep 1
	done
        [ "$RETVAL" = 2 ] && return 2
        rm -f $PIDFILE
}

case "$1" in
  start)
	[ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME"
	do_start
	case "$?" in
		0|1)
			[ "$VERBOSE" != no ] && log_end_msg 0
			exit 0
			;;
		2)
			[ "$VERBOSE" != no ] && log_end_msg 1
			exit 1
			;;
	esac
	;;
  stop)
	[ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
	do_stop
	case "$?" in
		0|1)
			[ "$VERBOSE" != no ] && log_end_msg 
			exit 0
			;;
		2)
			[ "$VERBOSE" != no ] && log_end_msg 1
			exit 1
			;;
	esac
	;;
  status)
        if isrunning; then
		log_success_msg "$NAME is running: $(doPC status)"
		exit 0
	else
		log_failure_msg "$NAME is not running"
		exit 3
	fi 
	;;	
  force-stop)
	[ "$VERBOSE" != no ] && log_daemon_msg "Killing $ODESC (all instances)" "$NAME"
	kill -9 $(pidof pdns_server)
	case "$?" in
		0)
			[ "$VERBOSE" != no ] && log_end_msg 0
			exit 0
			;;
		1)
			[ "$VERBOSE" != no ] && log_end_msg 1
			exit 1
			;;
	esac
	;;
  restart)
        log_daemon_msg "Restarting $DESC" "$NAME"
	do_stop
        case "$?" in
          0|1)
                do_start
                case "$?" in
                        0)
				log_end_msg 0
				exit 0
				;;
                        1)
				log_end_msg 1  # Old process is still running
				exit 1
				;;
                        *)
				log_end_msg 1 # Failed to start
				exit 1
				;;
                esac
                ;;
          *)
                # Failed to stop
                log_end_msg 1
		exit 1
                ;;
        esac
        ;;
  reload|force-reload) 
	log_daemon_msg "Reloading $DESC" "$NAME"
	if isrunning; then
	  doPC cycle >/dev/null
	  case "$?" in
		0)
			[ "$VERBOSE" != no ] && log_end_msg 0
			exit 0
			;;
		1)
			[ "$VERBOSE" != no ] && log_end_msg 1
			exit 1
			;;
	  esac
	else
	  log_end_msg 0
	  exit 7
	fi
	;;		
  monitor)
	if isrunning; then
		echo "already running"
		exit 1
	else
		pdns_server $DAEMON_ARGS --daemon=no --guardian=no --control-console --loglevel=9
		exit 0
	fi 
	;;		
  dump)
	if isrunning; then
		doPC list
		exit 0
	else
		echo "not running"
		exit 7
	fi 
	;;		
  show)
	if isrunning; then
		if [ $# -lt 2 ]; then
			echo "Insufficient parameters"
			exit 2
		fi
		echo -n "$2="
		doPC show $2
		exit 0
	else
		echo "not running"
		exit 7
	fi 
	;;		
  mrtg)
	if isrunning; then
		if [ $# -lt 2 ]; then
			echo "Insufficient parameters"
			exit 2
		fi 
		doPC show $2
		if [ "$3x" != "x" ]; then
			doPC show $3
		else
			echo 0
		fi
		doPC uptime
		echo "$DESC"
		exit 0
	else
		echo "not running"
		exit 7
	fi 
	;;		
  cricket)
	if isrunning; then
		if [ $# -lt 2 ]; then
			echo "Insufficient parameters"
			exit 1
		fi 
		doPC show $2
		exit 0
	else
		echo "not running"
		exit 7
	fi 
	;;		
  *)
	echo "Usage: $SCRIPTNAME {start|stop|status|force-stop|restart|reload|monitor|dump|show|mrtg|cricket}"
	;;
esac

exit 0
