#!/bin/ksh

/bin/rm -f /tmp/$PatchNum.log


PATH=/usr/bin:/usr/sbin:$PATH; export PATH
PKGCOND=/usr/bin/pkgcond
LOGIN_ENTRY_NON_RE="/dev/console    0600    /dev/usb/\[0-9a-f\]\+\[.\]\[0-9a-f\]\+/\[0-9\]\+/\*"
export LOGIN_ENTRY_NON_RE
EXIT=0
SataKU=118855-14

no_user_aliases() {
        driver=$1
        grep "^${driver} " $ROOTDIR/etc/driver_aliases > /dev/null 2>&1

        return $?
}

CheckZones()
{
        if [ "$ROOTDIR" = "/" -a -x /usr/bin/zonename ]; then
                ZONENAME=`/usr/bin/zonename`
                if [ ${ZONENAME} = "global" ]; then
                        GLOBAL_ZONE=true
                else
                        GLOBAL_ZONE=false
                fi
        else
                # Unable to determine zone
                GLOBAL_ZONE=true
        fi
}

function PatchInstalled {

        patchadd -p -R $ROOTDIR | sed 's/Obs.*//' | grep $1 2>&1 > /dev/null

}

function last_patch {
        ## returns the number of patches installed at or above this rev.

        root_dir=${ROOTDIR:-/}

        ## parse id and rev
        pid=`echo $1 | cut -d\- -f1`
        prev=`echo $1 | cut -d\- -f2`
        patch_cnt=0

        ## get all installed refernces to the installed patch base id   
        installed_patches=`patchadd -p -R $root_dir | sed -n -e 's/Req.*//' -e 's/[a-zA-Z]*://g' -e 's/,//g' -e "/$pid/p"`
        
        for x in $installed_patches ; do
                base=`echo $x  | cut -d\- -f1`
                rev=`echo $x | cut -d\- -f2`
                if [ $pid -eq $base ] && [ $rev -ge $prev ] ; then 
                        ## count all installed patches includeing this patch
                        patch_cnt=$(($patch_cnt + 1))
                fi
        done
        
        return $patch_cnt
}

function CheckForRequiredFiles {

#
# Look for required files;  if any are missing, bail out with an error.
#

	if PatchInstalled $SataKU ; then
		last_patch $SataKU
	    	status=$?
	    	if [ $status -eq 2 ] ; then
	
			## Files should only exist if backing out the first ku added
			## since $SataKU
		
			patchdir=$ROOTDIR/var/sadm/patch/$PatchNum
		
			if [ ! -x $patchdir/zfs_cache ]; then
				echo ERROR: Missing zfs_cache command.
				exit 1;
			fi
		
			if [ ! -f $patchdir/fbtmplmeth.ksh ]; then
				echo ERROR: Missing reboot service method template
				exit 1;
			fi
		
			if [ ! -f $patchdir/fbtmplsvc.xml ]; then
				echo ERROR: Missing reboot service XML manifest
				exit 1;
			fi
		fi 
	fi
	
	return 0

}

load_mods() {

	## load modules during patch installation per 6349240
	## to prevent warnings from displaying on the console
	## before the system is rebooted.

	## Is OS 32 or 64 bit?
	ISA_INFO=`/usr/bin/isainfo -b`

	if [ ${ROOTDIR} = "/" ]; then
		##
		## Disable kernel module unloading
		##
		print "Disabling kernel module unloading ... \n"
		if [ -x /usr/bin/mdb ]; then
			if [ $ISA_INFO = 64 ]; then
				SAVED_ADDR=`echo '_kobj_printf/J' | mdb -k | cut -f2 -d ':'`
				echo '_kobj_printf/Z systrace_stub' | mdb -kw > /dev/null 2>&1
			else
				SAVED_ADDR=`echo '_kobj_printf/X' | mdb -k | cut -f2 -d ':'`
				echo '_kobj_printf/W systrace_stub' | mdb -kw > /dev/null 2>&1
			fi

			echo "moddebug/W20000" | mdb -kw > /dev/null 2>&1
		else
			echo "mdb not found: patchadd not safe."
		fi
		cd ${patchdir:-$PWD}

		## find all kernel driver modules in patch
		if [ -f /var/sadm/patch/$PatchNum/backoutmods ]; then
			while read line; do
			## preload each module
				[ -f /$line ] && {
				## echo "loading module $line"
				modload /$line > /dev/null 2>&1
			}
			done < /var/sadm/patch/$PatchNum/backoutmods
		fi

		if [ $ISA_INFO = 64 ]; then
			echo '_kobj_printf/Z '$SAVED_ADDR | mdb -kw > /dev/null 2>&1
		else
			echo '_kobj_printf/W '$SAVED_ADDR | mdb -kw  > /dev/null 2>&1
                fi
	fi
}


Execute_commands() {
  ## if grep -w ugen ${ROOTDIR}/etc/name_to_major > /dev/null 2>&1
  ## then
  ## no_user_aliases ugen || /usr/sbin/rem_drv -b "${ROOTDIR}" ugen > /dev/null 2>&1
  ## fi

  CheckForRequiredFiles
  load_mods
  egrep -v "$LOGIN_ENTRY_NON_RE" $ROOTDIR/etc/logindevperm > /tmp/logindevperm$$
  cp -p $ROOTDIR/etc/logindevperm $ROOTDIR/etc/logindevperm.backout-$PatchNum
  mv /tmp/logindevperm$$ $ROOTDIR/etc/logindevperm


   return $EXIT
}

LocalZones () {
# commands specific to non-gloabl zones
return 0

}

ExecuteInProperEnvironment () {

   if $PKGCOND is_whole_root_nonglobal_zone > /dev/null 2>&1 ; then
       # Execute non-global whole root zone commands.
       return 0
   fi

   if $PKGCOND is_nonglobal_zone > /dev/null 2>&1 ; then
       # Execute non-global zone commands. Should be no action here
       return 0
   fi

   if $PKGCOND is_netinstall_image > /dev/null 2>&1 ; then
       # Execute commands applicable to patching the mini-root.
       return 0
   fi

   if $PKGCOND is_mounted_miniroot > /dev/null 2>&1 ; then
       # Execute commands specific to the mini-root
       return 0
   fi

   if $PKGCOND is_diskless_client > /dev/null 2>&1 ; then
       # Execute commands specific to diskless client
       return 0
   fi

   if $PKGCOND is_alternative_root > /dev/null 2>&1 ; then
       # Execute commands specific to an alternate root
       Execute_commands
       return $?
   fi

   if $PKGCOND is_global_zone > /dev/null 2>&1 ; then
       # In a global zone and system is mounted on /.
       Execute_commands
       return $?
   fi

   return 1
} 

if [ -x "$PKGCOND" ] ; then
   ExecuteInProperEnvironment && exit 0 || exit 1
else
   CheckZones
   if [ "${GLOBAL_ZONE}" = "true" ]; then
        Execute_commands && exit 0 || exit 1
   else
        LocalZones
   fi
fi

exit 0
