#!/bin/sh

if [ -n "$OCF_DEBUG_LIBRARY" ]; then
    . $OCF_DEBUG_LIBRARY
else
    . ${OCF_ROOT}/resource.d/heartbeat/.ocf-shellfuncs
fi

scsi2reserve_meta_data() {
	cat <<END
<?xml version="1.0"?>
<!DOCTYPE resource-agent SYSTEM "ra-api-1.dtd">
<resource-agent name="scsi2reserve">
<version>1.0</version>

<longdesc lang="en">
This is a resource agent reserve/release/preempt via scsi-2 reservation.
</longdesc>

<shortdesc lang="en">
scsi-2 reservation
</shortdesc>

<parameters>

<parameter name="sharedisk" unique="0" required="1">
<longdesc lang="en">
The shared disk that needs reservation.
</longdesc>
<shortdesc lang="en">
The brief description of this parameter
</shortdesc>
<content type="string" default="/dev/sdb" />
</parameter>

<parameter name="start_loop" unique="0" required="1">
<longdesc lang="en">
The number of iteration we try before giving up.
The detailed description of this parameter
</longdesc>
<shortdesc lang="en">
The brief description of this parameter
</shortdesc>
<content type="string" default="10" />
</parameter>


</parameters>

<actions>
<action name="start"   timeout="300" />
<action name="stop"    timeout="100" />
<action name="status"   timeout="90" />
<action name="monitor" depth="0"  timeout="20" interval="20" start-delay="1m" role="Slave" />
<action name="monitor" depth="0"  timeout="20" interval="10" start-delay="1m" role="Master" />
<action name="meta-data"  timeout="5" />
<action name="validate-all"  timeout="30" />
</actions>
</resource-agent>
END

	return $OCF_SUCCESS
}

scsi2reserve_usage() {
	cat <<END
		usage: $0 {start|stop|monitor|validate-all|meta-data}
END
}

case $__OCF_ACTION in
	meta-data)  scsi2reserve_meta_data
		exit $OCF_SUCCESS
		;;
	usage|help) scsi2reserve_usage
		exit $OCF_SUCCESS
		;;
	*)
		;;
esac		
	

scsi2reserve_validate ()
{
	: ${OCF_RESKEY_start_loop=10}
	if [ -z "${OCF_RESKEY_sharedisk}" ]; then
		exit $OCF_ERR_GENERIC
	fi	
	if [ ! -b "${OCF_RESKEY_sharedisk}" ]; then
		exit $OCF_ERR_ARGS
	fi		
}

scsi2reserve_validate

scsi2reserve_start ()
{
	ite=$OCF_RESKEY_start_loop
	while [ $ite -ge 0 ]; do	
		/sbin/startproc /usr/sbin/scsi_reserve -d ${OCF_RESKEY_sharedisk} --preempt --hold
		sleep 15
		/sbin/checkproc /usr/sbin/scsi_reserve
		rc=$?
		if [ $rc -eq 0 ]; then
			exit $OCF_SUCCESS
		fi		
		ite=`expr $ite - 1`
	done	
	exit $OCF_ERR_GENERIC
}

scsi2reserve_monitor ()
{
	/sbin/checkproc /usr/sbin/scsi_reserve
	rc=$?
	if [ $rc -eq 0 ]; then
		exit $OCF_SUCCESS
	else
		exit $OCF_NOT_RUNNING
	fi	
}

scsi2reserve_stop ()
{
	/sbin/killproc /usr/sbin/scsi_reserve
	/usr/sbin/scsi_reserve -d ${OCF_RESKEY_sharedisk} --release
	exit $OCF_SUCCESS
}

if [ $# -ne 1 ]; then
	scsi2reserve_usage
	exit $OCF_ERR_ARGS
fi

case $__OCF_ACTION in
	start)      scsi2reserve_start
		;;
	stop)       scsi2reserve_stop
		;;
	monitor)    scsi2reserve_monitor
		;;
	validate-all)   scsi2reserve_validate
			exit $OCF_SUCCESS
		;;
	*)      scsi2reserve_usage
		exit $OCF_ERR_UNIMPLEMENTED
	;;
esac

exit $?


