#! /bin/sh
# $Header$
#
#bcpyrght
#***************************************************************************
#* $Copyright: Copyright (c) 2022 Veritas Technologies LLC. All rights reserved $ *
#***************************************************************************
#ecpyrght
#
# post_checkpoint_notify.oracle_bli
#
# This script is called by NetBackup after bpbkar has created the
# checkpoint clones for a block incremental backup. It is normally used
# to take the DB out of "begin backup" mode.
#
# This script:
#	receives 4 parameters: CLIENTNAME POLICYNAME SCHEDNAME SCHEDTYPE
#	must be executable by the root user
#	should exit with 0 upon successful completion
#
# The following environment variables are also available:
#       KEYWORD          - The KEYWORD associated with the policy
#       STREAMS          - The number of policies with the same KEYWORD
#       BACKUPID         - The NetBackup image ID
#       UNIXBACKUPTIME   - The backup time in seconds since 1970
#       BACKUPTIME       - The backup time in readable form
#       BPSTART_TIMEOUT  - The bpstart_notify timeout value
#
# If this script will not complete within a few seconds, you should set
# the BPSTART_TIMEOUT in the /usr/openv/netbackup/bp.conf file on the server.
# You should also be aware that the time taken by this script will delay
# the initiation of other client's backups.
#
# To use this script, copy it to the /usr/openv/netbackup/bin/ directory
# on a client. Then copy it to post_checkpoint_notify.POLICY where POLICY
# is the name of each of the policies that will back up a subset of the
# filesystems. For example, if policies orasid_block_incr1,
# orasid_block_incr2, and orasid_block_incr3 are used, copy it to
# post_checkpoint_notify.orasid_block_incr1,
# post_checkpoint_notify.orasid_block_incr2, and
# post_checkpoint_notify.orasid_block_incr3.
#
# Once the post_checkpoint_notify.POLICY files have been created, change the mode
# bits on the files to 500 and change the owner to root.
#
# CAUTION:  writing anything to stdout or stderr can cause backup problems
# so direct any output to /dev/null or the file defined by OUTF.
#


# -----------------------------------------------------------------------------
# Replace the xxxxxx in ORACLE_DBA with the oracle administrator's user name.
# -----------------------------------------------------------------------------

#ORACLE_DBA=oracle
ORACLE_DBA=xxxxxx

# -----------------------------------------------------------------------------
# Replace xxxxxx below with the name of the policy that will do
# the DB shutdown/startup or alter tablespace operations. Normally,
# if you have 3 policies named block_incr1, block_incr2, and block_incr3,
# you would set POLICY_IN_CONTROL to block_incr1 so that you could
# increase or decrease the number of policies easily.
# -----------------------------------------------------------------------------

POLICY_IN_CONTROL=xxxxxx

# -----------------------------------------------------------------------------
# Replace the xxxxxx in ORACLE_BASE with the directory at the top of the
# Oracle software and administrative file structure. The recommended value 
# from Oracle is /MOUNTPOINT/app/oracle. 
# For example: ORACLE_BASE=/u01/app/oracle
# -----------------------------------------------------------------------------

ORACLE_BASE=xxxxxx
export ORACLE_BASE

# -----------------------------------------------------------------------------
# Replace the xxxxxx in ORACLE_HOME with the directory containing the Oracle
# software for a given Oracle Server release. The recommended value from
# Oracle is ${ORACLE_BASE}/product/RELEASE. 
# For example: ORACLE_HOME=${ORACLE_BASE}/product/10.2
# -----------------------------------------------------------------------------

#ORACLE_HOME=${ORACLE_BASE}/product/RELEASE
ORACLE_HOME=xxxxxx
export ORACLE_HOME

# -----------------------------------------------------------------------------
# The Oracle admin command path.
# -----------------------------------------------------------------------------

#SQLCMD=${ORACLE_HOME}/bin/sqlplus
SQLCMD=xxxxxx


# ---------------------------------------------------------------------------
# Change the Oracle login.
# ---------------------------------------------------------------------------
 
SQLLOGIN="sys/change_on_install as sysdba"

# -----------------------------------------------------------------------------
# Change the ORACLE_SID value if it is not the same as the KEYWORD.
# -----------------------------------------------------------------------------

