#!/bin/bsh
# IBM_PROLOG_BEGIN_TAG 
# This is an automatically generated prolog. 
#  
# onc720 src/oncplus/usr/sbin/netdisk/INSTALL.sh 1.1 
#  
# Licensed Materials - Property of IBM 
#  
# COPYRIGHT International Business Machines Corp. 1994,1997 
# All Rights Reserved 
#  
# US Government Users Restricted Rights - Use, duplication or 
# disclosure restricted by GSA ADP Schedule Contract with IBM Corp. 
#  
# IBM_PROLOG_END_TAG 
#
#   COMPONENT_NAME: onccmds
#
#   FUNCTIONS: unmountall
#
#   ORIGINS: 24,27
#
#
#   (C) COPYRIGHT International Business Machines Corp. 1994,1997
#   All Rights Reserved
#   Licensed Materials - Property of IBM
#   US Government Users Restricted Rights - Use, duplication or
#   disclosure restricted by GSA ADP Schedule Contract with IBM Corp.
#

# INSTALL:  script to add diskless architecture support and add clients
#
#  	Copyright (c) 1987 by Sun Microsystems, Inc.
#

trap unmountall 2 3 9

unmountall () {
        if [ -n "$CDFS_PATH" ] ; then
                unmount $CDFS_PATH 2>&1 > /dev/null
                rmfs $CDFS_PATH 2>&1 > /dev/null
                rmdir $CDFS_PATH 2>&1 > /dev/null
        fi
        exit
}

HOME=/; export HOME
PATH=/bin:/usr/bin:/usr/sbin:/etc:/usr/lpp/nfs/sun_diskless:/usr/ucb

CMDNAME=$0
RELEASE="1.0"
HOSTS="/etc/hosts"
BOOTPARAMS="/etc/bootparams"
YPMASTERPATH="/var/yp"

# If $TAPE starts with /dev/ then $TAPEDEV will be that name.  Otherwise
# tape device name $TAPEDEV constructed from ${NRTAPE}${TAPE}${DEVNO}
#       NRTAPE  is the prefix (including rooted path name)
#       TAPE    is the driver type taken from input prompt
#       DEVNO   is the suffix
# The device name should be the non-rewinding tape device to use.
NRTAPE="/dev/nr"
DEVNO="0"

# Specify default values for various paths here
ROOTPATHDEF=/export/root
SWAPPATHDEF=/export/swap
DUMPPATHDEF=none
HOMEPATHDEF=/home
EXECDEF=""
SWAPDEF=""
CLIENTYPDEF=""
UPGRADE="no"
case $# in
1)
        PVAL=${1}; shift
        case $PVAL in
        "upgrade" )
                UPGRADE="yes"
                echo "UPGRADE INSTALL"
                ;;
        *)
                ;;
        esac
        ;;
*)
        ;;
esac


echo
echo "	>>>	Sun Diskless Client Installation Tool	<<<"
echo "	>>>		(for non-Sun Servers)		<<<"
echo "	>>>		     Release $RELEASE		<<<"
#
# Get system hostname and YP domain name
#
HOST=`hostname`
DOMAIN=`domainname`
#
# Specify tape drive type : local or remote
# If remote, specify tape host name
#
while true; do
        echo
        echo "Enter tape drive type ? [local | remote]: \c"
        read DRIVE;
        case "$DRIVE" in
        "local"|"l" )
		TAPEHOST=""
                break ;;
        "remote"|"r" )
		while true; do
			echo;echo "Enter host of remote drive ? \c"
			read TAPEHOST;
			case "$TAPEHOST" in
			"" )
				echo; echo "${CMDNAME}: invalid tape host."
				;;
			* )
				if [ "$DOMAIN" = "noname" -o "$DOMAIN" = "" ];
				then
					host $TAPEHOST > /dev/null
				else
					ypmatch $TAPEHOST hosts >/dev/null
				fi
				case $? in
				1)
					echo
					echo "${CMDNAME}: invalid tapehost."
					;;
				*)
					break ;;
				esac ;;
			esac
		done
		break ;;
	* )
		echo "${CMDNAME}: invalid tape drive type \"${DRIVE}\"." ;;
	esac
