#!/bin/sh
#
#	$Id: heartbeat.in,v 1.41 2005/09/10 21:46:23 gshi Exp $
#
# heartbeat     Start high-availability services
#
# Author:       Alan Robertson	<alanr@unix.sh>
# License:      GNU General Public License (GPL)
#
#		This script works correctly under SuSE, Debian,
#		Conectiva, Red Hat and a few others.  Please let me know if it
#		doesn't work under your distribution, and we'll fix it.
#		We don't hate anyone, and like for everyone to use
#		our software, no matter what OS or distribution you're using.
#
# chkconfig: - 75 05
# description: Startup script high-availability services.
# processname: heartbeat
# pidfile: /var/run/heartbeat.pid
# config: /etc/ha.d/ha.cf

WITHOUT_RC_COMPAT=1

HA_DIR=/etc/ha.d; export HA_DIR
CONFIG=$HA_DIR/ha.cf
. $HA_DIR/shellfuncs

# exec 2>>/var/log/ha-debug

PROC_HA=$HA_BIN/ha.o
SUBSYS=heartbeat
INSMOD=/sbin/insmod
US=`uname -n`

LOCKFILE=/var/lock/subsys/$SUBSYS
RUNDIR=/var/run

# Solaris echo cannot use -n - linux echo by default cannot use \c
echo_n()
{
    echo -n "$*"
}

if
  [ -z "$rc_done" ]
then
  rc_done="Done."
  rc_failed="Failed."
  rc_skipped="Skipped."
fi


# Set this to a 1 if you want to automatically load kernel modules
USE_MODULES=1

[ -x $HA_BIN/heartbeat ] || exit 0

# Source function library.
. /etc/init.d/functions

#
#	See if they've configured things yet...
#
if
  [ ! -f $CONFIG ]
then
  echo_n "Heartbeat not configured: $CONFIG not found."
  echo_failure 1
  exit 0
fi

CheckBool() {
  case `echo "$1" | tr A-Z a-z` in
    y|yes|enable|on|true|1)	true;;
    *)				false;;
  esac
}
StartLogd() {

    $HA_BIN/ha_logd -s >/dev/null 2>&1

    if 
	[ $? -eq 0 ]
    then
	Echo "logd is already running" 
	return 0
    fi
    

    $HA_BIN/ha_logd -d >/dev/null 2>&1
    if 
	[ $? -ne 0 ]
    then
	Echo "starting logd failed"
    fi
    
}

StopLogd() {
    $HA_BIN/ha_logd -s >/dev/null 2>&1
    
    if 
	[ $? -ne 0 ] 
    then
	   Echo "logd is already stopped" 
	   return 0
    fi

    $HA_BIN/ha_logd -k >/dev/null 2>&1
    if 
	[ $? -ne 0 ]	
    then
	Echo "stopping logd failed"
    fi    
}

init_watchdog() {
  if
    [  -f /proc/devices -a  -x $INSMOD ]
  then
    init_watchdog_linux
  fi
}

#
#	Install the softdog module if we need to
#
init_watchdog_linux() {
#
# 	We need to install it if watchdog is specified in $CONFIG, and
#	/dev/watchdog refers to a softdog device, or it /dev/watchdog
#	doesn't exist at all.
#
#	If we need /dev/watchdog, then we'll make it if necessary.
#
#	Whatever the user says we should use for watchdog device, that's
#	what we'll check for, use and create if necessary.  If they misspell
#	it, or don't put it under /dev, so will we.
#	Hope they do it right :-)
#
#
  insmod=no
  # What do they think /dev/watchdog is named?
  MISCDEV=`grep ' misc$' /proc/devices | cut -c1-4`
  MISCDEV=`Echo $MISCDEV`
  WATCHDEV=`ha_parameter watchdog`
  WATCHDEV=`Echo $WATCHDEV`
  if
    [ "X$WATCHDEV" != X ]
  then
    : Watchdog requested by $CONFIG file
  #
  #	We try and insmod the module if there's no dev or the dev exists
  #	and points to the softdog major device.
  #
    if
      [ ! -c "$WATCHDEV" ]
    then
      insmod=yes
    else
      case `ls -l "$WATCHDEV" 2>/dev/null` in
      *$MISCDEV,*)
	    insmod=yes;;
      *)	: "$WATCHDEV isn't a softdog device (wrong major)" ;;
      esac
    fi
  else
    : No watchdog device specified in $CONFIG file.
  fi
  case $insmod in
    yes)
      if
        grep softdog /proc/modules >/dev/null 2>&1 
      then
        : softdog already loaded
      else
        $INSMOD softdog nowayout=0 >/dev/null 2>&1
      fi;;
  esac
  if
    [ "X$WATCHDEV" != X -a ! -c "$WATCHDEV" -a $insmod = yes ]
  then
    minor=`cat /proc/misc | grep watchdog | cut -c1-4`
    mknod -m 600 $WATCHDEV c $MISCDEV $minor
  fi
} # init_watchdog_linux()


#
#	Start the heartbeat daemon...
#

