summaryrefslogtreecommitdiffstats
path: root/cluster/drbd/init.d/drbd
diff options
context:
space:
mode:
Diffstat (limited to 'cluster/drbd/init.d/drbd')
-rwxr-xr-xcluster/drbd/init.d/drbd171
1 files changed, 171 insertions, 0 deletions
diff --git a/cluster/drbd/init.d/drbd b/cluster/drbd/init.d/drbd
new file mode 100755
index 0000000000..f8395c795c
--- /dev/null
+++ b/cluster/drbd/init.d/drbd
@@ -0,0 +1,171 @@
+#!/bin/bash
+
+# Distributed under the terms of the GNU General Public License v2
+#
+# Copyright 2001-2010 LINBIT Information Technologies
+# Philipp Reisner, Lars Ellenberg
+#
+# Copyright 2010-2011 Source Mage Team
+# Vlad Glagolev
+
+PROGRAM=/bin/false
+RUNLEVEL=3
+NEEDS="+local_fs +network"
+
+. /etc/init.d/smgl_init
+
+DRBDADM="/sbin/drbdadm"
+DRBDSETUP="/sbin/drbdsetup"
+PROC_DRBD="/proc/drbd"
+MODPROBE="/sbin/modprobe"
+RMMOD="/sbin/rmmod"
+UDEV_TIMEOUT=10
+ADD_MOD_PARAM=""
+
+function assure_module_is_loaded {
+ [ -e "$PROC_DRBD" ] && return
+ echo "Loading drbd module..."
+
+ $MODPROBE -s drbd `$DRBDADM sh-mod-parms` $ADD_MOD_PARAM || return 1
+
+ return 0
+}
+
+function adjust_with_progress {
+ local IFS_O=$IFS
+ local IFS=$'\n'
+ local res out
+
+ COMMANDS=`$DRBDADM -d -n res adjust all` || return 1
+
+ echo -n "[ "
+
+ for CMD in $COMMANDS; do
+ IFS=$IFS_O
+
+ case "$CMD" in
+ res=*)
+ eval "$CMD"
+ ;;
+ *\ disk\ *)
+ # Check for offline resize. If using internal meta data,
+ # we may need to move it first to its expected location.
+ out=$($DRBDADM check-resize "$res" 2>&1)
+ [[ -z $out ]] ||
+ printf "\n%s\n%s\n" "$res" "$out"
+ echo -n "d($res) "
+ ;;
+ *\ syncer\ *)
+ echo -n "s($res) "
+ ;;
+ *\ net\ *)
+ echo -n "n($res) "
+ ;;
+ *)
+ echo ".. "
+ ;;
+ esac
+
+ if ! eval "$CMD"; then
+ printf "[%s] cmd %s failed - continuing!\n" "$res" "$CMD"
+ fi
+ done
+
+ echo -n "]"
+
+ return 0
+}
+
+start() {
+ # Just in case drbdadm want to display any errors in the configuration
+ # file, or we need to ask the user about registering this installation
+ # at http://usage.drbd.org, we call drbdadm here without any IO
+ # redirection.
+ $DRBDADM sh-nop
+
+ assure_module_is_loaded
+ evaluate_retval
+
+ echo "Starting DRBD resources:"
+
+ adjust_with_progress
+ evaluate_retval
+
+ # make sure udev has time to create the device files
+ echo "Waiting for udev device creation..."
+
+ for RESOURCE in `$DRBDADM sh-resources`; do
+ for DEVICE in `$DRBDADM sh-dev $RESOURCE`; do
+ UDEV_TIMEOUT_LOCAL=$UDEV_TIMEOUT
+ while [[ ! -e $DEVICE ]] && [[ $UDEV_TIMEOUT_LOCAL -gt 0 ]]; do
+ sleep 1
+ UDEV_TIMEOUT_LOCAL=$(( $UDEV_TIMEOUT_LOCAL-1 ))
+ done
+ done
+ done
+
+ echo "Waiting for connection "
+ $DRBDADM wait-con-int # User interruptible version of wait-connect all
+ $DRBDADM sh-b-pri all # Become primary if configured
+
+ evaluate_retval
+}
+
+stop() {
+ $DRBDADM sh-nop
+ echo "Stopping all DRBD resources..."
+
+ if [ -e $PROC_DRBD ]; then
+ # bypass drbdadm and drbd config file and everything,
+ # to avoid leaving devices around that are not referenced by
+ # the current config file, or in case the current config file
+ # does not parse for some reason.
+ for d in /dev/drbd* ; do
+ [ -L "$d" ] && continue
+ [ -b "$d" ] || continue
+
+ M=$(umount "$d" 2>&1)
+
+ case $M in
+ *" not mounted")
+ :
+ ;;
+ *)
+ echo "$M" >&2
+ ;;
+ esac
+
+ $DRBDSETUP "$d" down
+ done
+
+ $RMMOD drbd
+ fi
+
+ evaluate_retval
+}
+
+status() {
+ if [ -e $PROC_DRBD ]; then
+ echo "device status:"
+ cat $PROC_DRBD
+ else
+ echo "drbd module not loaded"
+ return 1
+ fi
+}
+
+restart() {
+ echo "Restarting all DRBD resources..."
+
+ stop
+ sleep 1
+ start
+}
+
+reload() {
+ $DRBDADM sh-nop
+ echo "Reloading DRBD configuration..."
+ $DRBDADM adjust all
+
+ evaluate_retval
+}