#!/sbin/sh
#
# ident	"%Z%%M%	%I%	%E% SMI"
#
# Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
# Use is subject to license terms.
#

# This script is used install deferred updates at a same run
# level on the machine

# Set up localization text domain
TEXTDOMAIN=SUNW_PATCHMGR_SMF_SCRIPTS
PATCHADD=/usr/sbin/patchadd
UNZIP=/usr/bin/unzip
CHMOD=/usr/bin/chmod
MKDIR=/usr/bin/mkdir
ECHO=/usr/bin/echo
TOUCH=/usr/bin/touch
CHMOD=/usr/bin/chmod
MOVE=/usr/bin/mv
export TEXTDOMAIN

trap 'rm -f $JOB_HISTORY_REPORT_LOCK; exit 0' 1 2 3 15

DATE=`date '+%b %d %H:%M:%S'` 
NODE=`uname -n`

rotate() {
	no=`expr $2 - 1`
	while [ $no -ge 0 ]
	do
		if [ $no -eq 0 ]
		then
			original="$1"
		else
			original="$1.${no}"
		fi

		no2=`expr $no + 1`
		backup="$1.${no2}"

		if [ -f "$original" ]
		then
			$MOVE -f "$original" "$backup"
		fi

		no=`expr $no - 1`
	done
}

case "$1" in

'lock')
	if [ ! -f "$DEFERRED_LOCK_FILE" ]
	then
		$TOUCH $DEFERRED_LOCK_FILE
		$CHMOD 700 $DEFERRED_LOCK_FILE
	fi

	;;
'stop')
	DEFERRED_DIR=/var/sadm/spool
	DEFERRED_UPDATES_LIST="$DEFERRED_DIR/disallowed_patch_list"
        JOB_HISTORY_REPORT=`/usr/sbin/smpatch get patchpro.history.log.file`
	JOB_HISTORY_REPORT_DIR=`dirname "$JOB_HISTORY_REPORT"`
	JOB_HISTORY_REPORT_FILE=`basename "$JOB_HISTORY_REPORT"`
	JOB_HISTORY_REPORT_TMP="/tmp/$JOB_HISTORY_REPORT_FILE.tmp"
	JOB_HISTORY_REPORT_LOCK="$JOB_HISTORY_REPORT.lck"
	DEFERRED_LOCK_FILE="$DEFERRED_DIR/critical_shutdown_update_lock"
	export DEFERRED_DIR DEFERRED_UPDATES_LIST

	if [ -f "$DEFERRED_LOCK_FILE" ]
	then
		rm -f $DEFERRED_LOCK_FILE
		exit
	fi

	if [ ! -f "$DEFERRED_UPDATES_LIST" ]
	then
		exit
	fi

	TIMEOUT=`/usr/sbin/smpatch get patchpro.history.log.timeout`
	i="1"
	while [ -f "$JOB_HISTORY_REPORT_LOCK" ] && [ $i -le $TIMEOUT ]
	do
		sleep 1
		i=`expr $i + 1`
	done
	
	$MKDIR -p $JOB_HISTORY_REPORT_DIR
	$TOUCH $JOB_HISTORY_REPORT_LOCK
	$CHMOD 600 $JOB_HISTORY_REPORT_LOCK
	
	BACKOUT_DIR=`/usr/sbin/smpatch get patchpro.backout.directory`
	if [ ! -d "$BACKOUT_DIR" -o -z "$BACKOUT_DIR" ]
	then
		BACKOUT_PARM=
	else
		BACKOUT_PARM="-B $BACKOUT_DIR"
	fi
	export BACKOUT_DIR BACKOUT_PARM

	MAXROTATION=`/usr/sbin/smpatch get patchpro.history.log.maxrotation`
	if [ ! $MAXROTATION -eq 0 ]
	then
		SIZE=`/usr/sbin/smpatch get patchpro.history.log.size`
		logfile=`find $JOB_HISTORY_REPORT_DIR -type f -size +"$SIZE"c -name $JOB_HISTORY_REPORT_FILE -prune -print | sed 's/^\.\///'`
		if [ -f "$logfile" ]
		then
			rotate $logfile $MAXROTATION
		fi
	fi

	/usr/bin/gettext -n -s "Installing updates" > /dev/console
	for patchline in `cat $DEFERRED_UPDATES_LIST 2> /dev/null`; do
		PATCHID=`$ECHO $patchline | awk '{split($0,a,":"); print a[1]}'`
		LOCATION=`$ECHO $patchline | awk '{split($0,a,":"); print a[2]}'`
                # just in case the disallowed_patch_list has entries in the old format
                LOCATION=${LOCATION:-`/usr/sbin/smpatch get patchpro.download.directory`}
		$ECHO "$DATE" $NODE "Deferred Installation Log" >> "$JOB_HISTORY_REPORT"
		$ECHO "$DATE" $NODE $PATCHID "[notice] Status Install Begin $PATCHID" >> "$JOB_HISTORY_REPORT"
		/usr/bin/gettext -n -s "Installing update " > /dev/console
		$ECHO "$PATCHID\c" > /dev/console
		if [ -f "$LOCATION/$PATCHID.jar" ]
		then
			$MKDIR $LOCATION/$PATCHID.jar.dir
			$UNZIP -d $LOCATION/$PATCHID.jar.dir  $LOCATION/$PATCHID.jar >/dev/null 2>> "$JOB_HISTORY_REPORT"
                else
                        ERRMSG=`/usr/bin/ls $LOCATION/$PATCHID.jar 2>&1`
		        $ECHO "$DATE" $NODE $PATCHID "[ALERT] $ERRMSG" >> "$JOB_HISTORY_REPORT"
		fi
		$PATCHADD $BACKOUT_PARM $LOCATION/$PATCHID.jar.dir/$PATCHID > "$JOB_HISTORY_REPORT_TMP" 2>&1
		RET=$?
		EMPTY=''
		NEWLINE="
