#!/bin/sh
#
#
#	diskd OCF Resource Agent
#
# Copyright (c) 2008 NIPPON TELEGRAPH AND TELEPHONE CORPORATION
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that 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 Street, Fifth Floor, Boston, MA 02110-1301 USA.
#
#######################################################################
# Initialization:

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

#######################################################################

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

<longdesc lang="en">
This is a diskd Resource Agent.
</longdesc>
<shortdesc lang="en">diskd resource agent</shortdesc>

<parameters>

<parameter name="pidfile" unique="0">
<longdesc lang="en">PID file</longdesc>
<shortdesc lang="en">PID file</shortdesc>
<content type="string" default="$HA_VARRUN/diskd-${OCF_RESOURCE_INSTANCE}" />
</parameter>

<parameter name="name" unique="0">
<longdesc lang="en">
The name of the attributes to set.  This is the name to be used in the constraints.
</longdesc>
<shortdesc lang="en">Attribute name</shortdesc>
<content type="string" default="${OCF_RESOURCE_INSTANCE}"/>
</parameter>

<parameter name="device" unique="0">
<longdesc lang="en">
The name of device to check.
</longdesc>
<shortdesc lang="en">Device name</shortdesc>
<content type="string" default=""/>
</parameter>

<parameter name="write_dir" unique="0">
<longdesc lang="en">
The name of directory name to write.
</longdesc>
<shortdesc lang="en">Directory name</shortdesc>
<content type="string" default=""/>
</parameter>

<parameter name="oneshot" unique="0">
<longdesc lang="en">
Disk check only one time
</longdesc>
<shortdesc lang="en">oneshot</shortdesc>
<content type="string" default=""/>
</parameter>

<parameter name="interval" unique="0">
<longdesc lang="en">
Disk status check interval time.
</longdesc>
<shortdesc lang="en">check interval</shortdesc>
<content type="integer" default="30"/>
</parameter>

<parameter name="options" unique="0">
<longdesc lang="en">
A catch all for any other options that need to be passed to diskd.
</longdesc>
<shortdesc lang="en">Extra Options</shortdesc>
<content type="string" default=""/>
</parameter>

</parameters>

<actions>
<action name="start"   timeout="60" />
<action name="stop"    timeout="60" />
<action name="monitor" depth="0"  timeout="60" interval="10" start-delay="1m" />
<action name="meta-data"  timeout="5" />
<action name="validate-all"  timeout="30" />
</actions>
</resource-agent>
END
}

#######################################################################

del_attr_exit() {
	typeset status=$1
	attrd_updater -D -n $OCF_RESKEY_name -q
	exit $status
}

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

Expects to have a fully populated OCF RA-compliant environment set.
END
}

diskd_start() {
    if [ ! -z "$OCF_RESKEY_oneshot" ]; then   
	touch ${OCF_RESKEY_state}
	return $OCF_SUCCESS
    fi

    extras=""
    if [ ! -z "$OCF_RESKEY_device" ]; then
	extras="$extras -N $OCF_RESKEY_device"
    fi
    if [ ! -z "$OCF_RESKEY_write_dir" ]; then   # write-dir
	extras="$extras -w -d $OCF_RESKEY_write_dir"
    fi

    diskd_cmd="${HA_BIN}/diskd -D -p $OCF_RESKEY_pidfile -a $OCF_RESKEY_name -i $OCF_RESKEY_interval $extras $OCF_RESKEY_options"
  
    $diskd_cmd
    rc=$?
    if [ $rc = 0 ]; then
        while ! diskd_monitor; do
            ocf_log info "diskd still hasn't started yet. Waiting..."
            sleep 1
        done
	exit $OCF_SUCCESS
    fi
    
    ocf_log err "Could not run $diskd_cmd : rc=$rc"
    exit $OCF_ERR_GENERIC
}

