#!/bin/bash
################################################################################
#
# Intel Data Center Bridging (DCB) Software
# Copyright(c) 2007-2008 Intel Corporation.
#
# Based on:
#     Template LSB system startup script for example service/daemon FOO
#     Copyright (C) 1995--2005  Kurt Garloff, SUSE / Novell Inc.
#
# This program is free software; you can redistribute it and/or modify it
# under the terms and conditions of the GNU General Public License,
# version 2, as published by the Free Software Foundation.
#
# This program is distributed in the hope it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
# more details.
#
# You should have received a copy of the GNU General Public License along with
# this program; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
#
# The full GNU General Public License is included in this distribution in
# the file called "COPYING".
#
# Contact Information:
# e1000-eedc Mailing List <e1000-eedc@lists.sourceforge.net>
# Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
#
################################################################################
#
# dcbd		This shell script takes care of starting and stopping
#		dcbd (DCB capabilities exchange protocol)
#
# chkconfig: 345 20 80
# description: Data Center Bridging Exchange protocol daemon
#
### BEGIN INIT INFO
# Provides: dcbd
# Required-Start: network
# Required-Stop:
# Default-Start: 3 5
# Default-Stop:
# Description: Data Center Bridging Exchange protocol daemon
### END INIT INFO

DCBD=dcbd
DCBD_BIN=/usr/sbin/$DCBD

test -x $DCBD_BIN || { echo "$DCBD_BIN not installed";
	if [ "$1" = "stop" ]; then exit 0;
	else exit 5; fi; }

# Default: Assume sysvinit binaries exist
start_daemon() { /sbin/start_daemon ${1+"$@"}; }
killproc()     { /sbin/killproc     ${1+"$@"}; }
pidofproc()    { /sbin/pidofproc    ${1+"$@"}; }
checkproc()    { /sbin/checkproc    ${1+"$@"}; }

if test -e /etc/rc.status; then
	# SUSE rc script library
	. /etc/rc.status
else
	export LC_ALL=POSIX
	_cmd=$1
	declare -a _SMSG
	if test "${_cmd}" = "status"; then
		_SMSG=(running dead dead unused unknown reserved)
		_RC_UNUSED=3
	else
		_SMSG=(done failed failed missed failed skipped unused failed \
			failed reserved)
		_RC_UNUSED=6
	fi
	if test -e /lib/lsb/init-functions; then
		# LSB    
		. /lib/lsb/init-functions
		echo_rc()
		{
			if test ${_RC_RV} = 0; then
				log_success_msg "  [${_SMSG[${_RC_RV}]}] "
			else
				log_failure_msg "  [${_SMSG[${_RC_RV}]}] "
			fi
		}
		# TODO: Add checking for lockfiles
		checkproc() { pidofproc ${1+"$@"} >/dev/null 2>&1; }
	elif test -e /etc/init.d/functions; then
		# RHAT
		. /etc/init.d/functions
		echo_rc()
		{
			#echo -n "  [${_SMSG[${_RC_RV}]}] "
			if test ${_RC_RV} = 0; then
				success "  [${_SMSG[${_RC_RV}]}] "
			else
				failure "  [${_SMSG[${_RC_RV}]}] "
			fi
		}
		checkproc() { status ${1+"$@"}; return $?; }
		start_daemon() { daemon ${1+"$@"}; return $?; }
	else
		# emulate it
		echo_rc() { echo "  [${_SMSG[${_RC_RV}]}] "; }
	fi

	rc_reset() { _RC_RV=0; }
	rc_failed()
	{
		if test -z "$1"; then 
			_RC_RV=1;
		elif test "$1" != "0"; then 
			_RC_RV=$1; 
		fi
		return ${_RC_RV}
	}
	rc_check()
	{
		return rc_failed $?
	}	
	rc_status()
	{
		rc_failed $?
		if test "$1" = "-r"; then _RC_RV=0; shift; fi
		if test "$1" = "-s"; then
			rc_failed 5; echo_rc; rc_failed 3; shift;
		fi
		if test "$1" = "-u"; then
			rc_failed ${_RC_UNUSED}; echo_rc; rc_failed 3; shift;
		fi
		if test "$1" = "-v"; then echo_rc; shift; fi
		if test "$1" = "-r"; then _RC_RV=0; shift; fi
		return ${_RC_RV}
	}
	rc_exit() { exit ${_RC_RV}; }
	rc_active() 
	{
		if test -z "$RUNLEVEL"; then
			read RUNLEVEL REST < <(/sbin/runlevel);
		fi
		if test -e /etc/init.d/S[0-9][0-9]${1}; then return 0; fi
		return 1
	}
