#!/bin/bash
#
# xorp            This shell script takes care of starting and stopping
#                 the Open Router Platform XORP.
#
# chkconfig: - 84 16
# description:    XORP is the eXtensible Open Router Platform (XORP).
# processname:    xorp
# config:         /etc/xorp/xorp.conf
# pidfile:        /var/run/xorp.pid

# Source function library.
. /etc/rc.d/init.d/functions

# Source networking configuration.
. /etc/sysconfig/network

# Check that networking is up.
[ ${NETWORKING} = "no" ] && exit 1

# Defines
DESC="the Open Router Platform (XORP)"
PROG="xorp"
EXEC="/usr/sbin/${PROG}_rtrmgr"
LOCK="/var/lock/subsys/${PROG}"
LOGF="/var/log/${PROG}.log"
PIDF="/var/run/${PROG}.pid"
CONF="/etc/${PROG}/${PROG}.conf"

# Include config
if [ -s /etc/sysconfig/${PROG} ]; then
  . /etc/sysconfig/${PROG}
fi

# Further defines
XORP_CONF="${BOOT_CONF:-${CONF}}"
XORP_LOGF="${XORP_LOGF:-${LOGF}}"
XORP_TMPL="${XORP_TMPL:-/usr/local/xorp/share/${PROG}/templates}"
XORP_SHUT="${XORP_SHUT:-100}"

# Check for binaries and configs
[ -x ${EXEC} ] || exit 5
[ -f ${CONF} ] || exit 6


start() {
	# Start daemons.
	gprintf "Starting %s: " "${DESC}"
	daemon "${EXEC} -d -l ${XORP_LOGF} -P ${PIDF} -b ${XORP_CONF} -t ${XORP_TMPL} ${OPTIONS} >/dev/null"
	RETVAL=${?}

	[ ${RETVAL} -eq 0 ] && touch ${LOCK}
	echo
	return ${RETVAL}
}

stop() {
	# Stop daemons.
	gprintf "Shutting down %s: " "${DESC}"
	PID=`pidof -o %PPID ${PROG}_rtrmgr`
	RETVAL=${?}

	[ ${RETVAL} -eq 0 ] && {
	  kill -TERM ${PID}

	  TIMEOUT=0
	  while pidof -o %PPID ${PROG}_rtrmgr >/dev/null; do
	    if [ ${TIMEOUT} -ge ${XORP_SHUT} ]; then
	      RETVAL=1
	      break
	    else
	      sleep 5 && gprintf "."
	      TIMEOUT=$((TIMEOUT+5))
	    fi
	  done

	  [ ${RETVAL} -eq 0 ] && rm -f ${LOCK} ${PIDF}
	}

	[ ${RETVAL} -eq 0 ] && success $"%s shutdown" "${PROG}" || failure $"%s shutdown" "${PROG}"
	echo
	return ${RETVAL}
}

force_stop () {
        # Force Stopping daemons.
        gprintf "Force-Shutting down %s: " "${DESC}"
        PCPID=`pgrep ${PROG}_`
        PID=`pidof -o %PPID ${PROG}_rtrmgr`
        RETVAL=${?}

        [ ${RETVAL} -eq 0 ] && {
          kill -TERM ${PID}

          TIMEOUT=0
          
          kill -TERM ${PCPID}
          while pidof -o %PPID ${PROG}_rtrmgr >/dev/null; do
            if [ ${TIMEOUT} -ge ${XORP_SHUT} ]; then
               sleep 5 && gprintf "."
               TIMEOUT=$((TIMEOUT+5))
            else
              sleep 5 && gprintf "."
              TIMEOUT=$((TIMEOUT+5))
            fi
          done

          [ ${RETVAL} -eq 0 ] && rm -f ${LOCK} ${PIDF}
        }

        [ ${RETVAL} -eq 0 ] && success $"%s shutdown" "${PROG}" || failure $"%s shutdown" "${PROG}"
        echo
        return ${RETVAL}
}

restart() {
	stop
	sleep 2
	start
}

force-stop() {
	force_stop
}


# See how we were called.
case "${1}" in
    start)
	start
	;;
    stop)
	stop
	;;
    restart)
	restart
	;;
    force-stop)
	force-stop
	;;
    status)
	status ${PROG}_rtrmgr
	RETVAL=$?
	;;
    condrestart|try-restart)
	force-stop
        start
	;;
    *)
	gprintf "Usage: service %s {start|stop|status|restart|try-restart|force-stop}\n" "${PROG}"
	exit 2
esac
exit ${?}