done
#
# Specify tape type : ar, st, mt, xt or /dev/something
#
while true; do 
	echo
	echo \
"Enter tape type ? [ar[08] | st[08] | mt[08] | xt[08] | cd? | /dev/???]: \c"
	read TAPE;
	case "$TAPE" in
	ar | ar0 | nrar0 )
		TAPE=ar
		break ;;
	ar8 | nrar8 )
		TAPE=ar
		DEVNO=8
		break ;;
	st | st0 | nrst0 )
		TAPE=st
		break ;;
	st8 | nrst8 )
		TAPE=st
		DEVNO=8
		break ;;
       	/dev/* )
		break ;;
	mt | mt0 | nrmt0 | xt | xt0 | nrxt0 )
		TAPE=mt
		break ;;
	mt8 | nrmt8 | xt8 | nrxt8 )
		TAPE=mt
		DEVNO=8
		break ;;
        cd*)
                if [  $DRIVE = "r" ] || [ $DRIVE = "remote"  ] ; then
			echo " "
			echo "An install from CD-ROM on a remote host"
			echo "is not supported.  Please use an alternate"
			echo "media or local install."
			echo " "
			exit 1
		fi
                CDFS_PATH="/tmp/cdfs_$$"
                crfs -v cdrfs -p ro -d"$TAPE" -m"$CDFS_PATH" -A'no'
                if [ $? != 0 ] ; then
                        echo "${CMDNAME}: invalid device for cdrom file system"
                else
                        mount $CDFS_PATH
                        if [ $? != 0 ] ; then
                                echo "$CMDNAME: error in mounting cdrom file sys
tem"
                                rmfs $CDFS_PATH
                        else
                                TAPEHOST="$CDFS_PATH"
                                DEVNO=""
                                NRTAPE=""
                                break
                        fi
                fi
                ;;

       	* )
               	echo "${CMDNAME}: invalid tape type \"${TAPE}\"." ;;
	esac
done

#
# the statment of TAPEDEV=$TAPE was used instead
#
case $TAPE in
/dev/* )
	TAPEDEV=$TAPE
	;;
* )
	TAPEDEV=${NRTAPE}${TAPE}${DEVNO}
	;;
esac
#
# Create a list of architecture types.  Valid types are determined
# from the release tapes.
#
ARCHLIST=""
PATHLIST=""
while true; do
	while true; do
		echo "
Enter next architecture type to load
    [ sun2 | sun3 | ... | continue | done ]: \c"
		read ARCH;
		for i in ${ARCHLIST}; do
			case "$i" in
			"$ARCH")
				echo "\"${ARCH}\" already specified."
				break ;;
			esac
		done
		case "$i" in
		"$ARCH")
			;;
		*)
			break ;;
		esac
	done
	case "$ARCH" in
	"" | "execs" | "clients" | "share" | "noshare" )
		echo "${CMDNAME}: invalid architecture \"${ARCH}\"."
		;;
	"done" )
		break ;;
	"continue" | "c" )
		# continue with setup_exec with data already gathered
		ARCH=continue
		case "$ARCHLIST" in
		"")
			if [ -f /tmp/ARCHLIST ]; then
			    ARCHLIST=`cat /tmp/ARCHLIST`
			    case "$ARCHLIST" in
			    "")
				echo "No current architectures to use."
				;;
			    *)
				if [ -f /tmp/PATHLIST ]; then
				    PATHLIST=`cat /tmp/PATHLIST`
				    case "$PATHLIST" in
				    "")
					;;
				    *)
					echo "Continuing with architecture(s)\c"
					for i in $ARCHLIST
					do
					    case $i in
					    execs | clients | share | noshare )
						;;
					    * )
						echo " $i \c"
						;;
					    esac
					done
					echo ""
                                        if [ -f /tmp/UPGRADE ]; then
                                                UPGRADE="yes"
                                        fi
					break ;;
				    esac
				fi
				echo "No current pathlist to use."
				;;
			    esac
			else
			    echo "No current architectures to use."
			fi ;;
		*)
			echo "
Cannot continue after specifying additional architectures."
			;;
		esac ;;
	* )
		while true; do
			echo
			echo "Enter pathname for $ARCH executables ? \c"
			read EXEC;
			case "$EXEC" in
			"" )
				case "$EXECDEF" in
				"")
					;;
				*)
					EXEC=$EXECDEF
					echo "Using default \"$EXEC\""
					;;
				esac ;;
			esac
			case "$EXEC" in
			"" )
				;;
			*/$ARCH | */$ARCH/* )
				echo \
"Please give pathname without \"$ARCH\" at end."
				;;
			/* )
			    rm -f /tmp/*${ARCH}
			    if [ -d ${EXEC}/${ARCH}/bin ]; then
				echo "
${CMDNAME}: exec tree ${EXEC}/${ARCH} appears to already exist.
  You may select one of the following options:
	ignore	continue as if this architecture had not been specified
	remove	remove existing exec tree, then continue
	use	continue, loading any new optional software specified
        upgrade continue, loading all new files unconditionally
	clients	continue with $ARCH clients, but use existing exec tree
			? \c"
			        while true; do
				    read ans
				    case "$ans" in
				    "ignore" | "use" | "clients" | "upgrade" )
					break ;;
				    "remove" )
					echo "Removing ${EXEC}/${ARCH}..."
					rm -rf ${EXEC}/${ARCH}
					if [ -d ${EXEC}/${ARCH} ]; then
					    echo \
"  ${EXEC}/${ARCH} not removed; architecture ${ARCH} ignored"
					    ans=ignore
					else
					    ans=use
					fi
					break ;;
				    * )
					echo \
"Please enter \"ignore\" \"remove\" \"use\" \"upgrade\" or \"clients\" : \c"
					;;
				    esac
			        done
			    else
				ans=use
			    fi
			    # ans is one of ignore, use, upgrade or clients
			    case "$ans" in
			    "upgrade" | "use" )
                                if [ ${ans} = "upgrade" ]; then
                                        UPGRADE="yes"
                                fi
				STATUS=error
				opt_software ${ARCH} ${TAPEDEV} ${TAPEHOST}
				case $? in
				0 )
					ARCHLIST="${ARCHLIST} ${ARCH}"
					STATUS=ok
				esac
				case $STATUS in
				error)
					echo "
${CMDNAME}: error in opt_software; $ARCH architecture entry ignored."
					;;
				esac
				;;
			    "clients" )
				EXECDEF=$EXEC
				PATHLIST="${PATHLIST} ${EXEC}"
				ARCHLIST="${ARCHLIST} clients ${ARCH}"
				;;
			    * )
				# ignore
				echo "$ARCH architecture entry ignored."
				;;
			    esac
			    break
			    ;;
					
			* )
			    echo "Exec pathname must start with \"/\""
			    ;;
			esac
		done
		;;
	esac
done
rm -f /tmp/PATHLIST /tmp/ARCHLIST
echo "$ARCHLIST" > /tmp/ARCHLIST
echo "$PATHLIST" > /tmp/PATHLIST
if [ ${UPGRADE} = "yes" ]; then
        touch /tmp/UPGRADE
else
        rm -f /tmp/UPGRADE
fi

#
# Gather client info
# $RESET on input causes current client info to be reset and ignored
#
RESET="^"
case $ARCH in
continue)
	# already have client info.  Skip to setup_exec.
	;;
*)
    #  get client info for all ARCHSTATES (execs and clients)
    for ARCH in ${ARCHLIST}; do
	case $ARCH in
	share | noshare | execs | clients )
	    # ignore keywords
	    ;;
	* )
	    while true; do
		case "$STATE" in
		reset)
			echo ">> $CLIENT entries ignored"
			;;
		esac
		STATE=ok
		echo
		echo "Enter a $ARCH client name ? [ name | done ]: \c"
		read CLIENT;
		case "$CLIENT" in
		"" )
			;;
		"none" | "done" )
			break ;;
		* )
			#
			# Verify that host and ether entries are present
			#
			echo
			echo "Verifying ip address..."
			rm -f /tmp/ipaddr
			if [ "$DOMAIN" = "noname" -o "$DOMAIN" = "" ]; then
                                host $CLIENT | awk '{ print $3 }' > /tmp/ipaddr
			else
				ypmatch $CLIENT hosts | awk '{ print $1 }' \
				  > /tmp/ipaddr
			fi
			IPADDR=`cat /tmp/ipaddr`
			rm -f /tmp/ipaddr
			case "$IPADDR" in
			"")
				echo "
${CMDNAME}: can't find ip address in /etc/hosts for \"${CLIENT}\""
				echo
				STATE=reset
				;;
			*)
				echo "  $IPADDR $CLIENT"
				;;
			esac
			#
			# Verify ethernet address
			#
			echo
			echo "Verifying ethernet address..."
			rm -f /tmp/etheraddr
			if [ "$DOMAIN" = "noname" -o "$DOMAIN" = "" ]; then
				grep -w $CLIENT /etc/ethers | grep -v "^#" \
				  | awk '{ print $1 }' > /tmp/etheraddr
			else
				ypmatch $CLIENT ethers | awk '{ print $1 }' \
				  > /tmp/etheraddr
			fi
			ETHERADDR=`cat /tmp/etheraddr`
			rm -f /tmp/etheraddr
			case "$ETHERADDR" in
			"")
				echo "
${CMDNAME}: can't find ethernet address in /etc/ethers for \"${CLIENT}\""
				echo
				STATE=reset
				;;
			*)
				echo "  $ETHERADDR $CLIENT"
				;;
			esac

			case $STATE in
			ok)
			    while true; do
				echo
				echo \
"Enter yp type of $CLIENT ? [ master | slave | client | none ]: "
				read CLIENTYP;
				case "$CLIENTYP" in
				"")
					case "$CLIENTYPDEF" in
					"")
						;;
					*)
						CLIENTYP=$CLIENTYPDEF
						echo "Using default \"$CLIENTYP\""
						break ;;
					esac ;;
				"master" | "slave" | "client" | "none" )
					CLIENTYPDEF=$CLIENTYP
					break ;;
				"$RESET")
					STATE=reset
					break ;;
				* )
					;;
				esac
			    done ;;
			esac
			case $STATE in
			ok)
			    while true; do
				echo
				echo "Enter swap size of $CLIENT ? \c"
				read SWAP;
				case "$SWAP" in
				"$RESET")
					STATE=reset
					break ;;
				[0-9]* )
					SWAPDEF=$SWAP
					break ;;
				*)
					if [ "$SWAP" = "" -a "$SWAPDEF" != "" ]; then
						SWAP=$SWAPDEF
						echo "Using default \"$SWAP\""
						break
					fi
					echo "
Swap size must start with a digit (\"$SWAP\" is not valid)
Examples: 16M or 16m ==> 16 * 1048576 bytes
	  16K or 16k ==> 16 * 1000 bytes
	  16B or 16b ==> 16 * 512 bytes
	  16         ==> 16 bytes )"
					;;
				esac
			    done ;;
			esac
			case $STATE in
			ok)
			    while true; do
				echo
				echo "Enter root pathname of $CLIENT ? \c"
				read ROOTPATH;
				case "$ROOTPATH" in
				"" )
					case "$ROOTPATHDEF" in
					"")
						;;
					*)
						ROOTPATH=$ROOTPATHDEF
						echo "Using default \"$ROOTPATH\""
						break ;;
					esac ;;
				"$RESET")
					STATE=reset
					break ;;
				*/$CLIENT )
					echo \
"Please give pathname without \"$CLIENT\" at end."
					;;
				/* )
					ROOTPATHDEF=$ROOTPATH
					break ;;
				* )
					echo \
"Root pathname must start with \"/\""
					;;
				esac
			    done ;;
			esac
			case $STATE in
			ok)
			    while true; do
				echo
				echo  "Enter swap pathname of $CLIENT ? \c"
				read SWAPPATH;
				case "$SWAPPATH" in
				"" )
					case "$SWAPPATHDEF" in
					"")
						;;
					*)
						SWAPPATH=$SWAPPATHDEF
						echo "Using default \"$SWAPPATH\""
						break ;;
					esac ;;
				"$RESET")
					STATE=reset
					break ;;
				*/$CLIENT )
					echo \
"Please give pathname without \"$CLIENT\" at end."
					;;
				/* )
					SWAPPATHDEF=$SWAPPATH
					break ;;
				* )
					echo \
"Swap pathname must start with \"/\""
					;;
				esac
			    done ;;
			esac
			case $STATE in
			ok)
			    while true; do
				echo
				echo  "Enter dump pathname of $CLIENT (or \"none\") ? \c"
				read DUMPPATH;
				case "$DUMPPATH" in
				"" )
					case "$DUMPPATHDEF" in
					"")
						;;
					*)
						DUMPPATH=$DUMPPATHDEF
						echo "Using default \"$DUMPPATH\""
						break ;;
					esac ;;
				"$RESET")
					STATE=reset
					break ;;
				*/$CLIENT )
					echo \
