#! /bin/sh
#
### BEGIN INIT INFO
# Provides:          openhpid
# Required-Start:    $network $remote_fs $syslog
# Required-Stop:     $network $remote_fs $syslog
# Should-Start:      $named
# Should-Stop:       $named
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Start OpenHPI daemon at boot time
# Description:       Enable OpenHPI service which is provided by openhpid.
### END INIT INFO
#
# openhpid.sh    Start/Stop the openhpi daemon.
#
# description: openhpid is standard UNIX program which uses the OpenHPI \
#              APIs and provides a standard internet server to access those \
#              APIs for client programs.
# processname: openhpid
# config: the standard openhpi conf file specified on the command line or the env.
# pidfile: /var/run/openhpid.pid
#
# Author(s):
#	W. David Ashley <dashley@us.ibm.com>
#	Daniel de Araujo <ddearauj@us.ibm.com>

# Source function library.
PATH=/sbin:/bin:/usr/sbin:/usr/bin
prog="OpenHPI"

# If the openhpid executable is not available, we can't do any of this
test -f /usr/sbin/openhpid || exit 0

# Determine whether the lsb package is installed
# If it is, determine which lsb is installed:
# redhat, suse, or standard lsb

if test -f /etc/init.d/functions
then
   lsbtype="rh"
   . /etc/init.d/functions
elif test -f /etc/rc.status
then
   lsbtype="suse"
   . /etc/rc.status
elif test -f /lib/lsb/init-functions
then
   lsbtype="lsb"
   . /lib/lsb/init-functions
elif test -f /etc/gentoo-release
then
   lsbtype="gentoo"
   . /sbin/functions.sh
else
   lsbtype="nolsb"
fi

print_outcome()
{

	case "${lsbtype}" in

		suse)
 			rc_status -v
			;;

		lsb)
			if test "$?" -eq 0
   			then
      			log_success_msg "success"
   			else
				log_failure_msg "failed"
   			fi
  			;;
  
  		gentoo)
  			eend $?
  			;;

		nolsb | rh)
			if test "$?" -eq 0
			then
				echo " ... success"
			fi
			if test "$?" -ne 0
			then
				echo " ... failed"
			fi
			;;
   	esac
}

start() {
	case "${lsbtype}" in

		suse)
			echo -n "Starting $prog: "
			startproc /usr/sbin/openhpid -c /etc/openhpi/openhpi.conf
			RETVAL=$?
			;;
		lsb)
			echo -n "Starting $prog: "
			start_daemon /usr/sbin/openhpid -c /etc/openhpi/openhpi.conf
			RETVAL=$?
			;;
		gentoo | rh)
			echo "Starting $prog: "
			start-stop-daemon --start --quiet --exec /usr/sbin/openhpid -- -c /etc/openhpi/openhpi.conf
			RETVAL=$?
			;;
		nolsb)
			echo -n "Starting $prog: "
			/usr/sbin/openhpid -c /etc/openhpi/openhpi.conf
			RETVAL=$?
			;;

	esac

	print_outcome

}

stop() {
	case "${lsbtype}" in

		lsb | suse)
			echo -n "Stopping $prog: "
			killproc /usr/sbin/openhpid
			RETVAL=$?
			;;

		gentoo)
			echo "Stopping $prog: "
			start-stop-daemon --stop --quiet --exec /usr/sbin/openhpid
			RETVAL=$?
			;;

		nolsb | rh)
			echo -n "Stopping $prog: "
			if test -f /var/run/openhpid.pid && test "`cat /var/run/openhpid.pid`" != ""
         		then
            			kill "`cat /var/run/openhpid.pid`"
				RETVAL=$?
			else
				RETVAL=0
			fi
			;;

	esac

	print_outcome

	if test "$RETVAL" -eq 0 && test -f /var/run/openhpid.pid
	then
		rm -f /var/lock/openhpid
		rm -f /var/run/openhpid.pid
	fi

}

dstatus() {
	echo "Checking for $prog daemon: "

	case "${lsbtype}" in

		suse)
			checkproc /usr/sbin/openhpid
			rc_status -v
			;;
		lsb)
			pid="`pidofproc /usr/sbin/openhpid`"
         		if test "${pid}" != ""
			then
				log_success_msg "$prog is running"
			else
				log_success_msg "$prog is not running"
			fi
			;;
		gentoo | nolsb | rh)
			if test -f /var/run/openhpid.pid &&
				test "`cat /var/run/openhpid.pid`" != "" &&
				kill -s 0 "`cat /var/run/openhpid.pid`"
			then
				echo "$prog is running"
			else
				echo "$prog is not running"
			fi

			;;

	esac



}

restart() {
  	stop
	start
}

force_reload() {
	# We don't currently support a reload, but can do a restart
	stop
	start
}

# See how we were called.

case "$1" in
  start)
  	start
	;;
  stop)
  	stop
	;;
  restart)
  	restart
	;;
  status)
  	dstatus
	;;
  force-reload)
  	force_reload
	;;
  *)
	echo "Usage: $0 {start|stop|restart|status|force-reload}"
	exit 1
esac
