#!/bin/bash
# Copyright (c) 2008 Xinwei Hu All Rights Reserved.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of version 2 of the GNU General Public License as
# published by the Free Software Foundation.
#
# This program is distributed in the hope that it would be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
#
# Further, this software is distributed without any warranty that it is
# free of the rightful claim of any third person regarding infringement
# or the like.	Any license provided herein, whether implied or
# otherwise, applies only to this software file.  Patent licenses, if
# any, provided herein do not apply to combinations of this program with
# other software, or any other product whatsoever.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write the Free Software Foundation,
# Inc., 59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
#
#######################################################################

# OCF initialization
. ${OCF_ROOT}/resource.d/heartbeat/.ocf-shellfuncs

# Parameter defaults
: ${OCF_RESKEY_CRM_meta_globally_unique:="false"}
: ${OCF_RESKEY_daemon_timeout:="80"}

sbindir=$HA_SBIN_DIR

# Common variables
DAEMON="${sbindir}/cmirrord"

time_to_seconds() {
	local val 
	val=$1
	case $val in
		*h) echo $(( $(echo $val | sed -e "s/h$//") * 3600 ));;
		*ms) echo $(( $(echo $val | sed -e "s/ms$//") / 1000 ));;
		*s) echo $val | sed -e "s/s$//";;
		*m) echo $(( $(echo $val | sed -e "s/m$//") * 60 ));;
		*) echo "$val";;
	esac
}

OCF_RESKEY_daemon_timeout=$(time_to_seconds ${OCF_RESKEY_daemon_timeout})

status_daemon()
{
	PID=`pidofproc "$DAEMON"`
	if [ -n "$PID" ]; then
		return $OCF_SUCCESS
	fi
	return $OCF_NOT_RUNNING
}

bringup_daemon()
{
	if [ ! -e "$DAEMON" ]; then
		ocf_log err "Required binary not found: $DAEMON"
		return $OCF_ERR_INSTALLED
	fi

	start_daemon "$DAEMON"; rc=$?
	if [ $rc != 0 ]; then
		ocf_log err "Could not start $DAEMON"
		return $OCF_ERR_GENERIC
	fi

	sleep 1
	COUNT=0
	rc=$OCF_NOT_RUNNING

	while [ $rc = $OCF_NOT_RUNNING ]; do
		COUNT=`expr $COUNT + 1`
		if [ $COUNT -gt $OCF_RESKEY_daemon_timeout ]; then
			ocf_log err "`basename $DAEMON` did not come up"
			return $OCF_ERR_GENERIC
		fi
		status_daemon; rc=$?
		sleep 1
	done

	return $rc
}

kill_daemon()
{
	status_daemon; rc=$?
	if [ $rc != $OCF_SUCCESS ]; then
		return $rc
	fi

	ocf_log info "Stopping `basename "$DAEMON"`"
	killproc -INT "$DAEMON"

	sleep 1
	status_daemon; rc=$?
	
	COUNT=0
	while [ $rc = $OCF_SUCCESS ]; do
		COUNT=`expr $COUNT + 1`
		if [ $COUNT -gt $OCF_RESKEY_daemon_timeout ]; then
			ocf_log err "`basename $DAEMON` shutdown emergency"
			killproc -9 "$DAEMON"
			status_daemon; rc=$?
			if [ $rc = $OCF_NOT_RUNNING ]; then
				return $OCF_SUCCESS
			else
				return $OCF_ERR_GENERIC
			fi
		fi
		killproc -INT "$DAEMON"
		sleep 1
		status_daemon; rc=$?
	done

	return $OCF_SUCCESS
}

cmirrord_start() {

	cmirrord_monitor; rc=$?
	if [ $rc != $OCF_NOT_RUNNING ]; then 
		return $rc
	fi

	ocf_log info "Starting $OCF_RESOURCE_INSTANCE"

	bringup_daemon
	return $?
}

cmirrord_stop() {
	cmirrord_monitor; rc=$?
	case $rc in
		$OCF_NOT_RUNNING) return $OCF_SUCCESS;;
	esac

	ocf_log info "Stopping $OCF_RESOURCE_INSTANCE"

	kill_daemon
}

cmirrord_monitor() {
	cmirrord_validate

	status_daemon
	return $?
}

cmirrord_usage() {
	echo "usage: $0 {start|stop|monitor|validate-all|meta-data}"
	echo "	Expects to have a fully populated OCF RA-compliant environment set."
	echo "	In particualr, a value for OCF_ROOT"
}

cmirrord_validate() {
	: TODO: check for globally_unique=true and return OCF_ERR_CONFIGURED
	case ${OCF_RESKEY_CRM_meta_globally_unique} in
	yes|Yes|true|True|1) 
		ocf_log err "$OCF_RESOURCE_INSTANCE must be configured with the globally_unique=false meta attribute"
		exit $OCF_ERR_CONFIGURED
		;;
	esac

	return $OCF_SUCCESS
}

meta_data() {
	cat <<END
<?xml version="1.0"?>
<!DOCTYPE resource-agent SYSTEM "ra-api-1.dtd">
<resource-agent name="cmirrord">
  <version>1.0</version>
  <longdesc lang="en">
This is a cmirrord Resource Agent.
It starts cmirrord as anonymous clones.
  </longdesc>
  <shortdesc lang="en">cmirrord resource agent</shortdesc>
  <parameters>

	<parameter name="daemon_timeout" unique="0">
	  <longdesc lang="en">
Number of seconds to allow the control daemon to come up and down
	  </longdesc>
	  <shortdesc lang="en">Daemon Timeout</shortdesc>
	  <content type="string" default="80"/>
	</parameter>

	<parameter name="daemon_options" unique="0">
	  <longdesc lang="en">
Options to cmirrord. Cmirrord actually doesn't accept any options
for now.
	  </longdesc>
	  <shortdesc lang="en">Daemon Options</shortdesc>
	  <content type="string" default=""/>
	</parameter>

  </parameters>
  <actions>
	<action name="start"	timeout="90"/>
	<action name="stop"		timeout="100"/>
	<action name="monitor"	timeout="20"	depth="0"/>
	<action name="meta-data"	timeout="5"/>
	<action name="validate-all"	timeout="30"/>
  </actions>
</resource-agent>
END
}

case $__OCF_ACTION in
meta-data)	meta_data
		exit $OCF_SUCCESS
		;;
start)		cmirrord_start
		;;
stop)		cmirrord_stop
		;;
monitor)	cmirrord_monitor
		;;
validate-all)	cmirrord_validate
		;;
usage|help)	cmirrord_usage
		exit $OCF_SUCCESS
		;;
*)		cmirrord_usage
		exit $OCF_ERR_UNIMPLEMENTED
		;;
esac

exit $?