[Ocfs2-tools-commits] jlbec commits r1381 - in branches/cman-based: . vendor/common

svn-commits at oss.oracle.com svn-commits at oss.oracle.com
Tue Aug 14 16:32:31 PDT 2007


Author: jlbec
Date: 2007-08-14 16:32:29 -0700 (Tue, 14 Aug 2007)
New Revision: 1381

Added:
   branches/cman-based/vendor/common/o2cb.init.sh
Removed:
   branches/cman-based/vendor/common/o2cb.init.in
Modified:
   branches/cman-based/Postamble.make
   branches/cman-based/configure.in
   branches/cman-based/vendor/common/
   branches/cman-based/vendor/common/Makefile
Log:

Change from configure munging to sed munging.  It works cleaner with
execute permissions.

This involves adding ALL_RULES to Postamble.make, something that's already
happened in mainline Makebo.



Modified: branches/cman-based/Postamble.make
===================================================================
--- branches/cman-based/Postamble.make	2007-08-14 23:21:13 UTC (rev 1380)
+++ branches/cman-based/Postamble.make	2007-08-14 23:32:29 UTC (rev 1381)
@@ -54,7 +54,7 @@
 	$(MAKE) -C $@
 
 .PHONY: all-rules
-all-rules: subdirs $(UNINST_LIBRARIES) $(LIBRARIES) $(BIN_PROGRAMS) $(SBIN_PROGRAMS) $(UNINST_PROGRAMS) $(MODULES) $(MANS)
+all-rules: subdirs $(UNINST_LIBRARIES) $(LIBRARIES) $(BIN_PROGRAMS) $(SBIN_PROGRAMS) $(UNINST_PROGRAMS) $(MODULES) $(MANS) $(ALL_RULES)
 
 
 INSTALL_SUBDIRS = $(addsuffix -install,$(SUBDIRS))

Modified: branches/cman-based/configure.in
===================================================================
--- branches/cman-based/configure.in	2007-08-14 23:21:13 UTC (rev 1380)
+++ branches/cman-based/configure.in	2007-08-14 23:32:29 UTC (rev 1381)
@@ -258,7 +258,6 @@
 ocfs2console/ocfs2console.8
 tunefs.ocfs2/tunefs.ocfs2.8
 vendor/common/ocfs2-tools.spec-generic
-vendor/common/o2cb.init
 ])
 
 AC_OUTPUT


Property changes on: branches/cman-based/vendor/common
___________________________________________________________________
Name: svn:ignore
   - ocfs2-tools.spec
ocfs2-tools.spec-generic
.*.sw?

   + ocfs2-tools.spec
ocfs2-tools.spec-generic
.*.sw?
o2cb.init


Modified: branches/cman-based/vendor/common/Makefile
===================================================================
--- branches/cman-based/vendor/common/Makefile	2007-08-14 23:21:13 UTC (rev 1380)
+++ branches/cman-based/vendor/common/Makefile	2007-08-14 23:32:29 UTC (rev 1381)
@@ -2,8 +2,22 @@
 
 include $(TOPDIR)/Preamble.make
 
+SCRIPT_SH = o2cb.init.sh
+SCRIPTS = $(patsubst %.sh,%,$(SCRIPT_SH))
+
+# Depend on the substitution values
+$(SCRIPTS): $(TOPDIR)/Config.make
+
+$(patsubst %.sh,%,$(SCRIPT_SH)) : % : %.sh
+	rm -f $@ $@+
+	sed -e 's/@@CMAN_SUPPORTED@@/$(BUILD_CMAN_SUPPORT)/g' $@.sh >$@+
+	chmod +x $@+
+	mv $@+ $@
+
+ALL_RULES = $(SCRIPTS)
+
 DIST_FILES =					\
-	o2cb.init				\
+	$(SCRIPT_SH)				\
 	o2cb.sysconfig				\
 	ocfs2.init				\
 	ocfs2-tools.spec-generic.in		\

