File cmirrord.ocf of Package lvm2.openSUSE_Leap_42.1_Update

#!/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"}

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

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 $?