public inbox for cluster-cvs@sourceware.org
help / color / mirror / Atom feed
* master - init scripts: major rework to make them distro agnostic
@ 2008-11-07  5:35 Fabio M. Di Nitto
  0 siblings, 0 replies; only message in thread
From: Fabio M. Di Nitto @ 2008-11-07  5:35 UTC (permalink / raw)
  To: cluster-cvs-relay

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


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2008-11-07  5:35 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2008-11-07  5:35 master - init scripts: major rework to make them distro agnostic Fabio M. Di Nitto

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).