#!/bin/sh
# $Id: dbrecover,v 1.3 2001/12/11 02:00:20 pbaltz Exp $
# Copyright 2001 Sun Microsystems, Inc.  All rights reserved.
#
# dbrecover     run db_recover on system startup to make sure everything
#               is okay
#
# chkconfig: 12345 6 98
# description: run password information db recovery
# processname: db_recover
# config:
#

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

DBHOME=/var/db
DBRECOVER=/usr/bin/db_recover
DBCHECKPOINT=/usr/bin/db_checkpoint
LOGFILE=/var/log/dbrecover.log

[ -x $DBRECOVER ] || exit 1

recreate_dbenv()
{
	cat <<EOF | perl 2>/dev/null
use PWDB;
PWDB::pwdb_start();
PWDB::pwdb_locate('user', [ PWDB_UNIXDB, PWDB_SHADOWDB ], 'anyuser', 33);
PWDB::pwdb_end();
EOF
}

checkpoint_dbenv()
{
	$DBCHECKPOINT -1 -v -h $DBHOME >>$LOGFILE 2>&1 &
	# give it a chance to finish
	sleep 2;
	pid=`pidofproc $DBCHECKPOINT`
	if [ "$pid" != "" ]; then
		kill -INT $pid
		return 1
	else
		return 0
	fi
}

# See how we were called.
case "$1" in
  start)
    echo -n "Checking consistency of user and group information... "
	echo -n "[" >>$LOGFILE; echo -n `date` >>$LOGFILE; echo -n "]" >> $LOGFILE
    echo " Trying db_recover" >>$LOGFILE
    $DBRECOVER -v -h $DBHOME >>$LOGFILE 2>&1
 	dbrecover_result=$?
	echo -n "[" >>$LOGFILE; echo -n `date` >>$LOGFILE; echo -n "]" >> $LOGFILE
    echo " Finished db_recover" >>$LOGFILE
	if [ $dbrecover_result = 0 ]; then
		echo "Recreating db environment" >>$LOGFILE
		recreate_dbenv
		echo "done"
	else
		echo "failed"
	fi
	;;
  stop)
  	[ -x $DBCHECKPOINT ] || exit 1
  	# try to checkpoint on shutdown, if possible
	echo -n "Finalizing user and group information... "
	if checkpoint_dbenv; then
		# check point again
		checkpoint_dbenv
		echo "done"
	else
		echo "failed"
	fi
	;;
  *)
	echo "Usage: dbrecover {start|stop}"
	exit 1
esac

exit 0

