#
# Copyright (C) 2003 VA Linux Systems Japan, K.K.
#
# LICENSE NOTICE
#
#  This program is free software; you can redistribute it and/or modify
#  it under the terms of the GNU General Public License as published by
#  the Free Software Foundation; either version 2 of the License, or
#  (at your option) any later version.
#
#  This program is distributed in the hope that it will be useful,
#  but WITHOUT ANY WARRANTY; without even the implied warranty of
#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#  GNU General Public License for more details.
#

# $Id: 11failover,v 1.1 2004/06/24 08:42:59 taru Exp $

case "x$MODULECATEGORY" in

  xserver|x)

if test "x$cache" = "x"; then

# Virtual IP
VIRTUAL=$(ultrapossum_getconf VIRTUAL $VIRTUAL)

# Failover configuration for slurpd
ULTRAPOSSUM_RECOVERY_CONFIN=$(ultrapossum_getconf ULTRAPOSSUM_RECOVERY_CONFIN $TEMPLATEDIR/recovery.conf.in)
ULTRAPOSSUM_RECOVERY_CONF=$(ultrapossum_getconf ULTRAPOSSUM_RECOVERY_CONF $CONFDIR/recovery.conf)

# Mon configuration
ULTRAPOSSUM_MON_CFIN=$(ultrapossum_getconf ULTRAPOSSUM_MON_CFIN $TEMPLATEDIR/ultrapossum.mon.cf.in)
ULTRAPOSSUM_MON_CF=$(ultrapossum_getconf ULTRAPOSSUM_MON_CF $CONFDIR/ultrapossum.mon.cf)
MONPIDFILE=$(ultrapossum_getconf MONPIDFILE /var/run/mon/mon.pid)
MONCF=$(ultrapossum_getconf MONCF $monsysconfdir/mon.cf)
MONUSER=$(ultrapossum_getconf MONUSER daemon)
SUDOERS=$(ultrapossum_getconf SUDOERS $sudoersdir/sudoers)

FAILOVER_LDAP_INTERVAL=$(ultrapossum_getconf FAILOVER_LDAP_INTERVAL 10)
FAILOVER_LDAP_FAILURE_INTERVAL=$(ultrapossum_getconf FAILOVER_LDAP_FAILURE_INTERVAL 2)
FAILOVER_LDAP_ALERTAFTER=$(ultrapossum_getconf FAILOVER_LDAP_ALERTAFTER 10)

# HeartBeat configuration
halocalstatedir=$(ultrapossum_getconf halocalstatedir $halocalstatedir)
HA_DIR=$(ultrapossum_getconf HA_DIR $hasysconfdir)
HACF=$(ultrapossum_getconf HACF $HA_DIR/ha.cf)
HARESOURCES=$(ultrapossum_getconf HARESOURCES $HA_DIR/haresources)
AUTHKEYS=$(ultrapossum_getconf AUTHKEYS $HA_DIR/authkeys)
HAPIDFILE=$(ultrapossum_getconf HAPIDFILE $halocalstatedir/run/heartbeat.pid)

ULTRAPOSSUMSERVICES=$(ultrapossum_getconf ULTRAPOSSUMSERVICES "ldap mon")

# Load balancer
LOADBALANCER=$(ultrapossum_getconf LOADBALANCER localhost)

BACKUP=$(ultrapossum_getconf BACKUP "")

fi # cache

eval "`ultrapossum_parse_config failover`"

if test "x$cache" = "x"; then

if test "x$BACKUP" != "x" && test "x$NFSDIR" != "x"; then
  REPLOGFILE=$NFSDIR/$RPLDIR/$HOST/replog
fi

if test "x$SLAVES$BACKUP" != "x"; then
  if test "x$HOST" = "x$MASTER"; then
    ANOTHER_MASTER=$BACKUP
  elif test "x$HOST" = "x$BACKUP"; then
    ANOTHER_MASTER=$MASTER
  else
  #    echo "W: $HOST doesn't match master or backup" 1>&2
  #    echo "W: Assuming master steup" 1>&2
    ANOTHER_MASTER=$BACKUP
  fi
  REPLICAS="$ANOTHER_MASTER $REPLICAS"
fi

if test -f "$HACF"; then
  HEARTBEAT_NICE_FAILBACK=`grep ^nice_failback $HACF | awk -F' ' '{print $2;}'`