ORACLE_SID=$KEYWORD
export ORACLE_SID

# -----------------------------------------------------------------------------
# Change the Oracle init file path (if necessary).
# -----------------------------------------------------------------------------

ORACLE_INIT=${ORACLE_BASE}/admin/${ORACLE_SID}/pfile/init${ORACLE_SID}.ora

# -----------------------------------------------------------------------------
# If you want to receive mail for a successful execution of the script,
# replace the xxxxxx for the MAIL_ADDR_SUCCESS variable with a mail address.
# If you want to receive mail for a unsuccessful execution of the script,
# replace the xxxxxx for the MAIL_ADDR_FAILURE variable with a mail address.
# -----------------------------------------------------------------------------

MAIL_ADDR_SUCCESS=xxxxxx
MAIL_ADDR_FAILURE=xxxxxx

# -----------------------------------------------------------------------------
# Change the following PSCMD variable if necessary.
# -----------------------------------------------------------------------------

PSCMD="/bin/ps -ef"

# -----------------------------------------------------------------------------
# Change the following LD_LIBRARY_PATH variable if necessary.
# -----------------------------------------------------------------------------

LD_LIBRARY_PATH=$LD_LIBRARY_PATH:${ORACLE_HOME}/lib

if [ -d /usr/ucblib ]
then
        LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/ucblib
fi

export LD_LIBRARY_PATH

# -----------------------------------------------------------------------------
# END OF THE CONFIGURATION CHANGES.
# -----------------------------------------------------------------------------







# -----------------------------------------------------------------------------
# Take the database out of backup mode.
# -----------------------------------------------------------------------------

alter_tablespace_end_backup()
{
$ECHO "" >>$OUTF
$ECHO "`$TIME` $POLICYNAME -----------------------------------" >>$OUTF
$ECHO "`$TIME` $POLICYNAME alter_tablespace_end_backup() START" >>$OUTF
$ECHO "`$TIME` $POLICYNAME -----------------------------------" >>$OUTF
$ECHO "" >>$OUTF

/bin/rm -f $WORKF
/bin/rm -f $CMDF

/bin/touch $WORKF
/bin/chown $ORACLE_DBA $WORKF
/bin/chmod 644 $WORKF
/bin/touch $CMDF
/bin/chmod 644 $CMDF

$ECHO "LD_LIBRARY_PATH=${LD_LIBRARY_PATH}" >>$CMDF
$ECHO "export LD_LIBRARY_PATH" >>$CMDF
$ECHO "$SQLCMD <<EOF" >>$CMDF
$ECHO "$SQLLOGIN" >>$CMDF
$ECHO "set echo on;" >>$CMDF

cat $TABLES_FILE |
while read TBLSPACE
do
	$ECHO "alter tablespace $TBLSPACE end backup;" >>$CMDF
done

$ECHO "exit" >>$CMDF
$ECHO "EOF" >>$CMDF

/bin/su $ORACLE_DBA -c "/bin/sh $CMDF" >>$WORKF 2>>$WORKF

$ECHO "" >>$OUTF
$ECHO "`$TIME` $POLICYNAME Database end backup command output:" >>$OUTF
$ECHO "" >>$OUTF

/bin/cat $WORKF >>$OUTF

# Look for errors of the form "ORA-00000".

STAT=`egrep "(ORA|DBA|SQL|LCC|MGR)-[0-9]" $WORKF|wc -l`

if [ ${STAT} -ne 0 ]
then
	$ECHO "" >>$OUTF
	$ECHO "`$TIME` $POLICYNAME Could not take database ${ORACLE_SID} out of backup mode." >>$OUTF
	abort
else
	$ECHO "" >>$OUTF
	$ECHO "`$TIME` $POLICYNAME Database ${ORACLE_SID} taken out of backup mode." >>$OUTF
	/bin/rm -f $BEGIN_BACKUP_FILE
fi

$ECHO "" >>$OUTF
$ECHO "`$TIME` $POLICYNAME ---------------------------------" >>$OUTF
$ECHO "`$TIME` $POLICYNAME alter_tablespace_end_backup() END" >>$OUTF
$ECHO "`$TIME` $POLICYNAME ---------------------------------" >>$OUTF
$ECHO "" >>$OUTF
}

