#!/usr/bin/env bash
#
# 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: recovery,v 1.17 2004/10/14 14:00:24 taru Exp $

set -e

eval `ultrapossum-config init`
trap "eval `ultrapossum-config term`" 0

if test "x$NFSDIR" = "x" && test "x$RPLDIR" = "x"; then
  echo "E: Need to specify both NFSDIR and RPLDIR" 1>&2
  exit 1
fi

WORKDIR=$LOGDIR/recovery/`date +%Y%m%d%H%M%S`
install -d $WORKDIR/replica/

SLURPDREPLOGFILE="$SLURPDRPLDIR/replica/slurpd.replog"
SLURPDSTATUSFILE="$SLURPDRPLDIR/replica/slurpd.status"

ANOTHER_REPLOGFILE="$NFSDIR/$RPLDIR/$ANOTHER_MASTER/replog"
ANOTHER_SLURPDREPLOGFILE="$NFSDIR/$RPLDIR/$ANOTHER_MASTER/replica/slurpd.replog"
ANOTHER_SLURPDSTATUSFILE="$NFSDIR/$RPLDIR/$ANOTHER_MASTER/replica/slurpd.status"

BACKUP_SLURPDSTATUSFILE="$NFSDIR/$RPLDIR/backup/slurpd.status"

WORK_REPLOGFILE=$WORKDIR/replog
WORK_SLURPDREPLOGFILE=$WORKDIR/replica/slurpd.replog
WORK_SLURPDSTATUSFILE=$WORKDIR/replica/slurpd.status

check_replog() {

  recover=0

  echo -n "Checking for $ANOTHER_REPLOGFILE... " 1>&2
  if [ $ANOTHER_REPLOGFILE -nt $REPLOGFILE ]; then
    $MODULEDIR/failover/checkreplog $ANOTHER_REPLOGFILE $WORK_REPLOGFILE
    echo "newer than $REPLOGFILE" 1>&2
    recover=1
  else
    touch $REPLOGFILE
    /bin/cp $REPLOGFILE $WORK_REPLOGFILE
    echo "up-to-date" 1>&2
  fi

  echo -n "Checking for $ANOTHER_SLURPDREPLOGFILE... " 1>&2
  if [ $ANOTHER_SLURPDREPLOGFILE -nt $SLURPDREPLOGFILE ]; then
    $MODULEDIR/failover/checkreplog $ANOTHER_SLURPDREPLOGFILE $WORK_SLURPDREPLOGFILE
    echo "newer than $SLURPDREPLOGFILE" 1>&2
    recover=1
  else
    touch $SLURPDREPLOGFILE
    /bin/cp $SLURPDREPLOGFILE $WORK_SLURPDREPLOGFILE
    echo "up-to-date" 1>&2
  fi

  echo -n "Checking for $ANOTHER_SLURPDSTATUSFILE... " 1>&2
  if [ $ANOTHER_SLURPDSTATUSFILE -nt $SLURPDSTATUSFILE ]; then
    if $MODULEDIR/failover/checkstatus -f $ULTRAPOSSUM_MASTER_SLAPD_CONF $ANOTHER_SLURPDSTATUSFILE; then
      /bin/cp $ANOTHER_SLURPDSTATUSFILE $WORK_SLURPDSTATUSFILE
      echo "newer than $SLURPDSTATUSFILE" 1>&2
    else
      if ! test -f "$BACKUP_SLURPDSTATUSFILE"; then
        echo "W: $BACKUP_SLURPDSTATUSFILE not found" 1>&2
        touch $BACKUP_SLURPDSTATUSFILE
      fi
      /bin/cp $BACKUP_SLURPDSTATUSFILE $WORK_SLURPDSTATUSFILE
      echo "newer than $BACKUP_SLURPDSTATUSFILE" 1>&2
    fi
    recover=1
  else
    touch $SLURPDSTATUSFILE
    /bin/cp $SLURPDSTATUSFILE $WORK_SLURPDSTATUSFILE
    echo "up-to-date" 1>&2
  fi

  if test "x$recover" != "x1"; then
    echo "Recovery not required" 1>&2
    /bin/rm -rf $WORKDIR
  fi

}

status() {
  echo "$SLURPDSTATUSFILE:" 1>&2
  cat $SLURPDSTATUSFILE
  echo "$ANOTHER_SLURPDSTATUSFILE:" 1>&2
  cat $ANOTHER_SLURPDSTATUSFILE
  if test -f "$WORK_SLURPDSTATUSFILE"; then
    echo "$WORK_SLURPDSTATUSFILE:" 1>&2
    cat $WORK_SLURPDSTATUSFILE
  fi
}

install -d `dirname $SLURPDREPLOGFILE` \
		`dirname $ANOTHER_SLURPDREPLOGFILE` \
		`dirname $BACKUP_SLURPDSTATUSFILE`

check_replog
#status
if test -d "$WORKDIR"; then
  if test "`$MODULEDIR/server/startup status`" = "stopped"; then
    $MODULEDIR/server/startup slave_start
  fi
  cat $WORK_REPLOGFILE >> $WORK_SLURPDREPLOGFILE
  echo -n "Recovery starting... " 1>&2
  $SHAREDIR/envexec $SLURPD -d $SLURPD_DEBUGLEVEL -o -f $CONFDIR/recovery.conf -r $WORK_SLURPDREPLOGFILE -t $WORKDIR > $WORKDIR/slurpd.log 2>&1
  echo "done" 1>&2
  grep request $WORKDIR/slurpd.log  | grep done | tail -1 1>&2
  #status
  echo -n "Updating $HOST replogs... " 1>&2
  /bin/grep -v $HOST $ANOTHER_SLURPDSTATUSFILE > $WORK_SLURPDSTATUSFILE.$$ || true
  /bin/cat $WORK_SLURPDSTATUSFILE >> $WORK_SLURPDSTATUSFILE.$$
  /bin/mv $WORK_SLURPDSTATUSFILE.$$ $ANOTHER_SLURPDSTATUSFILE
  /bin/cp /dev/null $REPLOGFILE
  /bin/cp $WORK_SLURPDREPLOGFILE $SLURPDREPLOGFILE
   # FIXME: not corret strictly
  /bin/cp $ANOTHER_SLURPDSTATUSFILE $SLURPDSTATUSFILE
  echo "done" 1>&2
  #status
  echo "Log: $WORKDIR" 1>&2
fi

exit 0

