From c566897e0ee5323fa1708598e78662a1193c9000 Mon Sep 17 00:00:00 2001 From: aredridel Date: Tue, 17 Oct 2006 00:25:59 +0000 Subject: [PATCH] - added, needs PLDification Changed files: o2cb.init -> 1.1 ocfs2.init -> 1.1 --- o2cb.init | 849 +++++++++++++++++++++++++++++++++++++++++++++++++++++ ocfs2.init | 173 +++++++++++ 2 files changed, 1022 insertions(+) create mode 100644 o2cb.init create mode 100644 ocfs2.init diff --git a/o2cb.init b/o2cb.init new file mode 100644 index 0000000..2438031 --- /dev/null +++ b/o2cb.init @@ -0,0 +1,849 @@ +#!/bin/sh +# 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 + +# 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}" < 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 + + # 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" + + echo -n "Cleaning heartbeat on ${CLUSTER}: " + + if [ ! -d "$(configfs_path)/cluster/${CLUSTER}/heartbeat/" ] + then + echo "OK" + return + fi + + 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" +} + +# +# 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 "Cluster not known" + return + fi + + check_online $CLUSTER + if [ $? = 2 ] + then + echo "Cluster ${CLUSTER} already online" + return + fi + + if ! [ -f ${CLUSTERCONF} ] + then + echo -n "Checking cluster configuration : " + if_fail 1 + fi + + echo -n "Starting cluster ${CLUSTER}: " + OUTPUT="`o2cb_ctl -H -n "${CLUSTER}" -t cluster -a online=yes 2>&1`" + if [ $? = 0 ] + then + 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" + else + echo "WARNING: Unable to set heartbeat dead threshold" >&2 + fi + fi + + echo "OK" + return + else + echo "Failed" + echo "$OUTPUT" + fi + + echo -n "Stopping 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 [ ! -e "$(configfs_path)/cluster/${CLUSTER}" ] + then + return + fi + + clean_heartbeat $CLUSTER + + echo -n "Stopping cluster ${CLUSTER}: " + check_heartbeat $CLUSTER + if [ $? != 0 ] + then + echo "Failed" + echo "Unable to stop cluster as heartbeat region still active" >&2 + fi + + OUTPUT="`o2cb_ctl -H -n "${CLUSTER}" -t cluster -a online=no 2>&1`" + if_fail "$?" "$OUTPUT" + + 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 + echo "Unable to unload modules as Cluster ${CLUSTER} is still online" >&2 + exit 1 + 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 + write_sysconfig + if_fail "$?" "Unable to write the driver configuration" +} + +status() +{ + load_status + if [ $? != 2 ] + then + return 0; + fi + + CLUSTER="${1:-${O2CB_BOOTCLUSTER}}" + if [ -z "$CLUSTER" ] + then + return 1; + fi + + echo -n "Checking cluster $CLUSTER: " + check_online $CLUSTER + if [ $? = 2 ] + then + echo "Online" + else + echo "Offline" + return 0; + fi + + echo -n "Checking 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" + ;; + + 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|status}" + exit 1 + ;; +esac + +exit 0 diff --git a/ocfs2.init b/ocfs2.init new file mode 100644 index 0000000..cfd6459 --- /dev/null +++ b/ocfs2.init @@ -0,0 +1,173 @@ +#! /bin/bash +# Copyright (c) 2005 Oracle +# All rights reserved. +# +# chkconfig: 2345 25 19 +# description: Mount OCFS2 volumes at boot. +# +### BEGIN INIT INFO +# Provides: ocfs2 +# Required-Start: $network o2cb +# Required-Stop: +# X-UnitedLinux-Should-Start: +# X-UnitedLinux-Should-Stop: +# Default-Start: 2 3 5 +# Default-Stop: +# Description: Mount OCFS2 volumes at boot. +### END INIT INFO + +if [ -f /etc/redhat-release ] +then +. /etc/init.d/functions + +init_status() +{ + return 0 +} + +success_status() +{ + success + echo +} + +failure_status() +{ + failure $1 + echo +} + +exit_status() +{ + exit $? +} +elif [ -f /etc/SuSE-release -o -f /etc/UnitedLinux-release ] +then +. /etc/rc.status + +init_status() +{ + rc_reset +} + +success_status() +{ + /bin/true + rc_status -v +} + +failure_status() +{ + /bin/false + rc_status -v +} + +exit_status() +{ + rc_exit +} +else +init_status() +{ + return 0 +} + +success_status() +{ + echo "OK" + return 0 +} + +failure_status() +{ + echo "Failed" + return 0 +} + +exit_status() +{ + exit $? +} +fi + +ocfs2mounts() +{ + LC_ALL=C awk '$3 == "ocfs2" { print $2 }' /proc/mounts +} + +ocfs2fstab() +{ + LC_ALL=C awk '!/^#/ && $3 == "ocfs2" && $4 !~ /noauto/ { print $2 }' /etc/fstab +} + +init_status + +FUSER=`which fuser` + +case "$1" in + start|reload) + if [ -n "`ocfs2fstab`" ] ; then + echo -n "Starting Oracle Cluster File System (OCFS2) " + mount -at ocfs2 + if [ $? = 0 ] + then + success_status + else + failure_status "Unable to mount OCFS2 filesystems" + fi + fi + ;; + stop) + echo -n "Stopping Oracle Cluster File System (OCFS2) " + remaining="`ocfs2mounts`" + sig= + retry=3 + while [ -n "$remaining" -a "$retry" -gt 0 ] + do + if [ "$retry" -lt 3 ]; then + echo -n "Retry stopping Oracle Cluster File System (OCFS2) " + fi + umount -a -t ocfs2 2>/dev/null + sleep 1 + + remaining="`ocfs2mounts`" + [ -z "$remaining" ] && break + failure_status "Unable to unmount OCFS2 filesystems" + + $FUSER -km $sig $remaining >/dev/null + sleep 5 + retry=$(($retry - 1)) + sig=-9 + done + [ -z "$remaining" ] && success_status + ;; + restart|force-reload) + $0 stop + $0 start + ;; + status) + if [ -f /proc/mounts ] ; then + [ -n "`ocfs2fstab`" ] && { + echo "Configured OCFS2 mountpoints: " `ocfs2fstab` + } + + [ -n "`ocfs2mounts`" ] && { + echo "Active OCFS2 mountpoints: " `ocfs2mounts` + } + else + echo -n "Checking OCFS2 mountpoints: " + failure_status + fi + ;; + try-restart|condrestart) + $0 status + if test $? = 0; then + $0 restart + fi + ;; + *) + echo "Usage: $0 {start|stop|status|reload|force-reload|restart|try-restart}" + exit 1 +esac + +exit_status -- 2.43.0