start_heartbeat() {
  if
    ERROR=`$HA_BIN/heartbeat 2>&1`
  then
    : OK
  else
    return $?
  fi
}


#
#	Start Linux-HA
#

StartHA() {
  echo_n "Starting High-Availability services: "

  if
    CheckBool "`ha_parameter crm`"
  then
    : OK
  else
    $HA_BIN/ResourceManager verifyallidle
  fi
  if
    [ $USE_MODULES = 1 ]
  then
    #	Create /dev/watchdog and load module if we should
    init_watchdog
  fi
  rm -f $RUNDIR/ppp.d/*
  if
    [  -f $HA_DIR/ipresources -a ! -f $HA_DIR/haresources ]
  then
    mv $HA_DIR/ipresources $HA_DIR/haresources
  fi
  mkdir -p "$RUNDIR"/heartbeat/ccm
  chmod 755 "$RUNDIR"/heartbeat/ccm
  chown hacluster:haclient "$RUNDIR"/heartbeat/ccm
  mkdir -p "$RUNDIR"/heartbeat/crm
  chmod 750 "$RUNDIR"/heartbeat/crm
  chown hacluster:haclient "$RUNDIR"/heartbeat/crm
  #	Start heartbeat daemon
  if
    start_heartbeat
  then
    echo_success
    return 0 
  else
    RC=$?
    echo_failure $RC
    if [ ! -z "$ERROR" ]; then
      Echo
      Echo "$ERROR"
    fi 
    return $RC
  fi
}

#
#	Ask heartbeat to stop.  It will give up its resources...
#
StopHA() {
  echo_n "Stopping High-Availability services: "

  if
    $HA_BIN/heartbeat -k &> /dev/null	# Kill it
  then
    echo_success
    return 0
  else
    RC=$?
    echo_failure $RC
    return $RC
  fi
}

StatusHA() {
  $HA_BIN/heartbeat -s
}

StandbyHA() {
  auto_failback=`ha_parameter auto_failback | tr 'A-Z' 'a-z'`
  nice_failback=`ha_parameter nice_failback | tr 'A-Z' 'a-z'`

  case "$auto_failback" in
    *legacy*)	echo "auto_failback is set to legacy.  Cannot enter standby."
		exit 1;;
  esac
  case "$nice_failback" in
    *off*)	echo "nice_failback is disabled.  Cannot enter standby."
		exit 1;;
  esac
  case "${auto_failback}${nice_failback}" in
    "")	echo "auto_failback defaulted to legacy.  Cannot enter standby."
		exit 1;;
  esac

  echo "auto_failback: $auto_failback"
  if
    StatusHA >/dev/null 2>&1
  then
    echo_n "Attempting to enter standby mode"
    if
      $HA_BIN/hb_standby
    then
      # It's impossible to tell how long this will take.
      echo_success
    else
      echo_failure $?
    fi
  else
    Echo "Heartbeat is not currently running."
    exit 1
  fi
}

#
#	Ask heartbeat to restart.  It will *keep* its resources
#
ReloadHA() {
  echo_n "Reloading High-Availability services: "

  if
    $HA_BIN/heartbeat -r # Restart, and keep your resources
  then
    echo_success
    return 0
  else
    RC=$?
    echo_failure $RC
    return $RC
  fi
}

RunStartStop() {
  # Run pre-startup script if it exists
  if
    [  -f $HA_DIR/resource.d/startstop ]
  then
    $HA_DIR/resource.d/startstop  "$@"
  fi
}

start()
{
	StartLogd
	RunStartStop pre-start
	StartHA
	RC=$?
	Echo
	[ $RC -eq 0 ] && touch $LOCKFILE
	RunStartStop post-start $RC
	return $RC
}

stop()
{
	RunStartStop "pre-stop"
	StopHA
	RC=$?
	Echo
	[ $RC -eq 0 ] && rm -f $LOCKFILE
        RunStartStop post-stop $RC
	StopLogd
	return $RC
}

restart()
{
        sleeptime=`ha_parameter deadtime`
	StopHA
	Echo
	echo_n Waiting to allow resource takeover to complete:
	sleep $sleeptime
	sleep 10 # allow resource takeover to complete (hopefully).
	echo_success
	Echo
	StartHA
	Echo
}

RC=0
# See how we were called.

case "$1" in
  start)
	start
  	;;

  standby)
	StandbyHA
        ;;

  status)
	StatusHA
	;;

  stop)
	stop
  	;;

  restart)
	restart
  	;;

  reload)
	ReloadHA
	;;
	
  condstop)
	if [ -e $LOCKFILE ]; then
	    stop
	fi
	;;
	
  condrestart)
	if [ -e $LOCKFILE ]; then
	    restart
	fi
	;;
	
  condreload)
	if [ -e $LOCKFILE ]; then
	    ReloadHA
	fi
	;;

  *)
 	msg_usage "${0##*/} {start|stop|status|standby|restart|reload|condstop|condrestart|condreload}"
	RC=1
esac

exit $RC