fi

if test "x$HOST" = "x$BACKUP"; then
  TYPE=master
fi

fi

if test "x$ULTRAPOSSUM_MODULE_FAILOVER" = "xinstalled"; then

wait_master_service() {
  (for i in 1 2 2 3 3 3 5 5 5 5 10 10 10 10 10 20 20 20
    do
      if test "`ldapmaster_status`" = "running"; then
        exit 0
      fi
    if test "`$MODULEDIR/server/pid status $HAPIDFILE`" = "stopped"; then
      exit 1
    fi
    sleep $i
    echo -n "."
    done
    echo "timeout" 1>&2
    exit 1) || exit 1
  echo -n " `basename $SLAPD`"
  if test "x$SLURPDSLAVES" != "x"; then
    $MODULEDIR/server/pid wait $SLURPD_PIDFILE
    echo -n " `basename $SLURPD`"
  fi
  $MODULEDIR/server/pid wait $MONPIDFILE
  echo -n " mon"
}

wait_nicefailback_service()
{
  (for i in 1 2 2 3 3 3 5 5 5 5 10 10 10 10 10 20 20 20
    do
      if test "`$MODULEDIR/server/startup status`" = "running"; then
        exit 0
      fi
    if test "`$MODULEDIR/server/pid status $HAPIDFILE`" = "stopped"; then
      exit 1
    fi
    sleep $i
    echo -n "."
    done
    echo "timeout" 1>&2
    exit 1) || exit 1
  if test "`ldapmaster_status`" = "running"; then
    wait_master_service
  elif include "$BACKUP" "$SYNCBACKUPS"; then
    echo -n " `basename $SLAPD`"
  else   
    echo -n " "
    ldapslave_start
  fi
}

ldapmaster_service_start()
{
  if test "x$BACKUP" = "x" ; then
    ldapmaster_start
  else
    if include "$BACKUP" "$SYNCBACKUPS"; then
      ldapslave_start
      echo -n " "
    fi
    /etc/init.d/heartbeat start | grep ERROR 1>&2 && exit 1
    echo -n "heartbeat"
    if test "x$HOST" = "x$MASTER" && test "x$HEARTBEAT_NICE_FAILBACK" = "x"; then
      wait_master_service
    else
      wait_nicefailback_service
    fi
  fi
}

ldapmaster_service_stop()
{

  if test "x$BACKUP" = "x" ; then
    ldapmaster_stop > /dev/null
    ldapslave_stop
  else
    if test "`ldapslurp_status`" = "running"; then
      slurpd_running=1
    fi
    /etc/init.d/heartbeat stop | grep ERROR 1>&2 && exit 1
    if test "x$HOST" = "x$MASTER"; then
      $MODULEDIR/server/pid stop $HAPIDFILE
      if test `ldapmaster_status` = "running"; then
        echo -n " W: master running even though heartbeat stop " 1>&2
        ldapmaster_stop
      else
        if test "`$MODULEDIR/server/pid status $MONPIDFILE`" = "running"; then
          echo -n " W: mon running even though heartbeat stop " 1>&2
	  $MODULEDIR/server/pid stop $MONPIDFILE
	fi
	echo -n "mon"
        if test "$slurpd_running" = "1"; then
	  if test "`ldapslurp_status`" = "running"; then
            echo -n " W: slurpd running even though heartbeat stop " 1>&2
	    ldapslurp_stop
	  else
	    echo -n " `basename $SLURPD`"
	  fi
	fi
        echo -n " `basename $SLAPD`"
      fi
      echo -n " heartbeat"
      if include "$HOST" "$SYNCBACKUPS"; then
        echo -n " "
        ldapslave_stop
      fi
    else
      echo -n "heartbeat "
      ldapslave_stop
    fi

  fi

}

ldapslurp_start() {
  rpldir="$NFSDIR/$RPLDIR/$HOST"
  install -d $rpldir
  $SLURPD -d $SLURPD_DEBUGLEVEL -f $ULTRAPOSSUM_MASTER_SLAPD_CONF -t $rpldir $SLURPD_EXTRA_ARGS &
  echo $! > $SLURPD_PIDFILE
  $MODULEDIR/server/pid wait $SLURPD_PIDFILE
  echo -n " `basename $SLURPD`"
}

fi

  ;;

esac
