[Ocfs2-tools-devel] [PATCH 02/39] o2cb.init: Eliminate the
single-path load_actions scheme.
Joel Becker
joel.becker at oracle.com
Fri Mar 14 16:52:25 PDT 2008
The o2cb.init script had an array of actions that are run at load time.
Upon unload, they are run in reverse. This worked great for a single
backing cluster stack, but does not work well when we want to support
multiple schemes. The steps are now broken out.
The mechanism for loading modules and pseudo-filesystems could not handle
compiled-in drivers. Because depmod works great with loading modules for
filesystems, the code can just mount a filesystem and let depmod do the
rest.
o2cb.init is moved to o2cb.init.sh. This allows us to propagate
variables to the init script when the time comes. This involves adding
ALL_RULES to Postamble.make, something that already has happened in
Makebo.
Signed-off-by: Joel Becker <joel.becker at oracle.com>
---
Postamble.make | 2 +-
vendor/common/.gitignore | 1 +
vendor/common/Makefile | 16 +-
vendor/common/o2cb.init | 1060 -----------------------------------------
vendor/common/o2cb.init.sh | 1138 ++++++++++++++++++++++++++++++++++++++++++++
5 files changed, 1155 insertions(+), 1062 deletions(-)
delete mode 100755 vendor/common/o2cb.init
create mode 100644 vendor/common/o2cb.init.sh
diff --git a/Postamble.make b/Postamble.make
index 1c2b65f..7411bed 100644
--- a/Postamble.make
+++ b/Postamble.make
@@ -54,7 +54,7 @@ $(SUBDIRS):
$(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))
diff --git a/vendor/common/.gitignore b/vendor/common/.gitignore
index f4d162b..a70da97 100644
--- a/vendor/common/.gitignore
+++ b/vendor/common/.gitignore
@@ -1,3 +1,4 @@
ocfs2-tools.spec
ocfs2-tools.spec-generic
.*.sw?
+o2cb.init
diff --git a/vendor/common/Makefile b/vendor/common/Makefile
index eb70e4c..76ac444 100644
--- a/vendor/common/Makefile
+++ b/vendor/common/Makefile
@@ -2,8 +2,22 @@ TOPDIR = ../..
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/@@VERSION@@/$(VERSION)/g' $@.sh >$@+
+ chmod +x $@+
+ mv $@+ $@
+
+ALL_RULES = $(SCRIPTS)
+
DIST_FILES = \
- o2cb.init \
+ $(SCRIPT_SH) \
o2cb.sysconfig \
ocfs2.init \
ocfs2-tools.spec-generic.in \
diff --git a/vendor/common/o2cb.init b/vendor/common/o2cb.init
deleted file mode 100755
index 0f08447..0000000
--- a/vendor/common/o2cb.init
+++ /dev/null
@@ -1,1060 +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:
-# Short-Description: Load O2CB cluster services at system boot.
-# 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
- DPKGRECONF=yes
-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
-
-# Source configuration,
-[ -f "${CONFIGURATION}" ] && . "${CONFIGURATION}"
-
-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
-}
-
-#
-# This is a tricky bit of eval work. There are many steps involved in
-# O2CB startup/shutdown, so we collect them here. Each line is a line
-# of shell code that needs to be run. The code is run via eval as
-# follows:
-#
-# start/load:
-# Eval of the exact lines, in order. So, the first call is
-# "eval load_module configfs".
-#
-# status:
-# Eval of the lines with "check_" prepended, in order. So the first
-# call is "eval check_load_module configfs".
-#
-# stop/unload:
-# Eval of the lines with "un" prepened, in reverse order. So the
-# *last* call is "eval unload_module configfs".
-#
-# To provide an action, create a set of shell functions or commands
-# "foo", "check_foo", and "unfoo". Then add "foo arguments" to the
-# appropriate place. Be careful, eval requires quoting to be right.
-#
-LOAD_ACTIONS=("load_module configfs"
- "mount_fs configfs "'$(configfs_path)'
- "load_module ocfs2_nodemanager"
- "load_module ocfs2_dlm"
- "load_module ocfs2_dlmfs"
- "mount_fs ocfs2_dlmfs /dlm")
-
-
-#
-# 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.
-# On Debian based systems the preferred method is running
-# 'dpkg-reconfigure ocfs2-tools'.
-#
-
-# O2CB_ENABLED: 'true' means to load the driver on boot.
-O2CB_ENABLED=${O2CB_ENABLED:-false}
-
-# 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()
-{
- if [ -n "$DPKGRECONF" ]; then
- cat <<EOF
-Configuring the O2CB driver.
-
-Please configure this service in the Debian way:
-
- dpkg-reconfigure ocfs2-tools
-EOF
-
- exit 0
- fi
-
- 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 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
-}
-
-
-#
-# load_module()
-# Load a module
-#
-# 0 is success, 1 is error, 2 is already loaded
-#
-load_module()
-{
- if [ "$#" -lt "1" -o -z "$1" ]
- then
- echo "load_module(): Requires an argument" >&2
- return 1
- fi
- MODNAME="$1"
-
- MODOUT="`awk '$1 ~ /^'$MODNAME'$/{print $1;exit}' < /proc/modules 2>/dev/null`"
- if [ -n "$MODOUT" ]
- then
- return 2
- fi
-
- echo -n "Loading module \"$MODNAME\": "
- modprobe -s "$MODNAME"
- if [ "$?" != 0 ]
- then
- echo "Unable to load module \"$MODNAME\"" >&2
- return 1
- fi
-
- 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
-}
-
-#
-# 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
-}
-
-
-#
-# mount_fs()
-# Mount a filesystem.
-#
-# 0 is success, 1 is error, 2 is already mounted
-#
-mount_fs()
-{
- TYPE="$1"
- FULL_MOUNT="$2"
- FULL_MOUNTSEARCH="`echo "$FULL_MOUNT" | sed -e 's/\//\\\\\//g'`"
- MOUNTOUT="`awk '$2 ~ /^'$FULL_MOUNTSEARCH'$/{print $2; exit}' < /proc/mounts 2>/dev/null`"
-
- if [ -n "$MOUNTOUT" ]
- then
- return 2
- fi
-
- # XXX some policy?
- if [ ! -e "$FULL_MOUNT" ]; then
- make_dir $FULL_MOUNT
- if_fail "$?"
- fi
-
- echo -n "Mounting ${TYPE} filesystem at $FULL_MOUNT: "
- mount -t ${TYPE} ${TYPE} $FULL_MOUNT
- if [ $? != 0 ]
- then
- echo "Unable to mount ${TYPE} filesystem" >&2
- return 1
- fi
-
- return 0
-}
-
-#
-# check_mount_fs()
-#
-# 0 is not mounted, 1 is error, 2 is already mounted
-#
-check_mount_fs()
-{
- TYPE="$1"
- FULL_MOUNT="$2"
- FULL_MOUNTSEARCH="`echo "$FULL_MOUNT" | sed -e 's/\//\\\\\//g'`"
- MOUNTOUT="`awk '$2 ~ /^'$FULL_MOUNTSEARCH'$/{print $2; exit}' < /proc/mounts 2>/dev/null`"
-
- echo -n "Filesystem \"$TYPE\": "
- if [ -n "$MOUNTOUT" ]
- then
- echo "Mounted"
- return 2
- fi
- echo "Not mounted"
- return 0
-}
-
-#
-# unmount_fs()
-# Unmount a filesystem
-#
-# 0 is success, 1 is error, 2 is not mounted
-#
-unmount_fs()
-{
- TYPE="$1"
- FULL_MOUNT="$2"
- FULL_MOUNTSEARCH="`echo "$FULL_MOUNT" | sed -e 's/\//\\\\\//g'`"
- MOUNTOUT="`awk '$2 ~ /^'$FULL_MOUNTSEARCH'$/{print $2; exit}' < /proc/mounts 2>/dev/null`"
-
- if [ -z "$MOUNTOUT" ]
- then
- return 2
- fi
-
- echo -n "Unmounting ${TYPE} filesystem: "
- umount $FULL_MOUNT
- if [ $? != 0 ]
- then
- echo "Unable to unmount ${TYPE} filesystem" >&2
- return 1
- fi
-
- return 0
-}
-
-load()
-{
- for i in $(seq 0 $((${#LOAD_ACTIONS[*]} - 1)) ); do
- eval ${LOAD_ACTIONS[i]}
- if_fail "$?"
- done
-}
-
-load_status()
-{
- for i in $(seq 0 $((${#LOAD_ACTIONS[*]} - 1)) ); do
- eval "check_${LOAD_ACTIONS[i]}"
- done
- return "$?"
-}
-
-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
-
- 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"
-}
-
-#
-# 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()
-{
- 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
-
- 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
-
- 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
-
- for i in $(seq $((${#LOAD_ACTIONS[*]} - 1)) -1 0); do
- eval "un${LOAD_ACTIONS[i]}"
- if_fail "$?"
- done
-}
-
-stop()
-{
- offline "$1"
- unload
-}
-
-configure()
-{
- configure_ask
- if [ -z "$DPKGRECONF" ]; then
- write_sysconfig
- if_fail "$?" "Unable to write the driver configuration"
- fi
-}
-
-status()
-{
- load_status
- if [ $? != 2 ]
- then
- return 0;
- fi
-
- 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
-
- echo -n "Checking if O2CB is loaded: "
- RC=0
- for MODSPEC in $MODULE_LIST
- do
- MODULE_NAME="`echo $MODSPEC | cut -d: -f1`"
- FSTYPE="`echo $MODSPEC | cut -d: -f2`"
- MOUNT_POINT="`echo $MODSPEC | cut -d: -f3`"
-
- if grep "^${MODULE_NAME} " /proc/modules >/dev/null 2>&1
- then
- echo -n "${MODULE_NAME} "
- else
- RC=1
- break
- fi
- done
- if_fail "$RC"
-
- echo -n "Checking O2CB mount points: "
- for MODSPEC in $MODULE_LIST
- do
- MODULE_NAME="`echo $MODSPEC | cut -d: -f1`"
- FSTYPE="`echo $MODSPEC | cut -d: -f2`"
- MOUNT_POINT="`echo $MODSPEC | cut -d: -f3`"
-
- if [ -z "$FSTYPE" -o -z "$MOUNT_POINT" ]
- then
- continue
- fi
-
- FULL_MOUNT="${O2CB_MANAGER}/${MOUNT_POINT}"
- FULL_MOUNTSEARCH="`echo "$FULL_MOUNT" | sed -e 's/\//\\\\\//g'`"
- if grep "^${FSTYPE} ${FULL_MOUNTSEARCH} ${FSTYPE}" /proc/mounts >/dev/null 2>&1
- then
- echo -n "${MOUNT_POINT} "
- else
- RC=1
- break
- fi
- done
- if_fail "$RC"
-}
-
-
-
-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
diff --git a/vendor/common/o2cb.init.sh b/vendor/common/o2cb.init.sh
new file mode 100644
index 0000000..0ba3d99
--- /dev/null
+++ b/vendor/common/o2cb.init.sh
@@ -0,0 +1,1138 @@
+#!/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:
+# Short-Description: Load O2CB cluster services at system boot.
+# 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
+ DPKGRECONF=yes
+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
+
+VERSION=@@VERSION@@
+
+# 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.
+# On Debian based systems the preferred method is running
+# 'dpkg-reconfigure ocfs2-tools'.
+#
+
+# O2CB_ENABLED: '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()
+{
+ if [ -n "$DPKGRECONF" ]; then
+ cat <<EOF
+Configuring the O2CB driver.
+
+Please configure this service in the Debian way:
+
+ dpkg-reconfigure ocfs2-tools
+EOF
+
+ exit 0
+ fi
+
+ 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 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
+}
+
+#
+# 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 $?
+
+ return 0
+}
+
+load_status()
+{
+ status_filesystem "configfs" "$(configfs_path)"
+ status_filesystem "ocfs2_dlmfs" "/dlm"
+
+ 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()
+{
+ 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
+
+ online_o2cb "$CLUSTER"
+}
+
+#
+# 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()
+{
+ 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
+
+ offline_o2cb "$CLUSTER" "$FORCE"
+
+ 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
+
+ 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
+ if [ -z "$DPKGRECONF" ]; then
+ write_sysconfig
+ if_fail "$?" "Unable to write the driver configuration"
+ fi
+}
+
+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
--
1.5.3.8
More information about the Ocfs2-tools-devel
mailing list