# -----------------------------------------------------------------------------
# Restart the oracle DB (for shutdown/checkpoint/restart method).
# -----------------------------------------------------------------------------

restart_database()
{
$ECHO "" >>$OUTF
$ECHO "`$TIME` $POLICYNAME ------------------------" >>$OUTF
$ECHO "`$TIME` $POLICYNAME restart_database() START" >>$OUTF
$ECHO "`$TIME` $POLICYNAME ------------------------" >>$OUTF
$ECHO "" >>$OUTF

/bin/rm -f $WORKF
/bin/rm -f $CMDF

/bin/touch $WORKF
/bin/chown $ORACLE_DBA $WORKF
/bin/chmod 644 $WORKF
/bin/touch $CMDF
/bin/chmod 644 $CMDF

$ECHO "LD_LIBRARY_PATH=${LD_LIBRARY_PATH}" >>$CMDF
$ECHO "export LD_LIBRARY_PATH" >>$CMDF
$ECHO "$SQLCMD <<EOF" >>$CMDF
$ECHO "$SQLLOGIN" >>$CMDF
$ECHO "set echo on;" >>$CMDF
if [ "${ORACLE_INIT}" = "" ]
then
       $ECHO "startup" >> $CMDF
else
       $ECHO "startup pfile=$ORACLE_INIT" >>$CMDF
fi
$ECHO "exit" >>$CMDF
$ECHO "EOF" >>$CMDF

/bin/su $ORACLE_DBA -c "/bin/sh $CMDF" >>$WORKF 2>>$WORKF

$ECHO "" >>$OUTF
$ECHO "`$TIME` $POLICYNAME Database startup command output:" >>$OUTF
$ECHO "" >>$OUTF

/bin/cat $WORKF >>$OUTF

# Look for errors of the form "ORA-00000".

STAT=`egrep "(ORA|DBA|SQL|LCC|MGR)-[0-9]" $WORKF|wc -l`

if [ ${STAT} -eq 0 ]
then
	# No errors, but find out if the instance is really up.

	SMONPROC=`${PSCMD}|grep "smon_${ORACLE_SID}"|grep -v grep|wc -l`

	if [ ${SMONPROC} -eq 0 ]
	then
		$ECHO "" >>$OUTF
		$ECHO "`$TIME` $POLICYNAME Could not find smon_${ORACLE_SID} process." >>$OUTF
		abort
	else
		$ECHO "" >>$OUTF
		$ECHO "`$TIME` $POLICYNAME Database ${ORACLE_SID} restarted." >>$OUTF
		/bin/rm -f ${SHUTDOWN_FILE}
	fi
else
	$ECHO "" >>$OUTF
	$ECHO "`$TIME` $POLICYNAME Database ${ORACLE_SID} could not be restarted." >>$OUTF
	abort
fi

$ECHO "" >>$OUTF
$ECHO "`$TIME` $POLICYNAME ----------------------" >>$OUTF
$ECHO "`$TIME` $POLICYNAME restart_database() END" >>$OUTF
$ECHO "`$TIME` $POLICYNAME ----------------------" >>$OUTF
$ECHO "" >>$OUTF
}

# -----------------------------------------------------------------------------
# Exit the script.
# -----------------------------------------------------------------------------

abort()
{
$ECHO "" >>$OUTF
$ECHO "`$TIME` $POLICYNAME END post_checkpoint_notify exit status 1" >>$OUTF
$ECHO "" >>$OUTF

# Make sure the error file is created so that other streams know of problems.

/bin/touch "${ERROR_FILE}"
/bin/chmod 644 "${ERROR_FILE}"

if [ "${MAIL_ADDR_FAILURE}" != "xxxxxx" ]
then
	# Mail the output to someone.
	# CAUTION: Some platforms do not allow the -s parameter on mail.

	if [ $SUBJECT -eq 1 ]
	then
		cat $OUTF | $MAIL -s "${POLICYNAME} post_checkpoint_notify exit 1" $MAIL_ADDR_FAILURE
	else
		cat $OUTF | $MAIL $MAIL_ADDR_FAILURE
	fi
fi

exit 1
}


