#!/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