Deleted: branches/cman-based/vendor/common/o2cb.init.in
===================================================================
--- branches/cman-based/vendor/common/o2cb.init.in	2007-08-14 23:21:13 UTC (rev 1380)
+++ branches/cman-based/vendor/common/o2cb.init.in	2007-08-14 23:32:29 UTC (rev 1381)
@@ -1,1333 +0,0 @@
-#!/bin/bash
-# init fragment for O2CB.
-#
-# chkconfig: 2345 24 20
-# description: Load O2CB cluster services at system boot.
-#
-### BEGIN INIT INFO
-# Provides: o2cb
-# Required-Start: $network
-# Should-Start:
-# Required-Stop:
-# Default-Start: 2 3 5
-# Default-Stop:
-# Description: Load O2CB cluster services at system boot.
-### END INIT INFO
-
-# Force LC_ALL=C
-export LC_ALL=C
-
-CLUSTERCONF=/etc/ocfs2/cluster.conf
-
-if [ -f /etc/sysconfig/o2cb ]
-then
-    # Red Hat and Novell
-    CONFIGURATION=/etc/sysconfig/o2cb
-elif [ -f /etc/default/o2cb ]
-then
-    # Debian
-    CONFIGURATION=/etc/default/o2cb
-elif [ -d /etc/sysconfig ]
-then
-    CONFIGURATION=/etc/sysconfig/o2cb
-else
-    CONFIGURATION=/etc/default/o2cb
-fi
-
-# The default values should always be in sync with the kernel
-DEF_HEARTBEAT_THRESHOLD=31
-DEF_IDLE_TIMEOUT_MS=30000
-DEF_KEEPALIVE_DELAY_MS=2000
-DEF_RECONNECT_DELAY_MS=2000
-
-# Minimum timeout values
-MIN_HEARTBEAT_THRESHOLD=7
-MIN_IDLE_TIMEOUT_MS=5000
-MIN_KEEPALIVE_DELAY_MS=1000
-MIN_RECONNECT_DELAY_MS=2000
-
-CMAN_SUPPORTED=@BUILD_CMAN_SUPPORT@
-[ "$CMAN_SUPPORTED" != "yes" ] && CMAN_SUPPORTED=
-
-# Source configuration, 
-[ -f "${CONFIGURATION}" ] && . "${CONFIGURATION}"
-# Need this default
-[ -z "$O2CB_STACK" ] && O2CB_STACK=o2cb
-
-configfs_path()
-{
-    # Note that this is only valid *after* configfs is loaded
-    if [ -d /sys/kernel/config ]
-    then
-        echo /sys/kernel/config
-    else
-        echo /config
-    fi
-}
-
-
-#
-# if_fail()
-#
-# Evaluates return codes.  If 0, prints "OK", if 1, prints "Failed"
-# and exits.  If 2, status is "already done" and nothing is printed.
-# The rest of the functions in here all honor this convention.
-#
-if_fail()
-{
-    RC="$1"
-    REASON="$2"
-    if [ "$RC" = "0" ]
-    then
-        echo "OK"
-        return
-    elif [ "$RC" = "2" ]
-    then
-        return
-    fi
-    echo "Failed"
-    if [ -n "${REASON}" ]
-    then
-        echo "${REASON}" >&2
-    fi
-    exit 1
-}
-
-
-#
-# write_sysconfig()
-#
-# Writes the system configuration out
-#
-write_sysconfig()
-{
-    echo -n "Writing O2CB configuration: "
-    cat >"${CONFIGURATION}" <<EOF
-#
-# This is a configuration file for automatic startup of the O2CB
-# driver.  It is generated by running /etc/init.d/o2cb configure.
-# Please use that method to modify this file
-#
-
-# O2CB_ENABELED: 'true' means to load the driver on boot.
-O2CB_ENABLED=${O2CB_ENABLED:-false}
-
-# O2CB_STACK: The name of the cluster stack backing O2CB.
-O2CB_STACK=${O2CB_STACK}
-
-# O2CB_BOOTCLUSTER: If not empty, the name of a cluster to start.
-O2CB_BOOTCLUSTER=${O2CB_BOOTCLUSTER}
-
-# O2CB_HEARTBEAT_THRESHOLD: Iterations before a node is considered dead.
-O2CB_HEARTBEAT_THRESHOLD=${O2CB_HEARTBEAT_THRESHOLD}
-
-# O2CB_IDLE_TIMEOUT_MS: Time in ms before a network connection is considered dead.
-O2CB_IDLE_TIMEOUT_MS=${O2CB_IDLE_TIMEOUT_MS}
-
-# O2CB_KEEPALIVE_DELAY_MS: Max time in ms before a keepalive packet is sent
-O2CB_KEEPALIVE_DELAY_MS=${O2CB_KEEPALIVE_DELAY_MS}
-
-# O2CB_RECONNECT_DELAY_MS: Min time in ms between connection attempts
-O2CB_RECONNECT_DELAY_MS=${O2CB_RECONNECT_DELAY_MS}
-
-EOF
-
-    if [ $? != 0 ]
-    then
-        return 1
-    fi
-    return 0
-}
-
-#
-# read_timeout()
-#   Returns timeout value provided by user to caller in RET_VAL
-#
-read_timeout()
-{
-    if [ "$#" -lt "4" ]; then
-        echo "read_timeout(): Requires more arguments" >&2
-        exit 1
-    fi
-
-    ATTRIB_NAME=$1
-    ATTRIB_VAL=$2
-    MIN_ATTRIB_VAL=$3
-    DEF_ATTRIB_VAL=$4
-    RET_VAL=0
-
-    while :
-    do
-        if [ -z $ATTRIB_VAL ]; then
-            CUR=$DEF_ATTRIB_VAL
-        else
-            CUR=$ATTRIB_VAL
-        fi
-        echo -n "Specify ${ATTRIB_NAME} (>=$MIN_ATTRIB_VAL) [$CUR]: "
-        read LINE
-        case "$LINE" in
-        "")
-            RET_VAL="$ATTRIB_VAL"
-            break
-            ;;
-
-        *[^0-9]*)
-            echo "Invalid ${ATTRIB_NAME} value: $LINE" >&2
-            ;;
-        *)
-            if [ $LINE -lt $MIN_ATTRIB_VAL ]; then
-                echo "${ATTRIB_NAME} cannot be less than $MIN_ATTRIB_VAL" >&2
-            else
-                RET_VAL="$LINE"
-                break
-            fi
-            ;;
-        esac
-    done
-}
-
-set_timeouts()
-{
-    O2CB_HEARTBEAT_THRESHOLD_FILE_OLD=/proc/fs/ocfs2_nodemanager/hb_dead_threshold
-    O2CB_HEARTBEAT_THRESHOLD_FILE=$(configfs_path)/cluster/${CLUSTER}/heartbeat/dead_threshold
-    if [ -n "$O2CB_HEARTBEAT_THRESHOLD" ]; then
-        if [ -f "$O2CB_HEARTBEAT_THRESHOLD_FILE" ]; then
-            echo "$O2CB_HEARTBEAT_THRESHOLD" > "$O2CB_HEARTBEAT_THRESHOLD_FILE"
-        elif [ -f "$O2CB_HEARTBEAT_THRESHOLD_FILE_OLD" ]; then 
-            echo "$O2CB_HEARTBEAT_THRESHOLD" > "$O2CB_HEARTBEAT_THRESHOLD_FILE_OLD"
-        fi
-    fi
-
-    O2CB_IDLE_TIMEOUT_MS_FILE=$(configfs_path)/cluster/${CLUSTER}/idle_timeout_ms
-    if [ -n "$O2CB_IDLE_TIMEOUT_MS" ]; then
-        if [ -f "$O2CB_IDLE_TIMEOUT_MS_FILE" ]; then
-            echo "$O2CB_IDLE_TIMEOUT_MS" > "$O2CB_IDLE_TIMEOUT_MS_FILE"
-        fi
-    fi
-
-    O2CB_KEEPALIVE_DELAY_MS_FILE=$(configfs_path)/cluster/${CLUSTER}/keepalive_delay_ms
-    if [ -n "$O2CB_KEEPALIVE_DELAY_MS" ]; then
-        if [ -f "$O2CB_KEEPALIVE_DELAY_MS_FILE" ]; then
-            echo "$O2CB_KEEPALIVE_DELAY_MS" > "$O2CB_KEEPALIVE_DELAY_MS_FILE"
-        fi
-    fi
-
-    O2CB_RECONNECT_DELAY_MS_FILE=$(configfs_path)/cluster/${CLUSTER}/reconnect_delay_ms
-    if [ -n "$O2CB_RECONNECT_DELAY_MS" ]; then
-        if [ -f "$O2CB_RECONNECT_DELAY_MS_FILE" ]; then
-            echo "$O2CB_RECONNECT_DELAY_MS" > "$O2CB_RECONNECT_DELAY_MS_FILE"
-        fi
-    fi
-}
-
-show_timeouts()
-{
-
-    O2CB_HEARTBEAT_THRESHOLD_FILE_OLD=/proc/fs/ocfs2_nodemanager/hb_dead_threshold
-    O2CB_HEARTBEAT_THRESHOLD_FILE=$(configfs_path)/cluster/${CLUSTER}/heartbeat/dead_threshold
-    if [ -f "$O2CB_HEARTBEAT_THRESHOLD_FILE" ]; then
-        VAL=`cat "$O2CB_HEARTBEAT_THRESHOLD_FILE"`
-        echo "Heartbeat dead threshold = ${VAL}"
-    elif [ -f "$O2CB_HEARTBEAT_THRESHOLD_FILE_OLD" ]; then
-        VAL=`cat "$O2CB_HEARTBEAT_THRESHOLD_FILE_OLD"`
-        echo "  Heartbeat dead threshold: ${VAL}"
-    fi
-
-    O2CB_IDLE_TIMEOUT_MS_FILE=$(configfs_path)/cluster/${CLUSTER}/idle_timeout_ms
-    if [ -f "$O2CB_IDLE_TIMEOUT_MS_FILE" ]; then
-        VAL=`cat "$O2CB_IDLE_TIMEOUT_MS_FILE"`
-        echo "  Network idle timeout: ${VAL}"
-    fi
-
-    O2CB_KEEPALIVE_DELAY_MS_FILE=$(configfs_path)/cluster/${CLUSTER}/keepalive_delay_ms
-    if [ -f "$O2CB_KEEPALIVE_DELAY_MS_FILE" ]; then
-        VAL=`cat "$O2CB_KEEPALIVE_DELAY_MS_FILE"`
-        echo "  Network keepalive delay: ${VAL}"
-    fi
-
-    O2CB_RECONNECT_DELAY_MS_FILE=$(configfs_path)/cluster/${CLUSTER}/reconnect_delay_ms
-    if [ -f "$O2CB_RECONNECT_DELAY_MS_FILE" ]; then
-        VAL=`cat "$O2CB_RECONNECT_DELAY_MS_FILE"`
-        echo "  Network reconnect delay: ${VAL}"
-    fi
-}
-
-#
-# configure_ask()
-#
-# Ask configuration questions, setting the shell vars.
-#
-configure_ask()
-{
-    cat <<EOF
-Configuring the O2CB driver.
-
-This will configure the on-boot properties of the O2CB driver.
-The following questions will determine whether the driver is loaded on
-boot.  The current values will be shown in brackets ('[]').  Hitting
-<ENTER> without typing an answer will keep that current value.  Ctrl-C
-will abort.
-
-EOF
-
-    while :
-    do
-        if [ "$O2CB_ENABLED" = "true" ]
-        then
-            CUR=y
-        else
-            CUR=n
-        fi
-        echo -n "Load O2CB driver on boot (y/n) [$CUR]: "
-        read LINE
-        case "$LINE" in
-        "")
-            break
-            ;;
-        y|Y)
-            O2CB_ENABLED=true
-            break
-            ;;
-        n|N)
-            O2CB_ENABLED=false
-            break
-            ;;
-        *)
-            echo "Invalid answer: $LINE" >&2
-            ;;
-        esac
-    done
-
-    while :
-    do
-        echo -n "Cluster stack backing O2CB [$O2CB_STACK]: "
-        read LINE
-        case "$LINE" in
-        "")
-            break
-            ;;
-        o2cb|heartbeat2)
-            O2CB_STACK="$LINE"
-            break
-        cman)
-            if [ "$CMAN_SUPPORTED" = "yes" ]
-            then
-                O2CB_STACK="$LINE"
-                break
-            fi
-            echo "Cluster stack \"$LINE\" not supported" >&2
-            ;;
-        *)
-            echo "Invalid answer: $LINE" >&2
-            ;;
-        esac
-    done
-
-    while :
-    do
-        echo -n "Cluster to start on boot (Enter \"none\" to clear) [$O2CB_BOOTCLUSTER]: "
-        read LINE
-        case "$LINE" in
-        "")
-            break
-            ;;
-        none)
-            O2CB_BOOTCLUSTER=
-            break
-            ;;
-
-        *[^a-zA-Z0-9]*)
-            echo "Invalid cluster name: $LINE" >&2
-            ;;
-        *)
-            O2CB_BOOTCLUSTER="$LINE"
-            break
-            ;;
-        esac
-    done
-
-    read_timeout "heartbeat dead threshold" "$O2CB_HEARTBEAT_THRESHOLD" "$MIN_HEARTBEAT_THRESHOLD" "$DEF_HEARTBEAT_THRESHOLD"
-    O2CB_HEARTBEAT_THRESHOLD="$RET_VAL"
-
-    read_timeout "network idle timeout in ms" "$O2CB_IDLE_TIMEOUT_MS" "$MIN_IDLE_TIMEOUT_MS" "$DEF_IDLE_TIMEOUT_MS"
-    O2CB_IDLE_TIMEOUT_MS="$RET_VAL"
-
-    read_timeout "network keepalive delay in ms" "$O2CB_KEEPALIVE_DELAY_MS" "$MIN_KEEPALIVE_DELAY_MS" "$DEF_KEEPALIVE_DELAY_MS"
-    O2CB_KEEPALIVE_DELAY_MS="$RET_VAL"
-
-    read_timeout "network reconnect delay in ms" "$O2CB_RECONNECT_DELAY_MS" "$MIN_RECONNECT_DELAY_MS" "$DEF_RECONNECT_DELAY_MS"
-    O2CB_RECONNECT_DELAY_MS="$RET_VAL"
-
-    # XXX ask about mount point base
-}
-
-
-#
-# make_dir()
-#
-# Create $1
-# Returns 0 on success, 1 on error, 2 if it already exists.
-#
-make_dir()
-{
-    if [ "$#" -lt "1" -o -z "$1" ]
-    then
-        echo "make_dir(): Requires an argument" >&2
-        return 1
-    fi
-    DIR="$1"
-    if [ -e "$DIR" ]
-    then
-        if [ -d "$DIR" ]
-        then
-            return 2
-        fi
-        echo "make_dir(): File $DIR is not a directory" >&2
-        return 1
-    fi
-
-    echo -n "Creating directory '$DIR': "
-    mkdir -p "$DIR" 2>/dev/null
-    if [ $? != 0 ]
-    then
-        echo "Unable to create directory '$DIR'" >&2
-        return 1
-    fi
-    return 0
-}
-
-
-#
-# driver_filesystem()
-# Check to see if a filesystem driver is loaded.
-#
-# 0 is loaded, 1 is not.
-#
-driver_filesystem()
-{
-    if [ "$#" != "1" -o -z "$1" ]
-    then
-        echo "driver_filesystem(): Missing an argument" >&2
-        exit 1
-    fi
-    FSNAME="$1"
-
-    FSOUT="`awk '$2 ~ /^'$FSNAME'$/{print $1;exit}' < /proc/filesystems 2>/dev/null`"
-    test -n "$FSOUT"
-    return $?
-}
-
-
-#
-# load_filesystem()
-# Load a filesystem driver.
-#
-# 0 is success, 1 is error, 2 is already loaded.
-#
-load_filesystem()
-{
-    if [ "$#" != "1" -o -z "$1" ]
-    then
-        echo "load_filesystem(): Missing an argument" >&2
-        return 1
-    fi
-    FSNAME="$1"
-
-    driver_filesystem "$FSNAME" && return 2
-
-    echo -n "Loading filesystem \"$FSNAME\": "
-    modprobe -s "$FSNAME"
-    if [ "$?" != 0 ]
-    then
-        echo "Unable to load filesystem \"$FSNAME\"" >&2
-        return 1
-    fi
-
-    return 0
-}
-
-#
-# unload_filesystem()
-# Unload a filesystem driver.  Be careful to notice if the driver is
-# built-in and do nothing.
-#
-# 0 is success, 1 is error, 2 is already loaded.
-#
-unload_filesystem()
-{
-    if [ "$#" != "1" -o -z "$1" ]
-    then
-        echo "unload_filesystem(): Missing an argument" >&2
-        return 1
-    fi
-    FSNAME="$1"
-
-    driver_filesystem "$FSNAME" || return 2
-
-    MODOUT="`awk '$1 ~ /^'$FSNAME'$/{print $1,$3;exit}' < /proc/modules 2>/dev/null`"
-    if [ -z "$MODOUT" ]
-    then
-        # The driver is built in, we can't unload it.
-        return 2
-    fi
-
-    case "$MODOUT" in
-    $FSNAME\ 0)
-        ;;
-    $FSNAME\ *)
-        # The driver is busy, leave it alone
-        return 2
-        ;;
-    *)
-        echo -n "Invalid module parsing! "
-        return 1
-        ;;
-    esac
-
-    echo -n "Unloading module \"$FSNAME\": "
-    modprobe -rs "$FSNAME"
-    if [ "$?" != 0 ]
-    then
-        echo "Unable to unload module \"$FSNAME\"" >&2
-        return 1
-    fi
-
-    return 0
-}
-
-#
-# check_filesystem()
-# Check to see if a filesystem of type $1 is mounted at $2.
-#
-# 0 is mounted, 1 is not.
-#
-check_filesystem()
-{
-    if [ "$#" != "2" -o -z "$1" -o -z "$2" ]
-    then
-        echo "check_filesystem(): Missing arguments" >&2
-        exit 1
-    fi
-    FSNAME="$1"
-    MOUNTPOINT="$2"
-
-    FULL_MOUNTSEARCH="`echo "$MOUNTPOINT" | sed -e 's/\//\\\\\//g'`"
-    MOUNTOUT="`awk '$2 ~ /^'$FULL_MOUNTSEARCH'$/ && $3 ~ /^'$FSNAME'$/{print $2; exit}' < /proc/mounts 2>/dev/null`"
-    test -n "$MOUNTOUT"
-    return $?
-}
-
-#
-# mount_filesystem()
-# Mounts a pseudo-filesystem of type $1 on mountpoint $2.  It will
-# load the drivers for $1 and create $2 if needed.
-#
-# 0 is success, 1 is error, 2 is already mounted.
-# 
-mount_filesystem()
-{
-    if [ "$#" != "2" -o -z "$1" -o -z "$2" ]
-    then
-        echo "mount_filesystem(): Missing arguments" >&2
-        return 1
-    fi
-    FSNAME="$1"
-    MOUNTPOINT="$2"
-
-    check_filesystem "$FSNAME" "$MOUNTPOINT" && return 2
-
-    load_filesystem "$FSNAME"
-    if_fail $?
-
-    # XXX some policy?
-    if [ ! -e "$MOUNTPOINT" ]; then
-        make_dir $MOUNTPOINT
-        if_fail "$?"
-    fi
-
-    echo -n "Mounting ${FSNAME} filesystem at ${MOUNTPOINT}: "
-    mount -t ${FSNAME} ${FSNAME} ${MOUNTPOINT}
-    if [ $? != 0 ]
-    then
-        echo "Unable to mount ${FSNAME} filesystem" >&2
-        return 1
-    fi
-
-    return 0
-}
-
-#
-# unmount_filesystem()
-# Unmount a pseudo-filesystem of type $1 from mountpoint $2.  It will
-# remove the driver for $1 if it can.
-#
-# 0 is success, 1 is error, 2 is not mounted
-#
-unmount_filesystem()
-{
-    if [ "$#" != "2" -o -z "$1" -o -z "$2" ]
-    then
-        echo "unmount_filesystem(): Missing arguments" >&2
-        return 1
-    fi
-    FSNAME="$1"
-    MOUNTPOINT="$2"
-
-    if check_filesystem "$FSNAME" "$MOUNTPOINT"
-    then
-        echo -n "Unmounting ${FSNAME} filesystem: "
-        umount $MOUNTPOINT
-        RC=$?
-        if [ $RC != 0 ]
-        then
-            echo "Unable to unmount ${FSNAME} filesystem" >&2
-            return 1
-        fi
-        if_fail $RC  # For the success string
-    fi
-
-    unload_filesystem "$FSNAME"
-    return $?
-}
-
-#
-# status_filesystem()
-# Report the status of a filesystem, whether it is mounted or not
-#
-# 0 is not mounted, 1 is error, 2 is already mounted
-#
-status_filesystem()
-{
-    if [ "$#" != "2" -o -z "$1" -o -z "$2" ]
-    then
-        echo "status_filesystem(): Missing arguments" >&2
-        return 1
-    fi
-    FSNAME="$1"
-    MOUNTPOINT="$2"
-
-    echo -n "Driver for \"$FSNAME\": "
-    if driver_filesystem "$FSNAME"
-    then
-        echo "Loaded"
-    else
-        echo "Not loaded"
-        return 0
-    fi
-
-    echo -n "Filesystem \"$FSNAME\": "
-    if check_filesystem "$FSNAME" "$MOUNTPOINT"
-    then
-        echo "Mounted"
-        return 2
-    fi
-    echo "Not mounted"
-    return 0
-} 
-
-#
-# check_heartbeat()
-#
-# 0 is hb not active, 1 is error, 2 is hb active
-#
-check_heartbeat()
-{
-    if [ "$#" -lt "1" -o -z "$1" ]
-    then
-        echo "check_heartbeat(): Requires an argument" >&2
-        return 1
-    fi
-    CLUSTER="$1"
-
-    RC=0
-    if [ -d "$(configfs_path)/cluster/${CLUSTER}/heartbeat/" ]
-    then
-        ls -1 "$(configfs_path)/cluster/${CLUSTER}/heartbeat/" | while read HBUUID
-        do
-            if [ -d "$(configfs_path)/cluster/${CLUSTER}/heartbeat/${HBUUID}" ]
-            then
-                return 2;
-            fi
-        done
-        if [ $? = 2 ]
-        then
-            RC=2
-        fi
-    fi
-
-    return $RC
-}
-
-#
-# clean_heartbeat()
-# Removes the inactive heartbeat regions
-# 
-clean_heartbeat()
-{
-    if [ "$#" -lt "1" -o -z "$1" ]
-    then
-        echo "clean_heartbeat(): Requires an argument" >&2
-        return 1
-    fi
-    CLUSTER="$1"
-
-    if [ ! -f "$(configfs_path)/cluster/${CLUSTER}/heartbeat/*" ]
-    then
-        return
-    fi
-
-    echo -n "Cleaning heartbeat on ${CLUSTER}: "
-
-    ls -1 "$(configfs_path)/cluster/${CLUSTER}/heartbeat/" | while read HBUUID
-    do
-        if [ ! -d "$(configfs_path)/cluster/${CLUSTER}/heartbeat/${HBUUID}" ]
-        then
-            continue
-        fi
-
-        OUTPUT="`ocfs2_hb_ctl -I -u ${HBUUID} 2>&1`"
-        if [ $? != 0 ]
-        then
-            echo "Failed"
-            echo "${OUTPUT}" >&2
-            exit 1
-        fi
-
-        REF="`echo ${OUTPUT} | awk '/refs/ {print $2; exit;}' 2>&1`"
-        if [ $REF != 0 ]
-        then
-           echo "Failed"
-           echo "At least one heartbeat region still active" >&2
-           exit 1
-        else
-           OUTPUT="`ocfs2_hb_ctl -K -u ${HBUUID} 2>&1`"
-        fi
-    done
-    if [ $? = 1 ]
-    then
-        exit 1
-    fi
-    echo "OK"
-}
-
-#
-# clean_cluster()
-# Force cleans configured cluster
-#
-# 0 is clean, 1 is error, 2 is not clean
-#
-clean_cluster()
-{
-    if [ "$#" -lt "1" -o -z "$1" ]
-    then
-        echo "clean_cluster(): Requires an argument" >&2
-        return 1
-    fi
-    CLUSTER="$1"
-
-    if [ -d "$(configfs_path)/cluster/${CLUSTER}/node/" ]
-    then
-        ls -1 "$(configfs_path)/cluster/${CLUSTER}/node/" | while read NODE
-        do
-            rmdir "$(configfs_path)/cluster/${CLUSTER}/node/${NODE}" >/dev/null 2>&1
-        done
-    fi
-
-    if [ -d "$(configfs_path)/cluster/${CLUSTER}" ]
-    then
-        rmdir "$(configfs_path)/cluster/${CLUSTER}" >/dev/null 2>&1
-    fi
-
-    if [ -d "$(configfs_path)/cluster/${CLUSTER}" ]
-    then
-        return 2
-    fi
-
-    return 0
-}
-
-#
-# load_heartbeat()
-# Load a given heartbeat method and set it to be the active mode.
-#
-# 0 is success, 1 is error, and 2 is already active.
-#
-load_heartbeat()
-{
-    if [ "$#" -lt "1" -o -z "$1" ]
-    then
-        echo "load_heartbeat(): Requires an argument" >&2
-        exit 1 
-    fi
-    HB_METHOD="$1"
-    HB_MODULE="ocfs2_${HB_METHOD}_heartbeat"
-
-    #
-    # Older drivers don't have heartbeat_modes.  They're disk
-    # heartbeat only.  It's loaded with ocfs2_nodemanager, which is pulled
-    # in by loading ocfs2_dlmfs.
-    #
-    # For a newer driver, if ocfs2_nodemanager is loaded, we'll see
-    # heartbeat_mode.  Thus, we can check for the loaded
-    # ocfs2_<method>_heartbeat driver below.
-    #
-    if [ ! -e "$(configfs_path)/cluster/heartbeat_mode" ]
-    then
-        [ "$HB_METHOD" = "disk" ] && return 2
-        echo "Checking for available heartbeat method: "
-        echo "Unsupported heartbeat method: $HB_METHOD" >&2
-        if_fail 1 "Unsupported heartbeat method: $HB_METHOD"
-    fi
-    
-    CUR_METHOD="$(cat "$(configfs_path)/cluster/heartbeat_mode")"
-    [ "$CUR_METHOD" = "$HB_METHOD" ] && return 2
-
-    HBOUT="$(awk '/^'$HB_METHOD'$/{print;exit}' "$(configfs_path)/cluster/heartbeat_available_modes" 2>/dev/null)"
-    if [ -z "$HBOUT" ]
-    then
-        echo -n "Loading module \"${HB_MODULE}\": "
-        modprobe -s "$HB_MODULE"
-        if [ "$?" != 0 ]
-        then
-            echo "Unable to load module \"$HB_MODULE\"" >&2
-            if_fail 1 "Unable to load module \"$HB_MODULE\""
-        fi
-        if_fail 0
-    fi
-
-    echo -n "Setting heartbeat mode \"$HB_METHOD\": "
-    echo "$HB_METHOD" >"$(configfs_path)/cluster/heartbeat_mode" 2>/dev/null
-    if_fail $? "Unable to set heartbeat mode \"$HB_METHOD\""
-}
-
-#
-# unload_heartbeat()
-# Unload a given heartbeat method.
-#
-# 0 is success, 1 is error, and 2 is not loaded.
-#
-unload_heartbeat()
-{
-    if [ "$#" -lt "1" -o -z "$1" ]
-    then
-        echo "unload_heartbeat(): Requires an argument" >&2
-        exit 1 
-    fi
-    HB_METHOD="$1"
-    HB_MODULE="ocfs2_${HB_METHOD}_heartbeat"
-
-    #
-    # Older drivers don't have heartbeat drivers.  If we can't find
-    # the driver module, it might as well be unloaded :-)
-    #
-    MODOUT="`awk '$1 ~ /^'$HB_MODULE'$/{print $1,$3;exit}' < /proc/modules 2>/dev/null`"
-    if [ -z "$MODOUT" ]
-    then
-        # Either it's not loaded or the driver is built in
-        return 2
-    fi
-
-    case "$MODOUT" in
-    $HB_MODULE\ 0)
-        ;;
-    $HB_MODULE\ *)
-        # The driver is busy, leave it alone
-        return 2
-        ;;
-    *)
-        echo -n "Invalid module parsing! "
-        exit 1
-        ;;
-    esac
-
-    echo -n "Unloading module \"$HB_MODULE\": "
-    modprobe -rs "$HB_MODULE"
-    if [ "$?" != 0 ]
-    then
-        echo "Unable to unload module \"$HB_MODULE\"" >&2
-        if_fail 1 "$Unable to unload module \"$HB_MODULE\""
-    fi
-
-    if_fail 0
-}
-
-#
-# unload_module()
-# Unload a module
-#
-# 0 is success, 1 is error, 2 is not loaded
-# 
-unload_module()
-{
-    if [ "$#" -lt "1" -o -z "$1" ]
-    then
-        echo "unload_module(): Requires an argument" >&2
-        return 1
-    fi
-    MODNAME="$1"
-
-    MODOUT="`awk '$1 ~ /^'$MODNAME'$/{print $1,$3;exit}' < /proc/modules 2>/dev/null`"
-    if [ -z "$MODOUT" ]
-    then
-        return 2
-    fi
-    case "$MODOUT" in
-    $MODNAME\ 0)
-        ;;
-    $MODNAME\ *)
-        return 2
-        ;;
-    *)
-        echo -n "Invalid module parsing! "
-        return 1
-        ;;
-    esac
-
-    echo -n "Unloading module \"$MODNAME\": "
-    modprobe -rs "$MODNAME"
-    if [ "$?" != 0 ]
-    then
-        echo "Unable to unload module \"$MODNAME\"" >&2
-        return 1
-    fi
-
-    return 0
-}
-
-#
-# check_load_module()
-#
-# 0 is not loaded, 1 is error, 2 is already loaded
-#
-check_load_module()
-{
-    if [ "$#" -lt "1" -o -z "$1" ]
-    then
-        echo "check_load_module(): Requires an argument" >&2
-        return 1
-    fi
-    MODNAME="$1"
-
-    echo -n "Module \"$MODNAME\": "
-    MODOUT="`awk '$1 ~ /^'$MODNAME'$/{print $1,$3;exit}' < /proc/modules 2>/dev/null`"
-    if [ -z "$MODOUT" ]
-    then
-        echo "Not loaded"
-        return 0
-    fi
-    echo "Loaded"
-    return 2
-}
-
-load()
-{
-    # XXX: SPECIAL CASE!  We must load configfs for configfs_path() to work
-    load_filesystem "configfs"
-    if_fail $?
-
-    mount_filesystem "configfs" "$(configfs_path)"
-    if_fail $?
-
-    mount_filesystem "ocfs2_dlmfs" "/dlm"
-    if_fail $?
-
-    case "$O2CB_STACK" in
-        o2cb) load_heartbeat "disk" ;;
-        heartbeat2) load_heartbeat "user" ;;
-        cman)
-            if [ "$CMAN_SUPPORTED" = "yes" ]
-            then
-                load_heartbeat "user"
-            else
-                echo "Cluster stack \"${O2CB_STACK}\" not supported" >&2
-                exit 1
-            fi
-            ;;
-        *)
-            echo "Invalid O2CB_STACK: $O2CB_STACK" >&2
-            exit 1
-        ;;
-    esac
-
-    return 0
-}
-
-load_status()
-{
-    status_filesystem "configfs" "$(configfs_path)"
-    status_filesystem "ocfs2_dlmfs" "/dlm"
-
-    # TODO
-    # Check the status of the appropriate heartbeat driver based on our
-    # cluster type.
-
-    return 0
-}
-
-online_o2cb()
-{
-    if [ "$#" -lt "1" -o -z "$1" ]
-    then
-        echo "online_o2cb(): Requires an argument" >&2
-        return 1
-    fi
-    CLUSTER="$1"
-
-    if ! [ -f ${CLUSTERCONF} ]
-    then
-        echo -n "Checking O2CB cluster configuration : "
-        if_fail 1
-    fi
-
-    echo -n "Starting O2CB cluster ${CLUSTER}: "
-    OUTPUT="`o2cb_ctl -H -n "${CLUSTER}" -t cluster -a online=yes 2>&1`"
-    if [ $? = 0 ]
-    then
-        set_timeouts
-        echo "OK"
-        return
-    else
-        echo "Failed"
-        echo "$OUTPUT"
-    fi
-
-    echo -n "Stopping O2CB cluster ${CLUSTER}: "
-    OUTPUT="`o2cb_ctl -H -n "${CLUSTER}" -t cluster -a online=no 2>&1`"
-    if_fail "$?" "$OUTPUT"
-}
-
-online_cman()
-{
-    echo "online_cman isn't working yet"
-}
-
-online()
-{
-    CLUSTER="${1:-${O2CB_BOOTCLUSTER}}"
-    if [ -z "$CLUSTER" ]
-    then
-        echo "O2CB cluster not known"
-        return
-    fi
-
-    check_online $CLUSTER
-    if [ $? = 2 ]
-    then
-        echo "O2CB cluster ${CLUSTER} already online"
-        return
-    fi
-
-    case "$O2CB_STACK" in
-        o2cb|heartbeat2) online_o2cb "$CLUSTER" ;;
-        cman)
-            if [ "$CMAN_SUPPORTED" = "yes" ]
-            then
-                online_cman "$CLUSTER"
-            else
-                echo "Cluster stack \"$O2CB_STACK\" not supported" >&2
-                exit 1
-            fi
-            ;;
-        *)
-            echo "Invalid O2CB_STACK: $O2CB_STACK" >&2
-            exit 1
-            ;;
-    esac
-
-}
-
-#
-# check_online()
-#
-# 0 is not online, 1 is error, 2 is online
-#
-check_online()
-{
-    if [ "$#" -lt "1" -o -z "$1" ]
-    then
-        echo "check_online(): Requires an argument" >&2
-        return 1
-    fi
-    CLUSTER="$1"
-
-    RC=0
-    if [ -d "$(configfs_path)/cluster/${CLUSTER}/node/" ]
-    then
-        ls -1 "$(configfs_path)/cluster/${CLUSTER}/node/" | while read NODE
-        do
-            LOCAL="`cat \"$(configfs_path)/cluster/${CLUSTER}/node/${NODE}/local\"`"
-            if [ $LOCAL = 1 ]
-            then
-                return 2
-            fi
-        done
-        if [ $? = 2 ]
-        then
-            RC=2
-        fi
-    fi
-    return $RC
-}
-
-offline_o2cb()
-{
-    if [ "$#" -lt "2" -o -z "$1" -o -z "$2" ]
-    then
-        echo "offline_o2cb(): Missing arguments" >&2
-        return 1
-    fi
-    CLUSTER="$1"
-    FORCE="$2"
-
-    clean_heartbeat $CLUSTER
-
-    echo -n "Stopping O2CB cluster ${CLUSTER}: "
-    check_heartbeat $CLUSTER
-    if [ $? != 0 ]
-    then
-        echo "Failed"
-        echo "Unable to stop cluster as heartbeat region still active" >&2
-        exit 1
-    fi
-
-    if [ $FORCE -eq 1 ]
-    then
-        clean_cluster $CLUSTER
-        if_fail "$?" "Unable to force-offline cluster $CLUSTER" >&2
-    else
-        OUTPUT="`o2cb_ctl -H -n "${CLUSTER}" -t cluster -a online=no 2>&1`"
-        if_fail "$?" "$OUTPUT - Try to force-offline the O2CB cluster"
-    fi
-}
-
-offline_cman()
-{
-    echo "online_cman isn't working yet"
-}
-
-offline()
-{
-    CLUSTER="${1:-${O2CB_BOOTCLUSTER}}"
-    if [ -z "$CLUSTER" ]
-    then
-        return
-    fi
-
-    if [ $# -gt 1 ]
-    then
-        FORCE=$2
-    else
-        FORCE=0
-    fi
-
-    if [ ! -e "$(configfs_path)/cluster/${CLUSTER}" ]
-    then
-        return
-    fi
-
-    case "$O2CB_STACK" in
-        o2cb|heartbeat2) offline_o2cb "$CLUSTER" "$FORCE" ;;
-        cman)
-            if [ "$CMAN_SUPPORTED" = "yes" ]
-            then
-                offline_cman "$CLUSTER" "$FORCE"
-            else
-                echo "Cluster stack \"${O2CB_STACK}\" not supported" >&2
-                exit 1
-            fi
-            ;;
-        *)
-            echo "Invalid O2CB_STACK: $O2CB_STACK" >&2
-            exit 1
-            ;;
-    esac
-
-    unload_module ocfs2
-    if_fail "$?"
-}
-
-start()
-{
-    if [ "$O2CB_ENABLED" != "true" ]
-    then
-        exit 0
-    fi
-
-    load
-    online "$1"
-}
-
-unload()
-{
-    if [ -d "$(configfs_path)/cluster/" ]
-    then
-        ls -1 $(configfs_path)/cluster/ | while read CLUSTER
-        do
-            if [ ! -L "$(configfs_path)/cluster/${CLUSTER}" -a \
-                 -d "$(configfs_path)/cluster/${CLUSTER}" ]
-            then
-                echo "Unable to unload modules as O2CB cluster ${CLUSTER} is still online" >&2
-                exit 1
-            fi
-        done
-        if [ $? = 1 ]
-        then
-            exit 1
-        fi
-    fi
-
-    case "$O2CB_STACK" in
-        o2cb) unload_heartbeat "disk" ;;
-        heartbeat2) unload_heartbeat "user" ;;
-        cman)
-            if [ "$CMAN_SUPPORTED" = "yes" ]
-            then
-                unload_heartbeat "user"
-            else
-                echo "Cluster stack \"${O2CB_STACK}\" not supported" >&2
-                exit 1
-            fi 
-            ;;
-        *)
-            echo "Invalid O2CB_STACK: $O2CB_STACK" >&2
-            exit 1
-        ;;
-    esac
-
-    unmount_filesystem "ocfs2_dlmfs" "/dlm"
-    if_fail $?
-
-    # Only unmount configfs if there are no other users
-    if [ -z "$(ls -1 "$(configfs_path)")" ]
-    then
-        unmount_filesystem "configfs" "/sys/kernel/config"
-        if_fail $?
-    fi
-}
-
-stop()
-{
-    offline "$1"
-    unload
-}
-
-configure()
-{
-    configure_ask
-    write_sysconfig
-    if_fail "$?" "Unable to write the driver configuration"
-}
-
-status()
-{
-    load_status
-
-    CLUSTER="${1:-${O2CB_BOOTCLUSTER}}"
-    if [ -z "$CLUSTER" ]
-    then
-        return 1;
-    fi
-
-    echo -n "Checking O2CB cluster $CLUSTER: "
-    check_online $CLUSTER
-    if [ $? = 2 ]
-    then
-       echo "Online"
-    else
-       echo "Offline"
-       return 0;
-    fi
-
-    show_timeouts
-
-    echo -n "Checking O2CB heartbeat: "
-    check_heartbeat $CLUSTER
-    if [ $? = 2 ]
-    then
-        echo "Active"
-    else
-        echo "Not active"
-        return 0;
-    fi
-
-    return
-}
-
-
-
-case "$1" in
-    start)
-        start "$2"
-        ;;
-
-    status)
-        status "$2"
-        ;;
-
-    stop)
-        stop "$2"
-        ;;
-
-    restart)
-        stop "$2"
-        start "$2"
-        ;;
-
-    force-reload)
-        stop "$2"
-        start "$2"
-        ;;
-
-    load)
-        load
-        ;;
-
-    online)
-        load
-        online "$2"
-        ;;
-
-    offline)
-        offline "$2"
-        ;;
-
-    force-offline)
-        offline "$2" 1
-        ;;
-
-    unload)
-        offline "$2"
-        unload
-        ;;
-
-    configure)
-        configure
-        if [ "$O2CB_ENABLED" = "true" ]
-        then
-            start
-        else
-            stop
-        fi
-        ;;
-
-    enable)
-        O2CB_ENABLED=true
-        write_sysconfig
-        if_fail "$?" "Unable to write the driver configuration"
-        start
-        ;;
-
-    disable)
-        O2CB_ENABLED=false
-        write_sysconfig
-        if_fail "$?" "Unable to write the driver configuration"
-        stop
-        ;;
-
-    *)
-        echo "Usage: $0 {start|stop|restart|force-reload|enable|disable|configure|load|unload|online|offline|force-offline|status}"
-        exit 1
-        ;;
-esac
-
-exit 0

