#!/sbin/openrc-run # Copyright 1999-2014 Gentoo Foundation # Distributed under the terms of the GNU General Public License, v2 or later extra_started_commands="reload" depend() { use logger need net before heartbeat after sshd } DEFAULTFILE="/etc/conf.d/drbd" DRBDADM="/usr/sbin/drbdadm" PROC_DRBD="/proc/drbd" MODPROBE="/sbin/modprobe" RMMOD="/sbin/rmmod" UDEV_TIMEOUT=10 ADD_MOD_PARAM="" PATH=${PATH}:/lib/drbd:/lib64/drbd if [ -f $DEFAULTFILE ]; then . $DEFAULTFILE fi # 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() { [ -e "$PROC_DRBD" ] && return ebegin "Loading drbd module" ret=0 $MODPROBE -s drbd `$DRBDADM sh-mod-parms` $ADD_MOD_PARAM || ret=20 eend $ret return $ret } adjust_with_progress() { IFS_O=$IFS NEWLINE=' ' IFS=$NEWLINE local D=0 local S=0 local N=0 einfon "Setting drbd parameters " COMMANDS=`$DRBDADM -d adjust all` || { eend 20 "Error executing drbdadm" return 20 } echo -n "[ " for CMD in $COMMANDS; do if echo $CMD | grep -q disk; then echo -n "d$D "; D=$(( D+1 )); elif echo $CMD | grep -q syncer; then echo -n "s$S "; S=$(( S+1 )); elif echo $CMD | grep -q net; then echo -n "n$N "; N=$(( N+1 )); else echo -n ".. "; fi IFS=$IFS_O eval $CMD || { echo eend 20 "cmd $CMD failed!" return 20 } IFS=$NEWLINE done echo "]" eend 0 IFS=$IFS_O } start() { einfo "Starting DRBD resources:" eindent assure_module_is_loaded || return $? adjust_with_progress || return $? # make sure udev has time to create the device files ebegin "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 eend 0 einfon "Waiting for connection " $DRBDADM wait-con-int ret=$? echo sleep 5 einfon "Become primary if configured " $DRBDADM sh-b-pri all echo eend $ret return $ret } stop() { ebegin "Stopping all DRBD resources" # Check for mounted drbd devices if ! grep -q '^/dev/drbd' /proc/mounts &>/dev/null; then if [ -e ${PROC_DRBD} ]; then ${DRBDADM} down all ret=$? sleep 3 if [ -e /proc/modules ] && grep -q '^drbd' /proc/modules ; then ${RMMOD} drbd fi fi eend $ret return $ret else einfo "drbd devices mounted, please umount them before trying to stop drbd!" eend 1 return 1 fi } status() { # NEEDS to be heartbeat friendly... # so: put some "OK" in the output. if [ -e $PROC_DRBD ]; then ret=0 ebegin "drbd driver loaded OK; device status:" eend $ret cat $PROC_DRBD else ebegin "drbd not loaded" ret=3 eend $ret fi return $ret } reload() { ebegin "Reloading DRBD" ${DRBDADM} adjust all ret=$? eend $ret return $ret }