#!/bin/bash
#
# Start/Stop the OpenSLP SA daemon (slpd).
#
# chkconfig: 345 13 87
# description: slpd - OpenSLP daemon for the Service Location Protocol
#
# processname: slpd
# config: /etc/slp.conf
# config: /etc/sysconfig/slpd
# pidfile: /var/run/sshd.pid

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

[ -f /etc/sysconfig/slpd ] && . /etc/sysconfig/slpd

[ -x /usr/sbin/slpd ] || exit 1

RETVAL=0
prog="slpd"

#///////////// multicast_route_set() //////////////#
#                                                  #
# Does nothing if a route exists that supports     #
# multicast traffic. If no routes supporting       #
# multicast traffic exists, the function tries to  #
# add one.  A 0 is returned on success and a 1     #
# on failure. One parameter must be passed in.     #
# This variable determins verbosity. If parameter  #
# is non-zero debugging will appear                #
#                                                  #
#//////////////////////////////////////////////////#
multicast_route_set()
{
	PING_OPTIONS_1='-c1 -w1'
	PING_OPTIONS_2='-c1 -i1'
	MULTICAST_ADDRESS='239.255.255.253'
	TMP_FILE=/tmp/route.check
	PING_ERROR_NO_ROUTE='unreachable'

	MSG_FAILED_TO_FIND='Failed to Detect Multicast Route'
	MSG_SUCCESS_ON_FIND='Multicast Route Enabled'
	MSG_ADDING_ROUTE='Attempting to Add Multicast Route ...'
	MSG_FAILED_TO_ADD=' FAILED - Route NOT Added.'
	MSG_SUCCES_ON_ADD=' SUCCESS - Route Added.'

	CMD_GET_INTERFACE="netstat -i | awk 'BEGIN{}(NR>2)&&(!/^lo*/){print $1}'"
	CMD_ADD_ROUTE="route add -net 224.0.0.0 netmask 240.0.0.0"

	ping $PING_OPTIONS_1 $MULTICAST_ADDRESS 2> $TMP_FILE 1> /dev/null

	if [ $? = 2 ]; then
		ping $PING_OPTIONS_2 $MULTICAST_ADDRESS 2> $TMP_FILE 1> /dev/null
	fi

	grep $PING_ERROR_NO_ROUTE $TMP_FILE > /dev/null 2>&1
	err_unreachable_found=$?

	#If errors, add route. Otherwise, do nothing
	if [ -s $TMP_FILE ] && [ $err_unreachable_found = 0 ]; then

		if [ $1 != 0 ]; then
			echo $MSG_FAILED_TO_FIND
			echo $MSG_ADDING_ROUTE
		fi

		$CMD_ADD_ROUTE  > /dev/null 2>&1
		retval=$?

		if [ $1 != 0 ]; then
			if [ $retval = 0 ]; then
				echo $MSG_SUCCES_ON_ADD
			else
				echo $MSG_FAILED_TO_ADD
			fi
		fi
	else
		if [ $1 != 0 ]; then
			echo -n $MSG_SUCCESS_ON_FIND
		fi
		retval=0
	fi

	rm -f $TMP_FILE # Clean up
	return $retval
}

start() {
	echo -n $"Starting $prog: "

	# Attempt to guarantee a multicast route...
	multicast_route_set 1
	multicast_enabled=$?
	if [ "$multicast_enabled" != "0" ] ; then
		echo "Failure: No Route Available for Multicast Traffic"
		exit 1
	fi

	daemon /usr/sbin/slpd $OPTIONS
	RETVAL=$?
	echo
        [ $RETVAL -eq 0 ] && touch /var/lock/subsys/slpd
        return $RETVAL
}

stop() {
	echo -n $"Shutting down $prog: "
	killproc slpd
	RETVAL=$?
        [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/crond
	echo
        return $RETVAL
}

restart() {
	stop
	start
}

# See how we were called.
case "$1" in
  start)
	start
	;;
  stop)
	stop
        ;;
  restart)
	restart
	;;
  condrestart)
	[ -f /var/lock/subsys/crond ] && restart || :
	;;
  status)
	status slpd
	;;
  *)
	echo $"Usage: $0 {start|stop|restart|status}"
	exit 1
esac

exit $?