Copied: branches/cman-based/vendor/common/o2cb.init.sh (from rev 1380, branches/cman-based/vendor/common/o2cb.init.in)
===================================================================
--- branches/cman-based/vendor/common/o2cb.init.in	2007-08-14 23:21:13 UTC (rev 1380)
+++ branches/cman-based/vendor/common/o2cb.init.sh	2007-08-14 23:32:29 UTC (rev 1381)
@@ -0,0 +1,1334 @@
+#!/bin/bash
+# init fragment for O2CB.
+#
+# chkconfig: 2345 24 20
+# description: Load O2CB cluster services at system boot.
+#
+### BEGIN INIT INFO
+# Provides: o2cb
+# Required-Start: $network
+# Should-Start:
+# Required-Stop:
+# Default-Start: 2 3 5
+# Default-Stop:
+# Description: Load O2CB cluster services at system boot.
+### END INIT INFO
+
+# Force LC_ALL=C
+export LC_ALL=C
+
+CLUSTERCONF=/etc/ocfs2/cluster.conf
+
+if [ -f /etc/sysconfig/o2cb ]
+then
+    # Red Hat and Novell
+    CONFIGURATION=/etc/sysconfig/o2cb
+elif [ -f /etc/default/o2cb ]
+then
+    # Debian
+    CONFIGURATION=/etc/default/o2cb
+elif [ -d /etc/sysconfig ]
+then
+    CONFIGURATION=/etc/sysconfig/o2cb
+else
+    CONFIGURATION=/etc/default/o2cb
+fi
+
+# The default values should always be in sync with the kernel
+DEF_HEARTBEAT_THRESHOLD=31
+DEF_IDLE_TIMEOUT_MS=30000
+DEF_KEEPALIVE_DELAY_MS=2000
+DEF_RECONNECT_DELAY_MS=2000
+
+# Minimum timeout values
+MIN_HEARTBEAT_THRESHOLD=7
+MIN_IDLE_TIMEOUT_MS=5000
+MIN_KEEPALIVE_DELAY_MS=1000
+MIN_RECONNECT_DELAY_MS=2000
+
+CMAN_SUPPORTED=@@CMAN_SUPPORTED@@
+[ "$CMAN_SUPPORTED" != "yes" ] && CMAN_SUPPORTED=
+
+# Source configuration, 
+[ -f "${CONFIGURATION}" ] && . "${CONFIGURATION}"
+# Need this default
+[ -z "$O2CB_STACK" ] && O2CB_STACK=o2cb
+
+configfs_path()
+{
+    # Note that this is only valid *after* configfs is loaded
+    if [ -d /sys/kernel/config ]
+    then
+        echo /sys/kernel/config
+    else
+        echo /config
+    fi
+}
+
+
+#
+# if_fail()
+#
+# Evaluates return codes.  If 0, prints "OK", if 1, prints "Failed"
+# and exits.  If 2, status is "already done" and nothing is printed.
+# The rest of the functions in here all honor this convention.
+#
+if_fail()
+{
+    RC="$1"
+    REASON="$2"
+    if [ "$RC" = "0" ]
+    then
+        echo "OK"
+        return
+    elif [ "$RC" = "2" ]
+    then
+        return
+    fi
+    echo "Failed"
+    if [ -n "${REASON}" ]
+    then
+        echo "${REASON}" >&2
+    fi
+    exit 1
+}
+
+
+#
+# write_sysconfig()
+#
+# Writes the system configuration out
+#
+write_sysconfig()
+{
+    echo -n "Writing O2CB configuration: "
+    cat >"${CONFIGURATION}" <<EOF
+#
+# This is a configuration file for automatic startup of the O2CB
+# driver.  It is generated by running /etc/init.d/o2cb configure.
+# Please use that method to modify this file
+#
+
+# O2CB_ENABELED: 'true' means to load the driver on boot.
+O2CB_ENABLED=${O2CB_ENABLED:-false}
+
+# O2CB_STACK: The name of the cluster stack backing O2CB.
+O2CB_STACK=${O2CB_STACK}
+
+# O2CB_BOOTCLUSTER: If not empty, the name of a cluster to start.
+O2CB_BOOTCLUSTER=${O2CB_BOOTCLUSTER}
+
+# O2CB_HEARTBEAT_THRESHOLD: Iterations before a node is considered dead.
+O2CB_HEARTBEAT_THRESHOLD=${O2CB_HEARTBEAT_THRESHOLD}
+
+# O2CB_IDLE_TIMEOUT_MS: Time in ms before a network connection is considered dead.
+O2CB_IDLE_TIMEOUT_MS=${O2CB_IDLE_TIMEOUT_MS}
+
+# O2CB_KEEPALIVE_DELAY_MS: Max time in ms before a keepalive packet is sent
+O2CB_KEEPALIVE_DELAY_MS=${O2CB_KEEPALIVE_DELAY_MS}
+
+# O2CB_RECONNECT_DELAY_MS: Min time in ms between connection attempts
+O2CB_RECONNECT_DELAY_MS=${O2CB_RECONNECT_DELAY_MS}
+
+EOF
+
+    if [ $? != 0 ]
+    then
+        return 1
+    fi
+    return 0
+}
+
+#
+# read_timeout()
+#   Returns timeout value provided by user to caller in RET_VAL
+#
+read_timeout()
+{
+    if [ "$#" -lt "4" ]; then
+        echo "read_timeout(): Requires more arguments" >&2
+        exit 1
+    fi
+
+    ATTRIB_NAME=$1
+    ATTRIB_VAL=$2
+    MIN_ATTRIB_VAL=$3
+    DEF_ATTRIB_VAL=$4
+    RET_VAL=0
+
+    while :
+    do
+        if [ -z $ATTRIB_VAL ]; then
+            CUR=$DEF_ATTRIB_VAL
+        else
+            CUR=$ATTRIB_VAL
+        fi
+        echo -n "Specify ${ATTRIB_NAME} (>=$MIN_ATTRIB_VAL) [$CUR]: "
+        read LINE
+        case "$LINE" in
+        "")
+            RET_VAL="$ATTRIB_VAL"
+            break
+            ;;
+
+        *[^0-9]*)
+            echo "Invalid ${ATTRIB_NAME} value: $LINE" >&2
+            ;;
+        *)
+            if [ $LINE -lt $MIN_ATTRIB_VAL ]; then
+                echo "${ATTRIB_NAME} cannot be less than $MIN_ATTRIB_VAL" >&2
+            else
+                RET_VAL="$LINE"
+                break
+            fi
+            ;;
+        esac
+    done
+}
+
+set_timeouts()
+{
+    O2CB_HEARTBEAT_THRESHOLD_FILE_OLD=/proc/fs/ocfs2_nodemanager/hb_dead_threshold
+    O2CB_HEARTBEAT_THRESHOLD_FILE=$(configfs_path)/cluster/${CLUSTER}/heartbeat/dead_threshold
+    if [ -n "$O2CB_HEARTBEAT_THRESHOLD" ]; then
+        if [ -f "$O2CB_HEARTBEAT_THRESHOLD_FILE" ]; then
+            echo "$O2CB_HEARTBEAT_THRESHOLD" > "$O2CB_HEARTBEAT_THRESHOLD_FILE"
+        elif [ -f "$O2CB_HEARTBEAT_THRESHOLD_FILE_OLD" ]; then 
+            echo "$O2CB_HEARTBEAT_THRESHOLD" > "$O2CB_HEARTBEAT_THRESHOLD_FILE_OLD"
+        fi
+    fi
+
+    O2CB_IDLE_TIMEOUT_MS_FILE=$(configfs_path)/cluster/${CLUSTER}/idle_timeout_ms
+    if [ -n "$O2CB_IDLE_TIMEOUT_MS" ]; then
+        if [ -f "$O2CB_IDLE_TIMEOUT_MS_FILE" ]; then
+            echo "$O2CB_IDLE_TIMEOUT_MS" > "$O2CB_IDLE_TIMEOUT_MS_FILE"
+        fi
+    fi
+
+    O2CB_KEEPALIVE_DELAY_MS_FILE=$(configfs_path)/cluster/${CLUSTER}/keepalive_delay_ms
+    if [ -n "$O2CB_KEEPALIVE_DELAY_MS" ]; then
+        if [ -f "$O2CB_KEEPALIVE_DELAY_MS_FILE" ]; then
+            echo "$O2CB_KEEPALIVE_DELAY_MS" > "$O2CB_KEEPALIVE_DELAY_MS_FILE"
+        fi
+    fi
+
+    O2CB_RECONNECT_DELAY_MS_FILE=$(configfs_path)/cluster/${CLUSTER}/reconnect_delay_ms
+    if [ -n "$O2CB_RECONNECT_DELAY_MS" ]; then
+        if [ -f "$O2CB_RECONNECT_DELAY_MS_FILE" ]; then
+            echo "$O2CB_RECONNECT_DELAY_MS" > "$O2CB_RECONNECT_DELAY_MS_FILE"
+        fi
+    fi
+}
+
+show_timeouts()
+{
+
+    O2CB_HEARTBEAT_THRESHOLD_FILE_OLD=/proc/fs/ocfs2_nodemanager/hb_dead_threshold
+    O2CB_HEARTBEAT_THRESHOLD_FILE=$(configfs_path)/cluster/${CLUSTER}/heartbeat/dead_threshold
+    if [ -f "$O2CB_HEARTBEAT_THRESHOLD_FILE" ]; then
+        VAL=`cat "$O2CB_HEARTBEAT_THRESHOLD_FILE"`
+        echo "Heartbeat dead threshold = ${VAL}"
+    elif [ -f "$O2CB_HEARTBEAT_THRESHOLD_FILE_OLD" ]; then
+        VAL=`cat "$O2CB_HEARTBEAT_THRESHOLD_FILE_OLD"`
+        echo "  Heartbeat dead threshold: ${VAL}"
+    fi
+
+    O2CB_IDLE_TIMEOUT_MS_FILE=$(configfs_path)/cluster/${CLUSTER}/idle_timeout_ms
+    if [ -f "$O2CB_IDLE_TIMEOUT_MS_FILE" ]; then
+        VAL=`cat "$O2CB_IDLE_TIMEOUT_MS_FILE"`
+        echo "  Network idle timeout: ${VAL}"
+    fi
+
+    O2CB_KEEPALIVE_DELAY_MS_FILE=$(configfs_path)/cluster/${CLUSTER}/keepalive_delay_ms
+    if [ -f "$O2CB_KEEPALIVE_DELAY_MS_FILE" ]; then
+        VAL=`cat "$O2CB_KEEPALIVE_DELAY_MS_FILE"`
+        echo "  Network keepalive delay: ${VAL}"
+    fi
+
+    O2CB_RECONNECT_DELAY_MS_FILE=$(configfs_path)/cluster/${CLUSTER}/reconnect_delay_ms
+    if [ -f "$O2CB_RECONNECT_DELAY_MS_FILE" ]; then
+        VAL=`cat "$O2CB_RECONNECT_DELAY_MS_FILE"`
+        echo "  Network reconnect delay: ${VAL}"
+    fi
+}
+
+#
+# configure_ask()
+#
+# Ask configuration questions, setting the shell vars.
+#
+configure_ask()
+{
+    cat <<EOF
+Configuring the O2CB driver.
+
+This will configure the on-boot properties of the O2CB driver.
+The following questions will determine whether the driver is loaded on
+boot.  The current values will be shown in brackets ('[]').  Hitting
+<ENTER> without typing an answer will keep that current value.  Ctrl-C
+will abort.
+
+EOF
+
+    while :
+    do
+        if [ "$O2CB_ENABLED" = "true" ]
+        then
+            CUR=y
+        else
+            CUR=n
+        fi
+        echo -n "Load O2CB driver on boot (y/n) [$CUR]: "
+        read LINE
+        case "$LINE" in
+        "")
+            break
+            ;;
+        y|Y)
+            O2CB_ENABLED=true
+            break
+            ;;
+        n|N)
+            O2CB_ENABLED=false
+            break
+            ;;
+        *)
+            echo "Invalid answer: $LINE" >&2
+            ;;
+        esac
+    done
+
+    while :
+    do
+        echo -n "Cluster stack backing O2CB [$O2CB_STACK]: "
+        read LINE
+        case "$LINE" in
+        "")
+            break
+            ;;
+        o2cb|heartbeat2)
+            O2CB_STACK="$LINE"
+            break
+            ;;
+        cman)
+            if [ "$CMAN_SUPPORTED" = "yes" ]
+            then
+                O2CB_STACK="$LINE"
+                break
+            fi
+            echo "Cluster stack \"$LINE\" not supported" >&2
+            ;;
+        *)
+            echo "Invalid answer: $LINE" >&2
+            ;;
+        esac
+    done
+
+    while :
+    do
+        echo -n "Cluster to start on boot (Enter \"none\" to clear) [$O2CB_BOOTCLUSTER]: "
+        read LINE
+        case "$LINE" in
+        "")
+            break
+            ;;
+        none)
+            O2CB_BOOTCLUSTER=
+            break
+            ;;
+
+        *[^a-zA-Z0-9]*)
+            echo "Invalid cluster name: $LINE" >&2
+            ;;
+        *)
+            O2CB_BOOTCLUSTER="$LINE"
+            break
+            ;;
+        esac
+    done
+
+    read_timeout "heartbeat dead threshold" "$O2CB_HEARTBEAT_THRESHOLD" "$MIN_HEARTBEAT_THRESHOLD" "$DEF_HEARTBEAT_THRESHOLD"
+    O2CB_HEARTBEAT_THRESHOLD="$RET_VAL"
+
+    read_timeout "network idle timeout in ms" "$O2CB_IDLE_TIMEOUT_MS" "$MIN_IDLE_TIMEOUT_MS" "$DEF_IDLE_TIMEOUT_MS"
+    O2CB_IDLE_TIMEOUT_MS="$RET_VAL"
+
+    read_timeout "network keepalive delay in ms" "$O2CB_KEEPALIVE_DELAY_MS" "$MIN_KEEPALIVE_DELAY_MS" "$DEF_KEEPALIVE_DELAY_MS"
+    O2CB_KEEPALIVE_DELAY_MS="$RET_VAL"
+
+    read_timeout "network reconnect delay in ms" "$O2CB_RECONNECT_DELAY_MS" "$MIN_RECONNECT_DELAY_MS" "$DEF_RECONNECT_DELAY_MS"
+    O2CB_RECONNECT_DELAY_MS="$RET_VAL"
+
+    # XXX ask about mount point base
+}
+
+
+#
+# make_dir()
+#
+# Create $1
+# Returns 0 on success, 1 on error, 2 if it already exists.
+#
+make_dir()
+{
+    if [ "$#" -lt "1" -o -z "$1" ]
+    then
+        echo "make_dir(): Requires an argument" >&2
+        return 1
+    fi
+    DIR="$1"
+    if [ -e "$DIR" ]
+    then
+        if [ -d "$DIR" ]
+        then
+            return 2
+        fi
+        echo "make_dir(): File $DIR is not a directory" >&2
+        return 1
+    fi
+
+    echo -n "Creating directory '$DIR': "
+    mkdir -p "$DIR" 2>/dev/null
+    if [ $? != 0 ]
+    then
+        echo "Unable to create directory '$DIR'" >&2
+        return 1
+    fi
+    return 0
+}
+
+
+#
+# driver_filesystem()
+# Check to see if a filesystem driver is loaded.
+#
+# 0 is loaded, 1 is not.
+#
+driver_filesystem()
+{
+    if [ "$#" != "1" -o -z "$1" ]
+    then
+        echo "driver_filesystem(): Missing an argument" >&2
+        exit 1
+    fi
+    FSNAME="$1"
+
+    FSOUT="`awk '$2 ~ /^'$FSNAME'$/{print $1;exit}' < /proc/filesystems 2>/dev/null`"
+    test -n "$FSOUT"
+    return $?
+}
+
+
+#
+# load_filesystem()
+# Load a filesystem driver.
+#
+# 0 is success, 1 is error, 2 is already loaded.
+#
+load_filesystem()
+{
+    if [ "$#" != "1" -o -z "$1" ]
+    then
+        echo "load_filesystem(): Missing an argument" >&2
+        return 1
+    fi
+    FSNAME="$1"
+
+    driver_filesystem "$FSNAME" && return 2
+
+    echo -n "Loading filesystem \"$FSNAME\": "
+    modprobe -s "$FSNAME"
+    if [ "$?" != 0 ]
+    then
+        echo "Unable to load filesystem \"$FSNAME\"" >&2
+        return 1
+    fi
+
+    return 0
+}
+
+#
+# unload_filesystem()
+# Unload a filesystem driver.  Be careful to notice if the driver is
+# built-in and do nothing.
+#
+# 0 is success, 1 is error, 2 is already loaded.
+#
+unload_filesystem()
+{
+    if [ "$#" != "1" -o -z "$1" ]
+    then
+        echo "unload_filesystem(): Missing an argument" >&2
+        return 1
+    fi
+    FSNAME="$1"
+
+    driver_filesystem "$FSNAME" || return 2
+
+    MODOUT="`awk '$1 ~ /^'$FSNAME'$/{print $1,$3;exit}' < /proc/modules 2>/dev/null`"
+    if [ -z "$MODOUT" ]
+    then
+        # The driver is built in, we can't unload it.
+        return 2
+    fi
+
+    case "$MODOUT" in
+    $FSNAME\ 0)
+        ;;
+    $FSNAME\ *)
+        # The driver is busy, leave it alone
+        return 2
+        ;;
+    *)
+        echo -n "Invalid module parsing! "
+        return 1
+        ;;
+    esac
+
+    echo -n "Unloading module \"$FSNAME\": "
+    modprobe -rs "$FSNAME"
+    if [ "$?" != 0 ]
+    then
+        echo "Unable to unload module \"$FSNAME\"" >&2
+        return 1
+    fi
+
+    return 0
+}
+
+#
+# check_filesystem()
+# Check to see if a filesystem of type $1 is mounted at $2.
+#
+# 0 is mounted, 1 is not.
+#
+check_filesystem()
+{
+    if [ "$#" != "2" -o -z "$1" -o -z "$2" ]
+    then
+        echo "check_filesystem(): Missing arguments" >&2
+        exit 1
+    fi
+    FSNAME="$1"
+    MOUNTPOINT="$2"
+
+    FULL_MOUNTSEARCH="`echo "$MOUNTPOINT" | sed -e 's/\//\\\\\//g'`"
+    MOUNTOUT="`awk '$2 ~ /^'$FULL_MOUNTSEARCH'$/ && $3 ~ /^'$FSNAME'$/{print $2; exit}' < /proc/mounts 2>/dev/null`"
+    test -n "$MOUNTOUT"
+    return $?
+}
+
+#
+# mount_filesystem()
+# Mounts a pseudo-filesystem of type $1 on mountpoint $2.  It will
+# load the drivers for $1 and create $2 if needed.
+#
+# 0 is success, 1 is error, 2 is already mounted.
+# 
+mount_filesystem()
+{
+    if [ "$#" != "2" -o -z "$1" -o -z "$2" ]
+    then
+        echo "mount_filesystem(): Missing arguments" >&2
+        return 1
+    fi
+    FSNAME="$1"
+    MOUNTPOINT="$2"
+
+    check_filesystem "$FSNAME" "$MOUNTPOINT" && return 2
+
+    load_filesystem "$FSNAME"
+    if_fail $?
+
+    # XXX some policy?
+    if [ ! -e "$MOUNTPOINT" ]; then
+        make_dir $MOUNTPOINT
+        if_fail "$?"
+    fi
+
+    echo -n "Mounting ${FSNAME} filesystem at ${MOUNTPOINT}: "
+    mount -t ${FSNAME} ${FSNAME} ${MOUNTPOINT}
+    if [ $? != 0 ]
+    then
+        echo "Unable to mount ${FSNAME} filesystem" >&2
+        return 1
+    fi
+
+    return 0
+}
+
+#
+# unmount_filesystem()
+# Unmount a pseudo-filesystem of type $1 from mountpoint $2.  It will
+# remove the driver for $1 if it can.
+#
+# 0 is success, 1 is error, 2 is not mounted
+#
+unmount_filesystem()
+{
+    if [ "$#" != "2" -o -z "$1" -o -z "$2" ]
+    then
+        echo "unmount_filesystem(): Missing arguments" >&2
+        return 1
+    fi
+    FSNAME="$1"
+    MOUNTPOINT="$2"
+
+    if check_filesystem "$FSNAME" "$MOUNTPOINT"
+    then
+        echo -n "Unmounting ${FSNAME} filesystem: "
+        umount $MOUNTPOINT
+        RC=$?
+        if [ $RC != 0 ]
+        then
+            echo "Unable to unmount ${FSNAME} filesystem" >&2
+            return 1
+        fi
+        if_fail $RC  # For the success string
+    fi
+
+    unload_filesystem "$FSNAME"
+    return $?
+}
+
+#
+# status_filesystem()
+# Report the status of a filesystem, whether it is mounted or not
+#
+# 0 is not mounted, 1 is error, 2 is already mounted
+#
+status_filesystem()
+{
+    if [ "$#" != "2" -o -z "$1" -o -z "$2" ]
+    then
+        echo "status_filesystem(): Missing arguments" >&2
+        return 1
+    fi
+    FSNAME="$1"
+    MOUNTPOINT="$2"
+
+    echo -n "Driver for \"$FSNAME\": "
+    if driver_filesystem "$FSNAME"
+    then
+        echo "Loaded"
+    else
+        echo "Not loaded"
+        return 0
+    fi
+
+    echo -n "Filesystem \"$FSNAME\": "
+    if check_filesystem "$FSNAME" "$MOUNTPOINT"
+    then
+        echo "Mounted"
+        return 2
+    fi
+    echo "Not mounted"
+    return 0
+} 
+
+#
+# check_heartbeat()
+#
+# 0 is hb not active, 1 is error, 2 is hb active
+#
+check_heartbeat()
+{
+    if [ "$#" -lt "1" -o -z "$1" ]
+    then
+        echo "check_heartbeat(): Requires an argument" >&2
+        return 1
+    fi
+    CLUSTER="$1"
+
+    RC=0
+    if [ -d "$(configfs_path)/cluster/${CLUSTER}/heartbeat/" ]
+    then
+        ls -1 "$(configfs_path)/cluster/${CLUSTER}/heartbeat/" | while read HBUUID
+        do
+            if [ -d "$(configfs_path)/cluster/${CLUSTER}/heartbeat/${HBUUID}" ]
+            then
+                return 2;
+            fi
+        done
+        if [ $? = 2 ]
+        then
+            RC=2
+        fi
+    fi
+
+    return $RC
+}
+
+#
+# clean_heartbeat()
+# Removes the inactive heartbeat regions
+# 
+clean_heartbeat()
+{
+    if [ "$#" -lt "1" -o -z "$1" ]
+    then
+        echo "clean_heartbeat(): Requires an argument" >&2
+        return 1
+    fi
+    CLUSTER="$1"
+
+    if [ ! -f "$(configfs_path)/cluster/${CLUSTER}/heartbeat/*" ]
+    then
+        return
+    fi
+
+    echo -n "Cleaning heartbeat on ${CLUSTER}: "
+
+    ls -1 "$(configfs_path)/cluster/${CLUSTER}/heartbeat/" | while read HBUUID
+    do
+        if [ ! -d "$(configfs_path)/cluster/${CLUSTER}/heartbeat/${HBUUID}" ]
+        then
+            continue
+        fi
+
+        OUTPUT="`ocfs2_hb_ctl -I -u ${HBUUID} 2>&1`"
+        if [ $? != 0 ]
+        then
+            echo "Failed"
+            echo "${OUTPUT}" >&2
+            exit 1
+        fi
+
+        REF="`echo ${OUTPUT} | awk '/refs/ {print $2; exit;}' 2>&1`"
+        if [ $REF != 0 ]
+        then
+           echo "Failed"
+           echo "At least one heartbeat region still active" >&2
+           exit 1
+        else
+           OUTPUT="`ocfs2_hb_ctl -K -u ${HBUUID} 2>&1`"
+        fi
+    done
+    if [ $? = 1 ]
+    then
+        exit 1
+    fi
+    echo "OK"
+}
+
+#
+# clean_cluster()
+# Force cleans configured cluster
+#
+# 0 is clean, 1 is error, 2 is not clean
+#
+clean_cluster()
+{
+    if [ "$#" -lt "1" -o -z "$1" ]
+    then
+        echo "clean_cluster(): Requires an argument" >&2
+        return 1
+    fi
+    CLUSTER="$1"
+
+    if [ -d "$(configfs_path)/cluster/${CLUSTER}/node/" ]
+    then
+        ls -1 "$(configfs_path)/cluster/${CLUSTER}/node/" | while read NODE
+        do
+            rmdir "$(configfs_path)/cluster/${CLUSTER}/node/${NODE}" >/dev/null 2>&1
+        done
+    fi
+
+    if [ -d "$(configfs_path)/cluster/${CLUSTER}" ]
+    then
+        rmdir "$(configfs_path)/cluster/${CLUSTER}" >/dev/null 2>&1
+    fi
+
+    if [ -d "$(configfs_path)/cluster/${CLUSTER}" ]
+    then
+        return 2
+    fi
+
+    return 0
+}
+
+#
+# load_heartbeat()
+# Load a given heartbeat method and set it to be the active mode.
+#
+# 0 is success, 1 is error, and 2 is already active.
+#
+load_heartbeat()
+{
+    if [ "$#" -lt "1" -o -z "$1" ]
+    then
+        echo "load_heartbeat(): Requires an argument" >&2
+        exit 1 
+    fi
+    HB_METHOD="$1"
+    HB_MODULE="ocfs2_${HB_METHOD}_heartbeat"
+
+    #
+    # Older drivers don't have heartbeat_modes.  They're disk
+    # heartbeat only.  It's loaded with ocfs2_nodemanager, which is pulled
+    # in by loading ocfs2_dlmfs.
+    #
+    # For a newer driver, if ocfs2_nodemanager is loaded, we'll see
+    # heartbeat_mode.  Thus, we can check for the loaded
+    # ocfs2_<method>_heartbeat driver below.
+    #
+    if [ ! -e "$(configfs_path)/cluster/heartbeat_mode" ]
+    then
+        [ "$HB_METHOD" = "disk" ] && return 2
+        echo "Checking for available heartbeat method: "
+        echo "Unsupported heartbeat method: $HB_METHOD" >&2
+        if_fail 1 "Unsupported heartbeat method: $HB_METHOD"
+    fi
+    
+    CUR_METHOD="$(cat "$(configfs_path)/cluster/heartbeat_mode")"
+    [ "$CUR_METHOD" = "$HB_METHOD" ] && return 2
+
+    HBOUT="$(awk '/^'$HB_METHOD'$/{print;exit}' "$(configfs_path)/cluster/heartbeat_available_modes" 2>/dev/null)"
+    if [ -z "$HBOUT" ]
+    then
+        echo -n "Loading module \"${HB_MODULE}\": "
+        modprobe -s "$HB_MODULE"
+        if [ "$?" != 0 ]
+        then
+            echo "Unable to load module \"$HB_MODULE\"" >&2
+            if_fail 1 "Unable to load module \"$HB_MODULE\""
+        fi
+        if_fail 0
+    fi
+
+    echo -n "Setting heartbeat mode \"$HB_METHOD\": "
+    echo "$HB_METHOD" >"$(configfs_path)/cluster/heartbeat_mode" 2>/dev/null
+    if_fail $? "Unable to set heartbeat mode \"$HB_METHOD\""
+}
+
+#
+# unload_heartbeat()
+# Unload a given heartbeat method.
+#
+# 0 is success, 1 is error, and 2 is not loaded.
+#
+unload_heartbeat()
+{
+    if [ "$#" -lt "1" -o -z "$1" ]
+    then
+        echo "unload_heartbeat(): Requires an argument" >&2
+        exit 1 
+    fi
+    HB_METHOD="$1"
+    HB_MODULE="ocfs2_${HB_METHOD}_heartbeat"
+
+    #
+    # Older drivers don't have heartbeat drivers.  If we can't find
+    # the driver module, it might as well be unloaded :-)
+    #
+    MODOUT="`awk '$1 ~ /^'$HB_MODULE'$/{print $1,$3;exit}' < /proc/modules 2>/dev/null`"
+    if [ -z "$MODOUT" ]
+    then
+        # Either it's not loaded or the driver is built in
+        return 2
+    fi
+
+    case "$MODOUT" in
+    $HB_MODULE\ 0)
+        ;;
+    $HB_MODULE\ *)
+        # The driver is busy, leave it alone
+        return 2
+        ;;
+    *)
+        echo -n "Invalid module parsing! "
+        exit 1
+        ;;
+    esac
+
+    echo -n "Unloading module \"$HB_MODULE\": "
+    modprobe -rs "$HB_MODULE"
+    if [ "$?" != 0 ]
+    then
+        echo "Unable to unload module \"$HB_MODULE\"" >&2
+        if_fail 1 "$Unable to unload module \"$HB_MODULE\""
+    fi
+
+    if_fail 0
+}
+
+#
+# unload_module()
+# Unload a module
+#
+# 0 is success, 1 is error, 2 is not loaded
+# 
+unload_module()
+{
+    if [ "$#" -lt "1" -o -z "$1" ]
+    then
+        echo "unload_module(): Requires an argument" >&2
+        return 1
+    fi
+    MODNAME="$1"
+
+    MODOUT="`awk '$1 ~ /^'$MODNAME'$/{print $1,$3;exit}' < /proc/modules 2>/dev/null`"
+    if [ -z "$MODOUT" ]
+    then
+        return 2
+    fi
+    case "$MODOUT" in
+    $MODNAME\ 0)
+        ;;
+    $MODNAME\ *)
+        return 2
+        ;;
+    *)
+        echo -n "Invalid module parsing! "
+        return 1
+        ;;
+    esac
+
+    echo -n "Unloading module \"$MODNAME\": "
+    modprobe -rs "$MODNAME"
+    if [ "$?" != 0 ]
+    then
+        echo "Unable to unload module \"$MODNAME\"" >&2
+        return 1
+    fi
+
+    return 0
+}
+
+#
+# check_load_module()
+#
+# 0 is not loaded, 1 is error, 2 is already loaded
+#
+check_load_module()
+{
+    if [ "$#" -lt "1" -o -z "$1" ]
+    then
+        echo "check_load_module(): Requires an argument" >&2
+        return 1
+    fi
+    MODNAME="$1"
+
+    echo -n "Module \"$MODNAME\": "
+    MODOUT="`awk '$1 ~ /^'$MODNAME'$/{print $1,$3;exit}' < /proc/modules 2>/dev/null`"
+    if [ -z "$MODOUT" ]
+    then
+        echo "Not loaded"
+        return 0
+    fi
+    echo "Loaded"
+    return 2
+}
+
+load()
+{
+    # XXX: SPECIAL CASE!  We must load configfs for configfs_path() to work
+    load_filesystem "configfs"
+    if_fail $?
+
+    mount_filesystem "configfs" "$(configfs_path)"
+    if_fail $?
+
+    mount_filesystem "ocfs2_dlmfs" "/dlm"
+    if_fail $?
+
+    case "$O2CB_STACK" in
+        o2cb) load_heartbeat "disk" ;;
+        heartbeat2) load_heartbeat "user" ;;
+        cman)
+            if [ "$CMAN_SUPPORTED" = "yes" ]
+            then
+                load_heartbeat "user"
+            else
+                echo "Cluster stack \"${O2CB_STACK}\" not supported" >&2
+                exit 1
+            fi
+            ;;
+        *)
+            echo "Invalid O2CB_STACK: $O2CB_STACK" >&2
+            exit 1
+        ;;
+    esac
+
+    return 0
+}
+
+load_status()
+{
+    status_filesystem "configfs" "$(configfs_path)"
+    status_filesystem "ocfs2_dlmfs" "/dlm"
+
+    # TODO
+    # Check the status of the appropriate heartbeat driver based on our
+    # cluster type.
+
+    return 0
+}
+
+online_o2cb()
+{
+    if [ "$#" -lt "1" -o -z "$1" ]
+    then
+        echo "online_o2cb(): Requires an argument" >&2
+        return 1
+    fi
+    CLUSTER="$1"
+
+    if ! [ -f ${CLUSTERCONF} ]
+    then
+        echo -n "Checking O2CB cluster configuration : "
+        if_fail 1
+    fi
+
+    echo -n "Starting O2CB cluster ${CLUSTER}: "
+    OUTPUT="`o2cb_ctl -H -n "${CLUSTER}" -t cluster -a online=yes 2>&1`"
+    if [ $? = 0 ]
+    then
+        set_timeouts
+        echo "OK"
+        return
+    else
+        echo "Failed"
+        echo "$OUTPUT"
+    fi
+
+    echo -n "Stopping O2CB cluster ${CLUSTER}: "
+    OUTPUT="`o2cb_ctl -H -n "${CLUSTER}" -t cluster -a online=no 2>&1`"
+    if_fail "$?" "$OUTPUT"
+}
+
+online_cman()
+{
+    echo "online_cman isn't working yet"
+}
+
+online()
+{
+    CLUSTER="${1:-${O2CB_BOOTCLUSTER}}"
+    if [ -z "$CLUSTER" ]
+    then
+        echo "O2CB cluster not known"
+        return
+    fi
+
+    check_online $CLUSTER
+    if [ $? = 2 ]
+    then
+        echo "O2CB cluster ${CLUSTER} already online"
+        return
+    fi
+
+    case "$O2CB_STACK" in
+        o2cb|heartbeat2) online_o2cb "$CLUSTER" ;;
+        cman)
+            if [ "$CMAN_SUPPORTED" = "yes" ]
+            then
+                online_cman "$CLUSTER"
+            else
+                echo "Cluster stack \"$O2CB_STACK\" not supported" >&2
+                exit 1
+            fi
+            ;;
+        *)
+            echo "Invalid O2CB_STACK: $O2CB_STACK" >&2
+            exit 1
+            ;;
+    esac
+
+}
+
+#
+# check_online()
+#
+# 0 is not online, 1 is error, 2 is online
+#
+check_online()
+{
+    if [ "$#" -lt "1" -o -z "$1" ]
+    then
+        echo "check_online(): Requires an argument" >&2
+        return 1
+    fi
+    CLUSTER="$1"
+
+    RC=0
+    if [ -d "$(configfs_path)/cluster/${CLUSTER}/node/" ]
+    then
+        ls -1 "$(configfs_path)/cluster/${CLUSTER}/node/" | while read NODE
+        do
+            LOCAL="`cat \"$(configfs_path)/cluster/${CLUSTER}/node/${NODE}/local\"`"
+            if [ $LOCAL = 1 ]
+            then
+                return 2
+            fi
+        done
+        if [ $? = 2 ]
+        then
+            RC=2
+        fi
+    fi
+    return $RC
+}
+
+offline_o2cb()
+{
+    if [ "$#" -lt "2" -o -z "$1" -o -z "$2" ]
+    then
+        echo "offline_o2cb(): Missing arguments" >&2
+        return 1
+    fi
+    CLUSTER="$1"
+    FORCE="$2"
+
+    clean_heartbeat $CLUSTER
+
+    echo -n "Stopping O2CB cluster ${CLUSTER}: "
+    check_heartbeat $CLUSTER
+    if [ $? != 0 ]
+    then
+        echo "Failed"
+        echo "Unable to stop cluster as heartbeat region still active" >&2
+        exit 1
+    fi
+
+    if [ $FORCE -eq 1 ]
+    then
+        clean_cluster $CLUSTER
+        if_fail "$?" "Unable to force-offline cluster $CLUSTER" >&2
+    else
+        OUTPUT="`o2cb_ctl -H -n "${CLUSTER}" -t cluster -a online=no 2>&1`"
+        if_fail "$?" "$OUTPUT - Try to force-offline the O2CB cluster"
+    fi
+}
+
+offline_cman()
+{
+    echo "online_cman isn't working yet"
+}
+
+offline()
+{
+    CLUSTER="${1:-${O2CB_BOOTCLUSTER}}"
+    if [ -z "$CLUSTER" ]
+    then
+        return
+    fi
+
+    if [ $# -gt 1 ]
+    then
+        FORCE=$2
+    else
+        FORCE=0
+    fi
+
+    if [ ! -e "$(configfs_path)/cluster/${CLUSTER}" ]
+    then
+        return
+    fi
+
+    case "$O2CB_STACK" in
+        o2cb|heartbeat2) offline_o2cb "$CLUSTER" "$FORCE" ;;
+        cman)
+            if [ "$CMAN_SUPPORTED" = "yes" ]
+            then
+                offline_cman "$CLUSTER" "$FORCE"
+            else
+                echo "Cluster stack \"${O2CB_STACK}\" not supported" >&2
+                exit 1
+            fi
+            ;;
+        *)
+            echo "Invalid O2CB_STACK: $O2CB_STACK" >&2
+            exit 1
+            ;;
+    esac
+
+    unload_module ocfs2
+    if_fail "$?"
+}
+
+start()
+{
+    if [ "$O2CB_ENABLED" != "true" ]
+    then
+        exit 0
+    fi
+
+    load
+    online "$1"
+}
+
+unload()
+{
+    if [ -d "$(configfs_path)/cluster/" ]
+    then
+        ls -1 $(configfs_path)/cluster/ | while read CLUSTER
+        do
+            if [ ! -L "$(configfs_path)/cluster/${CLUSTER}" -a \
+                 -d "$(configfs_path)/cluster/${CLUSTER}" ]
+            then
+                echo "Unable to unload modules as O2CB cluster ${CLUSTER} is still online" >&2
+                exit 1
+            fi
+        done
+        if [ $? = 1 ]
+        then
+            exit 1
+        fi
+    fi
+
+    case "$O2CB_STACK" in
+        o2cb) unload_heartbeat "disk" ;;
+        heartbeat2) unload_heartbeat "user" ;;
+        cman)
+            if [ "$CMAN_SUPPORTED" = "yes" ]
+            then
+                unload_heartbeat "user"
+            else
+                echo "Cluster stack \"${O2CB_STACK}\" not supported" >&2
+                exit 1
+            fi 
+            ;;
+        *)
+            echo "Invalid O2CB_STACK: $O2CB_STACK" >&2
+            exit 1
+        ;;
+    esac
+
+    unmount_filesystem "ocfs2_dlmfs" "/dlm"
+    if_fail $?
+
+    # Only unmount configfs if there are no other users
+    if [ -z "$(ls -1 "$(configfs_path)")" ]
+    then
+        unmount_filesystem "configfs" "/sys/kernel/config"
+        if_fail $?
+    fi
+}
+
+stop()
+{
+    offline "$1"
+    unload
+}
+
+configure()
+{
+    configure_ask
+    write_sysconfig
+    if_fail "$?" "Unable to write the driver configuration"
+}
+
+status()
+{
+    load_status
+
+    CLUSTER="${1:-${O2CB_BOOTCLUSTER}}"
+    if [ -z "$CLUSTER" ]
+    then
+        return 1;
+    fi
+
+    echo -n "Checking O2CB cluster $CLUSTER: "
+    check_online $CLUSTER
+    if [ $? = 2 ]
+    then
+       echo "Online"
+    else
+       echo "Offline"
+       return 0;
+    fi
+
+    show_timeouts
+
+    echo -n "Checking O2CB heartbeat: "
+    check_heartbeat $CLUSTER
+    if [ $? = 2 ]
+    then
+        echo "Active"
+    else
+        echo "Not active"
+        return 0;
+    fi
+
+    return
+}
+
+
+
+case "$1" in
+    start)
+        start "$2"
+        ;;
+
+    status)
+        status "$2"
+        ;;
+
+    stop)
+        stop "$2"
+        ;;
+
+    restart)
+        stop "$2"
+        start "$2"
+        ;;
+
+    force-reload)
+        stop "$2"
+        start "$2"
+        ;;
+
+    load)
+        load
+        ;;
+
+    online)
+        load
+        online "$2"
+        ;;
+
+    offline)
+        offline "$2"
+        ;;
+
+    force-offline)
+        offline "$2" 1
+        ;;
+
+    unload)
+        offline "$2"
+        unload
+        ;;
+
+    configure)
+        configure
+        if [ "$O2CB_ENABLED" = "true" ]
+        then
+            start
+        else
+            stop
+        fi
+        ;;
+
+    enable)
+        O2CB_ENABLED=true
+        write_sysconfig
+        if_fail "$?" "Unable to write the driver configuration"
+        start
+        ;;
+
+    disable)
+        O2CB_ENABLED=false
+        write_sysconfig
+        if_fail "$?" "Unable to write the driver configuration"
+        stop
+        ;;
+
+    *)
+        echo "Usage: $0 {start|stop|restart|force-reload|enable|disable|configure|load|unload|online|offline|force-offline|status}"
+        exit 1
+        ;;
+esac
+
+exit 0




More information about the Ocfs2-tools-commits mailing list