Home | History | Annotate | Line # | Download | only in miniroot
install.sub revision 1.14
      1   1.1       pk #!/bin/sh
      2  1.14      leo #	$NetBSD: install.sub,v 1.14 1996/07/04 06:57:21 leo Exp $
      3   1.1       pk #
      4   1.2  thorpej # Copyright (c) 1996 The NetBSD Foundation, Inc.
      5   1.1       pk # All rights reserved.
      6   1.1       pk #
      7   1.2  thorpej # This code is derived from software contributed to The NetBSD Foundation
      8   1.2  thorpej # by Jason R. Thorpe.
      9   1.2  thorpej #
     10   1.1       pk # Redistribution and use in source and binary forms, with or without
     11   1.1       pk # modification, are permitted provided that the following conditions
     12   1.1       pk # are met:
     13   1.1       pk # 1. Redistributions of source code must retain the above copyright
     14   1.1       pk #    notice, this list of conditions and the following disclaimer.
     15   1.1       pk # 2. Redistributions in binary form must reproduce the above copyright
     16   1.1       pk #    notice, this list of conditions and the following disclaimer in the
     17   1.1       pk #    documentation and/or other materials provided with the distribution.
     18   1.1       pk # 3. All advertising materials mentioning features or use of this software
     19   1.1       pk #    must display the following acknowledgement:
     20   1.2  thorpej #        This product includes software developed by the NetBSD
     21   1.2  thorpej #        Foundation, Inc. and its contributors.
     22   1.2  thorpej # 4. Neither the name of The NetBSD Foundation nor the names of its
     23   1.2  thorpej #    contributors may be used to endorse or promote products derived
     24   1.2  thorpej #    from this software without specific prior written permission.
     25   1.1       pk #
     26   1.2  thorpej # THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
     27   1.2  thorpej # ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     28   1.2  thorpej # TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     29   1.2  thorpej # PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE
     30   1.2  thorpej # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     31   1.2  thorpej # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     32   1.2  thorpej # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     33   1.2  thorpej # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     34   1.2  thorpej # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     35   1.2  thorpej # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     36   1.2  thorpej # POSSIBILITY OF SUCH DAMAGE.
     37   1.1       pk #
     38   1.1       pk 
     39   1.1       pk #	NetBSD installation/upgrade script - common subroutines.
     40   1.1       pk 
     41   1.1       pk ROOTDISK=""				# filled in below
     42   1.7      leo VERSION=				# filled in automatically (see list)
     43   1.7      leo export VERSION
     44   1.1       pk 
     45   1.1       pk ALLSETS="base comp etc games man misc text"	# default install sets
     46   1.1       pk UPGRSETS="base comp games man misc text"	# default upgrade sets
     47  1.13       pk THESETS=					# one of the above
     48  1.13       pk 
     49  1.13       pk local_sets_dir=""			# Path searched for sets by install_sets
     50  1.13       pk 					# on the local filesystems
     51   1.1       pk 
     52   1.7      leo # decide upon an editor
     53   1.7      leo if [ X$EDITOR = X ]; then
     54   1.7      leo 	if [ -x /usr/bin/vi ]; then
     55   1.7      leo 		EDITOR=vi
     56   1.7      leo 	else
     57   1.7      leo 		EDITOR=ed
     58   1.7      leo 	fi
     59   1.7      leo fi
     60   1.7      leo 
     61   1.1       pk getresp() {
     62   1.1       pk 	read resp
     63   1.1       pk 	if [ "X$resp" = "X" ]; then
     64   1.1       pk 		resp=$1
     65   1.1       pk 	fi
     66   1.1       pk }
     67   1.1       pk 
     68   1.1       pk isin() {
     69   1.1       pk # test the first argument against the remaining ones, return succes on a match
     70   1.1       pk 	_a=$1; shift
     71   1.1       pk 	while [ $# != 0 ]; do
     72   1.1       pk 		if [ "$_a" = "$1" ]; then return 0; fi
     73   1.1       pk 		shift
     74   1.1       pk 	done
     75   1.1       pk 	return 1
     76   1.1       pk }
     77   1.1       pk 
     78   1.1       pk rmel() {
     79   1.1       pk # remove first argument from list formed by the remaining arguments
     80   1.6      leo 	local	_a
     81   1.6      leo 
     82   1.1       pk 	_a=$1; shift
     83   1.1       pk 	while [ $# != 0 ]; do
     84   1.1       pk 		if [ "$_a" != "$1" ]; then
     85   1.1       pk 			echo "$1";
     86   1.1       pk 		fi
     87   1.1       pk 		shift
     88   1.1       pk 	done
     89   1.1       pk }
     90   1.1       pk 
     91   1.3       pk cutword () {
     92   1.3       pk # read a line of data, return Nth element.
     93   1.3       pk 	local _a
     94   1.3       pk 	local _n
     95   1.4       pk 	local _oifs
     96   1.4       pk 
     97   1.4       pk 	# optional field separator
     98   1.4       pk 	_oifs="$IFS"
     99   1.4       pk 	case "$1" in
    100   1.6      leo 		-t?*) IFS=${1#-t}; shift;;
    101   1.4       pk 	esac
    102   1.4       pk 
    103   1.3       pk 	_n=$1
    104   1.3       pk 	read _a; set -- $_a
    105   1.4       pk 	IFS="$_oifs"
    106   1.3       pk 	if [ "$1" = "" ]; then return; fi
    107   1.3       pk 	eval echo \$$_n
    108   1.3       pk }
    109   1.3       pk 
    110   1.3       pk cutlast () {
    111   1.3       pk # read a line of data, return last element. Equiv. of awk '{print $NF}'.
    112   1.3       pk 	local _a
    113   1.4       pk 	local _oifs
    114   1.4       pk 
    115   1.4       pk 	# optional field separator
    116   1.4       pk 	_oifs="$IFS"
    117   1.4       pk 	case "$1" in
    118   1.6      leo 		-t?*) IFS=${1#-t}; shift;;
    119   1.4       pk 	esac
    120   1.4       pk 
    121   1.3       pk 	read _a; set -- $_a
    122   1.4       pk 	IFS="$_oifs"
    123   1.3       pk 	if [ "$1" = "" ]; then return; fi
    124   1.5       pk 	while [ "$#" -gt 10 ]; do shift 10; done
    125   1.3       pk 	eval echo \$$#
    126   1.3       pk }
    127   1.3       pk 
    128   1.3       pk firstchar () {
    129   1.3       pk # return first character of argument
    130   1.3       pk 	local _a
    131   1.3       pk 	_a=$1
    132   1.3       pk 	while [ ${#_a} != 1 ]; do
    133   1.3       pk 		_a=${_a%?}
    134   1.3       pk 	done
    135   1.3       pk 	echo $_a
    136   1.3       pk }
    137   1.3       pk 
    138   1.5       pk basename () {
    139   1.5       pk 	local _oifs
    140   1.5       pk 	if [ "$1" = "" ]; then return; fi
    141   1.5       pk 	_oifs="$IFS"
    142   1.5       pk 	IFS="/"
    143   1.5       pk 	set -- $1
    144   1.5       pk 	IFS="$_oifs"
    145   1.5       pk 	while [ "$#" -gt 10 ]; do shift 10; done
    146   1.5       pk 	eval echo \$$#
    147   1.5       pk }
    148   1.5       pk 
    149   1.7      leo dir_has_sets() {
    150   1.7      leo 	# return true when the directory $1 contains a set for $2...$n
    151   1.7      leo 	local _dir
    152   1.7      leo 	local _file
    153   1.7      leo 
    154   1.7      leo 	_dir=$1; shift
    155   1.7      leo 	for _file in $*
    156   1.7      leo 	do
    157   1.7      leo 		if [ -f $_dir/${_file}.tar.gz ]; then
    158   1.7      leo 			return 0
    159   1.7      leo 		fi
    160  1.13       pk 		# Try for stupid msdos convention
    161  1.13       pk 		if [ -f $_dir/${_file}.tgz ]; then
    162  1.13       pk 			return 0
    163  1.13       pk 		fi
    164   1.7      leo 	done
    165   1.7      leo 	return 1
    166   1.7      leo }
    167   1.7      leo 
    168   1.1       pk twiddle() {
    169   1.1       pk # spin the propeller so we don't get bored
    170   1.1       pk 	while : ; do  
    171   1.1       pk 		sleep 1; echo -n "/";
    172   1.1       pk 		sleep 1; echo -n "-";
    173   1.1       pk 		sleep 1; echo -n "\\";
    174   1.1       pk 		sleep 1; echo -n "|";
    175   1.1       pk 	done > /dev/tty & echo $!
    176   1.1       pk }
    177   1.1       pk 
    178   1.1       pk do_mfs_mount() {
    179   1.1       pk 	# $1 is the mount point
    180   1.1       pk 	# $2 is the size in DEV_BIZE blocks
    181   1.1       pk 
    182   1.1       pk 	umount $1 > /dev/null 2>&1
    183   1.1       pk 	if ! mount_mfs -s $2 swap $1 ; then
    184   1.1       pk 		cat << \__mfs_failed_1
    185   1.1       pk 
    186   1.1       pk FATAL ERROR: Can't mount the memory filesystem.
    187   1.1       pk 
    188   1.1       pk __mfs_failed_1
    189   1.1       pk 		exit
    190   1.1       pk 	fi
    191   1.1       pk 
    192   1.1       pk 	# Bleh.  Give mount_mfs a chance to DTRT.
    193   1.1       pk 	sleep 2
    194   1.1       pk }
    195   1.1       pk 
    196  1.13       pk get_localdir() {
    197  1.13       pk 	# $1 is relative mountpoint
    198  1.13       pk 	local _mp
    199  1.13       pk 	local _dir
    200  1.13       pk 
    201  1.13       pk 	_mp=$1
    202  1.13       pk 	_dir=
    203  1.13       pk 	while : ; do
    204  1.13       pk 	    echo -n "Enter the pathname where the sets are stored [$_dir] "
    205  1.13       pk 	    getresp "$_dir"
    206  1.13       pk 	    _dir=$resp
    207  1.13       pk 
    208  1.13       pk 	    # Allow break-out with empty response
    209  1.13       pk 	    if [ -z "$_dir" ]; then
    210  1.13       pk 		echo -n "Are you sure you don't want to set the pathname? [n] "
    211  1.13       pk 		getresp "n"
    212  1.13       pk 		case "$resp" in
    213  1.13       pk 			y*|Y*)
    214  1.13       pk 				break
    215  1.13       pk 				;;
    216  1.13       pk 			*)
    217  1.13       pk 				continue
    218  1.13       pk 				;;
    219  1.13       pk 		esac
    220  1.13       pk 	    fi
    221  1.13       pk 
    222  1.13       pk 	    if dir_has_sets "$_mp/$_dir" $THESETS
    223  1.13       pk 	    then
    224  1.13       pk 		local_sets_dir="$_mp/$_dir"
    225  1.13       pk 		break
    226  1.13       pk 	    else
    227  1.13       pk 		cat << __get_reldir_1
    228  1.13       pk The directory \"$local_sets_dir\" does not exist, or does not hold any of the
    229  1.13       pk upgrade sets.
    230  1.13       pk __get_reldir_1
    231  1.13       pk 		echo -n "Re-enter pathname? [y] "
    232  1.13       pk 		getresp "y"
    233  1.13       pk 		case "$resp" in
    234  1.13       pk 			y*|Y*)
    235  1.13       pk 				;;
    236  1.13       pk 			*)
    237  1.13       pk 				local_sets_dir=""
    238  1.13       pk 				break
    239  1.13       pk 				;;
    240  1.13       pk 		esac
    241  1.13       pk 	    fi
    242  1.13       pk 	done
    243  1.13       pk }
    244  1.13       pk 
    245   1.1       pk getrootdisk() {
    246   1.1       pk 	cat << \__getrootdisk_1
    247   1.1       pk 
    248   1.1       pk The installation program needs to know which disk to consider
    249   1.1       pk the root disk.  Note the unit number may be different than
    250   1.1       pk the unit number you used in the standalone installation
    251   1.1       pk program.
    252   1.1       pk 
    253   1.1       pk Available disks are:
    254   1.1       pk 
    255   1.1       pk __getrootdisk_1
    256   1.1       pk 	_DKDEVS=`md_get_diskdevs`
    257   1.1       pk 	echo	"$_DKDEVS"
    258   1.1       pk 	echo	""
    259   1.1       pk 	echo -n	"Which disk is the root disk? "
    260   1.1       pk 	getresp ""
    261   1.1       pk 	if isin $resp $_DKDEVS ; then
    262   1.1       pk 		ROOTDISK="$resp"
    263   1.1       pk 	else
    264   1.1       pk 		echo ""
    265   1.1       pk 		echo "The disk $resp does not exist."
    266   1.1       pk 		ROOTDISK=""
    267   1.1       pk 	fi
    268   1.1       pk }
    269   1.1       pk 
    270   1.1       pk labelmoredisks() {
    271   1.1       pk 	cat << \__labelmoredisks_1
    272   1.1       pk 
    273   1.1       pk You may label the following disks:
    274   1.1       pk 
    275   1.1       pk __labelmoredisks_1
    276   1.1       pk 	echo "$_DKDEVS"
    277   1.1       pk 	echo	""
    278   1.1       pk 	echo -n	"Label which disk? [done] "
    279   1.1       pk 	getresp "done"
    280   1.1       pk 	case "$resp" in
    281   1.1       pk 		done)
    282   1.1       pk 			;;
    283   1.1       pk 
    284   1.1       pk 		*)
    285   1.5       pk 			if isin $resp $_DKDEVS ; then
    286   1.1       pk 				md_labeldisk $resp
    287   1.1       pk 			else
    288   1.1       pk 				echo ""
    289   1.1       pk 				echo "The disk $resp does not exist."
    290   1.1       pk 			fi
    291   1.1       pk 			;;
    292   1.1       pk 	esac
    293   1.1       pk }
    294   1.1       pk 
    295   1.1       pk addhostent() {
    296   1.1       pk 	# $1 - IP address
    297   1.1       pk 	# $2 - symbolic name
    298   1.1       pk 
    299   1.1       pk 	# Create an entry in the hosts table.  If no host table
    300   1.1       pk 	# exists, create one.  If the IP address already exists,
    301   1.1       pk 	# replace it's entry.
    302   1.1       pk 	if [ ! -f /tmp/hosts ]; then
    303   1.1       pk 		echo "127.0.0.1 localhost" > /tmp/hosts
    304   1.1       pk 	fi
    305   1.1       pk 
    306   1.3       pk 	sed "/^$1 /d" < /tmp/hosts > /tmp/hosts.new
    307   1.3       pk 	mv /tmp/hosts.new /tmp/hosts
    308   1.1       pk 
    309   1.1       pk 	echo "$1 $2 $2.$FQDN" >> /tmp/hosts
    310   1.1       pk }
    311   1.1       pk 
    312   1.1       pk addifconfig() {
    313   1.1       pk 	# $1 - interface name
    314   1.1       pk 	# $2 - interface symbolic name
    315   1.1       pk 	# $3 - interface IP address
    316   1.1       pk 	# $4 - interface netmask
    317   1.1       pk 
    318   1.1       pk 	# Create a hostname.* file for the interface.
    319   1.1       pk 	echo "inet $2 $4" > /tmp/hostname.$1
    320   1.1       pk 
    321   1.1       pk 	addhostent $3 $2
    322   1.1       pk }
    323   1.1       pk 
    324   1.1       pk configurenetwork() {
    325   1.1       pk 	local _ifsdone
    326   1.1       pk 	local _ifs
    327   1.1       pk 
    328   1.1       pk 	_IFS=`md_get_ifdevs`
    329   1.1       pk 	_ifsdone=""
    330   1.1       pk 	resp=""		# force at least one iteration
    331   1.1       pk 	while [ "X${resp}" != X"done" ]; do
    332   1.1       pk 	cat << \__configurenetwork_1
    333   1.1       pk 
    334   1.1       pk You may configure the following network interfaces (the interfaces
    335   1.1       pk marked with [X] have been succesfully configured):
    336   1.1       pk 
    337   1.1       pk __configurenetwork_1
    338   1.1       pk 
    339   1.1       pk 		for _ifs in $_IFS; do
    340   1.1       pk 			if isin $_ifs $_ifsdone ; then
    341   1.1       pk 				echo -n "[X] "
    342   1.1       pk 			else
    343   1.1       pk 				echo -n "    "
    344   1.1       pk 			fi
    345   1.1       pk 			echo $_ifs
    346   1.1       pk 		done
    347   1.1       pk 		echo	""
    348   1.1       pk 		echo -n	"Configure which interface? [done] "
    349   1.1       pk 		getresp "done"
    350   1.1       pk 		case "$resp" in
    351   1.1       pk 		"done")
    352   1.1       pk 			;;
    353   1.1       pk 		*)
    354   1.1       pk 			_ifs=$resp
    355   1.1       pk 			if isin $_ifs $_IFS ; then
    356   1.1       pk 				if configure_ifs $_ifs ; then
    357   1.1       pk 					_ifsdone="$_ifs $_ifsdone"
    358   1.1       pk 				fi
    359   1.1       pk 			else
    360   1.1       pk 				echo "Invalid response: \"$resp\" is not in list"
    361   1.1       pk 			fi
    362   1.1       pk 			;;
    363   1.1       pk 		esac
    364   1.1       pk 	done
    365   1.1       pk }
    366   1.1       pk 
    367   1.1       pk configure_ifs() {
    368   1.1       pk 
    369   1.8       pk 	local _up
    370   1.8       pk 	local _interface_name
    371   1.8       pk 	local _interface_ip
    372   1.8       pk 	local _interface_mask
    373   1.8       pk 	local _interface_symname
    374   1.8       pk 
    375   1.1       pk 	_interface_name=$1
    376   1.1       pk 
    377   1.8       pk 	set -- `ifconfig $_interface_name | sed -n '
    378   1.8       pk 		1s/.*<UP,.*$/UP/p
    379   1.8       pk 		1s/.*<.*>*$/DOWN/p
    380   1.8       pk 		2s/inet//
    381   1.8       pk 		2s/--> [0-9.][0-9.]*//
    382   1.8       pk 		2s/netmask//
    383   1.8       pk 		2s/broadcast//
    384   1.8       pk 		2p'`
    385   1.8       pk 
    386   1.8       pk 	_up=$1
    387   1.8       pk 	_interface_ip=$2
    388   1.8       pk 	_interface_mask=$3
    389   1.8       pk 
    390   1.1       pk 	# Get IP address
    391   1.1       pk 	resp=""		# force one iteration
    392   1.1       pk 	while [ "X${resp}" = X"" ]; do
    393   1.8       pk 		echo -n "IP address? [$_interface_ip] "
    394   1.8       pk 		getresp "$_interface_ip"
    395   1.1       pk 		_interface_ip=$resp
    396   1.1       pk 	done
    397   1.1       pk 
    398   1.1       pk 	# Get symbolic name
    399   1.1       pk 	resp=""		# force one iteration
    400   1.1       pk 	while [ "X${resp}" = X"" ]; do
    401   1.1       pk 		echo -n "Symbolic (host) name? "
    402   1.1       pk 		getresp ""
    403   1.1       pk 		_interface_symname=$resp
    404   1.1       pk 	done
    405   1.1       pk 
    406   1.1       pk 	# Get netmask
    407   1.1       pk 	resp=""		# force one iteration
    408   1.1       pk 	while [ "X${resp}" = X"" ]; do
    409   1.8       pk 		echo -n "Netmask? [$_interface_mask] "
    410   1.8       pk 		getresp "$_interface_mask"
    411   1.1       pk 		_interface_mask=$resp
    412   1.1       pk 	done
    413   1.1       pk 
    414   1.1       pk 	# Configure the interface.  If it
    415   1.1       pk 	# succeeds, add it to the permanent
    416   1.1       pk 	# network configuration info.
    417   1.8       pk 	if [ $_up != "UP" ]; then
    418   1.8       pk 		ifconfig ${_interface_name} down
    419   1.8       pk 		if ifconfig ${_interface_name} inet \
    420   1.8       pk 		    ${_interface_ip} \
    421   1.8       pk 		    netmask ${_interface_mask} up ; then
    422   1.8       pk 			addifconfig \
    423   1.8       pk 			    ${_interface_name} \
    424   1.8       pk 			    ${_interface_symname} \
    425   1.8       pk 			    ${_interface_ip} \
    426   1.8       pk 			    ${_interface_mask}
    427   1.8       pk 			return 0
    428   1.8       pk 		fi
    429   1.8       pk 	else
    430   1.8       pk 		echo "Interface ${_interface_name} is already active."
    431   1.8       pk 		echo "Just saving configuration on new root filesystem."
    432   1.1       pk 		addifconfig \
    433   1.1       pk 		    ${_interface_name} \
    434   1.1       pk 		    ${_interface_symname} \
    435   1.1       pk 		    ${_interface_ip} \
    436   1.1       pk 		    ${_interface_mask}
    437   1.1       pk 	fi
    438   1.1       pk 	return 1
    439   1.1       pk }
    440   1.1       pk 
    441   1.1       pk # Much of this is gratuitously stolen from /etc/netstart.
    442   1.1       pk enable_network() {
    443   1.1       pk 
    444   1.1       pk 	# Set up the hostname.
    445   1.1       pk 	if [ ! -f /mnt/etc/myname ]; then
    446   1.1       pk 		echo "ERROR: no /etc/myname!"
    447   1.1       pk 		return 1
    448   1.1       pk 	fi
    449   1.1       pk 	hostname=`cat /mnt/etc/myname`
    450   1.1       pk 	hostname $hostname
    451   1.1       pk 
    452   1.1       pk 	# configure all the interfaces which we know about.
    453   1.1       pk (
    454   1.1       pk 	tmp="$IFS"
    455   1.1       pk 	IFS="$IFS."
    456   1.1       pk 	set -- `echo /mnt/etc/hostname*`
    457   1.1       pk 	IFS=$tmp
    458   1.1       pk 	unset tmp
    459   1.1       pk 
    460   1.1       pk 	while [ $# -ge 2 ] ; do
    461   1.1       pk 		shift		# get rid of "hostname"
    462   1.1       pk 		(
    463   1.1       pk 			read af name mask bcaddr extras
    464   1.1       pk 			read dt dtaddr
    465   1.1       pk 
    466   1.1       pk 			if [ ! -n "$name" ]; then
    467   1.1       pk 		    echo "/etc/hostname.$1: invalid network configuration file"
    468   1.1       pk 				exit
    469   1.1       pk 			fi
    470   1.1       pk 
    471   1.1       pk 			cmd="ifconfig $1 $af $name "
    472   1.1       pk 			if [ "${dt}" = "dest" ]; then cmd="$cmd $dtaddr"; fi
    473   1.1       pk 			if [ -n "$mask" ]; then cmd="$cmd netmask $mask"; fi
    474   1.1       pk 			if [ -n "$bcaddr" -a "X$bcaddr" != "XNONE" ]; then
    475   1.1       pk 				cmd="$cmd broadcast $bcaddr";
    476   1.1       pk 			fi
    477   1.1       pk 			cmd="$cmd $extras"
    478   1.1       pk 
    479   1.1       pk 			$cmd
    480   1.1       pk 		) < /mnt/etc/hostname.$1
    481   1.1       pk 		shift
    482   1.1       pk 	done
    483   1.1       pk )
    484   1.1       pk 
    485   1.1       pk 	# set the address for the loopback interface
    486   1.1       pk 	ifconfig lo0 inet localhost
    487   1.1       pk 
    488   1.1       pk 	# use loopback, not the wire
    489   1.1       pk 	route add $hostname localhost
    490   1.1       pk 
    491   1.1       pk 	# /etc/mygate, if it exists, contains the name of my gateway host
    492   1.1       pk 	# that name must be in /etc/hosts.
    493   1.1       pk 	if [ -f /mnt/etc/mygate ]; then
    494   1.1       pk 		route delete default > /dev/null 2>&1
    495   1.1       pk 		route add default `cat /mnt/etc/mygate`
    496   1.1       pk 	fi
    497   1.1       pk 
    498   1.1       pk 	# enable the resolver, if appropriate.
    499   1.1       pk 	if [ -f /mnt/etc/resolv.conf ]; then
    500   1.1       pk 		_resolver_enabled="TRUE"
    501   1.1       pk 		cp /mnt/etc/resolv.conf /tmp/resolv.conf.shadow
    502   1.1       pk 	fi
    503   1.1       pk 
    504   1.1       pk 	# Display results...
    505   1.1       pk 	echo	"Network interface configuration:"
    506   1.1       pk 	ifconfig -a
    507   1.1       pk 
    508   1.1       pk 	echo	""
    509   1.1       pk 
    510   1.1       pk 	if [ "X${_resolver_enabled}" = X"TRUE" ]; then
    511   1.1       pk 		netstat -r
    512   1.1       pk 		echo	""
    513   1.1       pk 		echo	"Resolver enabled."
    514   1.1       pk 	else
    515   1.1       pk 		netstat -rn
    516   1.1       pk 		echo	""
    517   1.1       pk 		echo	"Resolver not enabled."
    518   1.1       pk 	fi
    519   1.1       pk 
    520   1.1       pk 	return 0
    521   1.1       pk }
    522   1.1       pk 
    523   1.1       pk install_ftp() {
    524   1.1       pk 	# Get several parameters from the user, and create
    525   1.1       pk 	# a shell script that directs the appropriate
    526   1.1       pk 	# commands into ftp.
    527   1.1       pk 	cat << \__install_ftp_1
    528   1.1       pk 
    529   1.1       pk This is an automated ftp-based installation process.  You will be asked
    530   1.1       pk several questions.  The correct set of commands will be placed in a script
    531   1.1       pk that will be fed to ftp(1).
    532   1.1       pk 
    533   1.1       pk __install_ftp_1
    534   1.1       pk 	# Get server IP address
    535   1.1       pk 	resp=""		# force one iteration
    536   1.1       pk 	while [ "X${resp}" = X"" ]; do
    537   1.1       pk 		echo -n "Server IP? [${_ftp_server_ip}] "
    538   1.1       pk 		getresp "${_ftp_server_ip}"
    539   1.1       pk 		_ftp_server_ip=$resp
    540   1.1       pk 	done
    541   1.1       pk 
    542   1.1       pk 	# Get server directory
    543   1.1       pk 	resp=""		# force one iteration
    544   1.1       pk 	while [ "X${resp}" = X"" ]; do
    545   1.1       pk 		echo -n "Server directory? [${_ftp_server_dir}] "
    546   1.1       pk 		getresp "${_ftp_server_dir}"
    547   1.1       pk 		_ftp_server_dir=$resp
    548   1.1       pk 	done
    549   1.1       pk 
    550   1.1       pk 	# Get login name
    551   1.1       pk 	resp=""		# force one iteration
    552   1.1       pk 	while [ "X${resp}" = X"" ]; do
    553   1.1       pk 		echo -n "Login? [${_ftp_server_login}] "
    554   1.1       pk 		getresp "${_ftp_server_login}"
    555   1.1       pk 		_ftp_server_login=$resp 
    556   1.1       pk 	done
    557   1.1       pk 
    558   1.1       pk 	# Get password
    559   1.1       pk 	resp=""		# force one iteration
    560   1.1       pk 	while [ "X${resp}" = X"" ]; do
    561   1.1       pk 		echo -n "Password? [${_ftp_server_password}] "
    562   1.1       pk 		getresp "${_ftp_server_password}"
    563   1.1       pk 		_ftp_server_password=$resp
    564   1.1       pk 	done
    565   1.1       pk 
    566   1.1       pk 	# Get list of files for mget.
    567   1.1       pk 	cat << \__install_ftp_2
    568   1.1       pk 
    569   1.1       pk You will now be asked for files to extract.  Enter one file at a time.
    570   1.1       pk When you are done entering files, enter 'done'.
    571   1.1       pk 
    572   1.1       pk __install_ftp_2
    573   1.1       pk 	echo "#!/bin/sh" > /tmp/ftp-script.sh
    574   1.1       pk 	echo "cd /mnt" >> /tmp/ftp-script.sh
    575   1.1       pk 	echo "ftp -i -n $_ftp_server_ip << \__end_commands" >> \
    576   1.1       pk 	    /tmp/ftp-script.sh
    577   1.1       pk 	echo "user $_ftp_server_login $_ftp_server_password" >> \
    578   1.1       pk 	    /tmp/ftp-script.sh
    579   1.1       pk 	echo "bin" >> /tmp/ftp-script.sh
    580   1.1       pk 	echo "cd $_ftp_server_dir" >> /tmp/ftp-script.sh
    581   1.1       pk 
    582   1.1       pk 	resp=""		# force one interation
    583   1.1       pk 	while [ "X${resp}" != X"done" ]; do
    584   1.1       pk 		echo -n "File? [done] "
    585   1.1       pk 		getresp "done"
    586   1.1       pk 		if [ "X${resp}" = X"done" ]; then
    587   1.1       pk 			break
    588   1.1       pk 		fi
    589   1.1       pk 
    590   1.3       pk 		_ftp_file=`echo ${resp} | cutword 1'`
    591   1.1       pk 		echo "get ${_ftp_file} |\"tar --unlink -zxvpf -\"" >> \
    592   1.1       pk 		    /tmp/ftp-script.sh
    593   1.1       pk 	done
    594   1.1       pk 
    595   1.1       pk 	echo "quit" >> /tmp/ftp-script.sh
    596   1.1       pk 	echo "__end_commands" >> /tmp/ftp-script.sh
    597   1.1       pk 
    598   1.1       pk 	sh /tmp/ftp-script.sh
    599   1.1       pk 	rm -f /tmp/ftp-script.sh
    600   1.1       pk 	echo "Extraction complete."
    601   1.1       pk }
    602   1.1       pk 
    603  1.11       pk install_from_mounted_fs() {
    604  1.13       pk 	# $1 - directory containing installation sets
    605   1.1       pk 	local _filename
    606  1.13       pk 	local _sets
    607  1.12       pk 	local _next
    608   1.1       pk 	local _f
    609   1.1       pk 
    610  1.13       pk 	_sets=""
    611  1.13       pk 	if dir_has_sets $1 $THESETS; then
    612  1.13       pk 		for _f in $THESETS ; do
    613  1.13       pk 			if [ -f $1/${_f}.tar.gz ]; then
    614  1.13       pk 				_sets="$_sets ${_f}.tar.gz"
    615  1.13       pk 			elif [ -f $1/${_f}.tgz ]; then
    616  1.13       pk 				_sets="$_sets ${_f}.tgz"
    617  1.13       pk 			fi
    618  1.13       pk 		done
    619  1.13       pk 	else
    620   1.1       pk 		echo "There are no NetBSD install sets available in \"$1\""
    621   1.1       pk 		return
    622   1.1       pk 	fi
    623   1.1       pk 
    624   1.1       pk 	while : ; do
    625   1.1       pk 		echo "The following sets are available for extraction:"
    626   1.1       pk 		echo "(marked sets have already been extracted)"
    627   1.1       pk 		echo ""
    628   1.1       pk 
    629  1.12       pk 		_next=""
    630   1.1       pk 		for _f in $_sets ; do
    631   1.1       pk 			if isin $_f $_setsdone; then
    632   1.1       pk 				echo -n "[X] "
    633  1.12       pk 				_next=""
    634   1.1       pk 			else
    635   1.1       pk 				echo -n "    "
    636  1.12       pk 				if [ -z "$_next" ]; then _next=$_f; fi
    637   1.1       pk 			fi
    638   1.1       pk 			echo $_f
    639   1.1       pk 		done
    640   1.1       pk 		echo ""
    641   1.1       pk 
    642   1.1       pk 		# Get the name of the file.
    643  1.12       pk 		if [ "X$_next" = "X" ]; then resp=n; else resp=y; fi
    644   1.1       pk 		echo -n "Continue extraction [$resp]?"
    645   1.1       pk 		getresp "$resp"
    646   1.1       pk 		if [ "$resp" = "n" ]; then
    647   1.1       pk 			break
    648   1.1       pk 		fi
    649   1.1       pk 
    650  1.12       pk 		echo -n "File name [$_next]? "
    651  1.12       pk 		getresp "$_next"
    652   1.1       pk 		_f=$resp
    653  1.13       pk 		_filename="/$1/$_f"
    654   1.1       pk 
    655   1.1       pk 		# Ensure file exists
    656   1.1       pk 		if [ ! -f $_filename ]; then
    657   1.1       pk 			echo "File $_filename does not exist.  Check to make"
    658   1.1       pk 			echo "sure you entered the information properly."
    659   1.1       pk 			continue
    660   1.1       pk 		fi
    661   1.1       pk 
    662   1.1       pk 		# Extract file
    663   1.5       pk 		cat $_filename | (cd /mnt; tar --unlink -zxvpf -)
    664   1.1       pk 		echo "Extraction complete."
    665   1.1       pk 		_setsdone="$_f $_setsdone"
    666   1.1       pk 
    667   1.1       pk 	done
    668   1.1       pk }
    669   1.1       pk 
    670   1.1       pk install_cdrom() {
    671   1.5       pk 	local _drive
    672   1.6      leo 	local _partition_range
    673   1.5       pk 	local _partition
    674   1.5       pk 	local _fstype
    675   1.5       pk 	local _directory
    676   1.5       pk 
    677   1.1       pk 	# Get the cdrom device info
    678   1.1       pk 	cat << \__install_cdrom_1
    679   1.1       pk 
    680   1.1       pk The following CD-ROM devices are installed on your system; please select
    681   1.6      leo the CD-ROM device containing the partition with the installation sets:
    682   1.1       pk 
    683   1.1       pk __install_cdrom_1
    684   1.1       pk 	_CDDEVS=`md_get_cddevs`
    685   1.1       pk 	echo    "$_CDDEVS"
    686   1.1       pk 	echo	""
    687   1.1       pk 	echo -n	"Which is the CD-ROM with the installation media? [abort] "
    688   1.1       pk 	getresp "abort"
    689   1.1       pk 	case "$resp" in
    690   1.1       pk 		abort)
    691   1.1       pk 			echo "Aborting."
    692   1.1       pk 			return
    693   1.1       pk 			;;
    694   1.1       pk 
    695   1.1       pk 		*)
    696   1.1       pk 			if isin $resp $_CDDEVS ; then
    697   1.5       pk 				_drive=$resp
    698   1.1       pk 			else
    699   1.1       pk 				echo ""
    700   1.1       pk 				echo "The CD-ROM $resp does not exist."
    701   1.1       pk 				echo "Aborting."
    702   1.1       pk 				return
    703   1.1       pk 			fi
    704   1.1       pk 			;;
    705   1.1       pk 	esac
    706   1.1       pk 
    707   1.1       pk 	# Get partition
    708   1.6      leo 	_partition_range=`md_get_partition_range`
    709   1.1       pk 	resp=""		# force one iteration
    710   1.1       pk 	while [ "X${resp}" = X"" ]; do
    711   1.1       pk 		echo -n "Partition? [c] "
    712   1.1       pk 		getresp "c"
    713   1.1       pk 		case "$resp" in
    714   1.6      leo 			$_partition_range)
    715   1.5       pk 				_partition=$resp
    716   1.1       pk 				;;
    717   1.1       pk 
    718   1.1       pk 			*)
    719   1.1       pk 				echo "Invalid response: $resp"
    720   1.1       pk 				resp=""		# force loop to repeat
    721   1.1       pk 				;;
    722   1.1       pk 		esac
    723   1.1       pk 	done
    724   1.1       pk 
    725   1.1       pk 	# Ask for filesystem type
    726   1.1       pk 	cat << \__install_cdrom_2
    727   1.1       pk 
    728   1.1       pk There are two CD-ROM filesystem types currently supported by this program:
    729   1.1       pk 	1) ISO-9660 (cd9660)
    730   1.1       pk 	2) Berkeley Fast Filesystem (ffs)
    731   1.1       pk 
    732   1.1       pk __install_cdrom_2
    733   1.1       pk 	resp=""		# force one iteration
    734   1.1       pk 	while [ "X${resp}" = X"" ]; do
    735   1.1       pk 		echo -n "Which filesystem type? [cd9660] "
    736   1.1       pk 		getresp "cd9660"
    737   1.1       pk 		case "$resp" in
    738   1.1       pk 			cd9660|ffs)
    739   1.5       pk 				_fstype=$resp
    740   1.1       pk 				;;
    741   1.1       pk 
    742   1.1       pk 			*)
    743   1.1       pk 				echo "Invalid response: $resp"
    744   1.1       pk 				resp=""		# force loop to repeat
    745   1.1       pk 				;;
    746   1.1       pk 		esac
    747   1.1       pk 	done
    748   1.1       pk 
    749   1.1       pk 	# Mount the CD-ROM
    750   1.5       pk 	if ! mount -t ${_filesystem} -o ro \
    751   1.5       pk 	    /dev/${_drive}${_partition} /mnt2 ; then
    752   1.1       pk 		echo "Cannot mount CD-ROM drive.  Aborting."
    753   1.1       pk 		return
    754   1.1       pk 	fi
    755   1.1       pk 
    756   1.1       pk 	# Get the directory where the file lives
    757   1.1       pk 	resp=""		# force one iteration
    758   1.1       pk 	while [ "X${resp}" = X"" ]; do
    759   1.1       pk 		echo "Enter the directory relative to the mount point that"
    760   1.5       pk 		echo -n "contains the file. [${_directory}] "
    761   1.5       pk 		getresp "${_directory}"
    762   1.1       pk 	done
    763   1.5       pk 	_directory=$resp
    764   1.1       pk 
    765  1.13       pk 	install_from_mounted_fs /mnt2/${_directory}
    766   1.5       pk 	umount -f /mnt2 > /dev/null 2>&1
    767   1.5       pk }
    768   1.5       pk 
    769  1.14      leo mount_a_disk() {
    770  1.14      leo 	# Mount a disk on /mnt2. The set of disk devices to choose from
    771  1.14      leo 	# is $_DKDEVS.
    772  1.14      leo 	# returns 0 on failure.
    773  1.14      leo 
    774   1.5       pk 	local _drive
    775   1.6      leo 	local _partition_range
    776   1.5       pk 	local _partition
    777   1.5       pk 	local _fstype
    778   1.5       pk 	local _fsopts
    779   1.5       pk 	local _directory
    780   1.5       pk 	local _md_fstype
    781   1.5       pk 	local _md_fsopts
    782   1.5       pk 
    783   1.5       pk 	getresp "abort"
    784   1.5       pk 	case "$resp" in
    785   1.5       pk 		abort)
    786   1.5       pk 			echo "Aborting."
    787  1.14      leo 			return 0
    788   1.5       pk 			;;
    789   1.5       pk 
    790   1.5       pk 		*)
    791   1.5       pk 			if isin $resp $_DKDEVS ; then
    792   1.5       pk 				_drive=$resp
    793   1.5       pk 			else
    794   1.5       pk 				echo ""
    795   1.5       pk 				echo "The disk $resp does not exist."
    796   1.5       pk 				echo "Aborting."
    797  1.14      leo 				return 0
    798   1.5       pk 			fi
    799   1.5       pk 			;;
    800   1.5       pk 	esac
    801   1.5       pk 
    802   1.5       pk 	# Get partition
    803   1.6      leo 	_partition_range=`md_get_partition_range`
    804   1.5       pk 	resp=""		# force one iteration
    805   1.5       pk 	while [ "X${resp}" = X"" ]; do
    806   1.5       pk 		echo -n "Partition? [d] "
    807   1.5       pk 		getresp "d"
    808   1.5       pk 		case "$resp" in
    809   1.6      leo 			$_partition_range)
    810   1.5       pk 				_partition=$resp
    811   1.5       pk 				;;
    812   1.5       pk 
    813   1.5       pk 			*)
    814   1.5       pk 				echo "Invalid response: $resp"
    815   1.5       pk 				resp=""		# force loop to repeat
    816   1.5       pk 				;;
    817   1.5       pk 		esac
    818   1.5       pk 	done
    819   1.5       pk 
    820   1.5       pk 	# Ask for filesystem type
    821  1.14      leo 	cat << \__mount_a_disk_2
    822   1.5       pk 
    823   1.5       pk The following filesystem types are supported:
    824   1.5       pk 	1) ffs
    825  1.14      leo __mount_a_disk_2
    826   1.5       pk 	_md_fstype=`md_native_fstype`
    827   1.5       pk 	_md_fsopts=`md_native_fsopts`
    828   1.5       pk 	if [ ! -z "$_md_fstype" ]; then
    829   1.5       pk 		echo "	2) $_md_fstype"
    830   1.5       pk 	else
    831   1.5       pk 		_md_fstype="_undefined_"
    832   1.5       pk 	fi
    833   1.5       pk 	resp=""		# force one iteration
    834   1.5       pk 	while [ "X${resp}" = X"" ]; do
    835   1.5       pk 		echo -n "Which filesystem type? [ffs] "
    836   1.5       pk 		getresp "ffs"
    837   1.5       pk 		case "$resp" in
    838   1.5       pk 			ffs)
    839   1.5       pk 				_fstype=$resp
    840   1.5       pk 				_fsopts="ro"
    841   1.5       pk 				;;
    842   1.5       pk 			$_md_fstype)
    843   1.5       pk 				_fstype=$resp
    844   1.5       pk 				_fsopts=$_md_fsopts
    845   1.5       pk 				;;
    846   1.5       pk 			*)
    847   1.5       pk 				echo "Invalid response: $resp"
    848   1.5       pk 				resp=""		# force loop to repeat
    849   1.5       pk 				;;
    850   1.5       pk 		esac
    851   1.5       pk 	done
    852   1.5       pk 
    853   1.5       pk 	# Mount the disk
    854   1.5       pk 	if ! mount -t ${_fstype} -o $_fsopts \
    855   1.5       pk 	    /dev/${_drive}${_partition} /mnt2 ; then
    856   1.5       pk 		echo "Cannot mount disk.  Aborting."
    857  1.14      leo 		return 0
    858  1.14      leo 	fi
    859  1.14      leo 	return 1
    860  1.14      leo }
    861  1.14      leo 
    862  1.14      leo install_disk() {
    863  1.14      leo 	local _directory
    864  1.14      leo 
    865  1.14      leo 	cat << \__install_disk_1
    866  1.14      leo 
    867  1.14      leo The following disk devices are installed on your system; please select
    868  1.14      leo the disk device containing the partition with the installation sets:
    869  1.14      leo 
    870  1.14      leo __install_disk_1
    871  1.14      leo 	_DKDEVS=`md_get_diskdevs`
    872  1.14      leo 	echo    "$_DKDEVS"
    873  1.14      leo 	echo	""
    874  1.14      leo 	echo -n	"Which is the disk with the installation sets? [abort] "
    875  1.14      leo 
    876  1.14      leo 	if mount_a_disk ; then
    877   1.5       pk 		return
    878   1.5       pk 	fi
    879   1.5       pk 
    880   1.5       pk 	# Get the directory where the file lives
    881   1.5       pk 	resp=""		# force one iteration
    882   1.5       pk 	while [ "X${resp}" = X"" ]; do
    883   1.5       pk 		echo "Enter the directory relative to the mount point that"
    884   1.5       pk 		echo -n "contains the file. [${_directory}] "
    885   1.5       pk 		getresp "${_directory}"
    886   1.5       pk 	done
    887   1.5       pk 	_directory=$resp
    888   1.5       pk 
    889  1.13       pk 	install_from_mounted_fs /mnt2/${_directory}
    890   1.1       pk 	umount -f /mnt2 > /dev/null 2>&1
    891   1.1       pk }
    892   1.1       pk 
    893   1.1       pk install_nfs() {
    894   1.1       pk 	# Get the IP address of the server
    895   1.1       pk 	resp=""		# force one iteration
    896   1.1       pk 	while [ "X${resp}" = X"" ]; do
    897   1.1       pk 		echo -n "Server IP address? [${_nfs_server_ip}] "
    898   1.1       pk 		getresp "${_nfs_server_ip}"
    899   1.1       pk 	done
    900   1.1       pk 	_nfs_server_ip=$resp
    901   1.1       pk 
    902   1.1       pk 	# Get server path to mount
    903   1.1       pk 	resp=""		# force one iteration
    904   1.1       pk 	while [ "X${resp}" = X"" ]; do
    905   1.1       pk 		echo -n "Filesystem on server to mount? [${_nfs_server_path}] "
    906   1.1       pk 		getresp "${_nfs_server_path}"
    907   1.1       pk 	done
    908   1.1       pk 	_nfs_server_path=$resp
    909   1.1       pk 
    910   1.1       pk 	# Determine use of TCP
    911   1.1       pk 	echo -n "Use TCP transport (only works with capable NFS server)? [n] "
    912   1.1       pk 	getresp "n"
    913   1.1       pk 	case "$resp" in
    914   1.1       pk 		y*|Y*)
    915   1.1       pk 			_nfs_tcp="-T"
    916   1.1       pk 			;;
    917   1.1       pk 
    918   1.1       pk 		*)
    919   1.1       pk 			_nfs_tcp=""
    920   1.1       pk 			;;
    921   1.1       pk 	esac
    922   1.1       pk 
    923   1.1       pk 	# Mount the server
    924   1.1       pk 	mkdir /mnt2 > /dev/null 2>&1
    925   1.1       pk 	if ! mount_nfs $_nfs_tcp ${_nfs_server_ip}:${_nfs_server_path} \
    926   1.1       pk 	    /mnt2 ; then
    927   1.1       pk 		echo "Cannot mount NFS server.  Aborting."
    928   1.1       pk 		return
    929   1.1       pk 	fi
    930   1.1       pk 
    931   1.1       pk 	# Get the directory where the file lives
    932   1.1       pk 	resp=""		# force one iteration
    933   1.1       pk 	while [ "X${resp}" = X"" ]; do
    934   1.1       pk 		echo "Enter the directory relative to the mount point that"
    935   1.1       pk 		echo -n "contains the file. [${_nfs_directory}] "
    936   1.1       pk 		getresp "${_nfs_directory}"
    937   1.1       pk 	done
    938   1.1       pk 	_nfs_directory=$resp
    939   1.1       pk 
    940  1.13       pk 	install_from_mounted_fs /mnt2/${_nfs_directory}
    941   1.1       pk 	umount -f /mnt2 > /dev/null 2>&1
    942   1.1       pk }
    943   1.1       pk 
    944   1.1       pk install_tape() {
    945  1.11       pk 	local _xcmd
    946  1.11       pk 
    947   1.1       pk 	# Get the name of the tape from the user.
    948   1.1       pk 	cat << \__install_tape_1
    949   1.1       pk 
    950   1.1       pk The installation program needs to know which tape device to use.  Make
    951   1.1       pk sure you use a "no rewind on close" device.
    952   1.1       pk 
    953   1.1       pk __install_tape_1
    954   1.1       pk 	_tape=`basename $TAPE`
    955   1.1       pk 	resp=""		# force one iteration
    956   1.1       pk 	while [ "X${resp}" = X"" ]; do
    957   1.1       pk 		echo -n "Name of tape device? [${_tape}]"
    958   1.1       pk 		getresp "${_tape}"
    959   1.1       pk 	done
    960   1.1       pk 	_tape=`basename $resp`
    961   1.1       pk 	TAPE="/dev/${_tape}"
    962   1.1       pk 	if [ ! -c $TAPE ]; then
    963   1.1       pk 		echo "$TAPE does not exist or is not a character special file."
    964   1.1       pk 		echo "Aborting."
    965   1.1       pk 		return
    966   1.1       pk 	fi
    967   1.1       pk 	export TAPE
    968   1.1       pk 
    969   1.1       pk 	# Rewind the tape device
    970   1.1       pk 	echo -n "Rewinding tape..."
    971   1.1       pk 	if ! mt rewind ; then
    972   1.1       pk 		echo "$TAPE may not be attached to the system or may not be"
    973   1.1       pk 		echo "a tape device.  Aborting."
    974   1.1       pk 		return
    975   1.1       pk 	fi
    976   1.1       pk 	echo "done."
    977   1.1       pk 
    978   1.1       pk 	# Get the file number
    979   1.1       pk 	resp=""		# force one iteration
    980   1.1       pk 	while [ "X${resp}" = X"" ]; do
    981   1.1       pk 		echo -n "File number? "
    982   1.1       pk 		getresp ""
    983   1.1       pk 		case "$resp" in
    984   1.1       pk 			[1-9]*)
    985   1.1       pk 				_nskip=`expr $resp - 1`
    986   1.1       pk 				;;
    987   1.1       pk 
    988   1.1       pk 			*)
    989   1.1       pk 				echo "Invalid file number ${resp}."
    990   1.1       pk 				resp=""		# fore loop to repeat
    991   1.1       pk 				;;
    992   1.1       pk 		esac
    993   1.1       pk 	done
    994   1.1       pk 
    995   1.1       pk 	# Skip to correct file.
    996   1.1       pk 	echo -n "Skipping to source file..."
    997   1.1       pk 	if [ "X${_nskip}" != X"0" ]; then
    998   1.1       pk 		if ! mt fsf $_nskip ; then
    999   1.1       pk 			echo "Could not skip $_nskip files.  Aborting."
   1000   1.1       pk 			return
   1001   1.1       pk 		fi
   1002   1.1       pk 	fi
   1003   1.1       pk 	echo "done."
   1004   1.1       pk 
   1005   1.1       pk 	cat << \__install_tape_2
   1006   1.1       pk 
   1007   1.1       pk There are 2 different ways the file can be stored on tape:
   1008   1.1       pk 
   1009   1.1       pk 	1) an image of a gzipped tar file
   1010   1.1       pk 	2) a standard tar image
   1011   1.1       pk 
   1012   1.1       pk __install_tape_2
   1013   1.1       pk 	resp=""		# force one iteration
   1014   1.1       pk 	while [ "X${resp}" = X"" ]; do
   1015   1.1       pk 		echo -n "Which way is it? [1] "
   1016   1.1       pk 		getresp "1"
   1017   1.1       pk 		case "$resp" in
   1018  1.11       pk 		1)
   1019  1.11       pk 			_xcmd="tar --unlink -zxvpf -"
   1020  1.11       pk 			;;
   1021   1.1       pk 
   1022  1.11       pk 		2)
   1023  1.11       pk 			_xcmd="tar --unlink -xvpf -"
   1024  1.11       pk 			;;
   1025   1.1       pk 
   1026  1.11       pk 		*)
   1027  1.11       pk 			echo "Invalid response: $resp."
   1028  1.11       pk 			resp=""		# force loop to repeat
   1029  1.11       pk 			;;
   1030   1.1       pk 		esac
   1031  1.11       pk 		( cd /mnt; dd if=$TAPE | $_xcmd )
   1032   1.1       pk 	done
   1033   1.1       pk 	echo "Extraction complete."
   1034   1.1       pk }
   1035   1.1       pk 
   1036   1.1       pk get_timezone() {
   1037   1.1       pk 	local _a
   1038   1.6      leo 	local _zonepath
   1039   1.6      leo 
   1040   1.6      leo 	#
   1041   1.6      leo 	# If the zoneinfo is not on the installation medium or on the
   1042   1.6      leo 	# installed filesystem, set TZ to GMT and return immediatly.
   1043   1.6      leo 	#
   1044   1.9       pk 	if [ ! -e /usr/share/zoneinfo -a ! -e /mnt/usr/share/zoneinfo ]; then
   1045   1.6      leo 		TZ=GMT
   1046   1.6      leo 		return
   1047   1.6      leo 	fi
   1048   1.6      leo 	if [ ! -d /usr/share/zoneinfo ]; then
   1049   1.6      leo 		_zonepath=/mnt
   1050   1.6      leo 	else
   1051   1.6      leo 		_zonepath=""
   1052   1.6      leo 	fi
   1053   1.6      leo 		
   1054   1.1       pk cat << \__get_timezone_1
   1055   1.1       pk 
   1056   1.1       pk Select a time zone for your location. Timezones are represented on the
   1057   1.1       pk system by a directory structure rooted in "/usr/share/timezone". Most
   1058   1.1       pk timezones can be selected by entering a token like "MET" or "GMT-6".
   1059   1.1       pk Other zones are grouped by continent, with detailed zone information
   1060   1.1       pk separated by a slash ("/"), e.g. "US/Pacific".
   1061   1.1       pk 
   1062   1.1       pk To get a listing of what's available in /usr/share/zoneinfo, enter "?"
   1063   1.1       pk at the prompts below.
   1064   1.1       pk 
   1065   1.1       pk __get_timezone_1
   1066   1.1       pk 	if [ X$TZ = X ]; then
   1067  1.13       pk 		TZ=`ls -l /mnt/etc/localtime 2>/dev/null | cutlast`
   1068   1.3       pk 		TZ=${TZ#/usr/share/zoneinfo/}
   1069   1.1       pk 	fi
   1070   1.1       pk 	while :; do
   1071   1.1       pk 		echo -n	"What timezone are you in [\`?' for list] [$TZ]? "
   1072   1.1       pk 		getresp "$TZ"
   1073   1.1       pk 		case "$resp" in
   1074   1.1       pk 		"")
   1075   1.1       pk 			echo "Timezone defaults to GMT"
   1076   1.1       pk 			TZ="GMT"
   1077   1.1       pk 			break;
   1078   1.1       pk 			;;
   1079   1.1       pk 		"?")
   1080   1.6      leo 			ls ${_zonepath}/usr/share/zoneinfo
   1081   1.1       pk 			;;
   1082   1.1       pk 		*)
   1083   1.1       pk 			_a=$resp
   1084   1.6      leo 			while [ -d ${_zonepath}/usr/share/zoneinfo/$_a ]; do
   1085   1.1       pk 				echo -n "There are several timezones available"
   1086   1.1       pk 				echo " within zone '$_a'"
   1087   1.1       pk 				echo -n "Select a sub-timezone [\`?' for list]: "
   1088   1.1       pk 				getresp ""
   1089   1.1       pk 				case "$resp" in
   1090   1.6      leo 				"?") ls ${_zonepath}/usr/share/zoneinfo/$_a ;;
   1091   1.1       pk 				*)	_a=${_a}/${resp}
   1092   1.6      leo 					if [ -f ${_zonepath}/usr/share/zoneinfo/$_a ]; then
   1093   1.1       pk 						break;
   1094   1.1       pk 					fi
   1095   1.1       pk 					;;
   1096   1.1       pk 				esac
   1097   1.1       pk 			done
   1098   1.6      leo 			if [ -f ${_zonepath}/usr/share/zoneinfo/$_a ]; then
   1099   1.1       pk 				TZ="$_a"
   1100   1.1       pk 				echo "You have selected timezone \"$_a\"".
   1101   1.1       pk 				break 2
   1102   1.1       pk 			fi
   1103   1.1       pk 			echo "'/usr/share/zoneinfo/$_a' is not a valid timezone on this system."
   1104   1.1       pk 			;;
   1105   1.1       pk 		esac
   1106   1.1       pk 	done
   1107   1.1       pk }
   1108   1.1       pk 
   1109   1.1       pk install_sets()
   1110   1.1       pk {
   1111  1.13       pk 	local _yup
   1112  1.13       pk 	_yup="FALSE"
   1113  1.13       pk 
   1114  1.13       pk 	# Ask the user which media to load the distribution from.
   1115  1.13       pk 	cat << \__install_sets_1
   1116   1.1       pk 
   1117   1.1       pk It is now time to extract the installation sets onto the hard disk.
   1118  1.10  thorpej Make sure the sets are either on a local device (i.e. tape, CD-ROM) or on a
   1119   1.1       pk network server.
   1120   1.1       pk 
   1121   1.1       pk __install_sets_1
   1122  1.13       pk 
   1123  1.13       pk 	if [ "X$local_sets_dir" != "X" ]; then
   1124  1.13       pk 		install_from_mounted_fs ${local_sets_dir}
   1125  1.13       pk 		if [ X"$_setsdone" != X ]; then
   1126  1.13       pk 			_yup="TRUE"
   1127  1.13       pk 		fi
   1128  1.13       pk 	fi
   1129  1.13       pk 
   1130  1.13       pk 	# Go on prodding for alternate locations
   1131  1.13       pk 	resp=""		# force at least one iteration
   1132  1.13       pk 	while [ X"${resp}" = X ]; do
   1133  1.13       pk 		# If _yup is not FALSE, it means that we extracted sets above.
   1134  1.13       pk 		# If that's the case, bypass the menu the first time.
   1135  1.13       pk 		if [ X"$_yup" = X"FALSE" ]; then
   1136  1.13       pk 			echo -n	"Install from (f)tp, (t)ape, (C)D-ROM, (N)FS"
   1137  1.13       pk 			echo -n " or local (d)isk? "
   1138  1.13       pk 			getresp ""
   1139   1.1       pk 			case "$resp" in
   1140  1.13       pk 			d*|D*)
   1141  1.13       pk 				install_disk
   1142  1.13       pk 				;;
   1143  1.13       pk 			f*|F*)
   1144  1.13       pk 				install_ftp
   1145  1.13       pk 				;;
   1146  1.13       pk 			t*|T*)
   1147  1.13       pk 				install_tape
   1148  1.13       pk 				;;
   1149  1.13       pk 			c*|C*)
   1150  1.13       pk 				install_cdrom
   1151  1.13       pk 				;;
   1152  1.13       pk 			n*|N*)
   1153  1.13       pk 				install_nfs
   1154   1.1       pk 				;;
   1155   1.1       pk 			*)
   1156  1.13       pk 				echo "Invalid response: $resp"
   1157  1.13       pk 				resp=""
   1158   1.1       pk 				;;
   1159   1.1       pk 			esac
   1160  1.13       pk 		else
   1161  1.13       pk 			_yup="FALSE"	# So we'll ask next time
   1162  1.13       pk 		fi
   1163   1.1       pk 
   1164  1.13       pk 		# Give the user the opportunity to extract more sets. They
   1165  1.13       pk 		# don't necessarily have to come from the same media.
   1166  1.13       pk 		echo	""
   1167  1.13       pk 		echo -n	"Extract more sets? [n] "
   1168  1.13       pk 		getresp "n"
   1169   1.1       pk 		case "$resp" in
   1170  1.13       pk 		y*|Y*)
   1171  1.13       pk 			# Force loop to repeat
   1172  1.13       pk 			resp=""
   1173   1.1       pk 			;;
   1174   1.1       pk 
   1175   1.1       pk 		*)
   1176   1.1       pk 			;;
   1177   1.1       pk 		esac
   1178  1.13       pk 	done
   1179   1.1       pk }
   1180   1.1       pk 
   1181   1.1       pk munge_fstab()
   1182   1.1       pk {
   1183   1.1       pk 	local _fstab
   1184   1.1       pk 	local _fstab_shadow
   1185   1.5       pk 	local _dev
   1186   1.5       pk 	local _mp
   1187   1.7      leo 	local _fstype
   1188   1.5       pk 	local _rest
   1189   1.6      leo 
   1190   1.1       pk 	# Now that the 'real' fstab is configured, we munge it into a 'shadow'
   1191   1.1       pk 	# fstab which we'll use for mounting and unmounting all of the target
   1192   1.1       pk 	# filesystems relative to /mnt.  Mount all filesystems.
   1193   1.1       pk 	_fstab=$1
   1194   1.1       pk 	_fstab_shadow=$2
   1195   1.7      leo 	( while read _dev _mp _fstype _rest; do
   1196   1.7      leo 		# Skip comment lines
   1197   1.7      leo 		case "$_dev" in
   1198   1.7      leo 			\#*)	continue;;
   1199   1.7      leo 			*)	;;
   1200   1.7      leo 		esac
   1201   1.7      leo 		# and some filesystem types (like there are swap,kernfs,...)
   1202   1.7      leo 		case "$_fstype" in
   1203   1.7      leo 			ffs|ufs|nfs)	;;
   1204   1.7      leo 			*)	continue;;
   1205   1.7      leo 		esac
   1206   1.3       pk 		if [ "$_mp" = "/" ]; then
   1207   1.8       pk 			echo $_dev /mnt $_fstype $_rest
   1208   1.1       pk 		else
   1209   1.8       pk 			echo $_dev /mnt$_mp $_fstype $_rest
   1210   1.3       pk 		fi
   1211   1.6      leo 	    done ) < $_fstab > $_fstab_shadow
   1212   1.1       pk }
   1213   1.1       pk 
   1214   1.1       pk mount_fs()
   1215   1.1       pk {
   1216   1.1       pk 	# Must mount filesystems manually, one at a time, so we can make
   1217   1.1       pk 	# sure the mount points exist.
   1218   1.1       pk 	# $1 is a file in fstab format
   1219   1.1       pk 	local _fstab
   1220   1.1       pk 
   1221   1.1       pk 	_fstab=$1
   1222   1.1       pk 
   1223   1.1       pk 	( while read line; do
   1224   1.4       pk 		set -- $line
   1225   1.4       pk 		_dev=$1
   1226   1.4       pk 		_mp=$2
   1227   1.4       pk 		_fstype=$3
   1228   1.4       pk 		_opt=$4
   1229   1.1       pk 
   1230   1.1       pk 		# If not the root filesystem, make sure the mount
   1231   1.1       pk 		# point is present.
   1232   1.1       pk 		if [ "X{$_mp}" != X"/mnt" ]; then
   1233   1.1       pk 			mkdir -p $_mp
   1234   1.1       pk 		fi
   1235   1.1       pk 
   1236   1.1       pk 		# Mount the filesystem.  If the mount fails, exit
   1237   1.1       pk 		# with an error condition to tell the outer
   1238   1.1       pk 		# later to bail.
   1239   1.1       pk 		if ! mount -v -t $_fstype -o $_opt $_dev $_mp ; then
   1240   1.1       pk 			# error message displated by mount
   1241   1.1       pk 			exit 1
   1242   1.1       pk 		fi
   1243   1.1       pk 	done ) < $_fstab
   1244   1.1       pk 
   1245   1.1       pk 	if [ "X${?}" != X"0" ]; then
   1246   1.1       pk 		cat << \__mount_filesystems_1
   1247   1.1       pk 
   1248   1.1       pk FATAL ERROR:  Cannot mount filesystems.  Double-check your configuration
   1249   1.1       pk and restart the installation process.
   1250   1.1       pk __mount_filesystems_1
   1251   1.1       pk 		exit
   1252   1.1       pk 	fi
   1253   1.1       pk }
   1254   1.1       pk 
   1255   1.1       pk unmount_fs()
   1256   1.1       pk {
   1257   1.1       pk 	# Unmount all filesystems and check their integrity.
   1258  1.13       pk 	# Usage: [-fast] <fstab file>
   1259  1.13       pk 	local _fast
   1260   1.1       pk 	local _fstab
   1261  1.13       pk 	local _pid
   1262  1.13       pk 
   1263  1.13       pk 	if [ "$1" = "-fast" ]; then
   1264  1.13       pk 		_fast=1
   1265  1.13       pk 		_fstab=$2
   1266  1.13       pk 	else
   1267  1.13       pk 		_fast=0
   1268  1.13       pk 		_fstab=$1
   1269  1.13       pk 	fi
   1270   1.1       pk 
   1271  1.13       pk 	if [ ! \( -f $_fstab -a -s $_fstab \) ]; then
   1272  1.13       pk 		echo "fstab empty" > /dev/tty
   1273  1.13       pk 		return
   1274  1.13       pk 	fi
   1275   1.1       pk 
   1276  1.13       pk 	if [ $_fast = 0 ]; then
   1277  1.13       pk 		echo -n	"Syncing disks..."
   1278  1.13       pk 		_pid=`twiddle`
   1279  1.13       pk 		sync; sleep 4; sync; sleep 2; sync; sleep 2
   1280  1.13       pk 		kill $_pid
   1281  1.13       pk 		echo	"done."
   1282  1.13       pk 	fi
   1283   1.1       pk 
   1284   1.1       pk 	(
   1285   1.1       pk 		_devs=""
   1286   1.1       pk 		_mps=""
   1287   1.1       pk 		# maintain reverse order
   1288   1.1       pk 		while read line; do
   1289   1.3       pk 			set -- $line
   1290   1.3       pk 			_devs="$1 ${_devs}"
   1291   1.3       pk 			_mps="$2 ${_mps}"
   1292   1.1       pk 		done
   1293   1.1       pk 		echo -n "Umounting filesystems... "
   1294   1.1       pk 		for _mp in ${_mps}; do
   1295   1.1       pk 			echo -n "${_mp} "
   1296   1.1       pk 			umount ${_mp}
   1297   1.1       pk 		done
   1298   1.1       pk 		echo "Done."
   1299   1.1       pk 
   1300  1.13       pk 		if [ $_fast = 0 ]; then
   1301  1.13       pk 			exit
   1302  1.13       pk 		fi
   1303   1.1       pk 		echo "Checking filesystem integrity..."
   1304   1.1       pk 		for _dev in ${_devs}; do
   1305   1.1       pk 			echo  "${_dev}"
   1306   1.1       pk 			fsck -f ${_dev}
   1307   1.1       pk 		done
   1308   1.1       pk 		echo "Done."
   1309   1.1       pk 	) < $_fstab
   1310   1.1       pk }
   1311   1.1       pk 
   1312   1.1       pk check_fs()
   1313   1.1       pk {
   1314   1.1       pk 	# Check filesystem integrity.
   1315   1.1       pk 	# $1 is a file in fstab format
   1316   1.1       pk 	local _fstab
   1317   1.1       pk 
   1318   1.1       pk 	_fstab=$1
   1319   1.1       pk 
   1320   1.1       pk 	(
   1321   1.1       pk 		_devs=""
   1322   1.1       pk 		_mps=""
   1323   1.1       pk 		while read line; do
   1324   1.3       pk 			set -- $line
   1325   1.3       pk 			_devs="$1 ${_devs}"
   1326   1.3       pk 			_mps="$2 ${_mps}"
   1327   1.1       pk 		done
   1328   1.1       pk 
   1329   1.1       pk 		echo "Checking filesystem integrity..."
   1330   1.1       pk 		for _dev in ${_devs}; do
   1331   1.1       pk 			echo  "${_dev}"
   1332   1.1       pk 			fsck -f ${_dev}
   1333   1.1       pk 		done
   1334   1.1       pk 		echo "Done."
   1335   1.1       pk 	) < $_fstab
   1336   1.1       pk }
   1337