# This script creates the backout package for a patch package # # directory format options. # #pragma ident "@(#)postinstall 1.23 08/02/06 SMI" # # Copyright 2008 Sun Microsystems, Inc. All rights reserved. # Use is subject to license terms. # # Description: # Set the TYPE parameter for the remote file # # Parameters: # none # # Globals set: # TYPE # POSTINSTALL_ERR_LOG="$PKG_INSTALL_ROOT/var/run/$SUNW_PATCHID.postinstall_log.$$" RET_STATUS=0 set_TYPE_parameter () { if [ ${PATCH_UNDO_ARCHIVE:?????} = "/dev" ]; then # handle device specific stuff TYPE="removable" else TYPE="filesystem" fi } # # Description: # Build the remote file that points to the backout data # # Parameters: # $1: the un/compressed undo archive # # Globals set: # UNDO, STATE build_remote_file () { remote_path=$PKGSAV/$SUNW_PATCHID/remote set_TYPE_parameter STATE="active" if [ $1 = "undo" ]; then UNDO="undo" else UNDO="undo.Z" fi cat > $remote_path << EOF # Backout data stored remotely TYPE=$TYPE FIND_AT=$ARCHIVE_DIR/$UNDO STATE=$STATE EOF } PATH=/usr/sadm/bin:$PATH PATCH_COMMON_LIB="/usr/lib/patch/patch_common_lib" SAFEMODE_FAILED="Exiting! Patch deferred activation failed" if [ "$SAFEMODE_INSTALL" = "true" ] ; then if [ ! -s "$PATCH_COMMON_LIB" ]; then puttext "$SAFEMODE_FAILED" exit 1 fi . $PATCH_COMMON_LIB InitSafemode || { puttext $SAFEMODE_FAILED exit 1 } fi if [ "$PKG_INSTALL_ROOT" = "/" ]; then PKG_INSTALL_ROOT="" fi if [ -n "$PATCH_BUILD_DIR" -a -d "$PATCH_BUILD_DIR" ]; then BUILD_DIR="$PATCH_BUILD_DIR/$SUNW_PATCHID.$PKGINST" else BUILD_DIR="$PKG_INSTALL_ROOT/var/tmp/$SUNW_PATCHID.$PKGINST" fi if [ ! -n "$PATCH_UNDO_ARCHIVE" ]; then PATCH_UNDO_ARCHIVE="none" fi FILE_DIR=$BUILD_DIR/files RELOC_DIR=$FILE_DIR/reloc ROOT_DIR=$FILE_DIR/root BO_Deletes=$FILE_DIR/deletes THIS_DIR=`dirname $0` PROTO_FILE=$BUILD_DIR/prototype TEMP_REMOTE=$PKGSAV/$SUNW_PATCHID/temp if [ "$PATCH_PROGRESSIVE" = "true" ]; then # remove the scripts that are left behind install_scripts=`dirname $0` rm $install_scripts/checkinstall $install_scripts/patch_checkinstall $install_scripts/patch_postinstall # If this is being used in an old-style patch, insert # the old-style script commands here. #XXXOld_CommandsXXX# exit 0 fi # # At this point we either have a deletes file or we don't. If we do, # we create a prototype entry. # if [ -f $BO_Deletes ]; then echo "i deletes=$BO_Deletes" >> $BUILD_DIR/prototype fi if [ -f $BUILD_DIR/pkginfo ] ; then /usr/bin/grep "^SUNW_PATCH_SAFE_MODE=" $SCRIPTS_DIR/../pkginfo >> \ $BUILD_DIR/pkginfo fi # # Now delete everything in the deletes list after transferring # the file to the backout package and the entry to the prototype # file. Remember that the pkgmap will get the CLIENT_BASEDIR path # but we have to actually get at it using the BASEDIR path. Also # remember that removef will import our PKG_INSTALL_ROOT # # If this is a safemode patch package and it has a deletes file in it # then handle the deletion of an object for safemode patching. # Our_Deletes=$THIS_DIR/deletes if [ -f $Our_Deletes ]; then cd $BASEDIR PSPOOL_DIR="/var/sadm/pkg/$PKGINST/save/pspool/$PKGINST/install" cat $Our_Deletes | while read path; do # If this patch is deleting any pspool script, then the # deleted file would have any entry for the script # relative to the PKG_INSTALL_ROOT. We have to parse it # and process it as follows. # 1) build the complete path. # 2) move the file to undo package. # 3) Add it to the prototype file of undo package. Dir=`/usr/bin/dirname $path` if [ "$Dir" = "$PSPOOL_DIR" ]; then path="${PKG_INSTALL_ROOT:-/}$path" if [ -f $path ]; then filename=`/usr/bin/basename $path` spoolname="pkg_$filename" spoolfile="$FILE_DIR/$spoolname" mv -f $path $spoolfile echo "i $spoolname=$spoolfile" >> $BUILD_DIR/prototype fi continue; fi Reg_File=0 if valpath -l $path; then Client_Path="$CLIENT_BASEDIR/$path" Build_Path="$RELOC_DIR/$path" Proto_Path=$BASEDIR/$path else # It's an absolute path Client_Path=$path Build_Path="$ROOT_DIR$path" Proto_Path=$PKG_INSTALL_ROOT$path fi # If BASEDIR/CLIENTBASEDIR = "/", then the previous prepends # an extra / i.e. //. The sed command later can't find a # Proto_Path with // and therefore will not substitute the # correct build_Path resulting in the backout pkg not being # created. if [ "$CLIENT_BASEDIR" = "/" ]; then Client_Path=`echo $Client_Path | sed 's|^\/\/|\/|'` Proto_Path=`echo $Proto_Path | sed 's|^\/\/|\/|'` fi # Note: If the file isn't really there, pkgproto # doesn't write anything but displays an error # so check for the file before processing. if [ -f "$Proto_Path" ]; then LINE=`pkgproto $Proto_Path=$path` else continue fi ftype=`echo $LINE | nawk '{ print $1 }'` if [ "$ftype" = "f" ]; then Reg_File=1 fi if [ $Reg_File = 1 ]; then # Add source file to the prototype entry if [ "$Proto_Path" = "$path" ]; then LINE=`echo $LINE | sed -e "s|$Proto_Path|$Build_Path|2"` else LINE=`echo $LINE | sed -e "s|$Proto_Path|$Build_Path|"` fi DirName=`dirname $Build_Path` # make room in the build tree mkdir -p $DirName cp -p $Proto_Path $Build_Path fi # Insert it into the prototype file echo $LINE 1>>$PROTO_FILE 2>/dev/null if [ "$SAFEMODE_INSTALL" = "true" ]; then # Handle deletion of an object for safemode patching HandleSafemodeDeleteObject $PKGINST $Client_Path else # Remove the file only if it's OK'd by removef rm `/usr/sbin/removef $PKGINST $Client_Path` 1>/dev/null 2>&1 fi done /usr/sbin/removef -f $PKGINST rm $Our_Deletes fi # # Unless specifically denied, make the backout package. # if [ "$PATCH_NO_UNDO" != "true" ]; then cd $BUILD_DIR # We have to build from here. if [ "$PATCH_UNDO_ARCHIVE" != "none" ]; then STAGE_DIR="$PATCH_UNDO_ARCHIVE" ARCHIVE_DIR="$PATCH_UNDO_ARCHIVE/$SUNW_PATCHID/$PKGINST" mkdir -p $ARCHIVE_DIR mkdir -p $PKGSAV/$SUNW_PATCHID else if [ -d $PKGSAV/$SUNW_PATCHID ]; then rm -r $PKGSAV/$SUNW_PATCHID fi STAGE_DIR=$PKGSAV ARCHIVE_DIR=$PKGSAV/$SUNW_PATCHID mkdir $ARCHIVE_DIR fi ERR_LOG_DIR=`dirname $POSTINSTALL_ERR_LOG` if [ ! -d $ERR_LOG_DIR ]; then mkdir -p $ERR_LOG_DIR fi /usr/bin/pkgmk -o -d $STAGE_DIR 1>$POSTINSTALL_ERR_LOG 2>&1 retcode=$? if [ "$retcode" != 0 ]; then echo "pkgmk(1) failed with error code $retcode" >> $POSTINSTALL_ERR_LOG echo "The $PKGINST backout package will not get created" >> $POSTINSTALL_ERR_LOG RET_STATUS=1 else /usr/bin/pkgtrans -s $STAGE_DIR $ARCHIVE_DIR/undo $PKG 1>>$POSTINSTALL_ERR_LOG 2>&1 retcode=$? if [ "$retcode" != 0 ]; then echo "pkgtrans(1) failed with error code $retcode" >> $POSTINSTALL_ERR_LOG echo "The $PKGINST backout package will not get created" >> $POSTINSTALL_ERR_LOG RET_STATUS=1 else compress $ARCHIVE_DIR/undo retcode=$? if [ "$retcode" != 0 ]; then echo "compress(1) returned error code $retcode" echo "The $PKGINST backout package will not be compressed." echo "Continuing to process backout package." fi if [ "$PATCH_UNDO_ARCHIVE" != "none" ]; then if [ $retcode != 0 ]; then build_remote_file "undo" else build_remote_file "undo.Z" fi fi fi fi rm -r $STAGE_DIR/$PKG cd .. rm -r $BUILD_DIR # remove the scripts that are left behind install_scripts=`dirname $0` rm -f $install_scripts/checkinstall $install_scripts/patch_checkinstall $install_scripts/patch_postinstall $install_scripts/pkg_* fi # # Since this apparently worked, we'll mark as obsoleted the prior # versions of this patch - installpatch deals with explicit obsoletions. # cd ${PKG_INSTALL_ROOT:-/} cd var/sadm/pkg active_base=`echo $SUNW_PATCHID | nawk ' { print substr($0, 1, match($0, "-")-1) } '` List=`ls -d $PKGINST/save/${active_base}* 2>/dev/null` if [ $? -ne 0 ]; then List="" fi for savedir in $List; do patch=`basename $savedir` if [ $patch = $SUNW_PATCHID ]; then break fi # If we get here then the previous patch gets deleted if [ -f $savedir/undo ]; then mv $savedir/undo $savedir/obsolete echo $SUNW_PATCHID >> $savedir/obsoleted_by elif [ -f $savedir/undo.Z ]; then mv $savedir/undo.Z $savedir/obsolete.Z echo $SUNW_PATCHID >> $savedir/obsoleted_by elif [ -f $savedir/remote ]; then `grep . $PKGSAV/$patch/remote | sed 's|STATE=.*|STATE=obsolete|' > $TEMP_REMOTE` rm -f $PKGSAV/$patch/remote mv $TEMP_REMOTE $PKGSAV/$patch/remote rm -f $TEMP_REMOTE echo $SUNW_PATCHID >> $savedir/obsoleted_by elif [ -f $savedir/obsolete -o -f $savedir/obsolete.Z ]; then echo $SUNW_PATCHID >> $savedir/obsoleted_by fi done if [ "$RET_STATUS" != 0 ]; then cat $POSTINSTALL_ERR_LOG echo "Execution of postinstall encountered problems" echo "postinstall exited with 1" rm -f $POSTINSTALL_ERR_LOG exit $RET_STATUS else rm -f $POSTINSTALL_ERR_LOG fi # If additional operations are required for this package, place # those package-specific commands here. #XXXSpecial_CommandsXXX# #!/sbin/sh # # Copyright 2007 Sun Microsystems, Inc. All rights reserved. # Use is subject to license terms. # # ident "@(#)postinstall 1.19 07/11/12 SMI" # Function: check_add_drv() # # This function will check if the module has an entry in etc/name_to_major # If not simply calls add_drv with the arguments given. If there is # such an entry in name_to_major file, it adds entries in driver_aliases # driver_classes and minor_perm if necessary. # The syntax of this function is the same as add_drv. check_add_drv() { if [ "$BASEDIR" = "" ] then BASEDIR=/ fi alias="" class="" ADD_ALIAS=0 ADD_CLASS=0 ADD_MINOR=0 OPTIND=1 IS_NET_DRIVER=0 cmd="add_drv" NO_CMD= while getopts i:b:m:c:N opt do case $opt in N ) NO_CMD=1;; i ) ADD_ALIAS=1 alias=$OPTARG cmd=$cmd" -i '$alias'" ;; m ) ADD_MINOR=1 minor=$OPTARG cmd=$cmd" -m '$minor'" ;; c) ADD_CLASS=1 class=$OPTARG cmd=$cmd" -c $class" ;; b) BASEDIR=$OPTARG cmd=$cmd" -b $BASEDIR" ;; \?) echo "check_add_drv can not handle this option" return ;; esac done shift `/usr/bin/expr $OPTIND - 1` drvname=$1 cmd=$cmd" "$drvname drvname=`echo $drvname | /usr/bin/sed 's;.*/;;g'` /usr/bin/grep "^$drvname[ ]" $BASEDIR/etc/name_to_major > /dev/null 2>&1 if [ "$NO_CMD" = "" -a $? -ne 0 ] then eval $cmd else # entry already in name_to_major, add alias, class, minorperm # if necessary if [ $ADD_ALIAS = 1 ] then for i in $alias do /usr/bin/egrep "^$drvname[ ]+$i" $BASEDIR/etc/driver_aliases>/dev/null 2>&1 if [ $? -ne 0 ] then echo "$drvname $i" >> $BASEDIR/etc/driver_aliases fi done fi if [ $ADD_CLASS = 1 ] then /usr/bin/egrep "^$drvname[ ]+$class( | |$)" $BASEDIR/etc/driver_classes > /dev/null 2>&1 if [ $? -ne 0 ] then echo "$drvname\t$class" >> $BASEDIR/etc/driver_classes fi fi if [ $ADD_MINOR = 1 ] then /usr/bin/grep "^$drvname:" $BASEDIR/etc/minor_perm > /dev/null 2>&1 if [ $? -ne 0 ] then minorentry="$drvname:$minor" echo $minorentry >> $BASEDIR/etc/minor_perm fi fi fi } SPARCALIAS='"pci8086,1000" "pci8086,1001" "pci8086,1004" "pci8086,1008" "pci8086,1009" "pci8086,100c" "pci8086,100d" "pci8086,100e" "pci8086,100f" "pci8086,1010" "pci8086,1011" "pci8086,1012" "pci8086,1013" "pci8086,1014" "pci8086,1015" "pci8086,1016" "pci8086,1017" "pci8086,1018" "pci8086,1019" "pci8086,101a" "pci8086,101d" "pci8086,101e" "pci8086,1026" "pci8086,1027" "pci8086,1028" "pci8086,1049" "pci8086,104a" "pci8086,104b" "pci8086,104c" "pci8086,104d" "pci8086,105a" "pci8086,105b" "pci8086,105c" "pci8086,1060" "pci8086,1061" "pci8086,1062" "pci8086,1063" "pci8086,1075" "pci8086,1076" "pci8086,1077" "pci8086,1078" "pci8086,1079" "pci8086,107a" "pci8086,107b" "pci8086,107c" "pci8086,107d" "pci8086,107e" "pci8086,107f" "pci8086,108a" "pci8086,108b" "pci8086,108c" "pci8086,1096" "pci8086,1098" "pci8086,1099" "pci8086,109a" "pci8086,10a4" "pci8086,10a5" "pci8086,10b5" "pci8086,10b9" "pci8086,10ba" "pci8086,10bb" "pci8086,10bc" "pci8086,10bd" "pci8086,10be" "pci8086,10bf" "pci8086,10c0" "pci8086,10c2" "pci8086,10c3" "pci8086,10c4" "pci8086,10c5" "pci8086,10d5" "pci8086,10d9" "pci8086,10da" "pci8086,294c" "pciex8086,1049" "pciex8086,104a" "pciex8086,104b" "pciex8086,104c" "pciex8086,104d" "pciex8086,1060" "pciex8086,107d" "pciex8086,107e" "pciex8086,107f" "pciex8086,108b" "pciex8086,108c" "pciex8086,1096" "pciex8086,1098" "pciex8086,109a" "pciex8086,10a4" "pciex8086,10a5" "pciex8086,10b9" "pciex8086,10ba" "pciex8086,10bb" "pciex8086,10bc" "pciex8086,10bd" "pciex8086,10be" "pciex8086,10bf" "pciex8086,10c0" "pciex8086,10c2" "pciex8086,10c3" "pciex8086,10c4" "pciex8086,10c5" "pciex8086,10d5" "pciex8086,10d9" "pciex8086,10da" "pciex8086,294c"' # aliases for Intel Ophir chipset NEWALIAS='"pciex8086,105e" "pciex8086,105f" "pci8086,105e" "pci8086,105f"' CMPLALIAS="$SPARCALIAS $NEWALIAS" if [ ${ARCH} = "sparc" ] then if grep "\" $BASEDIR/etc/name_to_major > /dev/null 2>&1 then # if ipge driver exists, add the original set of SPARCALIAS check_add_drv -b "${BASEDIR}" -i "$SPARCALIAS" \ -m '* 0666 root root' e1000g else check_add_drv -b "${BASEDIR}" -i "$CMPLALIAS" \ -m '* 0666 root root' e1000g fi else if [ ${ARCH} = "i386" ] then check_add_drv -b "${BASEDIR}" -i "$CMPLALIAS" \ -m '* 0666 root root' e1000g fi fi exit 0