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