Home | History | Annotate | Line # | Download | only in miniroot
install.sub revision 1.9
      1  1.1       pk #!/bin/sh
      2  1.9       pk #	$NetBSD: install.sub,v 1.9 1996/06/19 14:16:25 pk 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.8       pk 	local _up
    313  1.8       pk 	local _interface_name
    314  1.8       pk 	local _interface_ip
    315  1.8       pk 	local _interface_mask
    316  1.8       pk 	local _interface_symname
    317  1.8       pk 
    318  1.1       pk 	_interface_name=$1
    319  1.1       pk 
    320  1.8       pk 	set -- `ifconfig $_interface_name | sed -n '
    321  1.8       pk 		1s/.*<UP,.*$/UP/p
    322  1.8       pk 		1s/.*<.*>*$/DOWN/p
    323  1.8       pk 		2s/inet//
    324  1.8       pk 		2s/--> [0-9.][0-9.]*//
    325  1.8       pk 		2s/netmask//
    326  1.8       pk 		2s/broadcast//
    327  1.8       pk 		2p'`
    328  1.8       pk 
    329  1.8       pk 	_up=$1
    330  1.8       pk 	_interface_ip=$2
    331  1.8       pk 	_interface_mask=$3
    332  1.8       pk 
    333  1.1       pk 	# Get IP address
    334  1.1       pk 	resp=""		# force one iteration
    335  1.1       pk 	while [ "X${resp}" = X"" ]; do
    336  1.8       pk 		echo -n "IP address? [$_interface_ip] "
    337  1.8       pk 		getresp "$_interface_ip"
    338  1.1       pk 		_interface_ip=$resp
    339  1.1       pk 	done
    340  1.1       pk 
    341  1.1       pk 	# Get symbolic name
    342  1.1       pk 	resp=""		# force one iteration
    343  1.1       pk 	while [ "X${resp}" = X"" ]; do
    344  1.1       pk 		echo -n "Symbolic (host) name? "
    345  1.1       pk 		getresp ""
    346  1.1       pk 		_interface_symname=$resp
    347  1.1       pk 	done
    348  1.1       pk 
    349  1.1       pk 	# Get netmask
    350  1.1       pk 	resp=""		# force one iteration
    351  1.1       pk 	while [ "X${resp}" = X"" ]; do
    352  1.8       pk 		echo -n "Netmask? [$_interface_mask] "
    353  1.8       pk 		getresp "$_interface_mask"
    354  1.1       pk 		_interface_mask=$resp
    355  1.1       pk 	done
    356  1.1       pk 
    357  1.1       pk 	# Configure the interface.  If it
    358  1.1       pk 	# succeeds, add it to the permanent
    359  1.1       pk 	# network configuration info.
    360  1.8       pk 	if [ $_up != "UP" ]; then
    361  1.8       pk 		ifconfig ${_interface_name} down
    362  1.8       pk 		if ifconfig ${_interface_name} inet \
    363  1.8       pk 		    ${_interface_ip} \
    364  1.8       pk 		    netmask ${_interface_mask} up ; then
    365  1.8       pk 			addifconfig \
    366  1.8       pk 			    ${_interface_name} \
    367  1.8       pk 			    ${_interface_symname} \
    368  1.8       pk 			    ${_interface_ip} \
    369  1.8       pk 			    ${_interface_mask}
    370  1.8       pk 			return 0
    371  1.8       pk 		fi
    372  1.8       pk 	else
    373  1.8       pk 		echo "Interface ${_interface_name} is already active."
    374  1.8       pk 		echo "Just saving configuration on new root filesystem."
    375  1.1       pk 		addifconfig \
    376  1.1       pk 		    ${_interface_name} \
    377  1.1       pk 		    ${_interface_symname} \
    378  1.1       pk 		    ${_interface_ip} \
    379  1.1       pk 		    ${_interface_mask}
    380  1.1       pk 	fi
    381  1.1       pk 	return 1
    382  1.1       pk }
    383  1.1       pk 
    384  1.1       pk # Much of this is gratuitously stolen from /etc/netstart.
    385  1.1       pk enable_network() {
    386  1.1       pk 
    387  1.1       pk 	# Set up the hostname.
    388  1.1       pk 	if [ ! -f /mnt/etc/myname ]; then
    389  1.1       pk 		echo "ERROR: no /etc/myname!"
    390  1.1       pk 		return 1
    391  1.1       pk 	fi
    392  1.1       pk 	hostname=`cat /mnt/etc/myname`
    393  1.1       pk 	hostname $hostname
    394  1.1       pk 
    395  1.1       pk 	# configure all the interfaces which we know about.
    396  1.1       pk (
    397  1.1       pk 	tmp="$IFS"
    398  1.1       pk 	IFS="$IFS."
    399  1.1       pk 	set -- `echo /mnt/etc/hostname*`
    400  1.1       pk 	IFS=$tmp
    401  1.1       pk 	unset tmp
    402  1.1       pk 
    403  1.1       pk 	while [ $# -ge 2 ] ; do
    404  1.1       pk 		shift		# get rid of "hostname"
    405  1.1       pk 		(
    406  1.1       pk 			read af name mask bcaddr extras
    407  1.1       pk 			read dt dtaddr
    408  1.1       pk 
    409  1.1       pk 			if [ ! -n "$name" ]; then
    410  1.1       pk 		    echo "/etc/hostname.$1: invalid network configuration file"
    411  1.1       pk 				exit
    412  1.1       pk 			fi
    413  1.1       pk 
    414  1.1       pk 			cmd="ifconfig $1 $af $name "
    415  1.1       pk 			if [ "${dt}" = "dest" ]; then cmd="$cmd $dtaddr"; fi
    416  1.1       pk 			if [ -n "$mask" ]; then cmd="$cmd netmask $mask"; fi
    417  1.1       pk 			if [ -n "$bcaddr" -a "X$bcaddr" != "XNONE" ]; then
    418  1.1       pk 				cmd="$cmd broadcast $bcaddr";
    419  1.1       pk 			fi
    420  1.1       pk 			cmd="$cmd $extras"
    421  1.1       pk 
    422  1.1       pk 			$cmd
    423  1.1       pk 		) < /mnt/etc/hostname.$1
    424  1.1       pk 		shift
    425  1.1       pk 	done
    426  1.1       pk )
    427  1.1       pk 
    428  1.1       pk 	# set the address for the loopback interface
    429  1.1       pk 	ifconfig lo0 inet localhost
    430  1.1       pk 
    431  1.1       pk 	# use loopback, not the wire
    432  1.1       pk 	route add $hostname localhost
    433  1.1       pk 
    434  1.1       pk 	# /etc/mygate, if it exists, contains the name of my gateway host
    435  1.1       pk 	# that name must be in /etc/hosts.
    436  1.1       pk 	if [ -f /mnt/etc/mygate ]; then
    437  1.1       pk 		route delete default > /dev/null 2>&1
    438  1.1       pk 		route add default `cat /mnt/etc/mygate`
    439  1.1       pk 	fi
    440  1.1       pk 
    441  1.1       pk 	# enable the resolver, if appropriate.
    442  1.1       pk 	if [ -f /mnt/etc/resolv.conf ]; then
    443  1.1       pk 		_resolver_enabled="TRUE"
    444  1.1       pk 		cp /mnt/etc/resolv.conf /tmp/resolv.conf.shadow
    445  1.1       pk 	fi
    446  1.1       pk 
    447  1.1       pk 	# Display results...
    448  1.1       pk 	echo	"Network interface configuration:"
    449  1.1       pk 	ifconfig -a
    450  1.1       pk 
    451  1.1       pk 	echo	""
    452  1.1       pk 
    453  1.1       pk 	if [ "X${_resolver_enabled}" = X"TRUE" ]; then
    454  1.1       pk 		netstat -r
    455  1.1       pk 		echo	""
    456  1.1       pk 		echo	"Resolver enabled."
    457  1.1       pk 	else
    458  1.1       pk 		netstat -rn
    459  1.1       pk 		echo	""
    460  1.1       pk 		echo	"Resolver not enabled."
    461  1.1       pk 	fi
    462  1.1       pk 
    463  1.1       pk 	return 0
    464  1.1       pk }
    465  1.1       pk 
    466  1.1       pk install_ftp() {
    467  1.1       pk 	# Get several parameters from the user, and create
    468  1.1       pk 	# a shell script that directs the appropriate
    469  1.1       pk 	# commands into ftp.
    470  1.1       pk 	cat << \__install_ftp_1
    471  1.1       pk 
    472  1.1       pk This is an automated ftp-based installation process.  You will be asked
    473  1.1       pk several questions.  The correct set of commands will be placed in a script
    474  1.1       pk that will be fed to ftp(1).
    475  1.1       pk 
    476  1.1       pk __install_ftp_1
    477  1.1       pk 	# Get server IP address
    478  1.1       pk 	resp=""		# force one iteration
    479  1.1       pk 	while [ "X${resp}" = X"" ]; do
    480  1.1       pk 		echo -n "Server IP? [${_ftp_server_ip}] "
    481  1.1       pk 		getresp "${_ftp_server_ip}"
    482  1.1       pk 		_ftp_server_ip=$resp
    483  1.1       pk 	done
    484  1.1       pk 
    485  1.1       pk 	# Get server directory
    486  1.1       pk 	resp=""		# force one iteration
    487  1.1       pk 	while [ "X${resp}" = X"" ]; do
    488  1.1       pk 		echo -n "Server directory? [${_ftp_server_dir}] "
    489  1.1       pk 		getresp "${_ftp_server_dir}"
    490  1.1       pk 		_ftp_server_dir=$resp
    491  1.1       pk 	done
    492  1.1       pk 
    493  1.1       pk 	# Get login name
    494  1.1       pk 	resp=""		# force one iteration
    495  1.1       pk 	while [ "X${resp}" = X"" ]; do
    496  1.1       pk 		echo -n "Login? [${_ftp_server_login}] "
    497  1.1       pk 		getresp "${_ftp_server_login}"
    498  1.1       pk 		_ftp_server_login=$resp 
    499  1.1       pk 	done
    500  1.1       pk 
    501  1.1       pk 	# Get password
    502  1.1       pk 	resp=""		# force one iteration
    503  1.1       pk 	while [ "X${resp}" = X"" ]; do
    504  1.1       pk 		echo -n "Password? [${_ftp_server_password}] "
    505  1.1       pk 		getresp "${_ftp_server_password}"
    506  1.1       pk 		_ftp_server_password=$resp
    507  1.1       pk 	done
    508  1.1       pk 
    509  1.1       pk 	# Get list of files for mget.
    510  1.1       pk 	cat << \__install_ftp_2
    511  1.1       pk 
    512  1.1       pk You will now be asked for files to extract.  Enter one file at a time.
    513  1.1       pk When you are done entering files, enter 'done'.
    514  1.1       pk 
    515  1.1       pk __install_ftp_2
    516  1.1       pk 	echo "#!/bin/sh" > /tmp/ftp-script.sh
    517  1.1       pk 	echo "cd /mnt" >> /tmp/ftp-script.sh
    518  1.1       pk 	echo "ftp -i -n $_ftp_server_ip << \__end_commands" >> \
    519  1.1       pk 	    /tmp/ftp-script.sh
    520  1.1       pk 	echo "user $_ftp_server_login $_ftp_server_password" >> \
    521  1.1       pk 	    /tmp/ftp-script.sh
    522  1.1       pk 	echo "bin" >> /tmp/ftp-script.sh
    523  1.1       pk 	echo "cd $_ftp_server_dir" >> /tmp/ftp-script.sh
    524  1.1       pk 
    525  1.1       pk 	resp=""		# force one interation
    526  1.1       pk 	while [ "X${resp}" != X"done" ]; do
    527  1.1       pk 		echo -n "File? [done] "
    528  1.1       pk 		getresp "done"
    529  1.1       pk 		if [ "X${resp}" = X"done" ]; then
    530  1.1       pk 			break
    531  1.1       pk 		fi
    532  1.1       pk 
    533  1.3       pk 		_ftp_file=`echo ${resp} | cutword 1'`
    534  1.1       pk 		echo "get ${_ftp_file} |\"tar --unlink -zxvpf -\"" >> \
    535  1.1       pk 		    /tmp/ftp-script.sh
    536  1.1       pk 	done
    537  1.1       pk 
    538  1.1       pk 	echo "quit" >> /tmp/ftp-script.sh
    539  1.1       pk 	echo "__end_commands" >> /tmp/ftp-script.sh
    540  1.1       pk 
    541  1.1       pk 	sh /tmp/ftp-script.sh
    542  1.1       pk 	rm -f /tmp/ftp-script.sh
    543  1.1       pk 	echo "Extraction complete."
    544  1.1       pk }
    545  1.1       pk 
    546  1.1       pk install_common_nfs_cdrom() {
    547  1.1       pk 	# $1 - directory containing file
    548  1.1       pk 	local _filename
    549  1.1       pk 	local _setsdone
    550  1.1       pk 	local _prev
    551  1.1       pk 	local _f
    552  1.1       pk 
    553  1.5       pk 	_sets=`(cd /mnt2/$1; ls *.tar.gz 2> /dev/null)`
    554  1.5       pk 	if [ -z "$_sets" ]; then
    555  1.5       pk 		# Try for stupid msdos convention
    556  1.5       pk 		_sets=`(cd /mnt2/$1; ls *.tgz 2> /dev/null)`
    557  1.5       pk 	fi
    558  1.1       pk 	if [ -z "$_sets" ]; then
    559  1.1       pk 		echo "There are no NetBSD install sets available in \"$1\""
    560  1.1       pk 		return
    561  1.1       pk 	fi
    562  1.1       pk 
    563  1.1       pk 	_setsdone=""
    564  1.1       pk 	while : ; do
    565  1.1       pk 		echo "The following sets are available for extraction:"
    566  1.1       pk 		echo "(marked sets have already been extracted)"
    567  1.1       pk 		echo ""
    568  1.1       pk 
    569  1.1       pk 		_prev=""
    570  1.1       pk 		for _f in $_sets ; do
    571  1.1       pk 			if isin $_f $_setsdone; then
    572  1.1       pk 				echo -n "[X] "
    573  1.1       pk 			else
    574  1.1       pk 				echo -n "    "
    575  1.1       pk 				if [ -z "$_prev" ]; then _prev=$_f; fi
    576  1.1       pk 			fi
    577  1.1       pk 			echo $_f
    578  1.1       pk 		done
    579  1.1       pk 		echo ""
    580  1.1       pk 
    581  1.1       pk 		# Get the name of the file.
    582  1.1       pk 		if [ "X$_prev" = "X" ]; then resp=n; else resp=y; fi
    583  1.1       pk 		echo -n "Continue extraction [$resp]?"
    584  1.1       pk 		getresp "$resp"
    585  1.1       pk 		if [ "$resp" = "n" ]; then
    586  1.1       pk 			break
    587  1.1       pk 		fi
    588  1.1       pk 
    589  1.1       pk 		echo -n "File name [$_prev]? "
    590  1.1       pk 		getresp "$_prev"
    591  1.1       pk 		_f=$resp
    592  1.1       pk 		_filename="/mnt2/$1/$_f"
    593  1.1       pk 
    594  1.1       pk 		# Ensure file exists
    595  1.1       pk 		if [ ! -f $_filename ]; then
    596  1.1       pk 			echo "File $_filename does not exist.  Check to make"
    597  1.1       pk 			echo "sure you entered the information properly."
    598  1.1       pk 			continue
    599  1.1       pk 		fi
    600  1.1       pk 
    601  1.1       pk 		# Extract file
    602  1.5       pk 		cat $_filename | (cd /mnt; tar --unlink -zxvpf -)
    603  1.1       pk 		echo "Extraction complete."
    604  1.1       pk 		_setsdone="$_f $_setsdone"
    605  1.1       pk 
    606  1.1       pk 	done
    607  1.1       pk }
    608  1.1       pk 
    609  1.1       pk install_cdrom() {
    610  1.5       pk 	local _drive
    611  1.6      leo 	local _partition_range
    612  1.5       pk 	local _partition
    613  1.5       pk 	local _fstype
    614  1.5       pk 	local _directory
    615  1.5       pk 
    616  1.1       pk 	# Get the cdrom device info
    617  1.1       pk 	cat << \__install_cdrom_1
    618  1.1       pk 
    619  1.1       pk The following CD-ROM devices are installed on your system; please select
    620  1.6      leo the CD-ROM device containing the partition with the installation sets:
    621  1.1       pk 
    622  1.1       pk __install_cdrom_1
    623  1.1       pk 	_CDDEVS=`md_get_cddevs`
    624  1.1       pk 	echo    "$_CDDEVS"
    625  1.1       pk 	echo	""
    626  1.1       pk 	echo -n	"Which is the CD-ROM with the installation media? [abort] "
    627  1.1       pk 	getresp "abort"
    628  1.1       pk 	case "$resp" in
    629  1.1       pk 		abort)
    630  1.1       pk 			echo "Aborting."
    631  1.1       pk 			return
    632  1.1       pk 			;;
    633  1.1       pk 
    634  1.1       pk 		*)
    635  1.1       pk 			if isin $resp $_CDDEVS ; then
    636  1.5       pk 				_drive=$resp
    637  1.1       pk 			else
    638  1.1       pk 				echo ""
    639  1.1       pk 				echo "The CD-ROM $resp does not exist."
    640  1.1       pk 				echo "Aborting."
    641  1.1       pk 				return
    642  1.1       pk 			fi
    643  1.1       pk 			;;
    644  1.1       pk 	esac
    645  1.1       pk 
    646  1.1       pk 	# Get partition
    647  1.6      leo 	_partition_range=`md_get_partition_range`
    648  1.1       pk 	resp=""		# force one iteration
    649  1.1       pk 	while [ "X${resp}" = X"" ]; do
    650  1.1       pk 		echo -n "Partition? [c] "
    651  1.1       pk 		getresp "c"
    652  1.1       pk 		case "$resp" in
    653  1.6      leo 			$_partition_range)
    654  1.5       pk 				_partition=$resp
    655  1.1       pk 				;;
    656  1.1       pk 
    657  1.1       pk 			*)
    658  1.1       pk 				echo "Invalid response: $resp"
    659  1.1       pk 				resp=""		# force loop to repeat
    660  1.1       pk 				;;
    661  1.1       pk 		esac
    662  1.1       pk 	done
    663  1.1       pk 
    664  1.1       pk 	# Ask for filesystem type
    665  1.1       pk 	cat << \__install_cdrom_2
    666  1.1       pk 
    667  1.1       pk There are two CD-ROM filesystem types currently supported by this program:
    668  1.1       pk 	1) ISO-9660 (cd9660)
    669  1.1       pk 	2) Berkeley Fast Filesystem (ffs)
    670  1.1       pk 
    671  1.1       pk __install_cdrom_2
    672  1.1       pk 	resp=""		# force one iteration
    673  1.1       pk 	while [ "X${resp}" = X"" ]; do
    674  1.1       pk 		echo -n "Which filesystem type? [cd9660] "
    675  1.1       pk 		getresp "cd9660"
    676  1.1       pk 		case "$resp" in
    677  1.1       pk 			cd9660|ffs)
    678  1.5       pk 				_fstype=$resp
    679  1.1       pk 				;;
    680  1.1       pk 
    681  1.1       pk 			*)
    682  1.1       pk 				echo "Invalid response: $resp"
    683  1.1       pk 				resp=""		# force loop to repeat
    684  1.1       pk 				;;
    685  1.1       pk 		esac
    686  1.1       pk 	done
    687  1.1       pk 
    688  1.1       pk 	# Mount the CD-ROM
    689  1.5       pk 	if ! mount -t ${_filesystem} -o ro \
    690  1.5       pk 	    /dev/${_drive}${_partition} /mnt2 ; then
    691  1.1       pk 		echo "Cannot mount CD-ROM drive.  Aborting."
    692  1.1       pk 		return
    693  1.1       pk 	fi
    694  1.1       pk 
    695  1.1       pk 	# Get the directory where the file lives
    696  1.1       pk 	resp=""		# force one iteration
    697  1.1       pk 	while [ "X${resp}" = X"" ]; do
    698  1.1       pk 		echo "Enter the directory relative to the mount point that"
    699  1.5       pk 		echo -n "contains the file. [${_directory}] "
    700  1.5       pk 		getresp "${_directory}"
    701  1.1       pk 	done
    702  1.5       pk 	_directory=$resp
    703  1.1       pk 
    704  1.5       pk 	install_common_nfs_cdrom ${_directory}
    705  1.5       pk 	umount -f /mnt2 > /dev/null 2>&1
    706  1.5       pk }
    707  1.5       pk 
    708  1.5       pk install_disk() {
    709  1.5       pk 	# Get the disk device info
    710  1.5       pk 	local _drive
    711  1.6      leo 	local _partition_range
    712  1.5       pk 	local _partition
    713  1.5       pk 	local _fstype
    714  1.5       pk 	local _fsopts
    715  1.5       pk 	local _directory
    716  1.5       pk 	local _md_fstype
    717  1.5       pk 	local _md_fsopts
    718  1.5       pk 
    719  1.5       pk 	cat << \__install_disk_1
    720  1.5       pk 
    721  1.5       pk The following disk devices are installed on your system; please select
    722  1.5       pk the disk device containing the partition with the installation sets:
    723  1.5       pk 
    724  1.5       pk __install_disk_1
    725  1.5       pk 	_DKDEVS=`md_get_diskdevs`
    726  1.5       pk 	echo    "$_DKDEVS"
    727  1.5       pk 	echo	""
    728  1.5       pk 	echo -n	"Which is the disk with the installation sets? [abort] "
    729  1.5       pk 	getresp "abort"
    730  1.5       pk 	case "$resp" in
    731  1.5       pk 		abort)
    732  1.5       pk 			echo "Aborting."
    733  1.5       pk 			return
    734  1.5       pk 			;;
    735  1.5       pk 
    736  1.5       pk 		*)
    737  1.5       pk 			if isin $resp $_DKDEVS ; then
    738  1.5       pk 				_drive=$resp
    739  1.5       pk 			else
    740  1.5       pk 				echo ""
    741  1.5       pk 				echo "The disk $resp does not exist."
    742  1.5       pk 				echo "Aborting."
    743  1.5       pk 				return
    744  1.5       pk 			fi
    745  1.5       pk 			;;
    746  1.5       pk 	esac
    747  1.5       pk 
    748  1.5       pk 	# Get partition
    749  1.6      leo 	_partition_range=`md_get_partition_range`
    750  1.5       pk 	resp=""		# force one iteration
    751  1.5       pk 	while [ "X${resp}" = X"" ]; do
    752  1.5       pk 		echo -n "Partition? [d] "
    753  1.5       pk 		getresp "d"
    754  1.5       pk 		case "$resp" in
    755  1.6      leo 			$_partition_range)
    756  1.5       pk 				_partition=$resp
    757  1.5       pk 				;;
    758  1.5       pk 
    759  1.5       pk 			*)
    760  1.5       pk 				echo "Invalid response: $resp"
    761  1.5       pk 				resp=""		# force loop to repeat
    762  1.5       pk 				;;
    763  1.5       pk 		esac
    764  1.5       pk 	done
    765  1.5       pk 
    766  1.5       pk 	# Ask for filesystem type
    767  1.5       pk 	cat << \__install_disk_2
    768  1.5       pk 
    769  1.5       pk The following filesystem types are supported:
    770  1.5       pk 	1) ffs
    771  1.5       pk __install_disk_2
    772  1.5       pk 	_md_fstype=`md_native_fstype`
    773  1.5       pk 	_md_fsopts=`md_native_fsopts`
    774  1.5       pk 	if [ ! -z "$_md_fstype" ]; then
    775  1.5       pk 		echo "	2) $_md_fstype"
    776  1.5       pk 	else
    777  1.5       pk 		_md_fstype="_undefined_"
    778  1.5       pk 	fi
    779  1.5       pk 	resp=""		# force one iteration
    780  1.5       pk 	while [ "X${resp}" = X"" ]; do
    781  1.5       pk 		echo -n "Which filesystem type? [ffs] "
    782  1.5       pk 		getresp "ffs"
    783  1.5       pk 		case "$resp" in
    784  1.5       pk 			ffs)
    785  1.5       pk 				_fstype=$resp
    786  1.5       pk 				_fsopts="ro"
    787  1.5       pk 				;;
    788  1.5       pk 			$_md_fstype)
    789  1.5       pk 				_fstype=$resp
    790  1.5       pk 				_fsopts=$_md_fsopts
    791  1.5       pk 				;;
    792  1.5       pk 			*)
    793  1.5       pk 				echo "Invalid response: $resp"
    794  1.5       pk 				resp=""		# force loop to repeat
    795  1.5       pk 				;;
    796  1.5       pk 		esac
    797  1.5       pk 	done
    798  1.5       pk 
    799  1.5       pk 	# Mount the disk
    800  1.5       pk 	if ! mount -t ${_fstype} -o $_fsopts \
    801  1.5       pk 	    /dev/${_drive}${_partition} /mnt2 ; then
    802  1.5       pk 		echo "Cannot mount disk.  Aborting."
    803  1.5       pk 		return
    804  1.5       pk 	fi
    805  1.5       pk 
    806  1.5       pk 	# Get the directory where the file lives
    807  1.5       pk 	resp=""		# force one iteration
    808  1.5       pk 	while [ "X${resp}" = X"" ]; do
    809  1.5       pk 		echo "Enter the directory relative to the mount point that"
    810  1.5       pk 		echo -n "contains the file. [${_directory}] "
    811  1.5       pk 		getresp "${_directory}"
    812  1.5       pk 	done
    813  1.5       pk 	_directory=$resp
    814  1.5       pk 
    815  1.5       pk 	install_common_nfs_cdrom ${_directory}
    816  1.1       pk 	umount -f /mnt2 > /dev/null 2>&1
    817  1.1       pk }
    818  1.1       pk 
    819  1.1       pk install_nfs() {
    820  1.1       pk 	# Get the IP address of the server
    821  1.1       pk 	resp=""		# force one iteration
    822  1.1       pk 	while [ "X${resp}" = X"" ]; do
    823  1.1       pk 		echo -n "Server IP address? [${_nfs_server_ip}] "
    824  1.1       pk 		getresp "${_nfs_server_ip}"
    825  1.1       pk 	done
    826  1.1       pk 	_nfs_server_ip=$resp
    827  1.1       pk 
    828  1.1       pk 	# Get server path to mount
    829  1.1       pk 	resp=""		# force one iteration
    830  1.1       pk 	while [ "X${resp}" = X"" ]; do
    831  1.1       pk 		echo -n "Filesystem on server to mount? [${_nfs_server_path}] "
    832  1.1       pk 		getresp "${_nfs_server_path}"
    833  1.1       pk 	done
    834  1.1       pk 	_nfs_server_path=$resp
    835  1.1       pk 
    836  1.1       pk 	# Determine use of TCP
    837  1.1       pk 	echo -n "Use TCP transport (only works with capable NFS server)? [n] "
    838  1.1       pk 	getresp "n"
    839  1.1       pk 	case "$resp" in
    840  1.1       pk 		y*|Y*)
    841  1.1       pk 			_nfs_tcp="-T"
    842  1.1       pk 			;;
    843  1.1       pk 
    844  1.1       pk 		*)
    845  1.1       pk 			_nfs_tcp=""
    846  1.1       pk 			;;
    847  1.1       pk 	esac
    848  1.1       pk 
    849  1.1       pk 	# Mount the server
    850  1.1       pk 	mkdir /mnt2 > /dev/null 2>&1
    851  1.1       pk 	if ! mount_nfs $_nfs_tcp ${_nfs_server_ip}:${_nfs_server_path} \
    852  1.1       pk 	    /mnt2 ; then
    853  1.1       pk 		echo "Cannot mount NFS server.  Aborting."
    854  1.1       pk 		return
    855  1.1       pk 	fi
    856  1.1       pk 
    857  1.1       pk 	# Get the directory where the file lives
    858  1.1       pk 	resp=""		# force one iteration
    859  1.1       pk 	while [ "X${resp}" = X"" ]; do
    860  1.1       pk 		echo "Enter the directory relative to the mount point that"
    861  1.1       pk 		echo -n "contains the file. [${_nfs_directory}] "
    862  1.1       pk 		getresp "${_nfs_directory}"
    863  1.1       pk 	done
    864  1.1       pk 	_nfs_directory=$resp
    865  1.1       pk 
    866  1.1       pk 	install_common_nfs_cdrom ${_nfs_directory}
    867  1.1       pk 	umount -f /mnt2 > /dev/null 2>&1
    868  1.1       pk }
    869  1.1       pk 
    870  1.1       pk install_tape() {
    871  1.1       pk 	# Get the name of the tape from the user.
    872  1.1       pk 	cat << \__install_tape_1
    873  1.1       pk 
    874  1.1       pk The installation program needs to know which tape device to use.  Make
    875  1.1       pk sure you use a "no rewind on close" device.
    876  1.1       pk 
    877  1.1       pk __install_tape_1
    878  1.1       pk 	_tape=`basename $TAPE`
    879  1.1       pk 	resp=""		# force one iteration
    880  1.1       pk 	while [ "X${resp}" = X"" ]; do
    881  1.1       pk 		echo -n "Name of tape device? [${_tape}]"
    882  1.1       pk 		getresp "${_tape}"
    883  1.1       pk 	done
    884  1.1       pk 	_tape=`basename $resp`
    885  1.1       pk 	TAPE="/dev/${_tape}"
    886  1.1       pk 	if [ ! -c $TAPE ]; then
    887  1.1       pk 		echo "$TAPE does not exist or is not a character special file."
    888  1.1       pk 		echo "Aborting."
    889  1.1       pk 		return
    890  1.1       pk 	fi
    891  1.1       pk 	export TAPE
    892  1.1       pk 
    893  1.1       pk 	# Rewind the tape device
    894  1.1       pk 	echo -n "Rewinding tape..."
    895  1.1       pk 	if ! mt rewind ; then
    896  1.1       pk 		echo "$TAPE may not be attached to the system or may not be"
    897  1.1       pk 		echo "a tape device.  Aborting."
    898  1.1       pk 		return
    899  1.1       pk 	fi
    900  1.1       pk 	echo "done."
    901  1.1       pk 
    902  1.1       pk 	# Get the file number
    903  1.1       pk 	resp=""		# force one iteration
    904  1.1       pk 	while [ "X${resp}" = X"" ]; do
    905  1.1       pk 		echo -n "File number? "
    906  1.1       pk 		getresp ""
    907  1.1       pk 		case "$resp" in
    908  1.1       pk 			[1-9]*)
    909  1.1       pk 				_nskip=`expr $resp - 1`
    910  1.1       pk 				;;
    911  1.1       pk 
    912  1.1       pk 			*)
    913  1.1       pk 				echo "Invalid file number ${resp}."
    914  1.1       pk 				resp=""		# fore loop to repeat
    915  1.1       pk 				;;
    916  1.1       pk 		esac
    917  1.1       pk 	done
    918  1.1       pk 
    919  1.1       pk 	# Skip to correct file.
    920  1.1       pk 	echo -n "Skipping to source file..."
    921  1.1       pk 	if [ "X${_nskip}" != X"0" ]; then
    922  1.1       pk 		if ! mt fsf $_nskip ; then
    923  1.1       pk 			echo "Could not skip $_nskip files.  Aborting."
    924  1.1       pk 			return
    925  1.1       pk 		fi
    926  1.1       pk 	fi
    927  1.1       pk 	echo "done."
    928  1.1       pk 
    929  1.1       pk 	cat << \__install_tape_2
    930  1.1       pk 
    931  1.1       pk There are 2 different ways the file can be stored on tape:
    932  1.1       pk 
    933  1.1       pk 	1) an image of a gzipped tar file
    934  1.1       pk 	2) a standard tar image
    935  1.1       pk 
    936  1.1       pk __install_tape_2
    937  1.1       pk 	resp=""		# force one iteration
    938  1.1       pk 	while [ "X${resp}" = X"" ]; do
    939  1.1       pk 		echo -n "Which way is it? [1] "
    940  1.1       pk 		getresp "1"
    941  1.1       pk 		case "$resp" in
    942  1.1       pk 			1)
    943  1.1       pk 				(
    944  1.1       pk 					cd /mnt
    945  1.1       pk 					dd if=$TAPE | tar --unlink -zxvpf -
    946  1.1       pk 				)
    947  1.1       pk 				;;
    948  1.1       pk 
    949  1.1       pk 			2)
    950  1.1       pk 				(
    951  1.1       pk 					cd /mnt
    952  1.1       pk 					dd if=$TAPE | tar --unlink -xvpf -
    953  1.1       pk 				)
    954  1.1       pk 				;;
    955  1.1       pk 
    956  1.1       pk 			*)
    957  1.1       pk 				echo "Invalid response: $resp."
    958  1.1       pk 				resp=""		# force loop to repeat
    959  1.1       pk 				;;
    960  1.1       pk 		esac
    961  1.1       pk 	done
    962  1.1       pk 	echo "Extraction complete."
    963  1.1       pk }
    964  1.1       pk 
    965  1.1       pk get_timezone() {
    966  1.1       pk 	local _a
    967  1.6      leo 	local _zonepath
    968  1.6      leo 
    969  1.6      leo 	#
    970  1.6      leo 	# If the zoneinfo is not on the installation medium or on the
    971  1.6      leo 	# installed filesystem, set TZ to GMT and return immediatly.
    972  1.6      leo 	#
    973  1.9       pk 	if [ ! -e /usr/share/zoneinfo -a ! -e /mnt/usr/share/zoneinfo ]; then
    974  1.6      leo 		TZ=GMT
    975  1.6      leo 		return
    976  1.6      leo 	fi
    977  1.6      leo 	if [ ! -d /usr/share/zoneinfo ]; then
    978  1.6      leo 		_zonepath=/mnt
    979  1.6      leo 	else
    980  1.6      leo 		_zonepath=""
    981  1.6      leo 	fi
    982  1.6      leo 		
    983  1.1       pk cat << \__get_timezone_1
    984  1.1       pk 
    985  1.1       pk Select a time zone for your location. Timezones are represented on the
    986  1.1       pk system by a directory structure rooted in "/usr/share/timezone". Most
    987  1.1       pk timezones can be selected by entering a token like "MET" or "GMT-6".
    988  1.1       pk Other zones are grouped by continent, with detailed zone information
    989  1.1       pk separated by a slash ("/"), e.g. "US/Pacific".
    990  1.1       pk 
    991  1.1       pk To get a listing of what's available in /usr/share/zoneinfo, enter "?"
    992  1.1       pk at the prompts below.
    993  1.1       pk 
    994  1.1       pk __get_timezone_1
    995  1.1       pk 	if [ X$TZ = X ]; then
    996  1.9       pk 		TZ=`ls -l /etc/localtime 2>/dev/null | cutlast`
    997  1.3       pk 		TZ=${TZ#/usr/share/zoneinfo/}
    998  1.1       pk 	fi
    999  1.1       pk 	while :; do
   1000  1.1       pk 		echo -n	"What timezone are you in [\`?' for list] [$TZ]? "
   1001  1.1       pk 		getresp "$TZ"
   1002  1.1       pk 		case "$resp" in
   1003  1.1       pk 		"")
   1004  1.1       pk 			echo "Timezone defaults to GMT"
   1005  1.1       pk 			TZ="GMT"
   1006  1.1       pk 			break;
   1007  1.1       pk 			;;
   1008  1.1       pk 		"?")
   1009  1.6      leo 			ls ${_zonepath}/usr/share/zoneinfo
   1010  1.1       pk 			;;
   1011  1.1       pk 		*)
   1012  1.1       pk 			_a=$resp
   1013  1.6      leo 			while [ -d ${_zonepath}/usr/share/zoneinfo/$_a ]; do
   1014  1.1       pk 				echo -n "There are several timezones available"
   1015  1.1       pk 				echo " within zone '$_a'"
   1016  1.1       pk 				echo -n "Select a sub-timezone [\`?' for list]: "
   1017  1.1       pk 				getresp ""
   1018  1.1       pk 				case "$resp" in
   1019  1.6      leo 				"?") ls ${_zonepath}/usr/share/zoneinfo/$_a ;;
   1020  1.1       pk 				*)	_a=${_a}/${resp}
   1021  1.6      leo 					if [ -f ${_zonepath}/usr/share/zoneinfo/$_a ]; then
   1022  1.1       pk 						break;
   1023  1.1       pk 					fi
   1024  1.1       pk 					;;
   1025  1.1       pk 				esac
   1026  1.1       pk 			done
   1027  1.6      leo 			if [ -f ${_zonepath}/usr/share/zoneinfo/$_a ]; then
   1028  1.1       pk 				TZ="$_a"
   1029  1.1       pk 				echo "You have selected timezone \"$_a\"".
   1030  1.1       pk 				break 2
   1031  1.1       pk 			fi
   1032  1.1       pk 			echo "'/usr/share/zoneinfo/$_a' is not a valid timezone on this system."
   1033  1.1       pk 			;;
   1034  1.1       pk 		esac
   1035  1.1       pk 	done
   1036  1.1       pk }
   1037  1.1       pk 
   1038  1.1       pk install_sets()
   1039  1.1       pk {
   1040  1.1       pk # arguments: the base names of the distribution sets to consider
   1041  1.1       pk # Ask the user which media to load the distribution from.
   1042  1.1       pk cat << \__install_sets_1
   1043  1.1       pk 
   1044  1.1       pk It is now time to extract the installation sets onto the hard disk.
   1045  1.1       pk Make sure The sets are either on a local device (i.e. tape, CD-ROM) or on a
   1046  1.1       pk network server.
   1047  1.1       pk 
   1048  1.1       pk __install_sets_1
   1049  1.7      leo if dir_has_sets "/mnt/$RELDIR" $* ; then
   1050  1.6      leo 	echo -n "Are you sure to install sets from $RELDIR ? [y] "
   1051  1.1       pk 	getresp "y"
   1052  1.1       pk 	case "$resp" in
   1053  1.1       pk 	y*|Y*)
   1054  1.1       pk 		for _f do
   1055  1.6      leo 			if [ ! -f /mnt/$RELDIR/${_f}.tar.gz ]; then
   1056  1.1       pk 				continue
   1057  1.1       pk 			fi
   1058  1.1       pk 			echo -n "Install \"$_f\" ? [y]"
   1059  1.1       pk 			getresp "y"
   1060  1.1       pk 			case "$resp" in
   1061  1.1       pk 			y*|Y*)
   1062  1.6      leo 			     cat /mnt/$RELDIR/${_f}.tar.gz |
   1063  1.1       pk 					(cd /mnt; tar --unlink -zxvpf -)
   1064  1.1       pk 				_yup="TRUE"
   1065  1.1       pk 				echo "Extraction complete."
   1066  1.1       pk 				;;
   1067  1.1       pk 			*)
   1068  1.1       pk 				echo "Skipping \"$_f\"."
   1069  1.1       pk 				;;
   1070  1.1       pk 			esac
   1071  1.1       pk 		done
   1072  1.1       pk 		;;
   1073  1.1       pk 	*)
   1074  1.1       pk 		_yup="FALSE"
   1075  1.1       pk 		;;
   1076  1.1       pk 	esac
   1077  1.1       pk else
   1078  1.1       pk 	_yup="FALSE"
   1079  1.1       pk fi
   1080  1.1       pk 
   1081  1.1       pk # Go on prodding for alternate locations
   1082  1.1       pk resp=""		# force at least one iteration
   1083  1.1       pk while [ "X${resp}" = X"" ]; do
   1084  1.1       pk 	# If _yup is not FALSE, it means that we extracted sets above.
   1085  1.1       pk 	# If that's the case, bypass the menu the first time.
   1086  1.1       pk 	if [ X"$_yup" = X"FALSE" ]; then
   1087  1.8       pk 		echo -n	"Install from (f)tp, (t)ape, (C)D-ROM, (N)FS"
   1088  1.8       pk 		echo -n " or local (d)isk?"
   1089  1.8       pk 		getresp ""
   1090  1.1       pk 		case "$resp" in
   1091  1.5       pk 		d*|D*)
   1092  1.5       pk 			install_disk
   1093  1.5       pk 			;;
   1094  1.1       pk 		f*|F*)
   1095  1.1       pk 			install_ftp
   1096  1.1       pk 			;;
   1097  1.1       pk 
   1098  1.1       pk 		t*|T*)
   1099  1.1       pk 			install_tape
   1100  1.1       pk 			;;
   1101  1.1       pk 
   1102  1.1       pk 		c*|C*)
   1103  1.1       pk 			install_cdrom
   1104  1.1       pk 			;;
   1105  1.1       pk 
   1106  1.1       pk 		n*|N*)
   1107  1.1       pk 			install_nfs
   1108  1.1       pk 			;;
   1109  1.1       pk 
   1110  1.1       pk 		*)
   1111  1.1       pk 			echo "Invalid response: $resp"
   1112  1.1       pk 			resp=""
   1113  1.1       pk 			;;
   1114  1.1       pk 		esac
   1115  1.1       pk 	else
   1116  1.1       pk 		_yup="FALSE"	# So we'll ask next time
   1117  1.1       pk 	fi
   1118  1.1       pk 
   1119  1.1       pk 	# Give the user the opportunity to extract more sets.  They don't
   1120  1.1       pk 	# necessarily have to come from the same media.
   1121  1.1       pk 	echo	""
   1122  1.1       pk 	echo -n	"Extract more sets? [n] "
   1123  1.1       pk 	getresp "n"
   1124  1.1       pk 	case "$resp" in
   1125  1.1       pk 	y*|Y*)
   1126  1.1       pk 		# Force loop to repeat
   1127  1.1       pk 		resp=""
   1128  1.1       pk 		;;
   1129  1.1       pk 
   1130  1.1       pk 	*)
   1131  1.1       pk 		;;
   1132  1.1       pk 	esac
   1133  1.1       pk done
   1134  1.1       pk }
   1135  1.1       pk 
   1136  1.1       pk munge_fstab()
   1137  1.1       pk {
   1138  1.1       pk 	local _fstab
   1139  1.1       pk 	local _fstab_shadow
   1140  1.5       pk 	local _dev
   1141  1.5       pk 	local _mp
   1142  1.7      leo 	local _fstype
   1143  1.5       pk 	local _rest
   1144  1.6      leo 
   1145  1.1       pk 	# Now that the 'real' fstab is configured, we munge it into a 'shadow'
   1146  1.1       pk 	# fstab which we'll use for mounting and unmounting all of the target
   1147  1.1       pk 	# filesystems relative to /mnt.  Mount all filesystems.
   1148  1.1       pk 	_fstab=$1
   1149  1.1       pk 	_fstab_shadow=$2
   1150  1.7      leo 	( while read _dev _mp _fstype _rest; do
   1151  1.7      leo 		# Skip comment lines
   1152  1.7      leo 		case "$_dev" in
   1153  1.7      leo 			\#*)	continue;;
   1154  1.7      leo 			*)	;;
   1155  1.7      leo 		esac
   1156  1.7      leo 		# and some filesystem types (like there are swap,kernfs,...)
   1157  1.7      leo 		case "$_fstype" in
   1158  1.7      leo 			ffs|ufs|nfs)	;;
   1159  1.7      leo 			*)	continue;;
   1160  1.7      leo 		esac
   1161  1.3       pk 		if [ "$_mp" = "/" ]; then
   1162  1.8       pk 			echo $_dev /mnt $_fstype $_rest
   1163  1.1       pk 		else
   1164  1.8       pk 			echo $_dev /mnt$_mp $_fstype $_rest
   1165  1.3       pk 		fi
   1166  1.6      leo 	    done ) < $_fstab > $_fstab_shadow
   1167  1.1       pk }
   1168  1.1       pk 
   1169  1.1       pk mount_fs()
   1170  1.1       pk {
   1171  1.1       pk 	# Must mount filesystems manually, one at a time, so we can make
   1172  1.1       pk 	# sure the mount points exist.
   1173  1.1       pk 	# $1 is a file in fstab format
   1174  1.1       pk 	local _fstab
   1175  1.1       pk 
   1176  1.1       pk 	_fstab=$1
   1177  1.1       pk 
   1178  1.1       pk 	( while read line; do
   1179  1.4       pk 		set -- $line
   1180  1.4       pk 		_dev=$1
   1181  1.4       pk 		_mp=$2
   1182  1.4       pk 		_fstype=$3
   1183  1.4       pk 		_opt=$4
   1184  1.1       pk 
   1185  1.1       pk 		# If not the root filesystem, make sure the mount
   1186  1.1       pk 		# point is present.
   1187  1.1       pk 		if [ "X{$_mp}" != X"/mnt" ]; then
   1188  1.1       pk 			mkdir -p $_mp
   1189  1.1       pk 		fi
   1190  1.1       pk 
   1191  1.1       pk 		# Mount the filesystem.  If the mount fails, exit
   1192  1.1       pk 		# with an error condition to tell the outer
   1193  1.1       pk 		# later to bail.
   1194  1.1       pk 		if ! mount -v -t $_fstype -o $_opt $_dev $_mp ; then
   1195  1.1       pk 			# error message displated by mount
   1196  1.1       pk 			exit 1
   1197  1.1       pk 		fi
   1198  1.1       pk 	done ) < $_fstab
   1199  1.1       pk 
   1200  1.1       pk 	if [ "X${?}" != X"0" ]; then
   1201  1.1       pk 		cat << \__mount_filesystems_1
   1202  1.1       pk 
   1203  1.1       pk FATAL ERROR:  Cannot mount filesystems.  Double-check your configuration
   1204  1.1       pk and restart the installation process.
   1205  1.1       pk __mount_filesystems_1
   1206  1.1       pk 		exit
   1207  1.1       pk 	fi
   1208  1.1       pk }
   1209  1.1       pk 
   1210  1.1       pk unmount_fs()
   1211  1.1       pk {
   1212  1.1       pk 	# Unmount all filesystems and check their integrity.
   1213  1.1       pk 	# $1 is a file in fstab format
   1214  1.1       pk 	local _fstab
   1215  1.1       pk 
   1216  1.1       pk 	_fstab=$1
   1217  1.1       pk 
   1218  1.1       pk 	echo -n	"Syncing disks..."
   1219  1.1       pk 	pid=`twiddle`
   1220  1.1       pk 	sync; sleep 4; sync; sleep 2; sync; sleep 2
   1221  1.1       pk 	kill $pid
   1222  1.1       pk 	echo	"done."
   1223  1.1       pk 
   1224  1.1       pk 	(
   1225  1.1       pk 		_devs=""
   1226  1.1       pk 		_mps=""
   1227  1.1       pk 		# maintain reverse order
   1228  1.1       pk 		while read line; do
   1229  1.3       pk 			set -- $line
   1230  1.3       pk 			_devs="$1 ${_devs}"
   1231  1.3       pk 			_mps="$2 ${_mps}"
   1232  1.1       pk 		done
   1233  1.1       pk 		echo -n "Umounting filesystems... "
   1234  1.1       pk 		for _mp in ${_mps}; do
   1235  1.1       pk 			echo -n "${_mp} "
   1236  1.1       pk 			umount ${_mp}
   1237  1.1       pk 		done
   1238  1.1       pk 		echo "Done."
   1239  1.1       pk 
   1240  1.1       pk 		echo "Checking filesystem integrity..."
   1241  1.1       pk 		for _dev in ${_devs}; do
   1242  1.1       pk 			echo  "${_dev}"
   1243  1.1       pk 			fsck -f ${_dev}
   1244  1.1       pk 		done
   1245  1.1       pk 		echo "Done."
   1246  1.1       pk 	) < $_fstab
   1247  1.1       pk }
   1248  1.1       pk 
   1249  1.1       pk check_fs()
   1250  1.1       pk {
   1251  1.1       pk 	# Check filesystem integrity.
   1252  1.1       pk 	# $1 is a file in fstab format
   1253  1.1       pk 	local _fstab
   1254  1.1       pk 
   1255  1.1       pk 	_fstab=$1
   1256  1.1       pk 
   1257  1.1       pk 	(
   1258  1.1       pk 		_devs=""
   1259  1.1       pk 		_mps=""
   1260  1.1       pk 		while read line; do
   1261  1.3       pk 			set -- $line
   1262  1.3       pk 			_devs="$1 ${_devs}"
   1263  1.3       pk 			_mps="$2 ${_mps}"
   1264  1.1       pk 		done
   1265  1.1       pk 
   1266  1.1       pk 		echo "Checking filesystem integrity..."
   1267  1.1       pk 		for _dev in ${_devs}; do
   1268  1.1       pk 			echo  "${_dev}"
   1269  1.1       pk 			fsck -f ${_dev}
   1270  1.1       pk 		done
   1271  1.1       pk 		echo "Done."
   1272  1.1       pk 	) < $_fstab
   1273  1.1       pk }
   1274