public inbox for cluster-cvs@sourceware.org help / color / mirror / Atom feed
From: "Fabio M. Di Nitto" <fabbione@fedoraproject.org> To: cluster-cvs-relay@redhat.com Subject: master - init scripts: major rework to make them distro agnostic Date: Fri, 07 Nov 2008 05:35:00 -0000 [thread overview] Message-ID: <20081107053424.9EDCB120363@lists.fedorahosted.org> (raw) Gitweb: http://git.fedorahosted.org/git/cluster.git?p=cluster.git;a=commitdiff;h=f374ce50290db6beffadd139626d55bd5125540a Commit: f374ce50290db6beffadd139626d55bd5125540a Parent: a71b12b692cac3a4786241927227013bf2f3bf99 Author: Fabio M. Di Nitto <fdinitto@redhat.com> AuthorDate: Wed Nov 5 14:21:57 2008 +0100 Committer: Fabio M. Di Nitto <fdinitto@redhat.com> CommitterDate: Fri Nov 7 06:34:14 2008 +0100 init scripts: major rework to make them distro agnostic - adapt build system to generate init scripts on the fly to respect some installation paths - create top level headers to set vars and defaults for/from each distribution. - remove absolute path calls to standard distribution tools (pidof, kill, etc). - replace few functions from /etc/init.d/functions with local ones when those ones are not available. - rework the output redirection across board to fix several race conditions during normal operations. - fix some statements that are now invalid in bash3. - fix cman status to skip ccsd if it's not being selected specifically. - standardize LOCK_FILE all over. - fix killing process for qdisk and rgmanager to use standard distro tools. - substitute "action" with normal rtrn parsing in gfs and gfs2 init scripts. - fix clulog usage in rgmanager init script. - generally avoid to fork external process to gather return statuses. All of the above tested on Fedora 10, Debian and Ubuntu. Signed-off-by: Fabio M. Di Nitto <fdinitto@redhat.com> --- cman/init.d/Makefile | 22 +- cman/init.d/cman | 712 ---------------------------------- cman/init.d/cman.in | 764 +++++++++++++++++++++++++++++++++++++ cman/init.d/qdiskd | 88 ----- cman/init.d/qdiskd.in | 128 ++++++ fence/agents/scsi/Makefile | 7 +- fence/agents/scsi/scsi_reserve | 316 --------------- fence/agents/scsi/scsi_reserve.in | 338 ++++++++++++++++ gfs/init.d/Makefile | 9 +- gfs/init.d/gfs | 97 ----- gfs/init.d/gfs.in | 149 +++++++ gfs2/init.d/Makefile | 9 +- gfs2/init.d/gfs2 | 96 ----- gfs2/init.d/gfs2.in | 149 +++++++ rgmanager/init.d/Makefile | 10 +- rgmanager/init.d/rgmanager | 142 ------- rgmanager/init.d/rgmanager.in | 192 ++++++++++ 17 files changed, 1766 insertions(+), 1462 deletions(-) diff --git a/cman/init.d/Makefile b/cman/init.d/Makefile index 1f7f5f4..8683c81 100644 --- a/cman/init.d/Makefile +++ b/cman/init.d/Makefile @@ -1,11 +1,25 @@ -TARGET=cman qdiskd +TARGET1=cman +TARGET2=qdiskd -INITDT=$(TARGET) +INITDT=$(TARGET1) $(TARGET2) -all: +all: $(TARGET1) $(TARGET2) include ../../make/defines.mk +include $(OBJDIR)/make/clean.mk include $(OBJDIR)/make/install.mk include $(OBJDIR)/make/uninstall.mk -clean: +$(TARGET1): $(S)/$(TARGET1).in + cat $(S)/$(TARGET1).in | sed \ + -e 's#@SBINDIR@#${sbindir}#g' \ + -e 's#@INITDDIR@#${initddir}#g' \ + > $(TARGET1) + +$(TARGET2): $(S)/$(TARGET2).in + cat $(S)/$(TARGET2).in | sed \ + -e 's#@SBINDIR@#${sbindir}#g' \ + -e 's#@INITDDIR@#${initddir}#g' \ + > $(TARGET2) + +clean: generalclean diff --git a/cman/init.d/cman b/cman/init.d/cman deleted file mode 100644 index d1bf62f..0000000 --- a/cman/init.d/cman +++ /dev/null @@ -1,712 +0,0 @@ -#!/bin/bash -# -# cman - Cluster Manager init script -# -# chkconfig: - 21 79 -# description: Starts and stops cman -# -# -### BEGIN INIT INFO -# Provides: cman -# Required-Start: $network $time -# Required-Stop: $network $time -# Default-Start: -# Default-Stop: -# Short-Description: Starts and stops cman -# Description: Starts and stops the Cluster Manager set of daemons -### END INIT INFO - -. /etc/init.d/functions - -[ -f /etc/sysconfig/cluster ] && . /etc/sysconfig/cluster -[ -f /etc/sysconfig/cman ] && . /etc/sysconfig/cman - -[ -z "$CCSD_OPTS" ] && CCSD_OPTS= - -# CMAN_CLUSTER_TIMEOUT -- amount of time to wait for joinging a cluster -# before giving up. If CMAN_CLUSTER_TIMEOUT is positive, then we will -# wait CMAN_CLUSTER_TIMEOUT seconds before giving up and failing when -# a cluster is not joined. If CMAN_CLUSTER_TIMEOUT is zero, then -# wait indefinately for a cluster join. If CMAN_CLUSTER_TIMEOUT is -# negative, do not check to see that the cluster has been joined -[ -z "$CMAN_CLUSTER_TIMEOUT" ] && CMAN_CLUSTER_TIMEOUT=120 - -# CMAN_QUORUM_TIMEOUT -- amount of time to wait for a quorate cluster on -# startup quorum is needed by many other applications, so we may as -# well wait here. If CMAN_QUORUM_TIMEOUT is less than 1, quorum will -# be ignored. -[ -z "$CMAN_QUORUM_TIMEOUT" ] && CMAN_QUORUM_TIMEOUT=0 - -# CMAN_SHUTDOWN_TIMEOUT -- amount of time to wait for cman to become a -# cluster member before calling cman_tool leave during shutdown. -# The default is 60 seconds -[ -z "$CMAN_SHUTDOWN_TIMEOUT" ] && CMAN_SHUTDOWN_TIMEOUT=60 - -# FENCED_START_TIMEOUT -- amount of time to wait for starting fenced -# before giving up. If FENCED_START_TIMEOUT is positive, then we will -# wait FENCED_START_TIMEOUT seconds before giving up and failing when -# fenced does not start. If FENCED_START_TIMEOUT is zero, then -# wait indefinately for fenced to start. -[ -z "$FENCED_START_TIMEOUT" ] && FENCED_START_TIMEOUT=300 - -# NET_RMEM_DEFAULT -- minimum value for rmem_default. If this is set -# higher elsewhere it will not be reduced here. -# These two values are only really needed for the DLM when using sctp -# but do no harm. -[ -z "$NET_RMEM_DEFAULT" ] && NET_RMEM_DEFAULT=4194304 - -# NET_RMEM_MAX -- minimum value for rmem_max. If this is set -# higher elsewhere it will not be reduced here. -[ -z "$NET_RMEM_MAX" ] && NET_RMEM_MAX=4194304 - -# FENCED_MEMBER_DELAY -- amount of time to delay fence_tool join to allow -# all nodes in cluster.conf to become cluster members. In seconds. -[ -z "$FENCED_MEMBER_DELAY" ] && FENCED_MEMBER_DELAY=45 - -# FENCE_JOIN -- boolean value used to control whether or not this node -# should join the fence domain. If FENCE_JOIN is set to "no", then -# the script will not attempt to the fence domain. If FENCE_JOIN is -# set to "yes", then the script will attempt to join the fence domain. -# If FENCE_JOIN is set to any other value, the default behavior is -# to join the fence domain (equivalent to "yes"). -[ -z "$FENCE_JOIN" ] && FENCE_JOIN="yes" - -# NETWORK_BRIDGE_SCRIPT -- script to use for xen network bridging. -# This script must exist in the /etc/xen/scripts directory. -# The default script is "network-bridge". -[ -z "$NETWORK_BRIDGE_SCRIPT" ] && NETWORK_BRIDGE_SCRIPT="network-bridge" - -[ -z "$LOCK_FILE" ] && LOCK_FILE="/var/lock/subsys/cman" - -[ -n "$CLUSTERNAME" ] && cman_join_opts="-c $CLUSTERNAME" - -[ -n "$NODENAME" ] && cman_join_opts+=" -n $NODENAME" - -# CONFIG_LOADER -- select default config parser. -# This can be: -# xmlconfig - read directly from cluster.conf and use ricci as default config -# propagation method. (default) -# ldapconfig - read configuration from an ldap server. -# Requires: LDAP_URL or/and LDAP_BASEDN envvar to be set. -# LDAP_BINDDN and LDAP_BINDPWD have to be either both set or both unset. -# corosync_parser - use internal corosync config file parser. -# openaisparser - use internal openais config file parser. -# ccsconfig - read configuration from ccsd daemon. This method is deprecated -# and available only if building the code with --enable_legacy_code. -[ -n "$CONFIG_LOADER" ] && cman_join_opts+=" -C $CONFIG_LOADER" - -load_modules() -{ - errmsg=$( /sbin/modprobe configfs 2>&1 ) || return 1 - errmsg=$( /sbin/modprobe dlm 2>&1 ) || return 1 - errmsg=$( /sbin/modprobe lock_dlm 2>&1 ) || return 1 - return 0 -} - -start_configfs() -{ - # configfs - awk '{ print $2 }' /etc/mtab | grep "/sys/kernel/config" &> /dev/null \ - && awk '{ print $3 }' /etc/mtab | grep "configfs" &> /dev/null - if [ $? -ne 0 ] - then - errmsg=$( /bin/mount -t configfs none /sys/kernel/config 2>&1 ) - return $? - fi - return 0 -} - -start_ccsd() -{ - # ccsd - status ccsd &> /dev/null - if [ $? -ne 0 ] - then - errmsg=$(/sbin/ccsd $CCSD_OPTS 2>&1) - rtrn=$? - return $rtrn - fi - return 0 -} - -start_cman() -{ - # cman - /sbin/cman_tool status &> /dev/null - if [ $? -ne 0 ] - then - case "$CONFIG_LOADER" in - ldapconfig) - if [ -n "$LDAP_URL" ] || [ -n "$LDAP_BASEDN" ]; then - if [ -n "$LDAP_BINDDN" ]; then - if [ -z "$LDAP_BINDPWD" ]; then - errmsg="ldadconfig has been select but LDAP_BINDPWD is not set" - return 1 - fi - fi - if [ -n "$LDAP_BINDPWD" ]; then - if [ -z "$LDAP_BINDDN" ]; then - errmsg="ldadconfig has been select but LDAP_BINDDN is not set" - return 1 - fi - fi - else - errmsg="ldadconfig has been select but neither LDAP_URL or LDAP_BASEDN have been set" - return 1 - fi - ;; - ccsconfig) - if [ -x /sbin/ccsd ]; then - echo -n " Starting ccsd... " - start_ccsd - if [ $? -eq 0 ] - then - echo "done" - else - echo "failed" - errmsg="Unable to start ccsd" - return 1 - fi - else - errmsg="ccsconfig has been selected but ccsd does not appear to be installed or executable" - return 1 - fi - ;; - *) - # nothing to do for now - ;; - esac - errmsg=$( /sbin/cman_tool -t $CMAN_CLUSTER_TIMEOUT -w join \ - $cman_join_opts 2>&1 ) || return 1 - - if [ $CMAN_QUORUM_TIMEOUT -gt 0 ] - then - errmsg=$( /sbin/cman_tool -t $CMAN_QUORUM_TIMEOUT \ - -q wait 2>&1 ) || return 1 - fi - fi - return 0 -} - - -start_qdiskd() -{ - declare current_runlevel - - current_runlevel=$(/sbin/runlevel 2>/dev/null | awk '{ print $2 }' 2>/dev/null) - # - # Start qdiskd before fenced to resolve bug #436381. This only - # happens if qdiskd is configured to run in the runlevel we are in - # - /sbin/chkconfig --levels "$current_runlevel" qdiskd 2>/dev/null - if [ $? -ne 0 ]; then - # qdiskd doesn't start at this runlevel. - return 0 - fi - - echo -n " Starting qdiskd... " - /sbin/service qdiskd start &> /dev/null - if [ $? -eq 0 ] - then - echo "done" - else - echo "failed" - return 1 - fi - return 0 -} - - -start_daemons() -{ - status groupd &> /dev/null - if [ $? -ne 0 ]; then - errmsg=$( /sbin/groupd 2>&1 ) || return 1 - fi - status fenced &> /dev/null - if [ $? -ne 0 ]; then - errmsg=$( /sbin/fenced 2>&1 ) || return 1 - fi - status dlm_controld &> /dev/null - if [ $? -ne 0 ]; then - errmsg=$( /sbin/dlm_controld 2>&1 ) || return 1 - fi - status gfs_controld &> /dev/null - if [ $? -ne 0 ]; then - errmsg=$( /sbin/gfs_controld 2>&1 ) || return 1 - fi - status cmannotifyd &> /dev/null - if [ $? -ne 0 ]; then - errmsg=$( /sbin/cmannotifyd 2>&1 ) || return 1 - fi - return 0 -} - -start_fence() -{ - /sbin/cman_tool status | grep Flags | grep 2node &> /dev/null - if [ $? -ne 0 ] - then - errmsg=$( /sbin/fence_tool -w -t $FENCED_START_TIMEOUT join \ - > /dev/null 2>&1 ) || return 1 - else - errmsg=$( /sbin/fence_tool -w -t $FENCED_START_TIMEOUT \ - -m $FENCED_MEMBER_DELAY join \ - > /dev/null 2>&1 ) || return 1 - fi - return 0 -} - -start_fence_xvmd() -{ - status fence_xvmd &> /dev/null - if [ $? -ne 0 ]; then - errmsg=$( /sbin/fence_xvmd $FENCE_XVMD_OPTS 2>&1 ) || return 1 - fi - return 0 -} - -xend_bridged_net_enabled() { - # Not a xen kernel - test -d /proc/xen || return 1 - - current_runlevel=$(/sbin/runlevel 2>/dev/null | awk '{ print $2 }' 2>/dev/null) - if [ -z "$current_runlevel" ]; then - errmsg='Unable to determine the current runlevel' - return 1 - fi - - /sbin/chkconfig --levels "$current_runlevel" xend 2>/dev/null - if [ $? -ne 0 ]; then - # xend doesn't start at this runlevel. - return 1 - fi - - if [ ! -f /etc/xen/xend-config.sxp ]; then - # xend isn't configured to use bridged networking. - return 1 - fi - - egrep "^[[:blank:]]*\([[:blank:]]*network-script[[:blank:]]+(')?[[:blank:]]*${NETWORK_BRIDGE_SCRIPT}([[:blank:]]*\)|[[:blank:]]+)" /etc/xen/xend-config.sxp >&/dev/null - if [ $? -ne 0 ]; then - # xend isn't configured to use bridged networking. - return 1 - fi - return 0 -} - -xend_bridged_net_start() { - if [ ! -x /etc/xen/scripts/${NETWORK_BRIDGE_SCRIPT} ]; then - if [ -f /etc/xen/scripts/${NETWORK_BRIDGE_SCRIPT} ]; then - errmsg='The xend bridged network script cannot be run' - else - errmsg='The xend bridged network script is missing' - fi - return 1 - fi - - /sbin/modprobe netbk >& /dev/null - /sbin/modprobe netloop >& /dev/null - bridge_parms=`egrep -m 1 "^[[:blank:]]*\([[:blank:]]*network-script[[:blank:]]+(')?[[:blank:]]*${NETWORK_BRIDGE_SCRIPT}([[:blank:]]*\)|[[:blank:]]+)" /etc/xen/xend-config.sxp| sed -r "s/^[[:blank:]]*\([[:blank:]]*network-script[[:blank:]]+'?[[:blank:]]*${NETWORK_BRIDGE_SCRIPT}[[:blank:]]*//; s/'?[[:blank:]]*\).*//"` - errmsg=$(/etc/xen/scripts/${NETWORK_BRIDGE_SCRIPT} start $bridge_parms 2>&1) || return 1 - return 0 -} - -fence_xvmd_enabled() -{ - # - # Check the value of FENCE_JOIN. - # If FENCE_JOIN is set to "no", then we should disable fence_xvm. - # - if [ "$FENCE_JOIN" == "no" ]; then - return 1 - fi - - # - # Check for the 'xm' binary. If it's not here, we are not - # running on a machine capable of running xvmd. - # - which xm &> /dev/null || return 1 - - # - # Check for presence of /cluster/fence_xvmd in cluster.conf - # (If -X is specified, it doesn't matter if it's in cluster.conf; - # we'll start it anyway since ccsd is not required) - # - /sbin/cman_tool status &> /dev/null - if [ $? -eq 0 ] - then - if [ "$FENCE_XVMD_OPTS" = "${FENCE_XVMD_OPTS/-X/}" ]; then - ccs_tool query /cluster/fence_xvmd || return 1 - fi - fi - - return 0 -} - -set_networking_params() -{ - if [ ! -f /proc/sys/net/core/rmem_default ] - then - return 0; - fi - - value="$(cat /proc/sys/net/core/rmem_default)" - if [ $value -le $NET_RMEM_DEFAULT ] - then - echo $NET_RMEM_DEFAULT > /proc/sys/net/core/rmem_default - fi - - value="$(cat /proc/sys/net/core/rmem_max)" - if [ $value -le $NET_RMEM_MAX ] - then - echo $NET_RMEM_MAX > /proc/sys/net/core/rmem_max - fi -} - -fence_join_enabled() -{ - # - # Check the value of FENCE_JOIN. - # If FENCE_JOIN is set to "no", we will not attempt to join - # the fence domain. If FENCE_JOIN is set to any other value, - # we will attempt to join the fence domain (default). - # - if [ "$FENCE_JOIN" == "no" ]; then - return 1 - else - return 0 - fi -} - -start() -{ - echo "Starting cluster: " - - xend_bridged_net_enabled - if [ $? -eq 0 ] - then - echo -n " Enabling workaround for Xend bridged networking... " - xend_bridged_net_start - if [ $? -eq 0 ] - then - echo "done" - else - echo "failed: $errmsg" - return 1 - fi - fi - - echo -n " Loading modules... " - ulimit -c unlimited - load_modules - if [ $? -eq 0 ] - then - echo "done" - else - echo "failed" - return 1 - fi - - echo -n " Mounting configfs... " - start_configfs - if [ $? -eq 0 ] - then - echo "done" - else - echo "failed" - return 1 - fi - - echo -n " Setting network parameters... " - set_networking_params - if [ $? -eq 0 ] - then - echo "done" - else - echo "failed" - return 1 - fi - - echo -n " Starting cman... " - start_cman - if [ $? -eq 0 ] - then - echo "done" - else - echo "failed" - return 1 - fi - - start_qdiskd - - echo -n " Starting daemons... " - start_daemons - if [ $? -eq 0 ] - then - echo "done" - else - echo "failed" - return 1 - fi - - if fence_join_enabled; then - echo -n " Starting fencing... " - start_fence - if [ $? -eq 0 ] - then - echo "done" - else - echo "failed" - return 1 - fi - fi - - if fence_xvmd_enabled; then - echo -n " Starting virtual machine fencing host... " - start_fence_xvmd - if [ $? -eq 0 ] - then - echo "done" - else - echo "failed" - return 1 - fi - fi - - return 0 -} - -stop_configfs() -{ - awk '{ print $2 }' /etc/mtab | grep "/sys/kernel/config" &> /dev/null\ - && awk '{ print $3 }' /etc/mtab | grep "configfs" &> /dev/null - if [ $? -eq 0 ] && [ -z "$(ls -1 /sys/kernel/config)" ] - then - errmsg=$( /bin/umount /sys/kernel/config 2>&1 ) - if [ $? -ne 0 ] - then - echo -n $errmsg " " - fi - fi - return 0 -} - -stop_ccsd() -{ - for sec in $(seq 1 10) - do - if /sbin/pidof ccsd &> /dev/null - then - # get the pid of ccsd from /var/run/cluster/ccsd.pid - # and break if the file is not there - [ -r /var/run/cluster/ccsd.pid ] || break - - pid=$(cat /var/run/cluster/ccsd.pid) - /usr/bin/kill $pid &> /dev/null || break - - sleep 1 - else - return 0 - fi - done - return 1 -} - -stop_cman() -{ - /sbin/cman_tool status &> /dev/null - if [ $? -eq 0 ] - then - errmsg=$( /sbin/cman_tool -t $CMAN_SHUTDOWN_TIMEOUT \ - -w leave $1 2>&1 ) || return 1 - fi - return 0 # all ok -} - -stop_daemons() -{ - if pid=$(/sbin/pidof cmannotifyd 2>&1); then - errmsg=$(/usr/bin/kill $pid 2>&1) || return 1 - fi - if pid=$(/sbin/pidof gfs_controld 2>&1); then - errmsg=$(/usr/bin/kill $pid 2>&1) || return 1 - fi - if pid=$(/sbin/pidof dlm_controld 2>&1); then - errmsg=$(/usr/bin/kill $pid 2>&1) || return 1 - fi - if pid=$(/sbin/pidof fenced 2>&1); then - errmsg=$(/usr/bin/kill $pid 2>&1) || return 1 - fi - if pid=$(/sbin/pidof groupd 2>&1); then - errmsg=$(/usr/bin/kill $pid 2>&1) || return 1 - fi - return 0 # all ok -} - -stop_fence() -{ - if /sbin/pidof fenced &> /dev/null - then - /sbin/fence_tool -w leave > /dev/null 2>&1 - rtrn=$? - sleep 1 # A bit of time for fenced to exit - return $rtrn - fi - return 0 # all ok -} - -stop_fence_xvmd() -{ - if /sbin/pidof fence_xvmd &> /dev/null - then - pkill -TERM fence_xvmd - sleep 1 # A bit of time for fenced to exit - fi - - [ -z "`pidof fence_xvmd`" ] - return $? -} - -stop() -{ - echo "Stopping cluster: " - - if fence_xvmd_enabled; then - echo -n " Stopping virtual machine fencing host... " - stop_fence_xvmd - if [ $? -eq 0 ] - then - echo "done" - else - echo "failed" - return 1 - fi - fi - - if fence_join_enabled; then - echo -n " Stopping fencing... " - stop_fence - if [ $? -eq 0 ] - then - echo "done" - else - echo "failed" - return 1 - fi - fi - - echo -n " Stopping cman... " - if [ $1 ]; then - stop_cman $1 - else - stop_cman - fi - if [ $? -eq 0 ] - then - echo "done" - else - echo "failed" - return 1 - fi - -# stop_daemons -# [ $? -ne 0 ] && return 1 - - echo -n " Stopping ccsd... " - stop_ccsd - if [ $? -eq 0 ] - then - echo "done" - else - echo "failed" - return 1 - fi - - echo -n " Unmounting configfs... " - stop_configfs - if [ $? -eq 0 ] - then - echo "done" - else - echo "failed" - return 1 - fi - - return 0 -} - -cmanstatus() -{ - errmsg=$( status ccsd 2>&1) || return 1 - errmsg=$( status groupd 2>&1) || return 1 - errmsg=$( status fenced 2>&1) || return 1 - errmsg=$( status dlm_controld 2>&1) || return 1 - errmsg=$( status gfs_controld 2>&1) || return 1 - errmsg=$( status cmannotifyd 2>&1) || return 1 - - fence_xvmd_enabled || return 0 - errmsg=$( status fence_xvmd 2>&1) || return 1 - - return 0 -} - -rtrn=1 - -# See how we were called. -case "$1" in - start) - start - rtrn=$? - [ $rtrn = 0 ] && touch $LOCK_FILE - if [ $rtrn -ne 0 ] - then - echo $errmsg - failure "failed to start cman" - echo - else - success "start" - echo - fi - ;; - stop) - if [ $2 ]; then - stop - else - stop remove - fi - rtrn=$? - [ $rtrn = 0 ] && rm -f $LOCK_FILE - if [ $rtrn -ne 0 ] - then - echo $errmsg - failure "failed to stop cman" - echo - else - success "shutdown" - echo - fi - ;; - - restart|reload) - $0 stop restart - $0 start - rtrn=$? - ;; - - status) - cmanstatus - rtrn=$? - if [ $rtrn -ne 0 ] ; then - echo $errmsg - else - echo "cman is running." - fi - ;; - - *) - echo $"Usage: $0 {start|stop|reload|restart|status}" - ;; -esac - -exit $rtrn diff --git a/cman/init.d/cman.in b/cman/init.d/cman.in new file mode 100644 index 0000000..0b55e68 --- /dev/null +++ b/cman/init.d/cman.in @@ -0,0 +1,764 @@ +#!/bin/bash +# +# cman - Cluster Manager init script +# +# chkconfig: - 21 79 +# description: Starts and stops cman +# +# +### BEGIN INIT INFO +# Provides: cman +# Required-Start: $network $time +# Required-Stop: $network $time +# Default-Start: +# Default-Stop: +# Short-Description: Starts and stops cman +# Description: Starts and stops the Cluster Manager set of daemons +### END INIT INFO + +# rpm based distros +if [ -d /etc/sysconfig ]; then + [ -f @INITDDIR@/functions ] && . @INITDDIR@/functions + [ -f /etc/sysconfig/cluster ] && . /etc/sysconfig/cluster + [ -f /etc/sysconfig/cman ] && . /etc/sysconfig/cman + [ -z "$LOCK_FILE" ] && LOCK_FILE="/var/lock/subsys/cman" + chkconfig=/sbin/chkconfig + success=success + failure=failure + status=status +fi + +# deb based distros +if [ -d /etc/default ]; then + [ -f /etc/default/cluster ] && . /etc/default/cluster + [ -f /etc/default/cman ] && . /etc/default/cman + [ -z "$LOCK_FILE" ] && LOCK_FILE="/var/lock/cman" + # deb based distros can have chkconfig installed. Use it if installed + # otherwire use our local wrapper. + [ -n "$(which chkconfig)" ] && chkconfig="$(which chkconfig)" + [ -z "$chkconfig" ] && chkconfig=local_chkconfig + success=local_success + failure=local_failure + # functions in rpm based distro implements a very complete version + # of pidof. For now we can live with this. + status=local_status +fi + +[ -z "$CCSD_OPTS" ] && CCSD_OPTS= + +# CMAN_CLUSTER_TIMEOUT -- amount of time to wait for joinging a cluster +# before giving up. If CMAN_CLUSTER_TIMEOUT is positive, then we will +# wait CMAN_CLUSTER_TIMEOUT seconds before giving up and failing when +# a cluster is not joined. If CMAN_CLUSTER_TIMEOUT is zero, then +# wait indefinately for a cluster join. If CMAN_CLUSTER_TIMEOUT is +# negative, do not check to see that the cluster has been joined +[ -z "$CMAN_CLUSTER_TIMEOUT" ] && CMAN_CLUSTER_TIMEOUT=120 + +# CMAN_QUORUM_TIMEOUT -- amount of time to wait for a quorate cluster on +# startup quorum is needed by many other applications, so we may as +# well wait here. If CMAN_QUORUM_TIMEOUT is less than 1, quorum will +# be ignored. +[ -z "$CMAN_QUORUM_TIMEOUT" ] && CMAN_QUORUM_TIMEOUT=0 + +# CMAN_SHUTDOWN_TIMEOUT -- amount of time to wait for cman to become a +# cluster member before calling cman_tool leave during shutdown. +# The default is 60 seconds +[ -z "$CMAN_SHUTDOWN_TIMEOUT" ] && CMAN_SHUTDOWN_TIMEOUT=60 + +# FENCED_START_TIMEOUT -- amount of time to wait for starting fenced +# before giving up. If FENCED_START_TIMEOUT is positive, then we will +# wait FENCED_START_TIMEOUT seconds before giving up and failing when +# fenced does not start. If FENCED_START_TIMEOUT is zero, then +# wait indefinately for fenced to start. +[ -z "$FENCED_START_TIMEOUT" ] && FENCED_START_TIMEOUT=300 + +# NET_RMEM_DEFAULT -- minimum value for rmem_default. If this is set +# higher elsewhere it will not be reduced here. +# These two values are only really needed for the DLM when using sctp +# but do no harm. +[ -z "$NET_RMEM_DEFAULT" ] && NET_RMEM_DEFAULT=4194304 + +# NET_RMEM_MAX -- minimum value for rmem_max. If this is set +# higher elsewhere it will not be reduced here. +[ -z "$NET_RMEM_MAX" ] && NET_RMEM_MAX=4194304 + +# FENCED_MEMBER_DELAY -- amount of time to delay fence_tool join to allow +# all nodes in cluster.conf to become cluster members. In seconds. +[ -z "$FENCED_MEMBER_DELAY" ] && FENCED_MEMBER_DELAY=45 + +# FENCE_JOIN -- boolean value used to control whether or not this node +# should join the fence domain. If FENCE_JOIN is set to "no", then +# the script will not attempt to the fence domain. If FENCE_JOIN is +# set to "yes", then the script will attempt to join the fence domain. +# If FENCE_JOIN is set to any other value, the default behavior is +# to join the fence domain (equivalent to "yes"). +[ -z "$FENCE_JOIN" ] && FENCE_JOIN="yes" + +# NETWORK_BRIDGE_SCRIPT -- script to use for xen network bridging. +# This script must exist in the /etc/xen/scripts directory. +# The default script is "network-bridge". +[ -z "$NETWORK_BRIDGE_SCRIPT" ] && NETWORK_BRIDGE_SCRIPT="network-bridge" + +[ -n "$CLUSTERNAME" ] && cman_join_opts="-c $CLUSTERNAME" + +[ -n "$NODENAME" ] && cman_join_opts+=" -n $NODENAME" + +# CONFIG_LOADER -- select default config parser. +# This can be: +# xmlconfig - read directly from cluster.conf and use ricci as default config +# propagation method. (default) +# ldapconfig - read configuration from an ldap server. +# Requires: LDAP_URL or/and LDAP_BASEDN envvar to be set. +# LDAP_BINDDN and LDAP_BINDPWD have to be either both set or both unset. +# corosync_parser - use internal corosync config file parser. +# openaisparser - use internal openais config file parser. +# ccsconfig - read configuration from ccsd daemon. This method is deprecated +# and available only if building the code with --enable_legacy_code. +[ -n "$CONFIG_LOADER" ] && cman_join_opts+=" -C $CONFIG_LOADER" + +local_chkconfig() +{ + ls /etc/rc${2}.d/S*${3} > /dev/null 2>/dev/null + return $? +} + +local_success() +{ + echo -ne "[ OK ]\r" +} + +local_failure() +{ + echo -ne "[FAILED]\r" +} + +local_status() +{ + pid=$(pidof $1 2>/dev/null) + rtrn=$? + if [ $rtrn -ne 0 ]; then + echo "$1 is stopped" + else + echo "$1 (pid $pid) is running..." + fi + return $rtrn +} + +load_modules() +{ + errmsg=$( /sbin/modprobe configfs 2>&1 ) || return 1 + errmsg=$( /sbin/modprobe dlm 2>&1 ) || return 1 + errmsg=$( /sbin/modprobe lock_dlm 2>&1 ) || return 1 + return 0 +} + +start_configfs() +{ + # configfs + awk '{ print $2 }' /etc/mtab | grep "/sys/kernel/config" > /dev/null 2>&1 \ + && awk '{ print $3 }' /etc/mtab | grep "configfs" > /dev/null 2>&1 + if [ $? -ne 0 ] + then + errmsg=$( /bin/mount -t configfs none /sys/kernel/config 2>&1 ) + return $? + fi + return 0 +} + +start_ccsd() +{ + # ccsd + $status ccsd > /dev/null + if [ $? -ne 0 ] + then + errmsg=$(@SBINDIR@/ccsd $CCSD_OPTS 2>&1) + rtrn=$? + return $rtrn + fi + return 0 +} + +start_cman() +{ + # cman + @SBINDIR@/cman_tool status > /dev/null 2>&1 + if [ $? -ne 0 ] + then + case "$CONFIG_LOADER" in + ldapconfig) + if [ -n "$LDAP_URL" ] || [ -n "$LDAP_BASEDN" ]; then + if [ -n "$LDAP_BINDDN" ]; then + if [ -z "$LDAP_BINDPWD" ]; then + errmsg="ldadconfig has been select but LDAP_BINDPWD is not set" + return 1 + fi + fi + if [ -n "$LDAP_BINDPWD" ]; then + if [ -z "$LDAP_BINDDN" ]; then + errmsg="ldadconfig has been select but LDAP_BINDDN is not set" + return 1 + fi + fi + else + errmsg="ldadconfig has been select but neither LDAP_URL or LDAP_BASEDN have been set" + return 1 + fi + ;; + ccsconfig) + if [ -x @SBINDIR@/ccsd ]; then + echo -n " Starting ccsd... " + start_ccsd + if [ $? -eq 0 ] + then + echo "done" + else + echo "failed" + errmsg="Unable to start ccsd" + return 1 + fi + else + errmsg="ccsconfig has been selected but ccsd does not appear to be installed or executable" + return 1 + fi + ;; + *) + # nothing to do for now + ;; + esac + errmsg=$( @SBINDIR@/cman_tool -t $CMAN_CLUSTER_TIMEOUT -w join \ + $cman_join_opts 2>&1 ) || return 1 + + if [ $CMAN_QUORUM_TIMEOUT -gt 0 ] + then + errmsg=$( @SBINDIR@/cman_tool -t $CMAN_QUORUM_TIMEOUT \ + -q wait 2>&1 ) || return 1 + fi + fi + return 0 +} + + +start_qdiskd() +{ + declare current_runlevel + + current_runlevel=$(/sbin/runlevel 2>/dev/null | awk '{ print $2 }' 2>/dev/null) + # + # Start qdiskd before fenced to resolve bug #436381. This only + # happens if qdiskd is configured to run in the runlevel we are in + # + $chkconfig --levels "$current_runlevel" qdiskd 2>/dev/null + if [ $? -ne 0 ]; then + # qdiskd doesn't start at this runlevel. + return 0 + fi + + echo -n " Starting qdiskd... " + service qdiskd start > /dev/null 2>&1 + if [ $? -eq 0 ] + then + echo "done" + else + echo "failed" + return 1 + fi + return 0 +} + + +start_daemons() +{ + $status groupd > /dev/null 2>&1 + if [ $? -ne 0 ]; then + errmsg=$( @SBINDIR@/groupd 2>&1 ) || return 1 + fi + $status fenced > /dev/null 2>&1 + if [ $? -ne 0 ]; then + errmsg=$( @SBINDIR@/fenced 2>&1 ) || return 1 + fi + $status dlm_controld > /dev/null 2>&1 + if [ $? -ne 0 ]; then + errmsg=$( @SBINDIR@/dlm_controld 2>&1 ) || return 1 + fi + $status gfs_controld > /dev/null 2>&1 + if [ $? -ne 0 ]; then + errmsg=$( @SBINDIR@/gfs_controld 2>&1 ) || return 1 + fi + $status cmannotifyd > /dev/null 2>&1 + if [ $? -ne 0 ]; then + errmsg=$( @SBINDIR@/cmannotifyd 2>&1 ) || return 1 + fi + return 0 +} + +start_fence() +{ + @SBINDIR@/cman_tool status | grep Flags | grep 2node > /dev/null 2>&1 + if [ $? -ne 0 ] + then + errmsg=$( @SBINDIR@/fence_tool -w -t $FENCED_START_TIMEOUT join \ + > /dev/null 2>&1 ) || return 1 + else + errmsg=$( @SBINDIR@/fence_tool -w -t $FENCED_START_TIMEOUT \ + -m $FENCED_MEMBER_DELAY join \ + > /dev/null 2>&1 ) || return 1 + fi + return 0 +} + +start_fence_xvmd() +{ + $status fence_xvmd > /dev/null 2>&1 + if [ $? -ne 0 ]; then + errmsg=$( @SBINDIR@/fence_xvmd $FENCE_XVMD_OPTS 2>&1 ) || return 1 + fi + return 0 +} + +xend_bridged_net_enabled() { + # Not a xen kernel + test -d /proc/xen || return 1 + + current_runlevel=$(/sbin/runlevel 2>/dev/null | awk '{ print $2 }' 2>/dev/null) + if [ -z "$current_runlevel" ]; then + errmsg='Unable to determine the current runlevel' + return 1 + fi + + $chkconfig --levels "$current_runlevel" xend 2>/dev/null + if [ $? -ne 0 ]; then + # xend doesn't start at this runlevel. + return 1 + fi + + if [ ! -f /etc/xen/xend-config.sxp ]; then + # xend isn't configured to use bridged networking. + return 1 + fi + + egrep "^[[:blank:]]*\([[:blank:]]*network-script[[:blank:]]+(')?[[:blank:]]*${NETWORK_BRIDGE_SCRIPT}([[:blank:]]*\)|[[:blank:]]+)" /etc/xen/xend-config.sxp >&/dev/null + if [ $? -ne 0 ]; then + # xend isn't configured to use bridged networking. + return 1 + fi + return 0 +} + +xend_bridged_net_start() { + if [ ! -x /etc/xen/scripts/${NETWORK_BRIDGE_SCRIPT} ]; then + if [ -f /etc/xen/scripts/${NETWORK_BRIDGE_SCRIPT} ]; then + errmsg='The xend bridged network script cannot be run' + else + errmsg='The xend bridged network script is missing' + fi + return 1 + fi + + /sbin/modprobe netbk >& /dev/null + /sbin/modprobe netloop >& /dev/null + bridge_parms=`egrep -m 1 "^[[:blank:]]*\([[:blank:]]*network-script[[:blank:]]+(')?[[:blank:]]*${NETWORK_BRIDGE_SCRIPT}([[:blank:]]*\)|[[:blank:]]+)" /etc/xen/xend-config.sxp| sed -r "s/^[[:blank:]]*\([[:blank:]]*network-script[[:blank:]]+'?[[:blank:]]*${NETWORK_BRIDGE_SCRIPT}[[:blank:]]*//; s/'?[[:blank:]]*\).*//"` + errmsg=$(/etc/xen/scripts/${NETWORK_BRIDGE_SCRIPT} start $bridge_parms 2>&1) || return 1 + return 0 +} + +fence_xvmd_enabled() +{ + # + # Check the value of FENCE_JOIN. + # If FENCE_JOIN is set to "no", then we should disable fence_xvm. + # + if [ "$FENCE_JOIN" = "no" ]; then + return 1 + fi + + # + # Check for the 'xm' binary. If it's not here, we are not + # running on a machine capable of running xvmd. + # + which xm > /dev/null 2>&1 || return 1 + + # + # Check for presence of /cluster/fence_xvmd in cluster.conf + # (If -X is specified, it doesn't matter if it's in cluster.conf; + # we'll start it anyway since ccsd is not required) + # + @SBINDIR@/cman_tool status > /dev/null 2>&1 + if [ $? -eq 0 ] + then + if [ "$FENCE_XVMD_OPTS" = "${FENCE_XVMD_OPTS/-X/}" ]; then + @SBINDIR@/ccs_tool query /cluster/fence_xvmd || return 1 + fi + fi + + return 0 +} + +set_networking_params() +{ + if [ ! -f /proc/sys/net/core/rmem_default ] + then + return 0; + fi + + value="$(cat /proc/sys/net/core/rmem_default)" + if [ $value -le $NET_RMEM_DEFAULT ] + then + echo $NET_RMEM_DEFAULT > /proc/sys/net/core/rmem_default + fi + + value="$(cat /proc/sys/net/core/rmem_max)" + if [ $value -le $NET_RMEM_MAX ] + then + echo $NET_RMEM_MAX > /proc/sys/net/core/rmem_max + fi +} + +fence_join_enabled() +{ + # + # Check the value of FENCE_JOIN. + # If FENCE_JOIN is set to "no", we will not attempt to join + # the fence domain. If FENCE_JOIN is set to any other value, + # we will attempt to join the fence domain (default). + # + if [ "$FENCE_JOIN" = "no" ]; then + return 1 + else + return 0 + fi +} + +start() +{ + echo "Starting cluster: " + + xend_bridged_net_enabled + if [ $? -eq 0 ] + then + echo -n " Enabling workaround for Xend bridged networking... " + xend_bridged_net_start + if [ $? -eq 0 ] + then + echo "done" + else + echo "failed: $errmsg" + return 1 + fi + fi + + echo -n " Loading modules... " + ulimit -c unlimited + load_modules + if [ $? -eq 0 ] + then + echo "done" + else + echo "failed" + return 1 + fi + + echo -n " Mounting configfs... " + start_configfs + if [ $? -eq 0 ] + then + echo "done" + else + echo "failed" + return 1 + fi + + echo -n " Setting network parameters... " + set_networking_params + if [ $? -eq 0 ] + then + echo "done" + else + echo "failed" + return 1 + fi + + echo -n " Starting cman... " + start_cman + if [ $? -eq 0 ] + then + echo "done" + else + echo "failed" + return 1 + fi + + start_qdiskd + + echo -n " Starting daemons... " + start_daemons + if [ $? -eq 0 ] + then + echo "done" + else + echo "failed" + return 1 + fi + + if fence_join_enabled; then + echo -n " Starting fencing... " + start_fence + if [ $? -eq 0 ] + then + echo "done" + else + echo "failed" + return 1 + fi + fi + + if fence_xvmd_enabled; then + echo -n " Starting virtual machine fencing host... " + start_fence_xvmd + if [ $? -eq 0 ] + then + echo "done" + else + echo "failed" + return 1 + fi + fi + + return 0 +} + +stop_configfs() +{ + awk '{ print $2 }' /etc/mtab | grep "/sys/kernel/config" > /dev/null 2>&1 \ + && awk '{ print $3 }' /etc/mtab | grep "configfs" > /dev/null 2>&1 + if [ $? -eq 0 ] && [ -z "$(ls -1 /sys/kernel/config)" ] + then + errmsg=$( /bin/umount /sys/kernel/config 2>&1 ) + if [ $? -ne 0 ] + then + echo -n $errmsg " " + fi + fi + return 0 +} + +stop_ccsd() +{ + for sec in $(seq 1 10) + do + if pidof ccsd > /dev/null 2>&1 + then + # get the pid of ccsd from /var/run/cluster/ccsd.pid + # and break if the file is not there + [ -r /var/run/cluster/ccsd.pid ] || break + + pid=$(cat /var/run/cluster/ccsd.pid) + kill $pid > /dev/null 2>&1 || break + + sleep 1 + else + return 0 + fi + done + return 1 +} + +stop_cman() +{ + @SBINDIR@/cman_tool status > /dev/null 2>&1 + if [ $? -eq 0 ] + then + errmsg=$( @SBINDIR@/cman_tool -t $CMAN_SHUTDOWN_TIMEOUT \ + -w leave $1 2>&1 ) || return 1 + fi + return 0 # all ok +} + +stop_daemons() +{ + if pid=$(pidof cmannotifyd 2>&1); then + errmsg=$(kill $pid 2>&1) || return 1 + fi + if pid=$(pidof gfs_controld 2>&1); then + errmsg=$(kill $pid 2>&1) || return 1 + fi + if pid=$(pidof dlm_controld 2>&1); then + errmsg=$(kill $pid 2>&1) || return 1 + fi + if pid=$(pidof fenced 2>&1); then + errmsg=$(kill $pid 2>&1) || return 1 + fi + if pid=$(pidof groupd 2>&1); then + errmsg=$(kill $pid 2>&1) || return 1 + fi + return 0 # all ok +} + +stop_fence() +{ + if pidof fenced > /dev/null 2>&1 + then + @SBINDIR@/fence_tool -w leave > /dev/null 2>&1 + rtrn=$? + sleep 1 # A bit of time for fenced to exit + return $rtrn + fi + return 0 # all ok +} + +stop_fence_xvmd() +{ + if pidof fence_xvmd > /dev/null 2>&1 + then + pkill -TERM fence_xvmd + sleep 1 # A bit of time for fenced to exit + fi + + [ -z "$(pidof fence_xvmd)" ] + return $? +} + +stop() +{ + echo "Stopping cluster: " + + if fence_xvmd_enabled; then + echo -n " Stopping virtual machine fencing host... " + stop_fence_xvmd + if [ $? -eq 0 ] + then + echo "done" + else + echo "failed" + return 1 + fi + fi + + if fence_join_enabled; then + echo -n " Stopping fencing... " + stop_fence + if [ $? -eq 0 ] + then + echo "done" + else + echo "failed" + return 1 + fi + fi + + echo -n " Stopping cman... " + if [ $1 ]; then + stop_cman $1 + else + stop_cman + fi + if [ $? -eq 0 ] + then + echo "done" + else + echo "failed" + return 1 + fi + +# stop_daemons +# [ $? -ne 0 ] && return 1 + + echo -n " Stopping ccsd... " + stop_ccsd + if [ $? -eq 0 ] + then + echo "done" + else + echo "failed" + return 1 + fi + + echo -n " Unmounting configfs... " + stop_configfs + if [ $? -eq 0 ] + then + echo "done" + else + echo "failed" + return 1 + fi + + return 0 +} + +cmanstatus() +{ + if [ -n "$CONFIG_LOADER" ] && [ "$CONFIG_LOADER" = ccsconfig ]; then + errmsg=$( $status ccsd 2>&1) || return 1 + fi + + errmsg=$( $status groupd 2>&1) || return 1 + errmsg=$( $status fenced 2>&1) || return 1 + errmsg=$( $status dlm_controld 2>&1) || return 1 + errmsg=$( $status gfs_controld 2>&1) || return 1 + errmsg=$( $status cmannotifyd 2>&1) || return 1 + + fence_xvmd_enabled || return 0 + errmsg=$( $status fence_xvmd 2>&1) || return 1 + + return 0 +} + +rtrn=1 + +# See how we were called. +case "$1" in + start) + start + rtrn=$? + [ $rtrn = 0 ] && touch $LOCK_FILE + if [ $rtrn -ne 0 ] + then + echo $errmsg + $failure "failed to start cman" + echo + else + $success "start" + echo + fi + ;; + stop) + if [ $2 ]; then + stop + else + stop remove + fi + rtrn=$? + [ $rtrn = 0 ] && rm -f $LOCK_FILE + if [ $rtrn -ne 0 ] + then + echo $errmsg + $failure "failed to stop cman" + echo + else + $success "shutdown" + echo + fi + ;; + + restart|reload) + $0 stop restart + $0 start + rtrn=$? + ;; + + status) + cmanstatus + rtrn=$? + if [ $rtrn -ne 0 ] ; then + echo $errmsg + else + echo "cman is running." + fi + ;; + + *) + echo $"Usage: $0 {start|stop|reload|restart|status}" + ;; +esac + +exit $rtrn diff --git a/cman/init.d/qdiskd b/cman/init.d/qdiskd deleted file mode 100644 index d77057c..0000000 --- a/cman/init.d/qdiskd +++ /dev/null @@ -1,88 +0,0 @@ -#!/bin/bash -# -# qdiskd quorum disk daemon -# -# chkconfig: - 22 78 -# description: Starts and stops the quorum disk daemon - -### BEGIN INIT INFO -# Provides: qdiskd -# Required-Start: cman -# Required-Stop: cman -# Default-Start: -# Default-Stop: -# Short-Description: start/stop quorum disk daemon -# Description: start/stop quorum disk daemon -### END INIT INFO - -. /etc/init.d/functions -[ -f /etc/sysconfig/cluster ] && . /etc/sysconfig/cluster -[ -f /etc/sysconfig/qdiskd ] && . /etc/sysconfig/qdiskd - -LOCK_FILE="/var/lock/subsys/qdiskd" - -rtrn=1 -retries=0 - -# See how we were called. -case "$1" in - start) - echo -n "Starting the Quorum Disk Daemon:" - - $0 status >/dev/null - if [ $? -eq 0 ]; then - echo_success - echo - exit 0 - fi - - qdiskd -Q - rtrn=$? - if [ $rtrn = 0 ]; then - touch $LOCK_FILE - echo_success - echo - else - echo_failure - echo - fi - - ;; - - stop) - echo -n "Stopping the Quorum Disk Daemon:" - killproc qdiskd - while [ -n "`pidof qdiskd`" ] && [ $retries -lt 5 ]; do - sleep 1 - killproc qdiskd - ((retries++)) - done - if [ -z "`pidof qdiskd`" ]; then - echo_success - echo - rtrn=0 - rm -f $LOCK_FILE - else - echo_failure - echo - rtrn=1 - fi - ;; - - restart|reload) - $0 stop || exit $? - $0 start - rtrn=$? - ;; - - status) - status qdiskd - rtrn=$? - ;; - - *) - echo $"Usage: $0 {start|stop|reload|restart|status}" - ;; -esac - -exit $rtrn diff --git a/cman/init.d/qdiskd.in b/cman/init.d/qdiskd.in new file mode 100644 index 0000000..3efdfe4 --- /dev/null +++ b/cman/init.d/qdiskd.in @@ -0,0 +1,128 @@ +#!/bin/bash +# +# qdiskd quorum disk daemon +# +# chkconfig: - 22 78 +# description: Starts and stops the quorum disk daemon + +### BEGIN INIT INFO +# Provides: qdiskd +# Required-Start: cman +# Required-Stop: cman +# Default-Start: +# Default-Stop: +# Short-Description: start/stop quorum disk daemon +# Description: start/stop quorum disk daemon +### END INIT INFO + +# rpm based distros +if [ -d /etc/sysconfig ]; then + [ -f @INITDDIR@/functions ] && . @INITDDIR@/functions + [ -f /etc/sysconfig/cluster ] && . /etc/sysconfig/cluster + [ -f /etc/sysconfig/qdiskd ] && . /etc/sysconfig/qdiskd + [ -z "$LOCK_FILE" ] && LOCK_FILE="/var/lock/subsys/qdiskd" + success=success + failure=failure + status=status +fi + +# deb based distros +if [ -d /etc/default ]; then + [ -f /etc/default/cluster ] && . /etc/default/cluster + [ -f /etc/default/qdiskd ] && . /etc/default/qdiskd + [ -z "$LOCK_FILE" ] && LOCK_FILE="/var/lock/qdiskd" + success=local_success + failure=local_failure + # functions in rpm based distro implements a very complete version + # of pidof. For now we can live with this. + status=local_status +fi + +local_success() +{ + echo -ne "[ OK ]\r" +} + +local_failure() +{ + echo -ne "[FAILED]\r" +} + +local_status() +{ + pid=$(pidof $1 2>/dev/null) + rtrn=$? + if [ $rtrn -ne 0 ]; then + echo "$1 is stopped" + else + echo "$1 (pid $pid) is running..." + fi + return $rtrn +} + +rtrn=1 +retries=0 + +# See how we were called. +case "$1" in + start) + echo -n "Starting the Quorum Disk Daemon: " + + $0 status >/dev/null + if [ $? -eq 0 ]; then + $success + echo + exit 0 + fi + + @SBINDIR@/qdiskd -Q + rtrn=$? + if [ $rtrn = 0 ]; then + touch $LOCK_FILE + $success + echo + else + $failure + echo + fi + + ;; + + stop) + echo -n "Stopping the Quorum Disk Daemon: " + pid="$(pidof qdiskd)" + while [ -n "$pid" ] && [ $retries -lt 5 ]; do + kill $pid 2>&1 + pid="$(pidof qdiskd)" + sleep 1 + ((retries++)) + done + if [ -z "$(pidof qdiskd)" ]; then + $success + echo + rtrn=0 + rm -f $LOCK_FILE + else + $failure + echo + rtrn=1 + fi + ;; + + restart|reload) + $0 stop || exit $? + $0 start + rtrn=$? + ;; + + status) + $status qdiskd + rtrn=$? + ;; + + *) + echo $"Usage: $0 {start|stop|reload|restart|status}" + ;; +esac + +exit $rtrn diff --git a/fence/agents/scsi/Makefile b/fence/agents/scsi/Makefile index c45bcc9..ccc30fb 100644 --- a/fence/agents/scsi/Makefile +++ b/fence/agents/scsi/Makefile @@ -1,6 +1,6 @@ include ../../../make/defines.mk -TARGET= fence_scsi fence_scsi_test scsi_reserve_notify +TARGET= fence_scsi fence_scsi_test scsi_reserve_notify scsi_reserve INITDT= scsi_reserve NOTIFYD= scsi_reserve_notify @@ -10,3 +10,8 @@ $(NOTIFYD): $(S)/$(NOTIFYD).in cat $(S)/$(NOTIFYD).in | sed \ -e 's#@INITDT@#${initddir}#g' \ > $(NOTIFYD) + +$(INITDT): $(S)/$(INITDT).in + cat $(S)/$(INITDT).in | sed \ + -e 's#@INITDDIR@#${initddir}#g' \ + > $(INITDT) diff --git a/fence/agents/scsi/scsi_reserve b/fence/agents/scsi/scsi_reserve deleted file mode 100644 index 86321f4..0000000 --- a/fence/agents/scsi/scsi_reserve +++ /dev/null @@ -1,316 +0,0 @@ -#!/bin/bash -# -# scsi_reserve persistent reservation service for lvm -# -# chkconfig: - 25 75 -# description: start/stop persistent reservation service for lvm - -### BEGIN INIT INFO -# Provides: scsi_reserve -# Required-Start: cman -# Required-Stop: cman -# Default-Start: -# Default-Stop: -# Short-Description: start/stop persistent reservation service for lvm -# Description: start/stop persistent reservation service for lvm -### END INIT INFO - -. /etc/init.d/functions - -# read in config file if it exists -# -[ -f /etc/sysconfig/cluster ] && . /etc/sysconfig/cluster -[ -f /etc/sysconfig/scsi_reserve ] && . /etc/sysconfig/scsi_reserve - -# check that cman is running -# -if ! cman_tool status &> /dev/null ; then - logger -t scsi_reserve \ - "[error] cman does not appear to be running" - exit 1 -fi - -# check if cluster is configured for fence_scsi -# -if ! fence_scsi_test -t fence ; then - logger -t scsi_reserve \ - "[error] cluster not configured for scsi reservations" - exit 1 -fi - -# check for sg_persist command provided by sg3_utils package -# -if ! sg_persist -V &> /dev/null ; then - logger -t scsi_reserve \ - "[error] unable to exec sg_persist" - exit 1 -fi - -# get physical volumes (devices) that are part of cluster volumes -# -scsi_devices=$( vgs --config 'global { locking_type = 0 }' \ - --noheadings -o vg_attr,pv_name 2> /dev/null \ - | awk ' $1 ~ /.*c$/ { print $2 } ' ) - -if [ -z "$scsi_devices" ] ; then - logger -t scsi_reserve \ - "[error] did not find devices in cluster volumes" - exit 1 -fi - -# get the cluster id from cman -# -cluster_id=$( cman_tool status | grep -i "Cluster ID" \ - | awk -F": " '{ print $2 }' ) - -if [ -z "$cluster_id" ] ; then - logger -s -t scsi_reserve \ - "[error] unable to determine cluster id" - exit 1 -fi - -# get the node id from cman -# -node_id=$( cman_tool status | grep -i "Node ID" \ - | awk -F": " '{ print $2 }' ) - -if [ -z "$node_id" ] ; then - logger -t scsi_reserve \ - "[error] unable to determine node id" - exit 1 -fi - -# generate unique key using cluster_id and node_id -# -key=$( printf "%x%.4x" $cluster_id $node_id ) - -if [ -z "$key" ] ; then - logger -t scsi_reserve \ - "[error] unable to generate key" - exit 1 -fi - -################################################################################ - -case $1 in - - start) - - error=0 - count=0 - - echo -n "Starting scsi_reserve:" - - for dev in $scsi_devices - do - # check if our key is already resgistered with this device - # - if sg_persist -n -d $dev -i -k | grep -qiE "^[[:space:]]*0x$key" ; then - logger -t scsi_reserve \ - "[info] already registered with $dev (key=0x$key)" - continue - fi - - # create the scsi registration - # - if ! sg_persist -n -d $dev -o -I -S $key &> /dev/null ; then - logger -t scsi_reserve \ - "[error] unable to register device $dev (key=0x$key)" - : $[ count = $count + 1 ] - error=1 - else - logger -t scsi_reserve \ - "[info] registered with device $dev (key=0x$key)" - fi - - # check to see if reservation already exists - # - if sg_persist -n -d $dev -i -r | grep -qiE "^[[:space:]]*Key=0x" ; then - logger -t scsi_reserve \ - "[info] reservation already exists on $dev" - continue - fi - - # create the scsi reservation - # - if ! sg_persist -n -d $dev -o -R -K $key -T 5 &> /dev/null ; then - logger -t scsi_reserver \ - "[error] unable to create reservation on $dev (key=0x$key)" - : $[ count = $count + 1 ] - error=1 - fi - done - - # leave fence domain if any errors occured during registration - # - if [ $error -eq 0 ] ; then - success - else - logger -t scsi_reserve \ - "[info] $count errors during registration" - logger -t scsi_reserve \ - "[info] leaving the fence domain" - fence_tool leave - failure - fi - - touch /var/lock/subsys/scsi_reserve - - echo - - ;; # end of start - - stop) - - error=0 - count=0 - - echo -n "Stopping scsi_reserve:" - - for dev in $scsi_devices - do - # get list of keys registered with this device - # - key_list=$( sg_persist -n -d $dev -i -k | grep -iE "^[[:space:]]*0x" ) - - # check that our key is registered with this device - # - if ! sg_persist -d $dev -i -k | grep -qiE "^[[:space:]]*0x$key" ; then - logger -t scsi_reserve \ - "[info] not registered with $dev (key=0x$key)" - continue - fi - - # check if our key is the reservation holder - # - if sg_persist -n -d $dev -i -r 2>/dev/null | grep -qiE "$key" ; then - if echo "$key_list" | grep -qivE "$key" ; then - logger -t scsi_reserve \ - "[error] unable to remove registration on $dev (key=0x$key)" - : $[ count = $count + 1 ] - error=1 - continue - fi - fi - - # remove registration for this device - # - if ! sg_persist -n -d $dev -o -G -K $key -S 0 &> /dev/null ; then - logger -t scsi_reserve \ - "[error] failed to remove registration on $dev (key=0x$key)" - : $[ count = $count + 1 ] - error=1 - else - logger -t scsi_reserve \ - "[info] removed registration on $dev (key=0x$key)" - fi - - done - - # report success or failure - # - if [ $error -eq 0 ] ; then - success - else - logger -t scsi_reserve \ - "[info] $count errors occured during unregistration" - failure - fi - - rm -f /var/lock/subsys/scsi_reserve - - echo - - ;; # end of stop - - restart) - - error=0 - - echo -n "Retarting scsi_reserve:" - - for dev in $scsi_devices - do - # recreate the scsi registration - # - if ! sg_persist -n -d $dev -o -I -S $key &> /dev/null ; then - logger -t scsi_reserve \ - "[error] unable to register device $dev (key=0x$key)" - : $[ count = $count + 1 ] - error=1 - else - logger -t scsi_reserve \ - "[info] registered with device $dev (key=0x$key)" - fi - - # check to see if reservation already exists - # - if sg_persist -n -d $dev -i -r | grep -qiE "^[[:space:]]*Key=0x" ; then - logger -t scsi_reserve \ - "[info] reservation already exists on $dev" - continue - fi - - # recreate the scsi reservation - # - if ! sg_persist -n -d $dev -o -R -K $key -T 5 &> /dev/null ; then - logger -t scsi_reserver \ - "[error] unable to create reservation on $dev (key=0x$key)" - : $[ count = $count + 1 ] - error=1 - fi - done - - # leave fence domain if any errors occured during registration - # - if [ $error -eq 0 ] ; then - success - else - logger -t scsi_reserve \ - "[info] $count errors during registration" - logger -t scsi_reserve \ - "[info] leaving the fence domain" - fence_tool leave - failure - fi - - echo - - ;; # end of restart - - status) - - error=0 - - for dev in $scsi_devices - do - if sg_persist -n -d $dev -i -k | grep -qiE "$key" ; then - devices[${#devices[@]}]=$dev - fi - done - - if [ -z "$devices" ] ; then - echo "No registered devices found." - else - echo "Found ${#devices[@]} registered device(s):" - - for i in "${devices[@]}" - do - echo $i - done - fi - - ;; # end of status - - restart|reload) - $0 stop - $0 start - ;; - - *) - echo $"Usage: $0 {start|stop|restart|reload|status}" - exit 1 - -esac - -exit $error diff --git a/fence/agents/scsi/scsi_reserve.in b/fence/agents/scsi/scsi_reserve.in new file mode 100644 index 0000000..c5a9790 --- /dev/null +++ b/fence/agents/scsi/scsi_reserve.in @@ -0,0 +1,338 @@ +#!/bin/bash +# +# scsi_reserve persistent reservation service for lvm +# +# chkconfig: - 25 75 +# description: start/stop persistent reservation service for lvm + +### BEGIN INIT INFO +# Provides: scsi_reserve +# Required-Start: cman +# Required-Stop: cman +# Default-Start: +# Default-Stop: +# Short-Description: start/stop persistent reservation service for lvm +# Description: start/stop persistent reservation service for lvm +### END INIT INFO + +# rpm based distros +if [ -d /etc/sysconfig ]; then + [ -f @INITDDIR@/functions ] && . @INITDDIR@/functions + [ -f /etc/sysconfig/cluster ] && . /etc/sysconfig/cluster + [ -f /etc/sysconfig/scsi_reserve ] && . /etc/sysconfig/scsi_reserve + [ -z "$LOCK_FILE" ] && LOCK_FILE="/var/lock/subsys/scsi_reserve" + success=success + failure=failure +fi + +# deb based distros +if [ -d /etc/default ]; then + [ -f /etc/default/cluster ] && . /etc/default/cluster + [ -f /etc/default/scsi_reserve ] && . /etc/default/scsi_reserve + [ -z "$LOCK_FILE" ] && LOCK_FILE="/var/lock/scsi_reserve" + success=local_success + failure=local_failure +fi + +local_success() +{ + echo -ne "[ OK ]\r" +} + +local_failure() +{ + echo -ne "[FAILED]\r" +} + +# check that cman is running +# +if ! cman_tool status > /dev/null 2>&1; then + logger -t scsi_reserve \ + "[error] cman does not appear to be running" + exit 1 +fi + +# check if cluster is configured for fence_scsi +# +if ! fence_scsi_test -t fence ; then + logger -t scsi_reserve \ + "[error] cluster not configured for scsi reservations" + exit 1 +fi + +# check for sg_persist command provided by sg3_utils package +# +if ! sg_persist -V > /dev/null 2>&1; then + logger -t scsi_reserve \ + "[error] unable to exec sg_persist" + exit 1 +fi + +# get physical volumes (devices) that are part of cluster volumes +# +scsi_devices=$( vgs --config 'global { locking_type = 0 }' \ + --noheadings -o vg_attr,pv_name 2> /dev/null \ + | awk ' $1 ~ /.*c$/ { print $2 } ' ) + +if [ -z "$scsi_devices" ] ; then + logger -t scsi_reserve \ + "[error] did not find devices in cluster volumes" + exit 1 +fi + +# get the cluster id from cman +# +cluster_id=$( cman_tool status | grep -i "Cluster ID" \ + | awk -F": " '{ print $2 }' ) + +if [ -z "$cluster_id" ] ; then + logger -s -t scsi_reserve \ + "[error] unable to determine cluster id" + exit 1 +fi + +# get the node id from cman +# +node_id=$( cman_tool status | grep -i "Node ID" \ + | awk -F": " '{ print $2 }' ) + +if [ -z "$node_id" ] ; then + logger -t scsi_reserve \ + "[error] unable to determine node id" + exit 1 +fi + +# generate unique key using cluster_id and node_id +# +key=$( printf "%x%.4x" $cluster_id $node_id ) + +if [ -z "$key" ] ; then + logger -t scsi_reserve \ + "[error] unable to generate key" + exit 1 +fi + +################################################################################ + +case $1 in + + start) + + error=0 + count=0 + + echo -n "Starting scsi_reserve:" + + for dev in $scsi_devices + do + # check if our key is already resgistered with this device + # + if sg_persist -n -d $dev -i -k | grep -qiE "^[[:space:]]*0x$key" ; then + logger -t scsi_reserve \ + "[info] already registered with $dev (key=0x$key)" + continue + fi + + # create the scsi registration + # + if ! sg_persist -n -d $dev -o -I -S $key > /dev/null 2>&1; then + logger -t scsi_reserve \ + "[error] unable to register device $dev (key=0x$key)" + : $[ count = $count + 1 ] + error=1 + else + logger -t scsi_reserve \ + "[info] registered with device $dev (key=0x$key)" + fi + + # check to see if reservation already exists + # + if sg_persist -n -d $dev -i -r | grep -qiE "^[[:space:]]*Key=0x" ; then + logger -t scsi_reserve \ + "[info] reservation already exists on $dev" + continue + fi + + # create the scsi reservation + # + if ! sg_persist -n -d $dev -o -R -K $key -T 5 > /dev/null 2>&1; then + logger -t scsi_reserver \ + "[error] unable to create reservation on $dev (key=0x$key)" + : $[ count = $count + 1 ] + error=1 + fi + done + + # leave fence domain if any errors occured during registration + # + if [ $error -eq 0 ] ; then + $success + else + logger -t scsi_reserve \ + "[info] $count errors during registration" + logger -t scsi_reserve \ + "[info] leaving the fence domain" + fence_tool leave + $failure + fi + + touch $LOCK_FILE + + echo + + ;; # end of start + + stop) + + error=0 + count=0 + + echo -n "Stopping scsi_reserve:" + + for dev in $scsi_devices + do + # get list of keys registered with this device + # + key_list=$( sg_persist -n -d $dev -i -k | grep -iE "^[[:space:]]*0x" ) + + # check that our key is registered with this device + # + if ! sg_persist -d $dev -i -k | grep -qiE "^[[:space:]]*0x$key" ; then + logger -t scsi_reserve \ + "[info] not registered with $dev (key=0x$key)" + continue + fi + + # check if our key is the reservation holder + # + if sg_persist -n -d $dev -i -r 2>/dev/null | grep -qiE "$key" ; then + if echo "$key_list" | grep -qivE "$key" ; then + logger -t scsi_reserve \ + "[error] unable to remove registration on $dev (key=0x$key)" + : $[ count = $count + 1 ] + error=1 + continue + fi + fi + + # remove registration for this device + # + if ! sg_persist -n -d $dev -o -G -K $key -S 0 > /dev/null 2>&1; then + logger -t scsi_reserve \ + "[error] failed to remove registration on $dev (key=0x$key)" + : $[ count = $count + 1 ] + error=1 + else + logger -t scsi_reserve \ + "[info] removed registration on $dev (key=0x$key)" + fi + + done + + # report success or failure + # + if [ $error -eq 0 ] ; then + $success + else + logger -t scsi_reserve \ + "[info] $count errors occured during unregistration" + $failure + fi + + rm -f $LOCK_FILE + + echo + + ;; # end of stop + + restart) + + error=0 + + echo -n "Retarting scsi_reserve:" + + for dev in $scsi_devices + do + # recreate the scsi registration + # + if ! sg_persist -n -d $dev -o -I -S $key > /dev/null 2>&1; then + logger -t scsi_reserve \ + "[error] unable to register device $dev (key=0x$key)" + : $[ count = $count + 1 ] + error=1 + else + logger -t scsi_reserve \ + "[info] registered with device $dev (key=0x$key)" + fi + + # check to see if reservation already exists + # + if sg_persist -n -d $dev -i -r | grep -qiE "^[[:space:]]*Key=0x" ; then + logger -t scsi_reserve \ + "[info] reservation already exists on $dev" + continue + fi + + # recreate the scsi reservation + # + if ! sg_persist -n -d $dev -o -R -K $key -T 5 > /dev/null 2>&1; then + logger -t scsi_reserver \ + "[error] unable to create reservation on $dev (key=0x$key)" + : $[ count = $count + 1 ] + error=1 + fi + done + + # leave fence domain if any errors occured during registration + # + if [ $error -eq 0 ] ; then + $success + else + logger -t scsi_reserve \ + "[info] $count errors during registration" + logger -t scsi_reserve \ + "[info] leaving the fence domain" + fence_tool leave + $failure + fi + + echo + + ;; # end of restart + + status) + + error=0 + + for dev in $scsi_devices + do + if sg_persist -n -d $dev -i -k | grep -qiE "$key" ; then + devices[${#devices[@]}]=$dev + fi + done + + if [ -z "$devices" ] ; then + echo "No registered devices found." + else + echo "Found ${#devices[@]} registered device(s):" + + for i in "${devices[@]}" + do + echo $i + done + fi + + ;; # end of status + + restart|reload) + $0 stop + $0 start + ;; + + *) + echo $"Usage: $0 {start|stop|restart|reload|status}" + exit 1 + +esac + +exit $error diff --git a/gfs/init.d/Makefile b/gfs/init.d/Makefile index 4fc21a9..2ad74ac 100644 --- a/gfs/init.d/Makefile +++ b/gfs/init.d/Makefile @@ -2,11 +2,16 @@ TARGET= gfs INITDT=$(TARGET) -all: +all: $(TARGET) include ../../make/defines.mk +include $(OBJDIR)/make/clean.mk include $(OBJDIR)/make/install.mk include $(OBJDIR)/make/uninstall.mk +$(TARGET): $(S)/$(TARGET).in + cat $(S)/$(TARGET).in | sed \ + -e 's#@INITDDIR@#${initddir}#g' \ + > $(TARGET) -clean: +clean: generalclean diff --git a/gfs/init.d/gfs b/gfs/init.d/gfs deleted file mode 100644 index e212a04..0000000 --- a/gfs/init.d/gfs +++ /dev/null @@ -1,97 +0,0 @@ -#!/bin/bash -# -# gfs mount/unmount helper -# -# chkconfig: - 26 74 -# description: mount/unmount gfs filesystems configured in /etc/fstab - -### BEGIN INIT INFO -# Provides: gfs -# Required-Start: $network cman -# Required-Stop: $network cman -# Default-Start: -# Default-Stop: -# Short-Description: mount/unmount gfs filesystems configured in /etc/fstab -# Description: mount/unmount gfs filesystems configured in /etc/fstab -### END INIT INFO - -. /etc/init.d/functions -[ -f /etc/sysconfig/cluster ] && . /etc/sysconfig/cluster -[ -f /etc/sysconfig/gfs ] && . /etc/sysconfig/gfs - -# -# This script's behavior is modeled closely after the netfs script. -# -GFSFSTAB=$(LC_ALL=C awk '!/^#/ && $3 == "gfs" && $4 !~ /noauto/ { print $2 }' /etc/fstab) -GFSMTAB=$(LC_ALL=C awk '!/^#/ && $3 == "gfs" && $2 != "/" { print $2 }' /proc/mounts) - -# See how we were called. -case "$1" in - start) - if [ -n "$GFSFSTAB" ] - then - action $"Mounting GFS filesystems: " mount -a -t gfs - fi - touch /var/lock/subsys/gfs - ;; - - stop) - if [ -n "$GFSMTAB" ] - then - sig= - retry=6 - remaining=`LC_ALL=C awk '!/^#/ && $3 == "gfs" && $2 != "/" {print $2}' /proc/mounts` - while [ -n "$remaining" -a "$retry" -gt 0 ] - do - action $"Unmounting GFS filesystems: " umount -a -t gfs - - if [ $retry -eq 0 ] - then - action $"Unmounting GFS filesystems (lazy): " umount -l -a -t gfs - break - fi - - sleep 2 - remaining=`LC_ALL=C awk '!/^#/ && $3 == "gfs" && $2 != "/" {print $2}' /proc/mounts` - [ -z "$remaining" ] && break - /sbin/fuser -k -m $sig $remaining >/dev/null - sleep 10 - retry=$(($retry - 1)) - sig=-9 - done - fi - - modprobe -r gfs - rm -f /var/lock/subsys/gfs - ;; - - status) - if [ -f /proc/mounts ] - then - [ -n "$GFSFSTAB" ] && { - echo $"Configured GFS mountpoints: " - for fs in $GFSFSTAB; do echo $fs ; done - } - [ -n "$GFSMTAB" ] && { - echo $"Active GFS mountpoints: " - for fs in $GFSMTAB; do echo $fs ; done - } - else - echo "/proc filesystem unavailable" - fi - ;; - - restart) - $0 stop - $0 start - ;; - - reload) - $0 start - ;; - *) - echo $"Usage: $0 {start|stop|restart|reload|status}" - exit 1 -esac - -exit 0 diff --git a/gfs/init.d/gfs.in b/gfs/init.d/gfs.in new file mode 100644 index 0000000..c3bf59a --- /dev/null +++ b/gfs/init.d/gfs.in @@ -0,0 +1,149 @@ +#!/bin/bash +# +# gfs mount/unmount helper +# +# chkconfig: - 26 74 +# description: mount/unmount gfs filesystems configured in /etc/fstab + +### BEGIN INIT INFO +# Provides: gfs +# Required-Start: $network cman +# Required-Stop: $network cman +# Default-Start: +# Default-Stop: +# Short-Description: mount/unmount gfs filesystems configured in /etc/fstab +# Description: mount/unmount gfs filesystems configured in /etc/fstab +### END INIT INFO + +# rpm based distros +if [ -d /etc/sysconfig ]; then + [ -f @INITDDIR@/functions ] && . @INITDDIR@/functions + [ -f /etc/sysconfig/cluster ] && . /etc/sysconfig/cluster + [ -f /etc/sysconfig/gfs ] && . /etc/sysconfig/gfs + [ -z "$LOCK_FILE" ] && LOCK_FILE="/var/lock/subsys/gfs" + success=success + failure=failure +fi + +# deb based distros +if [ -d /etc/default ]; then + [ -f /etc/default/cluster ] && . /etc/default/cluster + [ -f /etc/default/gfs ] && . /etc/default/gfs + [ -z "$LOCK_FILE" ] && LOCK_FILE="/var/lock/gfs" + success=local_success + failure=local_failure +fi + +local_success() +{ + echo -ne "[ OK ]\r" +} + +local_failure() +{ + echo -ne "[FAILED]\r" +} + +# +# This script's behavior is modeled closely after the netfs script. +# +GFSFSTAB=$(LC_ALL=C awk '!/^#/ && $3 == "gfs" && $4 !~ /noauto/ { print $2 }' /etc/fstab) +GFSMTAB=$(LC_ALL=C awk '!/^#/ && $3 == "gfs" && $2 != "/" { print $2 }' /proc/mounts) + +# See how we were called. +case "$1" in + start) + if [ -n "$GFSFSTAB" ] + then + echo -n "Mounting GFS filesystems: " + mount -a -t gfs + rtrn=$? + if [ $rtrn = 0 ]; then + touch $LOCK_FILE + $success + echo + else + $failure + echo + fi + fi + ;; + + stop) + if [ -n "$GFSMTAB" ] + then + sig= + retry=6 + remaining=`LC_ALL=C awk '!/^#/ && $3 == "gfs" && $2 != "/" {print $2}' /proc/mounts` + while [ -n "$remaining" -a "$retry" -gt 0 ] + do + echo -n "Unmounting GFS filesystems: " + umount -a -t gfs + rtrn=$? + if [ $rtrn = 0 ]; then + $success + echo + else + $failure + echo + fi + + if [ $retry -eq 0 ] + then + echo -n "Unmounting GFS filesystems (lazy): " + umount -l -a -t gfs + rtrn=$? + if [ $rtrn = 0 ]; then + $success + echo + else + $failure + echo + fi + break + fi + + sleep 2 + remaining=`LC_ALL=C awk '!/^#/ && $3 == "gfs" && $2 != "/" {print $2}' /proc/mounts` + [ -z "$remaining" ] && break + fuser -k -m $sig $remaining > /dev/null 2>&1 + sleep 10 + retry=$(($retry - 1)) + sig=-9 + done + fi + + modprobe -r gfs + rm -f $LOCK_FILE + ;; + + status) + if [ -f /proc/mounts ] + then + [ -n "$GFSFSTAB" ] && { + echo "Configured GFS mountpoints: " + for fs in $GFSFSTAB; do echo $fs ; done + } + [ -n "$GFSMTAB" ] && { + echo "Active GFS mountpoints: " + for fs in $GFSMTAB; do echo $fs ; done + } + else + echo "/proc filesystem unavailable" + fi + ;; + + restart) + $0 stop + $0 start + ;; + + reload) + $0 start + ;; + *) + echo $"Usage: $0 {start|stop|restart|reload|status}" + exit 1 +esac + +exit 0 diff --git a/gfs2/init.d/Makefile b/gfs2/init.d/Makefile index 221550e..fe50c3f 100644 --- a/gfs2/init.d/Makefile +++ b/gfs2/init.d/Makefile @@ -2,11 +2,16 @@ TARGET= gfs2 INITDT=$(TARGET) -all: +all: $(TARGET) include ../../make/defines.mk +include $(OBJDIR)/make/clean.mk include $(OBJDIR)/make/install.mk include $(OBJDIR)/make/uninstall.mk +$(TARGET): $(S)/$(TARGET).in + cat $(S)/$(TARGET).in | sed \ + -e 's#@INITDDIR@#${initddir}#g' \ + > $(TARGET) -clean: +clean: generalclean diff --git a/gfs2/init.d/gfs2 b/gfs2/init.d/gfs2 deleted file mode 100644 index cbe37fd..0000000 --- a/gfs2/init.d/gfs2 +++ /dev/null @@ -1,96 +0,0 @@ -#!/bin/bash -# -# gfs2 mount/unmount helper -# -# chkconfig: - 26 74 -# description: mount/unmount gfs2 filesystems configured in /etc/fstab - -### BEGIN INIT INFO -# Provides: gfs2 -# Required-Start: $network cman -# Required-Stop: $network cman -# Default-Start: -# Default-Stop: -# Short-Description: mount/unmount gfs2 filesystems configured in /etc/fstab -# Description: mount/unmount gfs2 filesystems configured in /etc/fstab -### END INIT INFO - -. /etc/init.d/functions -[ -f /etc/sysconfig/cluster ] && . /etc/sysconfig/cluster -[ -f /etc/sysconfig/gfs2 ] && . /etc/sysconfig/gfs2 - -# -# This script's behavior is modeled closely after the netfs script. -# -GFS2FSTAB=$(LC_ALL=C awk '!/^#/ && $3 == "gfs2" && $4 !~ /noauto/ { print $2 }' /etc/fstab) -GFS2MTAB=$(LC_ALL=C awk '!/^#/ && $3 == "gfs2" && $2 != "/" { print $2 }' /proc/mounts) - -# See how we were called. -case "$1" in - start) - if [ -n "$GFS2FSTAB" ] - then - action $"Mounting GFS2 filesystems: " mount -a -t gfs2 - fi - touch /var/lock/subsys/gfs2 - ;; - - stop) - if [ -n "$GFS2MTAB" ] - then - sig= - retry=6 - remaining=`LC_ALL=C awk '!/^#/ && $3 == "gfs2" && $2 != "/" {print $2}' /proc/mounts` - while [ -n "$remaining" -a "$retry" -gt 0 ] - do - action $"Unmounting GFS2 filesystems: " umount -a -t gfs2 - - if [ $retry -eq 0 ] - then - action $"Unmounting GFS2 filesystems (lazy): " umount -l -a -t gfs2 - break - fi - - sleep 2 - remaining=`LC_ALL=C awk '!/^#/ && $3 == "gfs2" && $2 != "/" {print $2}' /proc/mounts` - [ -z "$remaining" ] && break - /sbin/fuser -k -m $sig $remaining &> /dev/null - sleep 10 - retry=$(($retry - 1)) - sig=-9 - done - fi - - rm -f /var/lock/subsys/gfs2 - ;; - - status) - if [ -f /proc/mounts ] - then - [ -n "$GFS2FSTAB" ] && { - echo $"Configured GFS2 mountpoints: " - for fs in $GFS2FSTAB; do echo $fs ; done - } - [ -n "$GFS2MTAB" ] && { - echo $"Active GFS2 mountpoints: " - for fs in $GFS2MTAB; do echo $fs ; done - } - else - echo "/proc filesystem unavailable" - fi - ;; - - restart) - $0 stop - $0 start - ;; - - reload) - $0 start - ;; - *) - echo $"Usage: $0 {start|stop|restart|reload|status}" - exit 1 -esac - -exit 0 diff --git a/gfs2/init.d/gfs2.in b/gfs2/init.d/gfs2.in new file mode 100644 index 0000000..35688a0 --- /dev/null +++ b/gfs2/init.d/gfs2.in @@ -0,0 +1,149 @@ +#!/bin/bash +# +# gfs2 mount/unmount helper +# +# chkconfig: - 26 74 +# description: mount/unmount gfs2 filesystems configured in /etc/fstab + +### BEGIN INIT INFO +# Provides: gfs2 +# Required-Start: $network cman +# Required-Stop: $network cman +# Default-Start: +# Default-Stop: +# Short-Description: mount/unmount gfs2 filesystems configured in /etc/fstab +# Description: mount/unmount gfs2 filesystems configured in /etc/fstab +### END INIT INFO + +# rpm based distros +if [ -d /etc/sysconfig ]; then + [ -f @INITDDIR@/functions ] && . @INITDDIR@/functions + [ -f /etc/sysconfig/cluster ] && . /etc/sysconfig/cluster + [ -f /etc/sysconfig/gfs2 ] && . /etc/sysconfig/gfs2 + [ -z "$LOCK_FILE" ] && LOCK_FILE="/var/lock/subsys/gfs2" + success=success + failure=failure +fi + +# deb based distros +if [ -d /etc/default ]; then + [ -f /etc/default/cluster ] && . /etc/default/cluster + [ -f /etc/default/gfs2 ] && . /etc/default/gfs2 + [ -z "$LOCK_FILE" ] && LOCK_FILE="/var/lock/gfs2" + success=success + failure=failure +fi + +local_success() +{ + echo -ne "[ OK ]\r" +} + +local_failure() +{ + echo -ne "[FAILED]\r" +} + +# +# This script's behavior is modeled closely after the netfs script. +# +GFS2FSTAB=$(LC_ALL=C awk '!/^#/ && $3 == "gfs2" && $4 !~ /noauto/ { print $2 }' /etc/fstab) +GFS2MTAB=$(LC_ALL=C awk '!/^#/ && $3 == "gfs2" && $2 != "/" { print $2 }' /proc/mounts) + +# See how we were called. +case "$1" in + start) + if [ -n "$GFS2FSTAB" ] + then + echo -n "Mounting GFS2 filesystems: " + mount -a -t gfs2 + rtrn=$? + if [ $rtrn = 0 ]; then + touch $LOCK_FILE + $success + echo + else + $failure + echo + fi + fi + ;; + + stop) + if [ -n "$GFS2MTAB" ] + then + sig= + retry=6 + remaining=`LC_ALL=C awk '!/^#/ && $3 == "gfs2" && $2 != "/" {print $2}' /proc/mounts` + while [ -n "$remaining" -a "$retry" -gt 0 ] + do + echo -n "Unmounting GFS2 filesystems: " + umount -a -t gfs2 + rtrn=$? + if [ $rtrn = 0 ]; then + $success + echo + else + $failure + echo + fi + + if [ $retry -eq 0 ] + then + echo -n "Unmounting GFS2 filesystems (lazy): " + umount -l -a -t gfs2 + rtrn=$? + if [ $rtrn = 0 ]; then + $success + echo + else + $failure + echo + fi + break + fi + + sleep 2 + remaining=`LC_ALL=C awk '!/^#/ && $3 == "gfs2" && $2 != "/" {print $2}' /proc/mounts` + [ -z "$remaining" ] && break + fuser -k -m $sig $remaining > /dev/null 2>&1 + sleep 10 + retry=$(($retry - 1)) + sig=-9 + done + fi + + modprobe -r gfs2 + rm -f $LOCK_FILE + ;; + + status) + if [ -f /proc/mounts ] + then + [ -n "$GFS2FSTAB" ] && { + echo "Configured GFS2 mountpoints: " + for fs in $GFS2FSTAB; do echo $fs ; done + } + [ -n "$GFS2MTAB" ] && { + echo "Active GFS2 mountpoints: " + for fs in $GFS2MTAB; do echo $fs ; done + } + else + echo "/proc filesystem unavailable" + fi + ;; + + restart) + $0 stop + $0 start + ;; + + reload) + $0 start + ;; + *) + echo $"Usage: $0 {start|stop|restart|reload|status}" + exit 1 +esac + +exit 0 diff --git a/rgmanager/init.d/Makefile b/rgmanager/init.d/Makefile index f76190b..1a50d62 100644 --- a/rgmanager/init.d/Makefile +++ b/rgmanager/init.d/Makefile @@ -2,12 +2,18 @@ TARGET= rgmanager INITDT=$(TARGET) -all: +all: $(TARGET) include ../../make/defines.mk +include $(OBJDIR)/make/clean.mk include $(OBJDIR)/make/install.mk include $(OBJDIR)/make/uninstall.mk -clean: +$(TARGET): $(S)/$(TARGET).in + cat $(S)/$(TARGET).in | sed \ + -e 's#@INITDDIR@#${initddir}#g' \ + > $(TARGET) + +clean: generalclean check: diff --git a/rgmanager/init.d/rgmanager b/rgmanager/init.d/rgmanager deleted file mode 100644 index 361a65e..0000000 --- a/rgmanager/init.d/rgmanager +++ /dev/null @@ -1,142 +0,0 @@ -#!/bin/sh -# -# chkconfig: - 99 01 -# description: Starts and stops Red Hat Service (resource group) Manager - -### BEGIN INIT INFO -# Provides: rgmanager -# Required-Start: cman -# Required-Stop: cman -# Default-Start: -# Default-Stop: -# Short-Description: Starts and stops Red Hat Service (resource group) Manager -# Description: Starts and stops Red Hat Service (resource group) Manager -### END INIT INFO - -# Source function library -. /etc/init.d/functions - -# Grab cluster start config if it exists -[ -f /etc/sysconfig/cluster ] && . /etc/sysconfig/cluster -[ -f /etc/sysconfig/rgmanager ] && . /etc/sysconfig/rgmanager - -PATH=/sbin:/bin:/usr/sbin:/usr/bin - -export PATH - -ID="Cluster Service Manager" -RGMGRD="clurgmgrd" - -LOG_ERR=3 -LOG_WARNING=4 -LOG_NOTICE=5 -LOG_INFO=6 - - -# -# log_and_print <level> <message> -# -log_and_print() -{ - if [ -z "$1" -o -z "$2" ]; then - return 1; - fi - - clulog -p $$ -n "rgmanager" -s $1 "$2" - echo $2 - - return 0; -} - - -# -# Bring down the cluster on a node. -# -stop_cluster() -{ - kill -TERM `pidof $RGMGRD` - - while [ 0 ]; do - - if [ -n "`pidof $RGMGRD`" ]; then - echo -n $"Waiting for services to stop: " - while [ -n "`pidof $RGMGRD`" ]; do - sleep 1 - done - echo_success - echo - else - echo $"Services are stopped." - fi - - # Ensure all NFS rmtab daemons are dead. - killall $RMTABD &> /dev/null - - rm -f /var/run/$RGMGRD.pid - - return 0 - done -} - - -case $1 in - start) - echo -n $"Starting $ID: " - daemon $RGMGRD $RGMGR_OPTS - ret=$? - echo - - # To be consistent... - if [ $ret -eq 0 ]; then - touch /var/lock/subsys/rgmanager - fi - exit $ret - ;; - - restart) - $0 status &> /dev/null - if [ $? -ne 1 ]; then - $0 stop - fi - $0 start - ;; - - condrestart) - $0 status $> /dev/null - if [ $? -eq 0 ]; then - $0 stop - $0 start - fi - ;; - - reload) - clulog -p $LOG_NOTICE "Reloading Resource Configuration." - echo -n $"Reloading Resource Configuration: " - killproc $RGMGRD -HUP - rv=$? - echo - - exit $rv - ;; - - status) - status $RGMGRD - exit $? - ;; - - stop) - if [ -n "`pidof $RGMGRD`" ]; then - log_and_print $LOG_NOTICE "Shutting down $ID..." - stop_cluster - fi - - rm -f /var/lock/subsys/rgmanager - log_and_print $LOG_NOTICE "$ID is stopped." - ;; - *) - echo "usage: $0 {start|restart|condrestart|reload|status|stop}" - exit 1 - ;; -esac - -exit 0 diff --git a/rgmanager/init.d/rgmanager.in b/rgmanager/init.d/rgmanager.in new file mode 100644 index 0000000..a827aa9 --- /dev/null +++ b/rgmanager/init.d/rgmanager.in @@ -0,0 +1,192 @@ +#!/bin/bash +# +# chkconfig: - 99 01 +# description: Starts and stops Red Hat Service (resource group) Manager + +### BEGIN INIT INFO +# Provides: rgmanager +# Required-Start: cman +# Required-Stop: cman +# Default-Start: +# Default-Stop: +# Short-Description: Starts and stops Red Hat Service (resource group) Manager +# Description: Starts and stops Red Hat Service (resource group) Manager +### END INIT INFO + +# rpm based distros +if [ -d /etc/sysconfig ]; then + [ -f @INITDDIR@/functions ] && . @INITDDIR@/functions + [ -f /etc/sysconfig/cluster ] && . /etc/sysconfig/cluster + [ -f /etc/sysconfig/rgmanager ] && . /etc/sysconfig/rgmanager + [ -z "$LOCK_FILE" ] && LOCK_FILE="/var/lock/subsys/rgmanager" + success=success + failure=failure + status=status +fi + +# deb based distros +if [ -d /etc/default ]; then + [ -f /etc/default/cluster ] && . /etc/default/cluster + [ -f /etc/default/rgmanager ] && . /etc/default/rgmanager + [ -z "$LOCK_FILE" ] && LOCK_FILE="/var/lock/rgmanager" + success=local_success + failure=local_failure + status=local_status +fi + +PATH=/sbin:/bin:/usr/sbin:/usr/bin + +export PATH + +ID="Cluster Service Manager" +RGMGRD="clurgmgrd" + +LOG_ERR=3 +LOG_WARNING=4 +LOG_NOTICE=5 +LOG_INFO=6 + +local_success() +{ + echo -ne "[ OK ]\r" +} + +local_failure() +{ + echo -ne "[FAILED]\r" +} + +local_status() +{ + pid=$(pidof $1 2>/dev/null) + rtrn=$? + if [ $rtrn -ne 0 ]; then + echo "$1 is stopped" + else + echo "$1 (pid $pid) is running..." + fi + return $rtrn +} + +# +# log_and_print <level> <message> +# +log_and_print() +{ + if [ -z "$1" -o -z "$2" ]; then + return 1; + fi + + clulog -s $1 "$2" + echo -n $2 + + return 0; +} + + +# +# Bring down the cluster on a node. +# +stop_cluster() +{ + kill -TERM $(pidof $RGMGRD) + + while [ 0 ]; do + + if [ -n "$(pidof $RGMGRD)" ]; then + echo -n "Waiting for services to stop: " + while [ -n "`pidof $RGMGRD`" ]; do + sleep 1 + done + $success + echo + else + echo "Services are stopped." + fi + + # Ensure all NFS rmtab daemons are dead. + killall $RMTABD > /dev/null 2>&1 + + rm -f /var/run/$RGMGRD.pid + + return 0 + done +} + + +case $1 in + start) + echo -n "Starting $ID: " + + # most recent distributions use tmpfs for /var/run + # to avoid to clean it up on every boot. + # they also assume that init scripts will create + # required subdirectories for proper operations + mkdir -p /var/run/cluster + + $RGMGRD $RGMGR_OPTS + rtrn=$? + if [ $rtrn = 0 ]; then + touch $LOCK_FILE + $success + else + $failure + fi + echo + + exit $rtrn + ;; + + restart) + $0 status > /dev/null 2>&1 + if [ $? -ne 1 ]; then + $0 stop + fi + $0 start + ;; + + condrestart) + $0 status > /dev/null 2>&1 + if [ $? -eq 0 ]; then + $0 stop + $0 start + fi + ;; + + reload) + log_and_print $LOG_NOTICE "Reloading Resource Configuration." + kill -HUP $(pidof $RGMGRD) 2>&1 + rtrn=$? + if [ $rtrn = 0 ]; then + $success + else + $failure + fi + echo + + exit $rtrn + ;; + + status) + $status $RGMGRD + exit $? + ;; + + stop) + if [ -n "$(pidof $RGMGRD)" ]; then + log_and_print $LOG_NOTICE "Shutting down $ID..." + echo + stop_cluster + fi + + rm -f $LOCK_FILE + log_and_print $LOG_NOTICE "$ID is stopped." + echo + ;; + *) + echo "usage: $0 {start|restart|condrestart|reload|status|stop}" + exit 1 + ;; +esac + +exit 0
reply other threads:[~2008-11-07 5:35 UTC|newest] Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20081107053424.9EDCB120363@lists.fedorahosted.org \ --to=fabbione@fedoraproject.org \ --cc=cluster-cvs-relay@redhat.com \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).