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