#!/bin/sh # # Support: users@clusterlabs.org # License: GNU General Public License (GPL) # # EvmsSCC # Description: Runs evms_activate in a heartbeat cluster to activate a # EVMS shared cluster container in the cluster. # Original Author: Jo De Baer (jdebaer@novell.com) # Original Release: 06 Nov 2006 # # usage: ./EvmsSCC {start|stop|status|monitor|meta-data} # # The goal of this resource agent is to provoke the creation of device file # in /dev/emvs which correspond to EVMS2 volumes that reside in a EVMS2 shared # cluster container. As such it should be run as a clone resource in the # cluster. Logic inside the resource agent will make sure that "evms_activate" # is run on only one node in the cluster, both at cluster startup time as well # as when a node joins the cluster. # # Typically, resources that need to mount EVMS2 volumes should run after this # resource agent has finished it's run. As such those resources should be made # "dependent" on this resource agent by the cluster administrator. An example # of resources that should depend on this resource agent are Filesystem resource # agent that mount OCFS2 volumes that reside on EVMS2 volumes in a shared # EVMS2 cluster container. # # For this resource agent to do it's job correctly, evmsd must be running on # the node where the agent is started. Usually evmsd is started by the cluster # software via a respawn statement in /etc/ha.d/ha.cf. If you encounter timing # issues where evmsd is not yet started but where the cluster already starts # the EvmsSCC clone, then you should comment out the evmsd respawn statement # in /etc/ha.d/ha.cf and start evmsd on each node in the cluster via a separate # clone resource agent. The EvmsSCC resource agent cloneset should then be made # dependent to this evmsd cloneset. This will guarantee that emvsd is running # before EvmsSCC is started, on each node in the cluster. # ####################################################################### # Initialization: : ${OCF_FUNCTIONS_DIR=${OCF_ROOT}/lib/heartbeat} . ${OCF_FUNCTIONS_DIR}/ocf-shellfuncs # Parameter defaults OCF_RESKEY_ignore_deprecation_default="false" : ${OCF_RESKEY_ignore_deprecation=${OCF_RESKEY_ignore_deprecation_default}} ####################################################################### # Utilities used by this script CUT=cut EVMSACTIVATE=evms_activate usage() { cat <<-EOT usage: $0 {start|stop|status|monitor|meta-data} EOT } meta_data() { cat < 1.0 Deprecation warning: EVMS is no longer actively maintained and should not be used. This agent is deprecated and may be removed from a future release. -- Resource script for EVMS shared cluster container. It runs evms_activate on one node in the cluster. Manages EVMS Shared Cluster Containers (SCCs) (deprecated) If set to true, suppresses the deprecation warning for this agent. Suppress deprecation warning END } EvmsSCC_status() { # At the moment we don't support monitoring EVMS activations. We just return "not running" to cope with the pre-start monitor call. return $OCF_NOT_RUNNING } EvmsSCC_notify() { local n_type="$OCF_RESKEY_CRM_meta_notify_type" local n_op="$OCF_RESKEY_CRM_meta_notify_operation" local n_active="$OCF_RESKEY_CRM_meta_notify_active_uname" local n_stop="$OCF_RESKEY_CRM_meta_notify_stop_uname" local n_start="$OCF_RESKEY_CRM_meta_notify_start_uname" case "$n_type" in pre) case "$n_op" in start) ocf_log debug "EvmsSCC: Notify: Starting node(s): $n_start." EvmsSCC_start_notify_common ;; esac ;; esac return $OCF_SUCCESS } EvmsSCC_start() { local n_type="$OCF_RESKEY_CRM_meta_notify_type" local n_op="$OCF_RESKEY_CRM_meta_notify_operation" local n_active="$OCF_RESKEY_CRM_meta_notify_active_uname" local n_stop="$OCF_RESKEY_CRM_meta_notify_stop_uname" local n_start="$OCF_RESKEY_CRM_meta_notify_start_uname" ocf_log debug "EvmsSCC: Start: starting node(s): $n_start." EvmsSCC_start_notify_common return $OCF_SUCCESS } EvmsSCC_stop() { return $OCF_SUCCESS } EvmsSCC_start_notify_common() { local n_myself=${HA_CURHOST:-$(uname -n | tr A-Z a-z)} ocf_log debug "EvmsSCC: Start_Notify: I am node $n_myself." n_active="$n_active $n_start" case " $n_active " in *" $n_myself "*) ;; *) ocf_log err "EvmsSCC: $n_myself (local) not on active list!" return $OCF_ERR_GENERIC ;; esac #pick the first node from the starting list #when the cluster boots this will be one of the many booting nodes #when a node later joins the cluster, this will be the joining node local n_first=$(echo $n_start | cut -d ' ' -f 1) ocf_log debug "EvmsSCC: Start_Notify: First node in starting list is $n_first." if [ "$n_myself" = "$n_first" ] ; then ocf_log debug "EvmsSCC: Start_Notify: I am running ${EVMSACTIVATE}." while true ; do if ! ${EVMSACTIVATE} -q 2> /dev/null ; then SLEEP_TIME=$(($(ocf_maybe_random) % 40)) ocf_log info "EvmsSCC: Evms call failed - sleeping for $SLEEP_TIME seconds and then trying again." sleep $SLEEP_TIME else break fi done fi return $OCF_SUCCESS } # Check the arguments passed to this script if [ $# -ne 1 ] then usage exit $OCF_ERR_ARGS fi OP=$1 case $OP in meta-data) meta_data exit $OCF_SUCCESS ;; usage) usage exit $OCF_SUCCESS ;; esac # Be obnoxious, log deprecation warning on every invocation (unless # suppressed by resource configuration). ocf_deprecated check_binary $CUT check_binary $EVMSACTIVATE case $OP in start) EvmsSCC_start ;; notify) EvmsSCC_notify ;; stop) EvmsSCC_stop ;; status|monitor) EvmsSCC_status ;; *) usage exit $OCF_ERR_UNIMPLEMENTED ;; esac exit $?