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