Created
July 30, 2014 07:58
-
-
Save hogem/6946ca6338afc1ff3d2d to your computer and use it in GitHub Desktop.
/etc/ha.d/resource.d/drbddisk
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
# | |
# This script is inteded to be used as resource script by heartbeat | |
# | |
# Copright 2003-2008 LINBIT Information Technologies | |
# Philipp Reisner, Lars Ellenberg | |
# | |
### | |
DEFAULTFILE="/etc/default/drbd" | |
DRBDADM="/sbin/drbdadm" | |
if [ -f $DEFAULTFILE ]; then | |
. $DEFAULTFILE | |
fi | |
if [ "$#" -eq 2 ]; then | |
RES="$1" | |
CMD="$2" | |
else | |
RES="all" | |
CMD="$1" | |
fi | |
## EXIT CODES | |
# since this is a "legacy heartbeat R1 resource agent" script, | |
# exit codes actually do not matter that much as long as we conform to | |
# http://wiki.linux-ha.org/HeartbeatResourceAgent | |
# but it does not hurt to conform to lsb init-script exit codes, | |
# where we can. | |
# http://refspecs.linux-foundation.org/LSB_3.1.0/ | |
# LSB-Core-generic/LSB-Core-generic/iniscrptact.html | |
#### | |
drbd_set_role_from_proc_drbd() | |
{ | |
local out | |
if ! test -e /proc/drbd; then | |
ROLE="Unconfigured" | |
return | |
fi | |
dev=$( $DRBDADM sh-dev $RES ) | |
minor=${dev#/dev/drbd} | |
if [[ $minor = *[!0-9]* ]] ; then | |
# sh-minor is only supported since drbd 8.3.1 | |
minor=$( $DRBDADM sh-minor $RES ) | |
fi | |
if [[ -z $minor ]] || [[ $minor = *[!0-9]* ]] ; then | |
ROLE=Unknown | |
return | |
fi | |
if out=$(sed -ne "/^ *$minor: cs:/ { s/:/ /g; p; q; }" /proc/drbd); then | |
set -- $out | |
ROLE=${5%/*} | |
: ${ROLE:=Unconfigured} # if it does not show up | |
else | |
ROLE=Unknown | |
fi | |
} | |
case "$CMD" in | |
start) | |
# try several times, in case heartbeat deadtime | |
# was smaller than drbd ping time | |
try=6 | |
while true; do | |
$DRBDADM primary $RES && break | |
let "--try" || exit 1 # LSB generic error | |
sleep 1 | |
done | |
;; | |
stop) | |
# heartbeat (haresources mode) will retry failed stop | |
# for a number of times in addition to this internal retry. | |
try=3 | |
while true; do | |
$DRBDADM secondary $RES && break | |
# We used to lie here, and pretend success for anything != 11, | |
# to avoid the reboot on failed stop recovery for "simple | |
# config errors" and such. But that is incorrect. | |
# Don't lie to your cluster manager. | |
# And don't do config errors... | |
let --try || exit 1 # LSB generic error | |
sleep 1 | |
done | |
;; | |
status) | |
if [ "$RES" = "all" ]; then | |
echo "A resource name is required for status inquiries." | |
exit 10 | |
fi | |
ST=$( $DRBDADM role $RES ) | |
ROLE=${ST%/*} | |
case $ROLE in | |
Primary|Secondary|Unconfigured) | |
# expected | |
;; | |
*) | |
# unexpected. whatever... | |
# If we are unsure about the state of a resource, we need to | |
# report it as possibly running, so heartbeat can, after failed | |
# stop, do a recovery by reboot. | |
# drbdsetup may fail for obscure reasons, e.g. if /var/lock/ is | |
# suddenly readonly. So we retry by parsing /proc/drbd. | |
drbd_set_role_from_proc_drbd | |
esac | |
case $ROLE in | |
Primary) | |
echo "running (Primary)" | |
exit 0 # LSB status "service is OK" | |
;; | |
Secondary|Unconfigured) | |
echo "stopped ($ROLE)" | |
exit 3 # LSB status "service is not running" | |
;; | |
*) | |
# NOTE the "running" in below message. | |
# this is a "heartbeat" resource script, | |
# the exit code is _ignored_. | |
echo "cannot determine status, may be running ($ROLE)" | |
exit 4 # LSB status "service status is unknown" | |
;; | |
esac | |
;; | |
*) | |
echo "Usage: drbddisk [resource] {start|stop|status}" | |
exit 1 | |
;; | |
esac | |
exit 0 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment