# This script creates the backout package for a patch package
#
# directory format options.
#
# @(#) postinstall 1.10 99/04/23 SMI
#
# Copyright (c) 1995 by Sun Microsystems, Inc.
# All rights reserved
#

# Description:
#       Set the TYPE parameter for the remote file
#
# Parameters:
#       none
#
# Globals set:
#	TYPE

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

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

#
# 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
#
Our_Deletes=$THIS_DIR/deletes
if [ -f $Our_Deletes ]; then
	cd $BASEDIR

	cat $Our_Deletes | while read path; do
		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.
		LINE=`pkgproto $Proto_Path=$path`
		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

		# Remove the file only if it's OK'd by removef
		rm `removef $PKGINST $Client_Path` 1>/dev/null 2>&1
	done
	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

	pkgmk -o -d $STAGE_DIR 1>/dev/null 2>&1
	pkgtrans -s $STAGE_DIR $ARCHIVE_DIR/undo $PKG 1>/dev/null 2>&1
	compress $ARCHIVE_DIR/undo
	retcode=$?
	if [ "$PATCH_UNDO_ARCHIVE" != "none" ]; then
		if [ $retcode != 0 ]; then
			build_remote_file "undo"
		else
			build_remote_file "undo.Z"
		fi
	fi
	rm -r $STAGE_DIR/$PKG

	cd ..
	rm -r $BUILD_DIR
	# remove the scripts that are left behind
	install_scripts=`dirname $0`
	rm $install_scripts/checkinstall $install_scripts/patch_checkinstall $install_scripts/patch_postinstall
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 additional operations are required for this package, place
# those package-specific commands here.

#XXXSpecial_CommandsXXX#

ASPPP=/etc/init.d/asppp
TMP=/tmp/asppp.$$

#
# Add an exit to the old starting script
#
if [ -f ${ASPPP} ]; then

# SSP CTE fix for esc. #507885, bug. #4018335
# since preremove script does not remove these lines, better test
# if they exist before adding them

        grep pppexit_for3_X ${ASPPP} > /dev/null 2>&1
        if [ "$?" = "1" ]; then

                sed -e 's/^PATH/\
pppexit_for3_X() {      # Do not remove. Change for Solstice PPP 3.X \
        exit 0 \
}\
pppexit_for3_X \
\
\
PATH/' ${ASPPP} > ${TMP}

                cp ${TMP} ${ASPPP}
                rm ${TMP}
        fi
# end SSP CTE fix for esc. #507885, bug. #4018335
fi

#
# Add the ttydefs lines
# TODO: make it directly in the package with sed section
#
#
TTYDEFS=/etc/ttydefs
STTYDEFS=/usr/sbin/sttydefs
PPPDEFS="ppp115200 ppp57600 ppp38400 ppp19200 ppp9600 ppp4800"
UUDEFS="uu115200 uu57600 uu38400 uu19200 uu9600 uu4800"
DEFS="${PPPDEFS} ${UUDEFS}"
PPPFLAGS="cs8 -parenb hupcl"
UUFLAGS="cs7 parenb parodd hupcl"
#
# remove existing entries
#
for E in $DEFS; do
        $STTYDEFS -r $E > /dev/null 2>&1
done

# SSP CTE fix for esc. #507885, bug. #4018335
#
# set support speed
#
case `/usr/bin/uname -r` in
        5.3|5.4)
                SUPPORT_SPEED="38400 19200 9600 4800"
                ;;
        *)
                SUPPORT_SPEED="115200 57600 38400 19200 9600 4800"
                ;;
esac
HIGHEST_SPEED=`echo "${SUPPORT_SPEED}" | nawk '{print $1}'`
LOWEST_SPEED=`echo "${SUPPORT_SPEED}" | nawk '{print $NF}'`

#
# Add new one
#
PPPFLAGS="cs8 -parenb hupcl"
UUFLAGS="cs7 parenb parodd hupcl"

for SPEED in ${SUPPORT_SPEED} ; do
        ENTRY="ppp${SPEED}"
        FLAGS="${SPEED} ${PPPFLAGS}"
        NEXT="uu${SPEED}"
        #
        # The sttydefs always set set autobaud flag
        #
        # $STTYDEFS -a $ENTRY -n $NEXT -i "$FLAGS" -f "$FLAGS"
        LINE="${ENTRY}:${FLAGS}:${FLAGS}::${NEXT}"
        echo "${LINE}" >> /etc/ttydefs
done

#
# Add the one for uucp
#
NEXTSPEED=""
for SPEED in ${SUPPORT_SPEED} ; do
        if [ "${SPEED}" = "${LOWEST_SPEED}" ] ; then
                NEXTSPEED="${HIGHEST_SPEED}"
        else
                case "${SPEED}" in
                57600)  NEXTSPEED=38400
                        ;;
                *)      NEXTSPEED=`expr "${SPEED}" / 2`
                        ;;
                esac
        fi
        ENTRY="uu${SPEED}"
        FLAGS="${SPEED} ${UUFLAGS}"
        NEXT="ppp${NEXTSPEED}"
        #
        # Compute the link
        #
        # $STTYDEFS -a $ENTRY -n $NEXT -i "$FLAGS" -f "$FLAGS"
        LINE="${ENTRY}:${FLAGS}:${FLAGS}::${NEXT}"
        echo "${LINE}" >> /etc/ttydefs
done

#
# was:
#
# Add new one
#
# for D in $PPPDEFS; do
#       SPEED=`echo $D | sed 's/^ppp//'`
#       FLAGS="${SPEED} ${PPPFLAGS}"
#       NEXT="uu${SPEED}"
        #
        # The sttydefs always set set autobaud flag
        #
        # $STTYDEFS -a $D -n $NEXT -i "$FLAGS" -f "$FLAGS"
#       LINE="${D}:${FLAGS}:${FLAGS}::${NEXT}"
#       echo "${LINE}" >> /etc/ttydefs
#done
#
# Add the one for uucp
#
#for D in $UUDEFS; do
#       SPEED=`echo $D | sed 's/^uu//'`
#       FLAGS="${SPEED} ${UUFLAGS}"
        #
        # Compute the link
        #
#       case $D in
#       uu115200) NEXT=ppp57600 ;;
#       uu57600)  NEXT=ppp38400 ;;
#       uu38400)  NEXT=ppp19200 ;;
#       uu19200)  NEXT=ppp9600  ;;
#       uu9600)   NEXT=ppp4800  ;;
#       uu4800)   NEXT=ppp2400  ;;
#       uu2400)   NEXT=ppp1200  ;;
#       uu1200)   NEXT=ppp38400 ;;
#       *)        NEXT=$D       ;;
#       esac
#       LINE="${D}:${FLAGS}:${FLAGS}::${NEXT}"
#       echo "${LINE}" >> /etc/ttydefs
#done
# end SSP CTE fix for esc. #507885, bug. #4018335

#
# Add ppp the password entry
#
# useradd check the shell
# We have to be sure about the order of the pkg installation
# useradd -c 'Solstice PPP 3.0' -g 5 -o -u 10 -d / -s /usr/sbin/pppls ppp

PASSWD_ENTRY="ppp:x:10:5:Solstice PPP 3.0 pppls:/:/usr/sbin/pppls"
SHADOW_ENTRY="ppp:*LK*:::::::"

grep '^ppp' /etc/passwd > /dev/null 2>&1
if [ $? -eq 1 ]; then
        echo "$PASSWD_ENTRY" >> /etc/passwd
        echo "$SHADOW_ENTRY" >> /etc/shadow
fi

exit 0
