File clvmd.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"}
: ${OCF_RESKEY_daemon_options:="-d0"}

# Common variables
DAEMON="${sbindir}/clvmd"
CMIRRORD="${sbindir}/cmirrord"
LVMCONF="${sbindir}/lvmconf"

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

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

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

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

    start_daemon "$DAEMON" "$OCF_RESKEY_daemon_options"; 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_clvmd; rc=$?
        sleep 1
    done

    return $rc
}

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

    start_daemon "$CMIRRORD"; rc=$?
    if [ $rc != 0 ]; then
	ocf_log err "Could not start $CMIRRORD"
	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_cmirrord; rc=$?
        sleep 1
    done

    return $rc
}


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

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

    sleep 1
    status_daemons; 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_clvmd; rc=$?
			if [ $rc = $OCF_NOT_RUNNING ]; then
				return $OCF_SUCCESS
			else
				return $OCF_ERR_GENERIC
			fi
        fi
		killproc -INT "$DAEMON"
        sleep 1
		status_clvmd; rc=$?
    done

    return $OCF_SUCCESS
}

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

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

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

    return $OCF_SUCCESS
}


clvmd_start() 
{
	clvmd_validate
	ocf_log info "Starting $OCF_RESOURCE_INSTANCE"

    # autoset locking type to clusted when lvmconf tool is available
    if [ -x "$LVMCONF"  ]; then
        $LVMCONF --enable-cluster > /dev/null 2>&1
    fi  

	status_clvmd; rc=$?
    if [ $rc == $OCF_NOT_RUNNING ]; then 
      bringup_clvmd; rc=$?
	  if [ $rc != $OCF_SUCCESS ]; then
		  return $OCF_ERR_GENERIC
	  fi
	fi

	status_cmirrord; rc=$?
    if [ $rc == $OCF_NOT_RUNNING ]; then 
      bringup_cmirrord; rc=$?
	  if [ $rc != $OCF_SUCCESS ]; then
		  kill_clvmd
		  return $OCF_ERR_GENERIC
	  fi
	fi

    return $OCF_SUCCESS
}

clvmd_stop() {
	clvmd_validate
    ocf_log info "Stopping $OCF_RESOURCE_INSTANCE"

	status_clvmd; rc=$?
	if [ $rc != $OCF_NOT_RUNNING ]; then
		kill_clvmd; krc=$?
		if [ $krc != $OCF_SUCCESS ]; then
			ocf_log err "Failed to stop clvmd"
			return $OCF_ERR_GENERIC
		fi
	fi

	status_cmirrord; rc=$?
	if [ $rc != $OCF_NOT_RUNNING ]; then
		kill_cmirrord; krc=$?
		if [ $krc != $OCF_SUCCESS ]; then
			ocf_log err "Failed to stop cmirrord"
			return $OCF_ERR_GENERIC
		fi
	fi

	return $OCF_SUCCESS
}

clvmd_monitor() {
    clvmd_validate

    status_daemons
    return $?
}

clvmd_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"
}

clvmd_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="clvmd">
  <version>1.0</version>
  <longdesc lang="en">
This is a Resource Agent for both clvmd and cmirrord.
It starts clvmd and cmirrord as anonymous clones.
  </longdesc>
  <shortdesc lang="en">clvmd 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 clvmd. Refer to clvmd.8 for detailed descriptions.
      </longdesc>
      <shortdesc lang="en">Daemon Options</shortdesc>
      <content type="string" default="-d0"/>
    </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)		clvmd_start
		;;
stop)		clvmd_stop
		;;
monitor)	clvmd_monitor
		;;
validate-all)	clvmd_validate
		;;
usage|help)	clvmd_usage
		exit $OCF_SUCCESS
		;;
*)		clvmd_usage
		exit $OCF_ERR_UNIMPLEMENTED
		;;
esac

exit $?