# -----------------------------------------------------------------------------
# Main script starts here.
# -----------------------------------------------------------------------------

if [ -x /usr/bin/mailx ]
then
	MAIL=/usr/bin/mailx
	SUBJECT=1
elif [ -x /usr/ucb/mail ]
then
	MAIL=/usr/ucb/mail
	SUBJECT=1
elif [ -x /usr/bin/mail ]
then 
	MAIL=/usr/bin/mail
	SUBJECT=0
else
	MAIL=/bin/mail
	SUBJECT=0
fi

ECHO=/bin/echo

if [ "$#" -ne 4 ]
then
	$ECHO "`$TIME` $POLICYNAME Expected 4 parameters, but got $# instead." >>$OUTF
	abort
fi

# -----------------------------------------------------------------------------
# Assign names to our parameters.
# -----------------------------------------------------------------------------

CLIENTNAME=$1
POLICYNAME=$2
SCHEDNAME=$3
SCHEDTYPE=$4

# -----------------------------------------------------------------------------
# Create some variables using the environment variables from bpbkar.
# -----------------------------------------------------------------------------

CONTROL_DIR=/usr/openv/netbackup/bin/BLOCK_INCR

SHUTDOWN_BKUP_RESTART_FILE=${CONTROL_DIR}/SHUTDOWN_BKUP_RESTART.${ORACLE_SID}
SHUTDOWN_CKPT_RESTART_FILE=${CONTROL_DIR}/SHUTDOWN_CKPT_RESTART.${ORACLE_SID}
ALTER_TABLESPACE_FILE=${CONTROL_DIR}/ALTER_TABLESPACE.${ORACLE_SID}
NODATA_CKPT_HOT_FILE=${CONTROL_DIR}/NODATA_CKPT_HOT.${ORACLE_SID}

SHUTDOWN_FILE=${CONTROL_DIR}/shutdown.${ORACLE_SID}
BEGIN_BACKUP_FILE=${CONTROL_DIR}/begin_backup.${ORACLE_SID}

START_FILE=${CONTROL_DIR}/start.${ORACLE_SID}
START_LINK=${CONTROL_DIR}/start.${ORACLE_SID}.${POLICYNAME}

POST_CKPT_FILE=${CONTROL_DIR}/post_ckpt.${ORACLE_SID}
POST_CKPT_LINK=${CONTROL_DIR}/post_ckpt.${ORACLE_SID}.${POLICYNAME}

END_FILE=${CONTROL_DIR}/end.${ORACLE_SID}
END_LINK=${CONTROL_DIR}/end.${ORACLE_SID}.${POLICYNAME}

ERROR_FILE=${CONTROL_DIR}/error.${KEYWORD}
TABLES_FILE=${CONTROL_DIR}/tablespaces.${ORACLE_SID}
CMDF=${CONTROL_DIR}/end_backup.${ORACLE_SID}
OUTF=${CONTROL_DIR}/post_checkpoint_notify_output.${ORACLE_SID}
WORKF=${CONTROL_DIR}/db_cmd_output.${ORACLE_SID}

TIME='/bin/date +%T'

# -----------------------------------------------------------------------------
# Make sure there are no files left around from system crashes.
# -----------------------------------------------------------------------------

/bin/rm -f ${START_FILE}* 
/bin/rm -f ${END_FILE}*

if [ ! -d $CONTROL_DIR ]
then
	/bin/mkdir $CONTROL_DIR
	/bin/chmod 1777 $CONTROL_DIR
fi

if [ ! -f $OUTF ]
then
	/bin/touch $OUTF
	/bin/chmod 644 $OUTF
fi

$ECHO "" >>$OUTF
$ECHO "===============================================================================" >>$OUTF
$ECHO "`date` $POLICYNAME START post_checkpoint_notify" >>$OUTF
$ECHO "===============================================================================" >>$OUTF
$ECHO "" >>$OUTF

