#!/bin/bash

# Authors:
#  Klaus Wenninger <kwenning@redhat.com>
#
# License: Revised BSD

# chkconfig: - 99 01
# description: Shared-storage based fencing daemon
# processname: sbd
#
### BEGIN INIT INFO
# Provides:		sbd_helper
# Required-Start:	$local_fs $remote_fs
# Should-Start:		$syslog
# Required-Stop:	$local_fs $remote_fs
# Default-Start:
# Default-Stop:
# Short-Description:	Starts and stops Shared-storage based fencing daemon.
# Description:		Starts and stops Shared-storage based fencing daemon.
### END INIT INFO

desc="Shared-storage based fencing daemon"
prog="sbd"
pidfile="/var/run/${prog}.pid"

# set secure PATH
PATH="/sbin:/bin:/usr/sbin:/usr/bin:/usr/sbin"

checkrc() {
	if [ $? = 0 ]; then
		success
	else
		failure
	fi
}

success()
{
	echo -ne "[  OK  ]\r"
}

failure()
{
	echo -ne "[FAILED]\r"
}

log() 
{
	logger -t sbd -p daemon.notice "$*"
}

notify()
{
	log "$*"
	echo -n "   $*"
}

sbd_status()
{
	pid=$(cat $pidfile 2>/dev/null)
	rtrn=$?
	if [ $rtrn -eq 0 ]; then
		kill -0 $pid > /dev/null 2>&1
		rtrn=$?
	fi
	if [ $rtrn -ne 0 ]; then
		rm -f $pidfile
		echo "$prog is stopped"
	else
		echo "$prog (pid $pid) is running..."
	fi
	return $rtrn
}

# rpm based distros
if [ -d /etc/sysconfig ]; then
	[ -f /etc/rc.d/init.d/functions ] && . /etc/rc.d/init.d/functions
set -a
	[ -f /etc/sysconfig/sbd ] && . /etc/sysconfig/sbd
set +a
	[ -z "$LOCK_FILE" ] && LOCK_FILE="/var/lock/subsys/sbd"
fi

# deb based distros
if [ -d /etc/default ]; then
set -a
[ -f /etc/default/sbd ] && . /etc/default/sbd
set +a
[ -z "$LOCK_FILE" ] && LOCK_FILE="/var/lock/sbd"
fi

start()
{
	notify "Starting $desc"

	# most recent distributions use tmpfs for $/var/run
	# to avoid to clean it up on every boot.
	# they also assume that init scripts will create
	# required subdirectories for proper operations
	mkdir -p /var/run

	if sbd_status > /dev/null 2>&1; then
		success
	else
		$prog $SBD_OPTS -p $pidfile watch > /dev/null 2>&1

		# give it a little time to fail after daemonization 
		sleep 2

		if sbd_status > /dev/null 2>&1; then
			touch $LOCK_FILE
			success
		else
			failure
			rtrn=1
		fi
	fi
	echo
}

stop()
{
	if sbd_status > /dev/null 2>&1; then
	    notify "Signaling $desc to terminate"
	    kill -TERM $(cat $pidfile) > /dev/null 2>&1
	    checkrc
	    echo

	    notify "Waiting for sbd to unload"
	    while sbd_status > /dev/null 2>&1; do
		sleep 1
		echo -n "."
	    done
	else
	    echo -n "$desc is already stopped"
	fi

#	rm -f $LOCK_FILE
#	rm -f $pidfile
	killall -q -9 sbd
	success
	echo
}

rtrn=0

case "$1" in
start)
	start
;;
restart|reload|force-reload)
	stop
	start
;;
condrestart|try-restart)
	if sbd_status > /dev/null 2>&1; then
	    stop
	    start
	fi
;;
status)
	sbd_status 
	rtrn=$?
;;
stop)
	stop
;;
*)
	echo "usage: $0 {start|stop|restart|reload|force-reload|condrestart|try-restart|status}"
	rtrn=2
;;
esac

exit $rtrn