fi

# Reset status of this service
rc_reset

# See how we were called.
case "$1" in
	start)
		if ! /sbin/lsmod | grep dcbnl > /dev/null; then
			mod_dir="/lib/modules/$(uname -r)/kernel/net/dcb"
			if [ -f $mod_dir/dcbnl.ko ]; then
				modprobe dcbnl > /dev/null 2>&1
			fi
		fi		
		echo -n $"Starting $DCBD: "
		start_daemon $DCBD_BIN -d $OPTIONS
		rc_status -v
		[ $? -eq 0 ] && touch /var/lock/subsys/dcbd
		;;
	stop)
		echo -n $"Shutting down $DCBD: "
		killproc $DCBD
		rc_status -v
		[ $? -eq 0 ] && rm -f /var/lock/subsys/dcbd
		;;
	status)
		echo -n "Checking for service $DCBD: "
		## Check status with checkproc(8), if process is running
		## checkproc will return with exit status 0.

		# Return value is slightly different for the status command:
		# 0 - service up and running
		# 1 - service dead, but /var/run/  pid  file exists
		# 2 - service dead, but /var/lock/ lock file exists
		# 3 - service not running (unused)
		# 4 - service status unknown :-(
		# 5--199 reserved (5--99 LSB, 100--149 distro, 150--199 appl.)
		
		# NOTE: checkproc returns LSB compliant status values.
		checkproc $DCBD_BIN
		# NOTE: rc_status knows that we called this init script with
		# "status" option and adapts its messages accordingly.
		rc_status -v
		;;
	try-restart|condrestart)
		## Do a restart only if the service was active before.
		## Note: try-restart is now part of LSB (as of 1.9).
		## RH has a similar command named condrestart.
		if test "$1" = "condrestart"; then
			echo "${attn} Use try-restart ${done}(LSB)${attn}"\
				"rather than condrestart ${warn}(RH)${norm}"
		fi
		$0 status
		if test $? = 0; then
			$0 restart
		else
			rc_reset	# Not running is not a failure.
		fi
		# Remember status and be quiet
		rc_status
		;;
	restart)
		$0 stop
		$0 start

		# Remember status and be quiet
		rc_status
		;;
	force-reload)
		## Signal the daemon to reload its config. Most daemons
		## do this on signal 1 (SIGHUP).
		## If it does not support it, restart the service if it
		## is running.

		#echo -n "Reload service $DCBD "
		## if it supports it:
		#killproc -HUP $DCBD
		#touch /var/run/$DCBD.pid
		#rc_status -v

		## Otherwise:
		$0 try-restart
		rc_status
		;;
	reload)
		## Like force-reload, but if daemon does not support
		## signaling, do nothing (!)

		# If it supports signaling:
		#echo -n "Reload service $DCBD "
		#killproc -HUP $DCBD_BIN
		#touch /var/run/$DCBD.pid
		#rc_status -v
		
		## Otherwise if it does not support reload:
		echo -n $"Reloading $DCBD is not supported: "
		rc_failed 3
		rc_status -v
		;;
	*)
       		echo $"Usage: $0 {start|stop|status|try-restart|restart|force-reload|reload}"
		exit 1
esac

rc_exit
