#
# 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.16.2.1 2004/11/01 12:30:40 taru Exp $

case "x$MODULECATEGORY" in

  xserver|x)

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

if test "x$PIDTICK" = "x1 2 3 4 5 6 7 8 9 10"; then
  PIDTICK=""
fi
PIDTICK=$(ultrapossum_getconf PIDTICK "1 2 3 4 5 6 7 8 9 10 10 10 10 10 10 10")

# 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)
FAILOVER_RECOVERY_PIDFILE=$(ultrapossum_getconf FAILOVER_RECOVERY_PIDFILE "$localstatedir/run/ultrapossum.recovery.pid")

# 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)
MONLIBDIR=$(ultrapossum_getconf MONLIBDIR "$monlibdir")
MONPIDFILE=$(ultrapossum_getconf MONPIDFILE "$monpidfile")
MONCF=$(ultrapossum_getconf MONCF $monsysconfdir/mon.cf)
MONUSER=$(ultrapossum_getconf MONUSER daemon)
SUDOERS=$(ultrapossum_getconf SUDOERS $sudoersdir/sudoers)

FAILOVER_STATUSCPY_PIDFILE=$(ultrapossum_getconf FAILOVER_STATUSCPY_PIDFILE $localstatedir/run/statuscpy.pid)
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)

# NFS

FSTAB=$(ultrapossum_getconf FSTAB "/etc/fstab")
VFSTAB=$(ultrapossum_getconf VFSTAB "/etc/vfstab")
SHAREFSTYPE=$(ultrapossum_getconf SHAREFSTYPE "nfs")

if test "$UNAME" != "SunOS"; then

  c="`cat /proc/mounts | grep ' $SHAREFSTYPE ' | head -1`"
  f="`grep $SHAREFSTYPE $FSTAB | head -1`"

  NFSDIR=$(ultrapossum_getconf NFSDIR "`echo $c | cut -d' ' -f2`")
  if test "x$NFSDIR" = "x"; then
    NFSDIR="`echo $f | awk -F' ' '{print $2;}'`"
  fi
  
  NFSDEVICE=$(ultrapossum_getconf NFSDEVICE "`echo $c | cut -d' ' -f1`")
  if test "x$NFSDEVICE" = "x"; then
    NFSDEVICE="`echo $f | awk -F' ' '{print $1;}'`"
  fi

  SHAREFSOPTIONS=$(ultrapossum_getconf SHAREFSOPTIONS "`echo $c | cut -d' ' -f4`")
  if test "x$SHAREFSOPTIONS" = "x"; then
    SHAREFSOPTIONS="`echo $f | awk -F' ' '{print $4;}'`"
  fi

else
  NFSDIR=$(ultrapossum_getconf NFSDIR "`grep $SHAREFSTYPE $VFSTAB | awk -F' ' '{print $3;}' | head -1`")
  NFSDEVICE=$(ultrapossum_getconf NFSDEVICE "`grep $SHAREFSTYPE $VFSTAB | awk -F' ' '{print $1;}' | head -1`")
fi

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
  LOCAL_REPLOGFILE=$REPLOGFILE
  REPLOGFILE=$NFSDIR/$RPLDIR/$HOST/replog
  SLURPDRPLDIR=$NFSDIR/$RPLDIR/$HOST
else
  SLURPDRPLDIR=$RPLDIR
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;}'`
  HEARTBEAT_AUTO_FAILBACK=`grep ^auto_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() {
  $MODULEDIR/server/pid -t "$PIDTICK" wait $SLAPD_PIDFILE
  echo -n " `basename $SLAPD`"
  if test "x$SLURPDSLAVES" != "x"; then
    $MODULEDIR/server/pid -t "$PIDTICK" wait $SLURPD_PIDFILE
    echo -n " `basename $SLURPD`"
  fi
  $MODULEDIR/server/pid -t "$PIDTICK" wait $MONPIDFILE
  echo -n " mon"
}

wait_backup_service()
{
  # handle initdead case
  (for i in 1 2 2 3 3 3 5 5 5 5 10 10 10 10 10 20 20 20
   do
    # started as master service
    if test "`ldapmaster_status`" = "running"; then
      wait_master_service
      exit 0
    # started as slave service
    elif test "`ldapslave_status`" = "running"; then
      exit 0
    fi
    sleep $i
    echo -n "."
   done
   echo "timeout" 1>&2
   exit 1 ) || exit 1
}

ldapmaster_service_start()
{
  if test "x$BACKUP" = "x" ; then
    ldapmaster_start
  else
    if test "x$HEARTBEAT_NICE_FAILBACK" != "x" &&
       test "x$HEARTBEAT_AUTO_FAILBACK" = "xoff" ||
       include "$HOST" "$SYNCBACKUPS" ||
       test "x$HOST" = "x$BACKUP"
    then
      if test "x`$MODULEDIR/server/startup slave_status`" = "xstopped"; then
        ldapslave_start
        echo -n " "
      fi
    fi
    /etc/init.d/heartbeat start | grep ERROR 1>&2 && exit 1
    $MODULEDIR/server/pid -t "$PIDTICK" wait $HAPIDFILE
    echo -n "heartbeat"
    if test "x$HOST" = "x$MASTER"; then
      if test "x$HEARTBEAT_NICE_FAILBACK" = "x" && test "x$HEARTBEAT_AUTO_FAILBACK" != "xoff"; then
        wait_master_service
      else
        wait_backup_service
      fi
    else
      wait_backup_service
    fi
  fi
}

ldapmaster_service_stop()
{

  if test "x$BACKUP" = "x" ; then
    ldapmaster_stop
    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 -t "$PIDTICK" 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 -t "$PIDTICK" 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() {
  install -d $SLURPDRPLDIR
  $SHAREDIR/envexec $SLURPD -d $SLURPD_DEBUGLEVEL -f $ULTRAPOSSUM_MASTER_SLAPD_CONF -t $SLURPDRPLDIR $SLURPD_EXTRA_ARGS &
  echo $! > $SLURPD_PIDFILE
  $MODULEDIR/server/pid -t "$PIDTICK" wait $SLURPD_PIDFILE
  echo -n " `basename $SLURPD`"
}

fi

  ;;

esac