"Please give pathname without \"$CLIENT\" at end."
					;;
				/* | none )
					DUMPPATHDEF=$DUMPPATH
					break ;;
				* )
					echo \
"Dump pathname must start with \"/\""
					;;
				esac
			    done ;;
			esac
			case $STATE in
			ok)
			    while true; do
				echo
				echo  "Enter home pathname of $CLIENT (or \"none\") ? \c"
				read HOMEPATH;
				case "$HOMEPATH" in
				"" )
					case "$HOMEPATHDEF" in
					"")
						;;
					*)
						HOMEPATH=$HOMEPATHDEF
						echo "Using default \"$HOMEPATH\""
						break ;;
					esac ;;
				"$RESET")
					STATE=reset
					break ;;
				/* | none )
					HOMEPATHDEF=$HOMEPATH
					break ;;
				* )
					echo \
"Home pathname must start with \"/\""
					;;
				esac
			    done ;;
			esac
			case $STATE in
			ok)
			    while true; do
				echo
				echo  "Information for $CLIENT ok ? [y/n] : "
				read ans
				case "$ans" in
				"y" | "yes" )
					break ;;
				"n" | "no" )
					STATE=reset
					break ;;
				* )
					echo "Please answer yes or no."
					;;
				esac
			    done ;;
			esac
			case $STATE in
			ok)
			    echo "$CLIENT"	>> /tmp/CLIENT.${ARCH}
			    echo "$IPADDR"	>> /tmp/CLIENTIP.${ARCH}
			    echo "$ETHERADDR"	>> /tmp/CLIENTETHER.${ARCH}
			    echo "$CLIENTYP"	>> /tmp/CLIENTYP.${ARCH}
			    echo "$SWAP"	>> /tmp/SWAP.${ARCH}
			    echo "$ROOTPATH"	>> /tmp/ROOTPATH.${ARCH}
			    echo "$SWAPPATH"	>> /tmp/SWAPPATH.${ARCH}
			    echo "$DUMPPATH"	>> /tmp/DUMPPATH.${ARCH}
			    echo "$HOMEPATH"	>> /tmp/HOMEPATH.${ARCH}
			    ;;
			esac
			;;
		esac
	    done
	    ;;
	esac
    done
    ;;
esac
#
# Prompt user attention last time before starting to build
#
while true; do
        echo;echo  "Are you ready to start the installation ? [y/n] : "
        read READY;
        case "${READY}" in
        "y" | "yes" )
                break ;;
        "n" | "no" )
                echo "
Installation procedure terminates.
You may continue by running this script and entering \"continue\" at the
first prompt for architecture type."
                unmountall ;;
        * )
                echo;echo "Please answer only yes or no."
        esac
done

#
# Installation starts
#
ARCHSTATE=execs
for CURRENTARCH in ${ARCHLIST}; do
  case $CURRENTARCH in
  execs | clients | share | noshare )
    ARCHSTATE=$CURRENTARCH
    ;;
  * )
    echo
    echo "Beginning Installation for the ${CURRENTARCH} architecture."
    #
    # get path and read in release tape
    #
EXECPATH=${EXEC}
    case "$ARCHSTATE" in
    execs | share | noshare )
            setup_exec $CURRENTARCH $EXECPATH $DRIVE $TAPEHOST $TAPEDEV
            STATUS=$?
	    ;;
    * )
            # do not setup these execs
            echo
            echo "[${CURRENTARCH} executables already installed]"
            STATUS=0
            ;;
    esac
    
    case ${STATUS} in
    0)
	echo
	echo "Starting installation of ${CURRENTARCH} clients..."
	echo
	if [ -f /tmp/CLIENT.${CURRENTARCH} ]; then
		#
		# Read these files just once.
		# The 'set' hacks are used to avoid using 'expr'
		# counters, which are not built-in and take awhile
		# to do as the loops get bigger.
		# 
		IPLIST=`cat /tmp/CLIENTIP.${CURRENTARCH}`
		ETHERLIST=`cat /tmp/CLIENTETHER.${CURRENTARCH}`
		YPLIST=`cat /tmp/CLIENTYP.${CURRENTARCH}`
		SWAPLIST=`cat /tmp/SWAP.${CURRENTARCH}`
		ROOTPATHLIST=`cat /tmp/ROOTPATH.${CURRENTARCH}`
		SWAPPATHLIST=`cat /tmp/SWAPPATH.${CURRENTARCH}`
		DUMPPATHLIST=`cat /tmp/DUMPPATH.${CURRENTARCH}`
		HOMEPATHLIST=`cat /tmp/HOMEPATH.${CURRENTARCH}`
		for i in `cat /tmp/CLIENT.${CURRENTARCH}`; do
			set $IPLIST
			IP=$1
			shift
			IPLIST="$*"

			set $ETHERLIST
			ETHER=$1
			shift
			ETHERLIST="$*"

			set $YPLIST
			YP=$1
			shift
			YPLIST="$*"

			set $SWAPLIST
			SWAP=$1
			shift
			SWAPLIST="$*"

			set $ROOTPATHLIST
			ROOTPATH=$1
			shift
			ROOTPATHLIST="$*"

			set $SWAPPATHLIST
			SWAPPATH=$1
			shift
			SWAPPATHLIST="$*"

			set $DUMPPATHLIST
			DUMPPATH=$1
			shift
			DUMPPATHLIST="$*"

			set $HOMEPATHLIST
			HOMEPATH=$1
			shift
			HOMEPATHLIST="$*"
			#
			# Create client
			#
			setup_client add $i $YP $SWAP \
				$ROOTPATH $SWAPPATH $DUMPPATH \
				$HOMEPATH $EXECPATH $CURRENTARCH
			case $? in
			0)
				DIDACLIENT=yes
				;;
			*)
				echo "
ATTENTION: $CURRENTARCH client $i not installed."
				echo
				;;
			esac
		done
	fi
	;;
    *)
	echo
	echo "ATTENTION: exec installation for $CURRENTARCH failed."
	echo "           $CURRENTARCH clients not installed."
	;;
    esac
    ;;
  esac
done
case "$DIDACLIENT" in
yes)
	if [ "$DOMAIN" != "noname" -a "$DOMAIN" != "" -a -f ${YPMASTERPATH}/bootparams.time ]; then
		echo
		echo "Updating bootparams YP map..."
		cd ${YPMASTERPATH}
		make bootparams
	elif [ "$DOMAIN" != "noname" -a "$DOMAIN" != "" -a ! -f ${YPMASTERPATH}/bootparams.time ]; then
		if [ ! -f ${YPMASTERPATH}/bootparams.time- ]; then
			echo "
ATTENTION: /etc/bootparams on the yp master needs to be updated."
		fi
	fi ;;
esac
echo
case "$ARCHLIST" in
"")
	echo "Nothing to install!"
	;;
*)
	echo "Diskless Client Installation Completed."
	;;
esac
unmountall
exit 0