$ECHO "`$TIME` $POLICYNAME   BACKUPID         = ${BACKUPID}" >>$OUTF
$ECHO "`$TIME` $POLICYNAME   UNIXBACKUPTIME   = ${UNIXBACKUPTIME}" >>$OUTF
$ECHO "`$TIME` $POLICYNAME   BACKUPTIME       = ${BACKUPTIME}" >>$OUTF
$ECHO "`$TIME` $POLICYNAME   CLIENTNAME       = ${CLIENTNAME}" >>$OUTF
$ECHO "`$TIME` $POLICYNAME   POLICYNAME        = ${POLICYNAME}" >>$OUTF
$ECHO "`$TIME` $POLICYNAME   SCHEDNAME        = ${SCHEDNAME}" >>$OUTF
$ECHO "`$TIME` $POLICYNAME   SCHEDTYPE        = ${SCHEDTYPE}" >>$OUTF
$ECHO "`$TIME` $POLICYNAME   KEYWORD          = ${KEYWORD}" >>$OUTF
$ECHO "`$TIME` $POLICYNAME   STREAMS          = ${STREAMS}" >>$OUTF
$ECHO "`$TIME` $POLICYNAME   BPSTART_TIMEOUT  = ${BPSTART_TIMEOUT}" >>$OUTF
$ECHO "`$TIME` $POLICYNAME   BPEND_TIMEOUT    = ${BPEND_TIMEOUT}" >>$OUTF
$ECHO "`$TIME` $POLICYNAME   POLICY_IN_CONTROL = ${POLICY_IN_CONTROL}" >>$OUTF
$ECHO "`$TIME` $POLICYNAME   ORACLE_DBA       = ${ORACLE_DBA}" >>$OUTF
$ECHO "`$TIME` $POLICYNAME   ORACLE_BASE      = ${ORACLE_BASE}" >>$OUTF
$ECHO "`$TIME` $POLICYNAME   ORACLE_HOME      = ${ORACLE_HOME}" >>$OUTF
$ECHO "`$TIME` $POLICYNAME   ORACLE_SID       = ${ORACLE_SID}" >>$OUTF
$ECHO "`$TIME` $POLICYNAME   ORACLE_INIT      = ${ORACLE_INIT}" >>$OUTF
$ECHO "`$TIME` $POLICYNAME   SQLCMD           = ${SQLCMD}" >>$OUTF
$ECHO "`$TIME` $POLICYNAME   SQLLOGIN         = ${SQLLOGIN}" >>$OUTF

$ECHO "" >>$OUTF
$ECHO "`$TIME` $POLICYNAME   LD_LIBRARY_PATH  = ${LD_LIBRARY_PATH}" >>$OUTF
$ECHO "" >>$OUTF

if [ "$POLICYNAME" = "$POLICY_IN_CONTROL" ]
then
	if [ -f $SHUTDOWN_BKUP_RESTART_FILE ]
	then
		$ECHO "`$TIME` $POLICYNAME   METHOD           = SHUTDOWN_BKUP_RESTART" >>$OUTF
	elif [ -f $SHUTDOWN_CKPT_RESTART_FILE ]
	then
		$ECHO "`$TIME` $POLICYNAME   METHOD           = SHUTDOWN_CKPT_RESTART" >>$OUTF
	elif [ -f $ALTER_TABLESPACE_FILE ]
	then
		$ECHO "`$TIME` $POLICYNAME   METHOD           = ALTER_TABLESPACE" >>$OUTF
	elif [ -f $NODATA_CKPT_HOT_FILE ]
	then
		$ECHO "`$TIME` $POLICYNAME   METHOD           = NODATA_CKPT_HOT" >>$OUTF
	else
		$ECHO "`$TIME` $POLICYNAME   METHOD           = UNKNOWN" >>$OUTF
	fi

	$ECHO "" >>$OUTF
fi


if [ "$ORACLE_DBA" = "xxxxxx" ]
then
	$ECHO "`$TIME` $POLICYNAME The ORACLE_DBA variable is not set" >>$OUTF
	abort
fi

if [ "$POLICY_IN_CONTROL" = "xxxxxx" ]
then
	$ECHO "`$TIME` $POLICYNAME The POLICY_IN_CONTROL variable is not set" >>$OUTF
	abort
fi

