--- /dev/null
+#!/bin/bash
+
+# lhbadm - handle some common heartbeat/lustre failover ops
+
+PATH=/sbin:/usr/sbin:/usr/bin:$PATH:/usr/lib64/heartbeat:/usr/lib/heartbeat
+
+declare -r prog=lhbadm
+
+die ()
+{
+ echo "$prog: $@"
+ exit 1
+}
+
+warn ()
+{
+ echo "$prog: $@"
+}
+
+usage ()
+{
+ echo "Usage: $prog status|lstatus|failback|failover"
+ echo " status - print one-line heartbeat-lustre status"
+ echo " failover - fail all my active resources over to partner"
+ echo " failback - fail my normal resources back"
+ exit 1
+}
+
+test_mounts ()
+{
+ local label
+ local lcount=0
+ local fcount=0
+ local ltot=0
+ local ftot=0
+
+ for label in $(ldev -l); do
+ ltot=$((ltot + 1))
+ if [ "$(service lustre status $label)" == "running" ]; then
+ lcount=$((lcount + 1))
+ fi
+ done
+ for label in $(ldev -f); do
+ ftot=$((ftot+ 1))
+ if [ "$(service lustre status $label)" == "running" ]; then
+ fcount=$((fcount + 1))
+ fi
+ done
+
+ if [ $(($lcount + $fcount)) == 0 ]; then
+ echo none
+ elif [ $lcount == $ltot -a $fcount == 0 ]; then
+ echo local
+ elif [ $lcount == 0 -a $fcount == $ftot ]; then
+ echo foreign
+ elif [ $lcount == $ltot -a $fcount == $ftot ]; then
+ echo all
+ else
+ echo partial
+ fi
+}
+
+status ()
+{
+ local rstat fstat
+ local labels
+
+ rstat=$(cl_status rscstatus) || die "cl_status rscstatus failed"
+ fstat=$(service lustre status)
+
+ if [ "$fstat" == "running" ]; then
+ fstat=$(test_mounts)
+ fi
+
+ echo $rstat-$fstat
+}
+
+wait_for_transition ()
+{
+ while sleep 5; do
+ state=$(cl_status rscstatus) || die "cl_status rscstatus failed"
+ [ "$state" == "transition" ] || break
+ done
+}
+
+failover ()
+{
+ local s
+
+ [ "$(id -un)" == "root" ] || die "failover requires root privileges"
+ [ $# -gt 0 ] || die "please include a descriptive reason for the logs"
+
+ s=$(status)
+ logger -s -t Lustre-ha -p user.err "failover start, status=$s, reason: $*"
+
+ hb_standby all 2>/dev/null 1>&2 || die "hb_standby all failed"
+ wait_for_transition
+
+ s=$(status)
+ logger -s -t Lustre-ha -p user.err "failover complete, status=$s"
+}
+
+failback ()
+{
+ local s
+
+ [ "$(id -un)" == "root" ] || die "failback requires root privileges"
+ [ $# -gt 0 ] || die "please include a descriptive reason for the logs"
+
+ s=$(status)
+ logger -s -t Lustre-ha -p user.err "failback start, status=$s, reason: $*"
+
+ hb_takeover local || die "hb_takeover local failed"
+ wait_for_transition
+
+ s=$(status)
+ logger -s -t Lustre-ha -p user.err "failover complete, status=$s"
+}
+
+
+#
+# MAIN
+#
+
+[ $# == 0 ] && usage
+[ -x /usr/bin/cl_status ] || die "Heartbeat is not installed"
+hstat=$(cl_status hbstatus) || die "$hstat"
+
+case "$1" in
+ status) status ;;
+ lstatus) lstatus ;;
+ failback) shift; failback $*;;
+ failover) shift; failover $*;;
+ *) usage ;;
+esac
+
+# vi: ts=4 sw=4 expandtab