blob: 07670247369ef4ceeaf52bee8dc802b2a50436aa [file] [log] [blame]
#!/bin/sh
#
# DRBD fence-peer handler for Pacemaker 1.1 clusters
# (via stonith-ng).
#
# Requires that the cluster is running with STONITH
# enabled, and has configured and functional STONITH
# agents.
#
# Also requires that the DRBD disk fencing policy
# is at least "resource-only", but "resource-and-stonith"
# is more likely to be useful as most people will
# use this in dual-Primary configurations.
#
# Returns 7 on on success (DRBD fence-peer exit code
# for "yes, I've managed to fence this node").
# Returns 1 on any error (undefined generic error code,
# causes DRBD devices with the "resource-and-stonith"
# fencing policy to remain suspended).
log() {
local msg
msg="$1"
logger -i -t "`basename $0`" -s "$msg"
}
die() { log "$*"; exit 1; }
die_unless_all_minors_up_to_date()
{
set -- $DRBD_MINOR
local n_minors=$#
[ $n_minors != 0 ] ||
die "Resource minor numbers unknown! Unable to proceed."
# and build a "grep extended regex"
local _OLDIFS=$IFS
IFS="|"
local minor_regex="^ *($*): cs:"
IFS=$_OLDIFS
# grep -c -Ee '^ *(m|i|n|o|r|s): cs:.* ds:UpToDate' /proc/drbd
local proc_drbd=$(cat /proc/drbd)
local minors_of_resource=$(echo "$proc_drbd" | grep -E -e "$minor_regex")
local n_up_to_date=$(echo "$minors_of_resource" | grep -c -e "ds:UpToDate")
log "n_minors: $n_minors; n_up_to_date: $n_up_to_date"
[ "$n_up_to_date" = "$n_minors" ] ||
die "$DRBD_RESOURCE(minor $DRBD_MINOR): some minor is not UpToDate, will not fence peer."
}
[ -n "$DRBD_PEERS" ] || die "DRBD_PEERS is empty or unset, cannot continue."
die_unless_all_minors_up_to_date
for p in $DRBD_PEERS; do
stonith_admin --tolerance 5s --tag drbd --fence $p
rc=$?
if [ $rc -eq 0 ]; then
log "stonith_admin successfully fenced peer $p."
else
die "Failed to fence peer $p. stonith_admin returned $rc."
fi
done
exit 7