if [ "$ORACLE_BASE" = "xxxxxx" ]
then
	$ECHO "`$TIME` $POLICYNAME The ORACLE_BASE variable is not set" >>$OUTF
	abort
fi

if [ "$ORACLE_HOME" = "xxxxxx" ]
then
	$ECHO "`$TIME` $POLICYNAME The ORACLE_HOME variable is not set" >>$OUTF
	abort
fi

if [ "$SQLCMD" = "xxxxxx" ]
then
	$ECHO "`$TIME` $POLICYNAME The SQLCMD variable is not set" >>$OUTF
	abort
fi

if [ "$SQLLOGIN" = "xxxxxx" ]
then
	$ECHO "`$TIME` $POLICYNAME The SQLLOGIN variable is not set" >>$OUTF
	abort
fi

if [ "${ORACLE_INIT}" != "" -a ! -f "${ORACLE_INIT}" ]
then
	$ECHO "`$TIME` $POLICYNAME ORACLE_INIT ${ORACLE_INIT} not found" >>$OUTF
	abort
fi

if [ "$POLICYNAME" = "$POLICY_IN_CONTROL" ]
then
	if [ -f $POST_CKPT_FILE ]
	then
		# If the control file already exists, remove it along with
		# the link files from all the streams.
		/bin/rm -f ${POST_CKPT_FILE}*
	fi
	/bin/touch $POST_CKPT_FILE
	/bin/chmod 644 $POST_CKPT_FILE
else
	/bin/rm -f $POST_CKPT_LINK

	# Wait for the control file to be created by the "policy in control"
	# before continuing.

	SLEEP_COUNT=0

	while [ ! -f $POST_CKPT_FILE ]
	do
		/bin/sleep 1
		SLEEP_COUNT=`expr $SLEEP_COUNT + 1`

		if [ $SLEEP_COUNT -gt 7200 ]
		then
			# If we hit 2 hours, create the error file ourselves
			# so that we don't wait forever.

			$ECHO "`$TIME` $POLICYNAME Exceeded 7200 second wait count." >>$OUTF
			$ECHO "`$TIME` $POLICYNAME Creating error file $ERROR_FILE" >>$OUTF
			/bin/touch "${ERROR_FILE}"
			/bin/chmod 644 "${ERROR_FILE}"
			abort

		elif [ $SLEEP_COUNT -gt $BPSTART_TIMEOUT ]
		then
			# If we've exceeded the timeout and the policy in
			# control hasn't started yet, start looking for the
			# error file.

			if [ -f "${ERROR_FILE}" ]
			then
				$ECHO "`$TIME` $POLICYNAME Error file $ERROR_FILE detected" >>$OUTF
				$ECHO "`$TIME` $POLICYNAME while waiting for $POST_CKPT_FILE file" >>$OUTF
				abort
			fi
		fi
	done
fi

# -----------------------------------------------------------------------------
# Create a hard link to the POST_CKPT_FILE. We will use the link count to
# decide when all the streams have been started.
# -----------------------------------------------------------------------------

if [ -f $POST_CKPT_FILE ]
then
	/bin/ln $POST_CKPT_FILE $POST_CKPT_LINK
	LINKCOUNT=`ls -l $POST_CKPT_FILE|sed 's/  / /g'|sed 's/  / /g'|cut -f2 -d" "`
else
	LINKCOUNT=0
fi

while [ $STREAMS -ge $LINKCOUNT ]
do
	if [ -f "${ERROR_FILE}" ]
	then
		$ECHO "`$TIME` $POLICYNAME Error file $ERROR_FILE detected" >>$OUTF
		$ECHO "`$TIME` $POLICYNAME while waiting for link count of $LINKCOUNT on $POST_CKPT_FILE file" >>$OUTF
		abort
	fi

	/bin/sleep 1

	if [ -f $POST_CKPT_FILE ]
	then
		# The "policy in control" may remove our link if
		# the "policy in control" isn't the first one started.
		/bin/ln $POST_CKPT_FILE $POST_CKPT_LINK

		LINKCOUNT=`ls -l $POST_CKPT_FILE|sed 's/  / /g'|sed 's/  / /g'|cut -f2 -d" "`
	else
		LINKCOUNT=0
	fi
done