diskd_stop() {
    if [ ! -z "$OCF_RESKEY_oneshot" ]; then   
	if [ -f ${OCF_RESKEY_state} ]; then
	    rm ${OCF_RESKEY_state}
	fi 
        return $OCF_SUCCESS
    fi

    if [ -f $OCF_RESKEY_pidfile ]; then
	pid=`cat $OCF_RESKEY_pidfile`
    fi
    if [ ! -z $pid ]; then
	kill -TERM $pid
	rc=$?

	if [ $rc = 0 -o $rc = 1 ]; then
	    rm $OCF_RESKEY_pidfile
	    del_attr_exit $OCF_SUCCESS
	fi

	ocf_log err "Unexpected result from kill -TERM $pid: $rc"
	del_attr_exit $OCF_ERR_GENERIC
    fi
    del_attr_exit $OCF_SUCCESS
}

diskd_monitor() {
    if [ ! -z "$OCF_RESKEY_oneshot" ]; then   
	if [ ! -f ${OCF_RESKEY_state} ]; then
            return $OCF_NOT_RUNNING
	fi
    	extras=""
    	if [ ! -z "$OCF_RESKEY_device" ]; then
		extras="$extras -N $OCF_RESKEY_device"
    	fi
    	if [ ! -z "$OCF_RESKEY_write_dir" ]; then   # write-dir
		extras="$extras -w -d $OCF_RESKEY_write_dir"
    	fi
    	diskd_cmd="${HA_BIN}/diskd -o $extras $OCF_RESKEY_options"
	echo $diskd_cmd
    	$diskd_cmd
    	rc=$?
    	if [ $rc = 0 ]; then
	    return $OCF_SUCCESS
    	fi
    	ocf_log err "Could not run $diskd_cmd : rc=$rc"
    	return $OCF_ERR_GENERIC
    fi

    ## daemon
    if [ -f $OCF_RESKEY_pidfile ]; then
	pid=`cat $OCF_RESKEY_pidfile`
    fi
    if [ ! -z $pid ]; then
	kill -0 $pid
	if [ $? = 0 ]; then
	    return $OCF_SUCCESS
	fi
    fi
    return $OCF_NOT_RUNNING
}

diskd_validate() {
# Pidfile better be an absolute path
    case $OCF_RESKEY_pidfile in
	/*) ;;
	*) ocf_log warn "You should have pidfile($OCF_RESKEY_pidfile) of absolute path!" ;;
    esac

# Check the interval
    if ocf_is_decimal "$OCF_RESKEY_interval" && [ $OCF_RESKEY_interval -gt 0 ]; then
	:
    else
	ocf_log err "Invalid interval $OCF_RESKEY_interval. It should be positive integer!"
	exit $OCF_ERR_ARGS
    fi

    echo "Validate OK"
    return $OCF_SUCCESS
}

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

: ${OCF_RESKEY_options:=""}
: ${OCF_RESKEY_interval:="30"}
: ${OCF_RESKEY_name:="diskd"}
: ${OCF_RESKEY_CRM_meta_interval:=0}
: ${OCF_RESKEY_CRM_meta_globally_unique:="true"}

if [ ${OCF_RESKEY_CRM_meta_globally_unique} = "false" ]; then
    : ${OCF_RESKEY_pidfile:="$HA_VARRUN/diskd-${OCF_RESKEY_name}"}
else 
    : ${OCF_RESKEY_pidfile:="$HA_VARRUN/diskd-${OCF_RESOURCE_INSTANCE}"}
fi

if [ "x$OCF_RESKEY_state" = "x" ]; then
    if [ ${OCF_RESKEY_CRM_meta_globally_unique} = "false" ]; then
        state="${HA_VARRUN}/diskd-${OCF_RESOURCE_INSTANCE}.state"
        
        # Strip off the trailing clone marker
        OCF_RESKEY_state=`echo $state | sed s/:[0-9][0-9]*\.state/.state/`
    else 
        OCF_RESKEY_state="${HA_VARRUN}/diskd-${OCF_RESOURCE_INSTANCE}.state"
    fi
fi

case $__OCF_ACTION in
meta-data)	meta_data
		exit $OCF_SUCCESS
		;;
start)		diskd_start
		;;
stop)		diskd_stop
		;;
monitor)	diskd_monitor
		;;
validate-all)	diskd_validate
		;;
usage|help)	diskd_usage
		exit $OCF_SUCCESS
		;;
*)		diskd_usage
		exit $OCF_ERR_UNIMPLEMENTED
		;;
esac

exit $?