"

		OIFS="$IFS"
		IFS=$NEWLINE
		if [ $RET -eq 0 ]
		then
		        /usr/bin/gettext -s " Succeeded" > /dev/console
			rm $LOCATION/$PATCHID.jar >/dev/null 2>&1
			MESSAGE=`/usr/bin/gettext "Update installation was successful"`

			for line in `cat $JOB_HISTORY_REPORT_TMP 2> /dev/null`; do
				if [ "$line" != "$EMPTY" ] && [ "$line" != "Done!" ]
				then
					$ECHO "$DATE" $NODE $PATCHID [notice] "$line" >> "$JOB_HISTORY_REPORT"
				fi
			done

			$ECHO "$DATE" $NODE $PATCHID "[notice] Status Install End $PATCHID Install $MESSAGE" >> "$JOB_HISTORY_REPORT"
		else
		        /usr/bin/gettext -s " Failed" > /dev/console
			MESSAGE=`/usr/bin/gettext "Update installation failed"`

			for line in `cat $JOB_HISTORY_REPORT_TMP 2> /dev/null`; do
				if [ "$line" != "$EMPTY" ] && [ "$line" != "Done!" ]
				then
					$ECHO "$DATE" $NODE $PATCHID [ALERT] "$line" >> "$JOB_HISTORY_REPORT"
				fi
			done

			$ECHO "$DATE" $NODE $PATCHID "[ALERT] Status Install End $PATCHID Install $MESSAGE" >> "$JOB_HISTORY_REPORT"
		fi	
		IFS="$OIFS"

		rm -rf $LOCATION/$PATCHID.jar.dir >/dev/null 2>&1

	done

	rm -f "$DEFERRED_UPDATES_LIST"

	rm -f $JOB_HISTORY_REPORT_LOCK

	;;
*)
	;;
esac