# -----------------------------------------------------------------------------
# All streams have reached this point, so we can now continue.
# -----------------------------------------------------------------------------

$ECHO "" >>$OUTF
$ECHO "`$TIME` $POLICYNAME All streams have been checkpointed." >>$OUTF
$ECHO "" >>$OUTF

if [ "$POLICYNAME" = "$POLICY_IN_CONTROL" ]
then
	# Restart the DB or put it in "end" mode.
	# If the backup method is SHUTDOWN_BKUP_RESTART, we don't do anything.

	if [ -f $SHUTDOWN_CKPT_RESTART_FILE -a -f $SHUTDOWN_FILE ]
	then
		# Restart the database if we shut it down in bpstart_notify.
		restart_database

	elif [ -f $ALTER_TABLESPACE_FILE ]
	then
		# Take the database out of backup mode using
		# "alter tablespace end backup".
		alter_tablespace_end_backup
	fi

	# We now have all the streams at the same point.
	# Now wait for others to unlink.

	if [ -f $POST_CKPT_FILE ]
	then
		LINKCOUNT=`ls -l $POST_CKPT_FILE|sed 's/  / /g'|sed 's/  / /g'|cut -f2 -d" "`
	else
		LINKCOUNT=0
	fi

	while [ $LINKCOUNT -gt 2 ]
	do
		if [ -f "${ERROR_FILE}" ]
		then
			$ECHO "`$TIME` $POLICYNAME Error file $ERROR_FILE detected" >>$OUTF
			$ECHO "`$TIME` $POLICYNAME while waiting for link count to get down to 2 on $POST_CKPT_FILE file" >>$OUTF
			abort
		fi

		/bin/sleep 1

		if [ -f $POST_CKPT_FILE ]
		then
			LINKCOUNT=`ls -l $POST_CKPT_FILE|sed 's/  / /g'|sed 's/  / /g'|cut -f2 -d" "`
		else
			LINKCOUNT=0
		fi
	done

	/bin/rm -f $POST_CKPT_LINK
	/bin/rm -f $POST_CKPT_FILE
else
	# This is not the "policy in control".
	/bin/sleep 3
	/bin/rm -f $POST_CKPT_LINK

	# Wait for the control file to be deleted by the "policy in control"
	# before continuing.

	while [ -f $POST_CKPT_FILE ]
	do
		if [ -f "${ERROR_FILE}" ]
		then
			$ECHO "`$TIME` $POLICYNAME Error file $ERROR_FILE detected" >>$OUTF
			$ECHO "`$TIME` $POLICYNAME while waiting for $POST_CKPT_FILE to be deleted" >>$OUTF
			abort
		fi

		/bin/sleep 1
	done
fi

if [ -f "${ERROR_FILE}" ]
then
	# Something went wrong

	$ECHO "`$TIME` $POLICYNAME Error file $ERROR_FILE detected" >>$OUTF

	if [ "$POLICYNAME" = "$POLICY_IN_CONTROL" ]
	then
		if [ -f $SHUTDOWN_BKUP_RESTART_FILE ]
		then
			# Try to restart the database now since we won't be
			# doing the backup.
			restart_database
		fi
	fi

	abort
fi

if [ -f "${ERROR_FILE}" ]
then
	$ECHO "`$TIME` $POLICYNAME Error file $ERROR_FILE detected" >>$OUTF
	abort
else
	$ECHO "" >>$OUTF
	$ECHO "`$TIME` $POLICYNAME END post_checkpoint_notify exit status 0" >>$OUTF
	$ECHO "" >>$OUTF

	if [ "$POLICYNAME" = "$POLICY_IN_CONTROL" ]
	then
		if [ "${MAIL_ADDR_SUCCESS}" != "xxxxxx" ]
		then
			# Mail the output to someone.
			# CAUTION: Some platforms do not allow the -s parameter on mail.

			if [ $SUBJECT -eq 1 ]
			then
				cat $OUTF | $MAIL -s "${POLICYNAME} post_checkpoint_notify exit 0" $MAIL_ADDR_SUCCESS
			else
				cat $OUTF | $MAIL $MAIL_ADDR_SUCCESS
			fi
		fi
	fi

	exit 0
fi

