Home | History | Annotate | Line # | Download | only in miniroot
install.sub revision 1.41
      1   1.1        pk #!/bin/sh
      2  1.41  fredette #	$NetBSD: install.sub,v 1.41 2002/04/18 21:41:38 fredette 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.22       jtc # PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
     30  1.22       jtc # BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     31   1.2   thorpej # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     32   1.2   thorpej # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     33   1.2   thorpej # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     34   1.2   thorpej # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     35   1.2   thorpej # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     36   1.2   thorpej # POSSIBILITY OF SUCH DAMAGE.
     37   1.1        pk #
     38   1.1        pk 
     39   1.1        pk #	NetBSD installation/upgrade script - common subroutines.
     40   1.1        pk 
     41   1.1        pk ROOTDISK=""				# filled in below
     42   1.7       leo VERSION=				# filled in automatically (see list)
     43   1.7       leo export VERSION
     44   1.1        pk 
     45   1.1        pk ALLSETS="base comp etc games man misc text"	# default install sets
     46   1.1        pk UPGRSETS="base comp games man misc text"	# default upgrade sets
     47  1.13        pk THESETS=					# one of the above
     48  1.13        pk 
     49  1.13        pk local_sets_dir=""			# Path searched for sets by install_sets
     50  1.13        pk 					# on the local filesystems
     51   1.1        pk 
     52   1.7       leo # decide upon an editor
     53   1.7       leo if [ X$EDITOR = X ]; then
     54   1.7       leo 	if [ -x /usr/bin/vi ]; then
     55   1.7       leo 		EDITOR=vi
     56   1.7       leo 	else
     57   1.7       leo 		EDITOR=ed
     58   1.7       leo 	fi
     59   1.7       leo fi
     60   1.7       leo 
     61   1.1        pk getresp() {
     62   1.1        pk 	read resp
     63   1.1        pk 	if [ "X$resp" = "X" ]; then
     64   1.1        pk 		resp=$1
     65   1.1        pk 	fi
     66   1.1        pk }
     67   1.1        pk 
     68   1.1        pk isin() {
     69   1.1        pk # test the first argument against the remaining ones, return succes on a match
     70   1.1        pk 	_a=$1; shift
     71   1.1        pk 	while [ $# != 0 ]; do
     72   1.1        pk 		if [ "$_a" = "$1" ]; then return 0; fi
     73   1.1        pk 		shift
     74   1.1        pk 	done
     75   1.1        pk 	return 1
     76   1.1        pk }
     77   1.1        pk 
     78   1.1        pk rmel() {
     79   1.1        pk # remove first argument from list formed by the remaining arguments
     80   1.6       leo 	local	_a
     81   1.6       leo 
     82   1.1        pk 	_a=$1; shift
     83   1.1        pk 	while [ $# != 0 ]; do
     84   1.1        pk 		if [ "$_a" != "$1" ]; then
     85   1.1        pk 			echo "$1";
     86   1.1        pk 		fi
     87   1.1        pk 		shift
     88   1.1        pk 	done
     89   1.1        pk }
     90   1.1        pk 
     91   1.3        pk cutword () {
     92   1.3        pk # read a line of data, return Nth element.
     93   1.3        pk 	local _a
     94   1.3        pk 	local _n
     95   1.4        pk 	local _oifs
     96   1.4        pk 
     97   1.4        pk 	# optional field separator
     98   1.4        pk 	_oifs="$IFS"
     99   1.4        pk 	case "$1" in
    100   1.6       leo 		-t?*) IFS=${1#-t}; shift;;
    101   1.4        pk 	esac
    102   1.4        pk 
    103   1.3        pk 	_n=$1
    104   1.3        pk 	read _a; set -- $_a
    105   1.4        pk 	IFS="$_oifs"
    106   1.3        pk 	if [ "$1" = "" ]; then return; fi
    107   1.3        pk 	eval echo \$$_n
    108   1.3        pk }
    109   1.3        pk 
    110   1.3        pk cutlast () {
    111   1.3        pk # read a line of data, return last element. Equiv. of awk '{print $NF}'.
    112   1.3        pk 	local _a
    113   1.4        pk 	local _oifs
    114   1.4        pk 
    115   1.4        pk 	# optional field separator
    116   1.4        pk 	_oifs="$IFS"
    117   1.4        pk 	case "$1" in
    118   1.6       leo 		-t?*) IFS=${1#-t}; shift;;
    119   1.4        pk 	esac
    120   1.4        pk 
    121   1.3        pk 	read _a; set -- $_a
    122   1.4        pk 	IFS="$_oifs"
    123   1.3        pk 	if [ "$1" = "" ]; then return; fi
    124   1.5        pk 	while [ "$#" -gt 10 ]; do shift 10; done
    125   1.3        pk 	eval echo \$$#
    126   1.3        pk }
    127   1.3        pk 
    128   1.3        pk firstchar () {
    129   1.3        pk # return first character of argument
    130   1.3        pk 	local _a
    131   1.3        pk 	_a=$1
    132   1.3        pk 	while [ ${#_a} != 1 ]; do
    133   1.3        pk 		_a=${_a%?}
    134   1.3        pk 	done
    135   1.3        pk 	echo $_a
    136   1.3        pk }
    137   1.3        pk 
    138   1.5        pk basename () {
    139   1.5        pk 	local _oifs
    140   1.5        pk 	if [ "$1" = "" ]; then return; fi
    141   1.5        pk 	_oifs="$IFS"
    142   1.5        pk 	IFS="/"
    143   1.5        pk 	set -- $1
    144   1.5        pk 	IFS="$_oifs"
    145   1.5        pk 	while [ "$#" -gt 10 ]; do shift 10; done
    146   1.5        pk 	eval echo \$$#
    147   1.5        pk }
    148   1.5        pk 
    149   1.7       leo dir_has_sets() {
    150   1.7       leo 	# return true when the directory $1 contains a set for $2...$n
    151   1.7       leo 	local _dir
    152   1.7       leo 	local _file
    153   1.7       leo 
    154   1.7       leo 	_dir=$1; shift
    155   1.7       leo 	for _file in $*
    156   1.7       leo 	do
    157   1.7       leo 		if [ -f $_dir/${_file}.tar.gz ]; then
    158   1.7       leo 			return 0
    159   1.7       leo 		fi
    160  1.13        pk 		# Try for stupid msdos convention
    161  1.13        pk 		if [ -f $_dir/${_file}.tgz ]; then
    162  1.13        pk 			return 0
    163  1.13        pk 		fi
    164  1.40  fredette 		# Try for uncompressed files
    165  1.40  fredette 		if [ -f $_dir/${_file}.tar ]; then
    166  1.40  fredette 			return 0
    167  1.40  fredette 		fi
    168  1.18        is 		# Try for split files
    169  1.18        is 		if [ -f $_dir/${_file}${VERSION}.aa ]; then
    170  1.18        is 			return 0
    171  1.18        is 		fi
    172   1.7       leo 	done
    173   1.7       leo 	return 1
    174   1.7       leo }
    175   1.7       leo 
    176   1.1        pk twiddle() {
    177   1.1        pk # spin the propeller so we don't get bored
    178   1.1        pk 	while : ; do  
    179   1.1        pk 		sleep 1; echo -n "/";
    180   1.1        pk 		sleep 1; echo -n "-";
    181   1.1        pk 		sleep 1; echo -n "\\";
    182   1.1        pk 		sleep 1; echo -n "|";
    183   1.1        pk 	done > /dev/tty & echo $!
    184   1.1        pk }
    185   1.1        pk 
    186  1.13        pk get_localdir() {
    187  1.13        pk 	# $1 is relative mountpoint
    188  1.13        pk 	local _mp
    189  1.13        pk 	local _dir
    190  1.13        pk 
    191  1.13        pk 	_mp=$1
    192  1.13        pk 	_dir=
    193  1.13        pk 	while : ; do
    194  1.32        pk 	    if [ X$_mp != X ]; then
    195  1.32        pk 		cat << __get_localdir_1
    196  1.32        pk Note: your filesystems are mounted under the temporary mount point \"$_mp\".
    197  1.32        pk The pathname you are requested to enter below should NOT include the \"$_mp\"
    198  1.32        pk prefix.
    199  1.32        pk __get_localdir_1
    200  1.32        pk 	    fi
    201  1.13        pk 	    echo -n "Enter the pathname where the sets are stored [$_dir] "
    202  1.13        pk 	    getresp "$_dir"
    203  1.13        pk 	    _dir=$resp
    204  1.13        pk 
    205  1.13        pk 	    # Allow break-out with empty response
    206  1.13        pk 	    if [ -z "$_dir" ]; then
    207  1.13        pk 		echo -n "Are you sure you don't want to set the pathname? [n] "
    208  1.13        pk 		getresp "n"
    209  1.13        pk 		case "$resp" in
    210  1.13        pk 			y*|Y*)
    211  1.13        pk 				break
    212  1.13        pk 				;;
    213  1.13        pk 			*)
    214  1.13        pk 				continue
    215  1.13        pk 				;;
    216  1.13        pk 		esac
    217  1.13        pk 	    fi
    218  1.13        pk 
    219  1.13        pk 	    if dir_has_sets "$_mp/$_dir" $THESETS
    220  1.13        pk 	    then
    221  1.13        pk 		local_sets_dir="$_mp/$_dir"
    222  1.13        pk 		break
    223  1.13        pk 	    else
    224  1.32        pk 		cat << __get_localdir_2
    225  1.32        pk The directory \"$_mp/$_dir\" does not exist, or does not hold any of the
    226  1.13        pk upgrade sets.
    227  1.32        pk __get_localdir_2
    228  1.13        pk 		echo -n "Re-enter pathname? [y] "
    229  1.13        pk 		getresp "y"
    230  1.13        pk 		case "$resp" in
    231  1.13        pk 			y*|Y*)
    232  1.13        pk 				;;
    233  1.13        pk 			*)
    234  1.13        pk 				local_sets_dir=""
    235  1.13        pk 				break
    236  1.13        pk 				;;
    237  1.13        pk 		esac
    238  1.13        pk 	    fi
    239  1.13        pk 	done
    240  1.13        pk }
    241  1.13        pk 
    242   1.1        pk getrootdisk() {
    243   1.1        pk 	cat << \__getrootdisk_1
    244   1.1        pk 
    245   1.1        pk The installation program needs to know which disk to consider
    246   1.1        pk the root disk.  Note the unit number may be different than
    247   1.1        pk the unit number you used in the standalone installation
    248   1.1        pk program.
    249   1.1        pk 
    250   1.1        pk Available disks are:
    251   1.1        pk 
    252   1.1        pk __getrootdisk_1
    253   1.1        pk 	_DKDEVS=`md_get_diskdevs`
    254   1.1        pk 	echo	"$_DKDEVS"
    255   1.1        pk 	echo	""
    256   1.1        pk 	echo -n	"Which disk is the root disk? "
    257   1.1        pk 	getresp ""
    258   1.1        pk 	if isin $resp $_DKDEVS ; then
    259   1.1        pk 		ROOTDISK="$resp"
    260   1.1        pk 	else
    261   1.1        pk 		echo ""
    262   1.1        pk 		echo "The disk $resp does not exist."
    263   1.1        pk 		ROOTDISK=""
    264   1.1        pk 	fi
    265   1.1        pk }
    266   1.1        pk 
    267   1.1        pk labelmoredisks() {
    268   1.1        pk 	cat << \__labelmoredisks_1
    269   1.1        pk 
    270   1.1        pk You may label the following disks:
    271   1.1        pk 
    272   1.1        pk __labelmoredisks_1
    273   1.1        pk 	echo "$_DKDEVS"
    274   1.1        pk 	echo	""
    275   1.1        pk 	echo -n	"Label which disk? [done] "
    276   1.1        pk 	getresp "done"
    277   1.1        pk 	case "$resp" in
    278  1.31       sjg 		"done")
    279   1.1        pk 			;;
    280   1.1        pk 
    281   1.1        pk 		*)
    282   1.5        pk 			if isin $resp $_DKDEVS ; then
    283   1.1        pk 				md_labeldisk $resp
    284   1.1        pk 			else
    285   1.1        pk 				echo ""
    286   1.1        pk 				echo "The disk $resp does not exist."
    287   1.1        pk 			fi
    288   1.1        pk 			;;
    289   1.1        pk 	esac
    290   1.1        pk }
    291   1.1        pk 
    292   1.1        pk addhostent() {
    293   1.1        pk 	# $1 - IP address
    294   1.1        pk 	# $2 - symbolic name
    295   1.1        pk 
    296  1.34        pk 	local fqdn
    297  1.34        pk 
    298   1.1        pk 	# Create an entry in the hosts table.  If no host table
    299   1.1        pk 	# exists, create one.  If the IP address already exists,
    300   1.1        pk 	# replace it's entry.
    301   1.1        pk 	if [ ! -f /tmp/hosts ]; then
    302   1.1        pk 		echo "127.0.0.1 localhost" > /tmp/hosts
    303   1.1        pk 	fi
    304   1.1        pk 
    305   1.3        pk 	sed "/^$1 /d" < /tmp/hosts > /tmp/hosts.new
    306   1.3        pk 	mv /tmp/hosts.new /tmp/hosts
    307   1.1        pk 
    308  1.34        pk 	if [ X${FQDN} != X ]; then
    309  1.34        pk 		fqdn=$2.$FQDN
    310  1.34        pk 	fi
    311  1.34        pk 	echo "$1 $2 $fqdn" >> /tmp/hosts
    312   1.1        pk }
    313   1.1        pk 
    314   1.1        pk addifconfig() {
    315   1.1        pk 	# $1 - interface name
    316   1.1        pk 	# $2 - interface symbolic name
    317   1.1        pk 	# $3 - interface IP address
    318   1.1        pk 	# $4 - interface netmask
    319  1.38        is 	# $5 - (optional) interface link-layer medium, preceded by "media ", else ""
    320  1.16        pk 	# $6 - (optional) interface link-layer directives
    321  1.16        pk 	local _m
    322  1.16        pk 
    323  1.16        pk 	# Create a ifconfig.* file for the interface.
    324  1.38        is 	echo "inet $2 netmask $4 $5 $6" > /tmp/ifconfig.$1
    325   1.1        pk 
    326   1.1        pk 	addhostent $3 $2
    327   1.1        pk }
    328   1.1        pk 
    329   1.1        pk configurenetwork() {
    330   1.1        pk 	local _ifsdone
    331   1.1        pk 	local _ifs
    332   1.1        pk 
    333  1.16        pk #	_IFS=`md_get_ifdevs`
    334  1.16        pk 	_IFS=`ifconfig -l | sed '
    335  1.16        pk 		s/lo0//
    336  1.16        pk 		s/ppp[0-9]//g
    337  1.16        pk 		s/sl[0-9]//g
    338  1.16        pk 		s/tun[0-9]//g'`
    339  1.16        pk 
    340   1.1        pk 	_ifsdone=""
    341   1.1        pk 	resp=""		# force at least one iteration
    342   1.1        pk 	while [ "X${resp}" != X"done" ]; do
    343   1.1        pk 	cat << \__configurenetwork_1
    344   1.1        pk 
    345   1.1        pk You may configure the following network interfaces (the interfaces
    346  1.41  fredette marked with [X] have been successfully configured):
    347   1.1        pk 
    348   1.1        pk __configurenetwork_1
    349   1.1        pk 
    350   1.1        pk 		for _ifs in $_IFS; do
    351   1.1        pk 			if isin $_ifs $_ifsdone ; then
    352   1.1        pk 				echo -n "[X] "
    353   1.1        pk 			else
    354   1.1        pk 				echo -n "    "
    355   1.1        pk 			fi
    356   1.1        pk 			echo $_ifs
    357   1.1        pk 		done
    358   1.1        pk 		echo	""
    359   1.1        pk 		echo -n	"Configure which interface? [done] "
    360   1.1        pk 		getresp "done"
    361   1.1        pk 		case "$resp" in
    362   1.1        pk 		"done")
    363   1.1        pk 			;;
    364   1.1        pk 		*)
    365   1.1        pk 			_ifs=$resp
    366   1.1        pk 			if isin $_ifs $_IFS ; then
    367   1.1        pk 				if configure_ifs $_ifs ; then
    368   1.1        pk 					_ifsdone="$_ifs $_ifsdone"
    369   1.1        pk 				fi
    370   1.1        pk 			else
    371   1.1        pk 				echo "Invalid response: \"$resp\" is not in list"
    372   1.1        pk 			fi
    373   1.1        pk 			;;
    374   1.1        pk 		esac
    375   1.1        pk 	done
    376   1.1        pk }
    377   1.1        pk 
    378   1.1        pk configure_ifs() {
    379   1.1        pk 
    380   1.8        pk 	local _up
    381   1.8        pk 	local _interface_name
    382   1.8        pk 	local _interface_ip
    383   1.8        pk 	local _interface_mask
    384   1.8        pk 	local _interface_symname
    385  1.15       gwr 	local _interface_extra
    386  1.19        pk 	local _interface_mediumtype
    387  1.19        pk 	local _interface_supported_media
    388  1.28        is 	local _m
    389  1.29       mrg 	local _t
    390   1.8        pk 
    391   1.1        pk 	_interface_name=$1
    392  1.16        pk 	_up=DOWN
    393  1.16        pk 	if isin $_interface_name `ifconfig -l -u` ; then
    394  1.16        pk 		_up=UP
    395  1.16        pk 	fi
    396  1.16        pk 
    397  1.16        pk 	_interface_supported_media=`ifconfig -m $_interface_name | sed -n '
    398  1.29       mrg 		/^[ 	]*media autoselect/d
    399  1.29       mrg 		4,$s/[ 	]*media //p'`
    400   1.1        pk 
    401  1.29       mrg 	# get current "media" "ip" and "netmask" ("broadcast")
    402  1.29       mrg 	_t=`ifconfig $_interface_name | sed -n '
    403  1.29       mrg 		s/^[ 	]*media: [^ 	]* \([^ ][^ ]*\).*/\1/p'`
    404   1.8        pk 
    405  1.29       mrg 	if [ "$_t" != "manual" -a "$_t" != "media:" -a "$_t" != "autoselect" ];
    406  1.29       mrg 	then
    407  1.19        pk 		_interface_mediumtype=$1
    408  1.19        pk 	fi
    409  1.29       mrg 
    410  1.29       mrg 	set -- `ifconfig $_interface_name | sed -n '
    411  1.29       mrg 		/^[ 	]*inet/{
    412  1.29       mrg 		s/inet//
    413  1.29       mrg 		s/--> [0-9.][0-9.]*//
    414  1.29       mrg 		s/netmask//
    415  1.29       mrg 		s/broadcast//
    416  1.29       mrg 		p;}'`
    417  1.29       mrg 
    418  1.29       mrg 	_interface_ip=$1
    419  1.29       mrg 	_interface_mask=$2
    420   1.8        pk 
    421   1.1        pk 	# Get IP address
    422   1.1        pk 	resp=""		# force one iteration
    423   1.1        pk 	while [ "X${resp}" = X"" ]; do
    424   1.8        pk 		echo -n "IP address? [$_interface_ip] "
    425   1.8        pk 		getresp "$_interface_ip"
    426   1.1        pk 		_interface_ip=$resp
    427   1.1        pk 	done
    428   1.1        pk 
    429   1.1        pk 	# Get symbolic name
    430   1.1        pk 	resp=""		# force one iteration
    431   1.1        pk 	while [ "X${resp}" = X"" ]; do
    432   1.1        pk 		echo -n "Symbolic (host) name? "
    433   1.1        pk 		getresp ""
    434   1.1        pk 		_interface_symname=$resp
    435   1.1        pk 	done
    436   1.1        pk 
    437   1.1        pk 	# Get netmask
    438   1.1        pk 	resp=""		# force one iteration
    439   1.1        pk 	while [ "X${resp}" = X"" ]; do
    440   1.8        pk 		echo -n "Netmask? [$_interface_mask] "
    441   1.8        pk 		getresp "$_interface_mask"
    442   1.1        pk 		_interface_mask=$resp
    443   1.1        pk 	done
    444   1.1        pk 
    445  1.16        pk 	echo "Your network interface might require explicit selection"
    446  1.16        pk 	echo "of the type of network medium attached. Supported media:"
    447  1.29       mrg 	echo "$_interface_supported_media"
    448  1.29       mrg 	echo -n "Additional media type arguments (none)? [$_interface_mediumtype] "
    449  1.16        pk 	getresp "$_interface_mediumtype"
    450  1.28        is 	_m=""
    451  1.29       mrg 	if [ "X${resp}" != X"" -a "X${resp}" != Xnone ]; then
    452  1.16        pk 		_interface_mediumtype=$resp
    453  1.28        is 		_m="media ${resp}"
    454  1.16        pk 	fi
    455  1.16        pk 
    456  1.16        pk 
    457  1.15       gwr 	echo "Your network interface might require additional link-layer"
    458  1.15       gwr 	echo "directives (like \`link0'). If this is the case you can enter"
    459  1.15       gwr 	echo "these at the next prompt."
    460  1.15       gwr 	echo ""
    461  1.29       mrg 	echo -n "Additional link-layer arguments (none)? [$_interface_extra] "
    462  1.15       gwr 	getresp "$_interface_extra"
    463  1.29       mrg 	if [ "X${resp}" != X"" -a "X${resp}" != Xnone ]; then
    464  1.15       gwr 		_interface_extra=$resp
    465  1.15       gwr 	fi
    466  1.15       gwr 
    467   1.1        pk 	# Configure the interface.  If it
    468   1.1        pk 	# succeeds, add it to the permanent
    469   1.1        pk 	# network configuration info.
    470   1.8        pk 	if [ $_up != "UP" ]; then
    471   1.8        pk 		ifconfig ${_interface_name} down
    472   1.8        pk 		if ifconfig ${_interface_name} inet \
    473   1.8        pk 		    ${_interface_ip} \
    474  1.28        is 		    netmask ${_interface_mask} \
    475  1.28        is 		    ${_interface_extra} ${_m} up ; then
    476   1.8        pk 			addifconfig \
    477  1.28        is 			    "${_interface_name}" \
    478  1.28        is 			    "${_interface_symname}" \
    479  1.28        is 			    "${_interface_ip}" \
    480  1.28        is 			    "${_interface_mask}" \
    481  1.38        is 			    "${_m}" \
    482  1.28        is 			    "${_interface_extra}"
    483   1.8        pk 			return 0
    484   1.8        pk 		fi
    485   1.8        pk 	else
    486   1.8        pk 		echo "Interface ${_interface_name} is already active."
    487   1.8        pk 		echo "Just saving configuration on new root filesystem."
    488   1.1        pk 		addifconfig \
    489  1.28        is 		    "${_interface_name}" \
    490  1.28        is 		    "${_interface_symname}" \
    491  1.28        is 		    "${_interface_ip}" \
    492  1.28        is 		    "${_interface_mask}" \
    493  1.38        is 		    "${_m}" \
    494  1.28        is 		    "${_interface_extra}"
    495   1.1        pk 	fi
    496   1.1        pk 	return 1
    497   1.1        pk }
    498   1.1        pk 
    499  1.35     lukem # Much of this is gratuitously stolen from /etc/rc.d/network.
    500   1.1        pk enable_network() {
    501   1.1        pk 
    502   1.1        pk 	# Set up the hostname.
    503  1.39       abs 	if [ -f /mnt/etc/myname ]; then
    504  1.39       abs 		hostname=`cat /mnt/etc/myname`
    505  1.39       abs 	elif [ -f /mnt/etc/rc.conf ];then
    506  1.39       abs 		hostname=`sh -c '. /mnt/etc/rc.conf ; echo $hostname'`
    507  1.39       abs 	else
    508   1.1        pk 		echo "ERROR: no /etc/myname!"
    509   1.1        pk 		return 1
    510   1.1        pk 	fi
    511  1.39       abs 	if [ -z "$hostname" ];then
    512  1.39       abs 		echo "ERROR: hostname not set in /etc/myname or /etc/rc.conf!"
    513  1.39       abs 		return 1
    514  1.39       abs 	fi
    515   1.1        pk 	hostname $hostname
    516   1.1        pk 
    517   1.1        pk 	# configure all the interfaces which we know about.
    518  1.16        pk if [ -f /mnt/etc/rc.conf ]; then
    519  1.16        pk (
    520  1.16        pk 	# assume network interface configuration style 1.2D and up
    521  1.16        pk 	. /mnt/etc/rc.conf
    522  1.16        pk 
    523  1.16        pk 	if [ "$net_interfaces" != NO ]; then
    524  1.24        pk 		if [ "$auto_ifconfig" = YES ]; then
    525  1.16        pk 			tmp="`ifconfig -l`"
    526  1.16        pk 		else
    527  1.16        pk 			tmp="$net_interfaces"
    528  1.16        pk 		fi
    529  1.16        pk 		echo -n "configuring network interfaces:"
    530  1.16        pk 		for i in $tmp; do
    531  1.16        pk 			eval `echo 'args=$ifconfig_'$i`
    532  1.16        pk 			if [ ! -z "$args" ]; then
    533  1.16        pk 				echo -n " $i"
    534  1.16        pk 				ifconfig $i $args
    535  1.16        pk 			elif [ -f /mnt/etc/ifconfig.$i ]; then
    536  1.16        pk 				echo -n " $i"
    537  1.16        pk 				(while read args; do
    538  1.16        pk 					ifconfig $i $args
    539  1.16        pk 				done) < /mnt/etc/ifconfig.$i
    540  1.24        pk 			elif [ "$auto_ifconfig" != YES ]; then
    541  1.16        pk 				echo
    542  1.16        pk 				echo -n "/mnt/etc/ifconfig.$i missing"
    543  1.16        pk 				echo -n "& ifconfig_$i not set"
    544  1.16        pk 				echo "; interface $i can't be configured"
    545  1.16        pk 			fi
    546  1.16        pk 		done
    547  1.16        pk 		echo "."
    548  1.16        pk 	fi
    549  1.16        pk )
    550  1.16        pk else
    551   1.1        pk (
    552   1.1        pk 	tmp="$IFS"
    553   1.1        pk 	IFS="$IFS."
    554   1.1        pk 	set -- `echo /mnt/etc/hostname*`
    555   1.1        pk 	IFS=$tmp
    556   1.1        pk 	unset tmp
    557   1.1        pk 
    558   1.1        pk 	while [ $# -ge 2 ] ; do
    559   1.1        pk 		shift		# get rid of "hostname"
    560   1.1        pk 		(
    561   1.1        pk 			read af name mask bcaddr extras
    562   1.1        pk 			read dt dtaddr
    563   1.1        pk 
    564   1.1        pk 			if [ ! -n "$name" ]; then
    565   1.1        pk 		    echo "/etc/hostname.$1: invalid network configuration file"
    566   1.1        pk 				exit
    567   1.1        pk 			fi
    568   1.1        pk 
    569   1.1        pk 			cmd="ifconfig $1 $af $name "
    570   1.1        pk 			if [ "${dt}" = "dest" ]; then cmd="$cmd $dtaddr"; fi
    571   1.1        pk 			if [ -n "$mask" ]; then cmd="$cmd netmask $mask"; fi
    572   1.1        pk 			if [ -n "$bcaddr" -a "X$bcaddr" != "XNONE" ]; then
    573   1.1        pk 				cmd="$cmd broadcast $bcaddr";
    574   1.1        pk 			fi
    575   1.1        pk 			cmd="$cmd $extras"
    576   1.1        pk 
    577   1.1        pk 			$cmd
    578   1.1        pk 		) < /mnt/etc/hostname.$1
    579   1.1        pk 		shift
    580   1.1        pk 	done
    581   1.1        pk )
    582  1.16        pk fi
    583   1.1        pk 
    584   1.1        pk 	# set the address for the loopback interface
    585   1.1        pk 	ifconfig lo0 inet localhost
    586   1.1        pk 
    587   1.1        pk 	# use loopback, not the wire
    588   1.1        pk 	route add $hostname localhost
    589   1.1        pk 
    590   1.1        pk 	# /etc/mygate, if it exists, contains the name of my gateway host
    591   1.1        pk 	# that name must be in /etc/hosts.
    592   1.1        pk 	if [ -f /mnt/etc/mygate ]; then
    593   1.1        pk 		route delete default > /dev/null 2>&1
    594   1.1        pk 		route add default `cat /mnt/etc/mygate`
    595   1.1        pk 	fi
    596   1.1        pk 
    597   1.1        pk 	# enable the resolver, if appropriate.
    598   1.1        pk 	if [ -f /mnt/etc/resolv.conf ]; then
    599   1.1        pk 		_resolver_enabled="TRUE"
    600   1.1        pk 		cp /mnt/etc/resolv.conf /tmp/resolv.conf.shadow
    601   1.1        pk 	fi
    602   1.1        pk 
    603   1.1        pk 	# Display results...
    604   1.1        pk 	echo	"Network interface configuration:"
    605   1.1        pk 	ifconfig -a
    606   1.1        pk 
    607   1.1        pk 	echo	""
    608   1.1        pk 
    609   1.1        pk 	if [ "X${_resolver_enabled}" = X"TRUE" ]; then
    610   1.1        pk 		netstat -r
    611   1.1        pk 		echo	""
    612   1.1        pk 		echo	"Resolver enabled."
    613   1.1        pk 	else
    614   1.1        pk 		netstat -rn
    615   1.1        pk 		echo	""
    616   1.1        pk 		echo	"Resolver not enabled."
    617   1.1        pk 	fi
    618   1.1        pk 
    619   1.1        pk 	return 0
    620   1.1        pk }
    621   1.1        pk 
    622   1.1        pk install_ftp() {
    623  1.21       leo 	local	_f
    624  1.21       leo 	local	_sets
    625  1.21       leo 	local	_next
    626  1.21       leo 
    627  1.21       leo 	# Build a script to extract valid files from a list
    628  1.21       leo 	# of filenames on stdin.
    629  1.21       leo 	# XXX : Can we use this on more places? Leo.
    630  1.21       leo 
    631  1.21       leo 	echo "#!/bin/sh" > /tmp/fname_filter.sh
    632  1.21       leo 	echo "while read line; do"	>> /tmp/fname_filter.sh
    633  1.21       leo 	echo "    case \$line in"	>> /tmp/fname_filter.sh
    634  1.21       leo 	for _f in $THESETS; do
    635  1.40  fredette 		echo "    $_f.tar.gz|$_f.tgz|$_f.tar|$_f.${VERSION}.aa)" \
    636  1.21       leo 					>> /tmp/fname_filter.sh
    637  1.21       leo 		echo '        echo -n "$line ";;' \
    638  1.21       leo 					>> /tmp/fname_filter.sh
    639  1.21       leo 	done
    640  1.21       leo 	echo "        *) ;;"		>> /tmp/fname_filter.sh
    641  1.21       leo 	echo "    esac"			>> /tmp/fname_filter.sh
    642  1.21       leo 	echo "done"			>> /tmp/fname_filter.sh
    643  1.21       leo 
    644   1.1        pk 	# Get several parameters from the user, and create
    645   1.1        pk 	# a shell script that directs the appropriate
    646   1.1        pk 	# commands into ftp.
    647   1.1        pk 	cat << \__install_ftp_1
    648   1.1        pk 
    649   1.1        pk This is an automated ftp-based installation process.  You will be asked
    650   1.1        pk several questions.  The correct set of commands will be placed in a script
    651   1.1        pk that will be fed to ftp(1).
    652   1.1        pk 
    653   1.1        pk __install_ftp_1
    654   1.1        pk 	# Get server IP address
    655   1.1        pk 	resp=""		# force one iteration
    656   1.1        pk 	while [ "X${resp}" = X"" ]; do
    657   1.1        pk 		echo -n "Server IP? [${_ftp_server_ip}] "
    658   1.1        pk 		getresp "${_ftp_server_ip}"
    659   1.1        pk 		_ftp_server_ip=$resp
    660   1.1        pk 	done
    661   1.1        pk 
    662   1.1        pk 	# Get login name
    663   1.1        pk 	resp=""		# force one iteration
    664   1.1        pk 	while [ "X${resp}" = X"" ]; do
    665   1.1        pk 		echo -n "Login? [${_ftp_server_login}] "
    666   1.1        pk 		getresp "${_ftp_server_login}"
    667   1.1        pk 		_ftp_server_login=$resp 
    668   1.1        pk 	done
    669   1.1        pk 
    670   1.1        pk 	# Get password
    671   1.1        pk 	resp=""		# force one iteration
    672   1.1        pk 	while [ "X${resp}" = X"" ]; do
    673  1.16        pk 		echo -n "Password? "
    674  1.16        pk 		stty -echo
    675  1.16        pk 		getresp ""
    676  1.16        pk 		echo ""
    677  1.16        pk 		stty echo
    678   1.1        pk 		_ftp_server_password=$resp
    679   1.1        pk 	done
    680   1.1        pk 
    681   1.1        pk 	cat << \__install_ftp_2
    682   1.1        pk 
    683  1.21       leo You will be asked to enter the name of the directory that contains the
    684  1.21       leo installation sets. When you enter a '?' you will see a listing of the
    685  1.21       leo current directory on the server.
    686  1.21       leo __install_ftp_2
    687  1.21       leo 	_sets=""
    688  1.21       leo 	while [ -z "$_sets" ]
    689  1.21       leo 	do
    690  1.21       leo 		resp=""		# force one iteration
    691  1.21       leo 		while [ "X${resp}" = X"" ]; do
    692  1.21       leo 			echo -n "Server directory? [${_ftp_server_dir}] "
    693  1.21       leo 		    getresp "${_ftp_server_dir}"
    694  1.21       leo 		    if [ "X$resp" = 'X?' -a -z "$_ftp_server_dir" ]; then
    695  1.21       leo 			resp=""
    696  1.21       leo 		    fi
    697  1.21       leo 		done
    698  1.21       leo 		if [ $resp != '?' ]; then
    699  1.21       leo 			_ftp_server_dir=$resp
    700  1.21       leo 		fi
    701  1.21       leo 
    702  1.21       leo 		# Build the basics of an ftp-script...
    703  1.21       leo 		echo "#!/bin/sh" > /tmp/ftp-script.sh
    704  1.21       leo 		echo "cd /mnt" >> /tmp/ftp-script.sh
    705  1.26        is 		echo "ftp -e -i -n $_ftp_server_ip << \__end_commands" >> \
    706  1.21       leo 		    /tmp/ftp-script.sh
    707  1.21       leo 		echo "user $_ftp_server_login $_ftp_server_password" >> \
    708  1.21       leo 		    /tmp/ftp-script.sh
    709  1.21       leo 		echo "bin" >> /tmp/ftp-script.sh
    710  1.21       leo 		echo "cd $_ftp_server_dir" >> /tmp/ftp-script.sh
    711  1.21       leo 
    712  1.21       leo 		# Make a copy of this script that lists the directory
    713  1.21       leo 		# contents, and use that to determine the files to get.
    714  1.21       leo 		cat /tmp/ftp-script.sh	>  /tmp/ftp-dir.sh
    715  1.36        pk 		echo "nlist"		>> /tmp/ftp-dir.sh
    716  1.21       leo 		echo "quit"		>> /tmp/ftp-dir.sh
    717  1.21       leo 		echo "__end_commands"	>> /tmp/ftp-dir.sh
    718  1.21       leo 
    719  1.21       leo 		if [ $resp = '?' ]; then
    720  1.21       leo 			sh /tmp/ftp-dir.sh
    721  1.21       leo 		else
    722  1.21       leo 			_sets=`sh /tmp/ftp-dir.sh | sh /tmp/fname_filter.sh`
    723  1.21       leo 		fi
    724  1.21       leo 	done
    725  1.21       leo 	rm -f /tmp/ftp-dir.sh /tmp/fname_filter.sh
    726  1.21       leo 
    727  1.21       leo 	while : ; do
    728  1.21       leo 		echo "The following sets are available for extraction:"
    729  1.27        is 		echo "(marked sets are already on the extraction list)"
    730  1.21       leo 		echo ""
    731   1.1        pk 
    732  1.21       leo 		_next=""
    733  1.21       leo 		for _f in $_sets ; do
    734  1.21       leo 			if isin $_f $_setsdone; then
    735  1.21       leo 				echo -n "[X] "
    736  1.21       leo 				_next=""
    737  1.21       leo 			else
    738  1.21       leo 				echo -n "    "
    739  1.21       leo 				if [ -z "$_next" ]; then _next=$_f; fi
    740  1.21       leo 			fi
    741  1.21       leo 			echo $_f
    742  1.21       leo 		done
    743  1.21       leo 		echo ""
    744   1.1        pk 
    745  1.21       leo 		# Get name of the file and add extraction command
    746  1.21       leo 		# to the ftp-script.
    747  1.21       leo 		if [ "X$_next" = "X" ]; then resp=n; else resp=y; fi
    748  1.21       leo 		echo -n "Continue to add filenames [$resp]? "
    749  1.21       leo 		getresp "$resp"
    750  1.21       leo 		if [ "$resp" = "n" ]; then
    751   1.1        pk 			break
    752   1.1        pk 		fi
    753   1.1        pk 
    754  1.21       leo 		echo -n "File name [$_next]? "
    755  1.21       leo 		getresp "$_next"
    756  1.21       leo 		if isin $resp $_sets; then
    757  1.33       mrg 			echo "get $resp |\"pax -zr${verbose_flag}pe\"" >> \
    758  1.21       leo 					/tmp/ftp-script.sh
    759  1.21       leo 			_setsdone="$resp $_setsdone"
    760  1.21       leo 		else
    761  1.21       leo 			echo "You entered an invalid filename."
    762  1.21       leo 			echo ""
    763  1.21       leo 		fi
    764   1.1        pk 	done
    765   1.1        pk 
    766   1.1        pk 	echo "quit" >> /tmp/ftp-script.sh
    767   1.1        pk 	echo "__end_commands" >> /tmp/ftp-script.sh
    768   1.1        pk 
    769   1.1        pk 	sh /tmp/ftp-script.sh
    770   1.1        pk 	rm -f /tmp/ftp-script.sh
    771   1.1        pk 	echo "Extraction complete."
    772   1.1        pk }
    773   1.1        pk 
    774  1.11        pk install_from_mounted_fs() {
    775  1.13        pk 	# $1 - directory containing installation sets
    776   1.1        pk 	local _filename
    777  1.13        pk 	local _sets
    778  1.12        pk 	local _next
    779  1.29       mrg 	local _all
    780   1.1        pk 	local _f
    781  1.18        is 	local _dirname
    782   1.1        pk 
    783  1.18        is 	_dirname=$1
    784  1.13        pk 	_sets=""
    785  1.20        is 
    786  1.31       sjg 	if ! dir_has_sets ${_dirname} $THESETS
    787  1.31       sjg 	then
    788  1.20        is 
    789  1.18        is 		echo ""
    790  1.31       sjg 		echo "The directory at the mount point, \"${_dirname}\", contains: "
    791  1.18        is 		echo ""
    792  1.18        is 		ls -F ${_dirname}
    793  1.18        is 		echo ""
    794  1.31       sjg 		echo    "Enter the subdirectory relative to the mountpoint, that"
    795  1.31       sjg 		echo -n "contains the savesets: [try this directory] "
    796  1.18        is 		getresp ""
    797  1.31       sjg 		if [ "X${resp}" != "X" ]; then
    798  1.18        is 			_dirname=${_dirname}/$resp
    799  1.18        is 		fi
    800  1.31       sjg 
    801  1.31       sjg 		while ! dir_has_sets ${_dirname} $THESETS; do
    802  1.31       sjg 			echo ""
    803  1.31       sjg 			echo -n "There are no NetBSD install sets available in "
    804  1.31       sjg 			echo "\"${_dirname}\"."
    805  1.31       sjg 			echo "\"${_dirname}\" contains: "
    806  1.31       sjg 			echo ""
    807  1.31       sjg 			ls -F ${_dirname}
    808  1.31       sjg 			echo ""
    809  1.31       sjg 			echo -n "Enter subdirectory: [try other install media] "
    810  1.31       sjg 			getresp ""
    811  1.31       sjg 			if [ "X${resp}" = "X" ]; then
    812  1.31       sjg 				return
    813  1.31       sjg 			fi
    814  1.31       sjg 			if [ ! -d ${_dirname}/${resp} ]; then
    815  1.31       sjg 				echo "\"${resp}\" is no directory; try again."
    816  1.31       sjg 			else
    817  1.31       sjg 				_dirname=${_dirname}/$resp
    818  1.31       sjg 			fi
    819  1.31       sjg 		done
    820  1.31       sjg 	fi
    821  1.18        is 
    822  1.18        is 	for _f in $THESETS ; do
    823  1.18        is 		if [ -f ${_dirname}/${_f}.tar.gz ]; then
    824  1.18        is 			_sets="$_sets ${_f}.tar.gz"
    825  1.18        is 		elif [ -f ${_dirname}/${_f}.tgz ]; then
    826  1.18        is 			_sets="$_sets ${_f}.tgz"
    827  1.40  fredette 		elif [ -f ${_dirname}/${_f}.tar ]; then
    828  1.40  fredette 			_sets="$_sets ${_f}.tar"
    829  1.18        is 		elif [ -f ${_dirname}/${_f}${VERSION}.aa ]; then
    830  1.18        is 			_sets="$_sets ${_f}${VERSION}"
    831  1.18        is 		fi
    832  1.18        is 	done
    833   1.1        pk 
    834   1.1        pk 	while : ; do
    835   1.1        pk 		echo "The following sets are available for extraction:"
    836   1.1        pk 		echo "(marked sets have already been extracted)"
    837   1.1        pk 		echo ""
    838   1.1        pk 
    839  1.12        pk 		_next=""
    840  1.29       mrg 		_all=""
    841   1.1        pk 		for _f in $_sets ; do
    842   1.1        pk 			if isin $_f $_setsdone; then
    843   1.1        pk 				echo -n "[X] "
    844  1.12        pk 				_next=""
    845   1.1        pk 			else
    846   1.1        pk 				echo -n "    "
    847  1.29       mrg 				if [ -z "$_next" ]; then
    848  1.29       mrg 					_next=$_f;
    849  1.29       mrg 				fi
    850  1.29       mrg 				_all="$_all $_f"
    851   1.1        pk 			fi
    852   1.1        pk 			echo $_f
    853   1.1        pk 		done
    854   1.1        pk 		echo ""
    855   1.1        pk 
    856   1.1        pk 		# Get the name of the file.
    857  1.33       mrg 		if [ "X$_next" = "X" ]; then
    858  1.33       mrg 			resp=n
    859  1.33       mrg 		else
    860  1.33       mrg 			resp=y
    861  1.33       mrg 		fi
    862   1.1        pk 		echo -n "Continue extraction [$resp]?"
    863   1.1        pk 		getresp "$resp"
    864   1.1        pk 		if [ "$resp" = "n" ]; then
    865   1.1        pk 			break
    866   1.1        pk 		fi
    867   1.1        pk 
    868  1.29       mrg 		echo -n "File name(s) (or "all") [$_next]? "
    869  1.12        pk 		getresp "$_next"
    870  1.29       mrg 		if [ "x$resp" = xall ]; then
    871  1.29       mrg 			resp="$_all"
    872  1.29       mrg 		fi
    873  1.29       mrg 
    874  1.29       mrg 		for _f in $resp; do
    875  1.29       mrg 			_filename="/${_dirname}/$_f"
    876   1.1        pk 
    877  1.29       mrg 			# Ensure file exists
    878  1.29       mrg 			if [ ! -f $_filename ]; then
    879  1.29       mrg 				if [ -f ${_filename}.aa ]; then
    880  1.29       mrg 					_filename=${_filename}.\?\?
    881  1.29       mrg 				else
    882  1.18        is 			 echo "File $_filename does not exist.  Check to make"
    883  1.18        is 			 echo "sure you entered the information properly."
    884  1.29       mrg 			 continue 2
    885  1.29       mrg 				fi
    886  1.18        is 			fi
    887   1.1        pk 
    888  1.29       mrg 			# Extract file
    889  1.29       mrg 			echo "Extracting the $_f set:"
    890  1.40  fredette 			case "$_filename" in
    891  1.40  fredette 			*.tar)
    892  1.40  fredette 				(cd /mnt; pax -r${verbose_flag}pe < $_filename)
    893  1.40  fredette 				;;
    894  1.40  fredette 			*)
    895  1.40  fredette 				cat $_filename | \
    896  1.40  fredette 					(cd /mnt; pax -zr${verbose_flag}pe)
    897  1.40  fredette 				;;
    898  1.40  fredette 			esac
    899  1.29       mrg 			echo "Extraction complete."
    900  1.29       mrg 			_setsdone="$_f $_setsdone"
    901  1.29       mrg 		done
    902   1.1        pk 
    903   1.1        pk 	done
    904   1.1        pk }
    905   1.1        pk 
    906   1.1        pk install_cdrom() {
    907   1.5        pk 	local _drive
    908   1.6       leo 	local _partition_range
    909   1.5        pk 	local _partition
    910   1.5        pk 	local _fstype
    911   1.5        pk 	local _directory
    912   1.5        pk 
    913   1.1        pk 	# Get the cdrom device info
    914   1.1        pk 	cat << \__install_cdrom_1
    915   1.1        pk 
    916   1.1        pk The following CD-ROM devices are installed on your system; please select
    917   1.6       leo the CD-ROM device containing the partition with the installation sets:
    918   1.1        pk 
    919   1.1        pk __install_cdrom_1
    920   1.1        pk 	_CDDEVS=`md_get_cddevs`
    921   1.1        pk 	echo    "$_CDDEVS"
    922   1.1        pk 	echo	""
    923   1.1        pk 	echo -n	"Which is the CD-ROM with the installation media? [abort] "
    924   1.1        pk 	getresp "abort"
    925   1.1        pk 	case "$resp" in
    926   1.1        pk 		abort)
    927   1.1        pk 			echo "Aborting."
    928   1.1        pk 			return
    929   1.1        pk 			;;
    930   1.1        pk 
    931   1.1        pk 		*)
    932   1.1        pk 			if isin $resp $_CDDEVS ; then
    933   1.5        pk 				_drive=$resp
    934   1.1        pk 			else
    935   1.1        pk 				echo ""
    936   1.1        pk 				echo "The CD-ROM $resp does not exist."
    937   1.1        pk 				echo "Aborting."
    938   1.1        pk 				return
    939   1.1        pk 			fi
    940   1.1        pk 			;;
    941   1.1        pk 	esac
    942   1.1        pk 
    943   1.1        pk 	# Get partition
    944   1.6       leo 	_partition_range=`md_get_partition_range`
    945   1.1        pk 	resp=""		# force one iteration
    946   1.1        pk 	while [ "X${resp}" = X"" ]; do
    947  1.17        is 		echo -n "Partition? [a] "
    948  1.17        is 		getresp "a"
    949   1.1        pk 		case "$resp" in
    950   1.6       leo 			$_partition_range)
    951   1.5        pk 				_partition=$resp
    952   1.1        pk 				;;
    953   1.1        pk 
    954   1.1        pk 			*)
    955   1.1        pk 				echo "Invalid response: $resp"
    956   1.1        pk 				resp=""		# force loop to repeat
    957   1.1        pk 				;;
    958   1.1        pk 		esac
    959   1.1        pk 	done
    960   1.1        pk 
    961   1.1        pk 	# Ask for filesystem type
    962   1.1        pk 	cat << \__install_cdrom_2
    963   1.1        pk 
    964   1.1        pk There are two CD-ROM filesystem types currently supported by this program:
    965   1.1        pk 	1) ISO-9660 (cd9660)
    966   1.1        pk 	2) Berkeley Fast Filesystem (ffs)
    967   1.1        pk 
    968   1.1        pk __install_cdrom_2
    969   1.1        pk 	resp=""		# force one iteration
    970   1.1        pk 	while [ "X${resp}" = X"" ]; do
    971   1.1        pk 		echo -n "Which filesystem type? [cd9660] "
    972   1.1        pk 		getresp "cd9660"
    973   1.1        pk 		case "$resp" in
    974   1.1        pk 			cd9660|ffs)
    975   1.5        pk 				_fstype=$resp
    976   1.1        pk 				;;
    977   1.1        pk 
    978   1.1        pk 			*)
    979   1.1        pk 				echo "Invalid response: $resp"
    980   1.1        pk 				resp=""		# force loop to repeat
    981   1.1        pk 				;;
    982   1.1        pk 		esac
    983   1.1        pk 	done
    984   1.1        pk 
    985   1.1        pk 	# Mount the CD-ROM
    986  1.17        is 	if ! mount -t ${_fstype} -o ro \
    987   1.5        pk 	    /dev/${_drive}${_partition} /mnt2 ; then
    988   1.1        pk 		echo "Cannot mount CD-ROM drive.  Aborting."
    989   1.1        pk 		return
    990   1.1        pk 	fi
    991   1.1        pk 
    992  1.20        is 	install_from_mounted_fs /mnt2
    993   1.5        pk 	umount -f /mnt2 > /dev/null 2>&1
    994   1.5        pk }
    995   1.5        pk 
    996  1.14       leo mount_a_disk() {
    997  1.14       leo 	# Mount a disk on /mnt2. The set of disk devices to choose from
    998  1.14       leo 	# is $_DKDEVS.
    999  1.14       leo 	# returns 0 on failure.
   1000  1.14       leo 
   1001   1.5        pk 	local _drive
   1002   1.6       leo 	local _partition_range
   1003   1.5        pk 	local _partition
   1004   1.5        pk 	local _fstype
   1005   1.5        pk 	local _fsopts
   1006   1.5        pk 	local _directory
   1007   1.5        pk 	local _md_fstype
   1008   1.5        pk 	local _md_fsopts
   1009   1.5        pk 
   1010   1.5        pk 	getresp "abort"
   1011   1.5        pk 	case "$resp" in
   1012   1.5        pk 		abort)
   1013   1.5        pk 			echo "Aborting."
   1014  1.14       leo 			return 0
   1015   1.5        pk 			;;
   1016   1.5        pk 
   1017   1.5        pk 		*)
   1018   1.5        pk 			if isin $resp $_DKDEVS ; then
   1019   1.5        pk 				_drive=$resp
   1020   1.5        pk 			else
   1021   1.5        pk 				echo ""
   1022   1.5        pk 				echo "The disk $resp does not exist."
   1023   1.5        pk 				echo "Aborting."
   1024  1.14       leo 				return 0
   1025   1.5        pk 			fi
   1026   1.5        pk 			;;
   1027   1.5        pk 	esac
   1028   1.5        pk 
   1029   1.5        pk 	# Get partition
   1030   1.6       leo 	_partition_range=`md_get_partition_range`
   1031   1.5        pk 	resp=""		# force one iteration
   1032   1.5        pk 	while [ "X${resp}" = X"" ]; do
   1033   1.5        pk 		echo -n "Partition? [d] "
   1034   1.5        pk 		getresp "d"
   1035   1.5        pk 		case "$resp" in
   1036   1.6       leo 			$_partition_range)
   1037   1.5        pk 				_partition=$resp
   1038   1.5        pk 				;;
   1039   1.5        pk 
   1040   1.5        pk 			*)
   1041   1.5        pk 				echo "Invalid response: $resp"
   1042   1.5        pk 				resp=""		# force loop to repeat
   1043   1.5        pk 				;;
   1044   1.5        pk 		esac
   1045   1.5        pk 	done
   1046   1.5        pk 
   1047   1.5        pk 	# Ask for filesystem type
   1048  1.14       leo 	cat << \__mount_a_disk_2
   1049   1.5        pk 
   1050   1.5        pk The following filesystem types are supported:
   1051   1.5        pk 	1) ffs
   1052  1.14       leo __mount_a_disk_2
   1053   1.5        pk 	_md_fstype=`md_native_fstype`
   1054   1.5        pk 	_md_fsopts=`md_native_fsopts`
   1055   1.5        pk 	if [ ! -z "$_md_fstype" ]; then
   1056   1.5        pk 		echo "	2) $_md_fstype"
   1057   1.5        pk 	else
   1058   1.5        pk 		_md_fstype="_undefined_"
   1059   1.5        pk 	fi
   1060   1.5        pk 	resp=""		# force one iteration
   1061   1.5        pk 	while [ "X${resp}" = X"" ]; do
   1062   1.5        pk 		echo -n "Which filesystem type? [ffs] "
   1063   1.5        pk 		getresp "ffs"
   1064   1.5        pk 		case "$resp" in
   1065   1.5        pk 			ffs)
   1066   1.5        pk 				_fstype=$resp
   1067   1.5        pk 				_fsopts="ro"
   1068   1.5        pk 				;;
   1069   1.5        pk 			$_md_fstype)
   1070   1.5        pk 				_fstype=$resp
   1071   1.5        pk 				_fsopts=$_md_fsopts
   1072   1.5        pk 				;;
   1073   1.5        pk 			*)
   1074   1.5        pk 				echo "Invalid response: $resp"
   1075   1.5        pk 				resp=""		# force loop to repeat
   1076   1.5        pk 				;;
   1077   1.5        pk 		esac
   1078   1.5        pk 	done
   1079   1.5        pk 
   1080   1.5        pk 	# Mount the disk
   1081   1.5        pk 	if ! mount -t ${_fstype} -o $_fsopts \
   1082   1.5        pk 	    /dev/${_drive}${_partition} /mnt2 ; then
   1083   1.5        pk 		echo "Cannot mount disk.  Aborting."
   1084  1.14       leo 		return 0
   1085  1.14       leo 	fi
   1086  1.14       leo 	return 1
   1087  1.14       leo }
   1088  1.14       leo 
   1089  1.14       leo install_disk() {
   1090  1.14       leo 	local _directory
   1091  1.14       leo 
   1092  1.14       leo 	cat << \__install_disk_1
   1093  1.14       leo 
   1094  1.30       mrg Ok, lets install from a disk.  The file-system the install sets on may
   1095  1.30       mrg already mounted, or we might have to mount the filesystem to get to it.
   1096  1.30       mrg 
   1097  1.30       mrg __install_disk_1
   1098  1.30       mrg 
   1099  1.30       mrg 	echo -n "Is the file-system with the install sets already mounted? [n] "
   1100  1.30       mrg 	getresp "n"
   1101  1.30       mrg 	case $resp in
   1102  1.30       mrg 	y*|Y*)
   1103  1.30       mrg 		echo "What mount point are the sets located in? [] "
   1104  1.30       mrg 		getresp ""
   1105  1.30       mrg 		if [ -d "$resp" ]; then
   1106  1.30       mrg 			install_from_mounted_fs $resp
   1107  1.30       mrg 		else
   1108  1.30       mrg 			echo "$resp: Not a directory, aborting..."
   1109  1.30       mrg 		fi
   1110  1.30       mrg 		return
   1111  1.30       mrg 		;;
   1112  1.30       mrg 	*)
   1113  1.30       mrg 		;;
   1114  1.30       mrg 	esac
   1115  1.30       mrg 
   1116  1.30       mrg 	cat << \__install_disk_2
   1117  1.30       mrg 
   1118  1.14       leo The following disk devices are installed on your system; please select
   1119  1.14       leo the disk device containing the partition with the installation sets:
   1120  1.14       leo 
   1121  1.30       mrg __install_disk_2
   1122  1.14       leo 	_DKDEVS=`md_get_diskdevs`
   1123  1.14       leo 	echo    "$_DKDEVS"
   1124  1.14       leo 	echo	""
   1125  1.14       leo 	echo -n	"Which is the disk with the installation sets? [abort] "
   1126  1.14       leo 
   1127  1.14       leo 	if mount_a_disk ; then
   1128   1.5        pk 		return
   1129   1.5        pk 	fi
   1130   1.5        pk 
   1131  1.20        is 	install_from_mounted_fs /mnt2
   1132   1.1        pk 	umount -f /mnt2 > /dev/null 2>&1
   1133   1.1        pk }
   1134   1.1        pk 
   1135   1.1        pk install_nfs() {
   1136   1.1        pk 	# Get the IP address of the server
   1137   1.1        pk 	resp=""		# force one iteration
   1138   1.1        pk 	while [ "X${resp}" = X"" ]; do
   1139   1.1        pk 		echo -n "Server IP address? [${_nfs_server_ip}] "
   1140   1.1        pk 		getresp "${_nfs_server_ip}"
   1141   1.1        pk 	done
   1142   1.1        pk 	_nfs_server_ip=$resp
   1143   1.1        pk 
   1144   1.1        pk 	# Get server path to mount
   1145   1.1        pk 	resp=""		# force one iteration
   1146   1.1        pk 	while [ "X${resp}" = X"" ]; do
   1147   1.1        pk 		echo -n "Filesystem on server to mount? [${_nfs_server_path}] "
   1148   1.1        pk 		getresp "${_nfs_server_path}"
   1149   1.1        pk 	done
   1150   1.1        pk 	_nfs_server_path=$resp
   1151   1.1        pk 
   1152   1.1        pk 	# Determine use of TCP
   1153   1.1        pk 	echo -n "Use TCP transport (only works with capable NFS server)? [n] "
   1154   1.1        pk 	getresp "n"
   1155   1.1        pk 	case "$resp" in
   1156   1.1        pk 		y*|Y*)
   1157   1.1        pk 			_nfs_tcp="-T"
   1158   1.1        pk 			;;
   1159   1.1        pk 
   1160   1.1        pk 		*)
   1161  1.40  fredette 			echo -n "Use small NFS transfers (needed when server "
   1162  1.40  fredette 			echo "or client"
   1163  1.40  fredette 			echo -n "has a slow network card)? [n] "
   1164  1.40  fredette 			getresp "n"
   1165  1.40  fredette 			case "$resp" in
   1166  1.40  fredette 			y*|Y*)
   1167  1.40  fredette 				_nfs_tcp="-r 1024 -w 1024"
   1168  1.40  fredette 				;;
   1169  1.40  fredette 
   1170  1.40  fredette 			*)
   1171  1.40  fredette 				_nfs_tcp=""
   1172  1.40  fredette 				;;
   1173  1.40  fredette 			esac
   1174   1.1        pk 			;;
   1175   1.1        pk 	esac
   1176   1.1        pk 
   1177   1.1        pk 	# Mount the server
   1178   1.1        pk 	mkdir /mnt2 > /dev/null 2>&1
   1179   1.1        pk 	if ! mount_nfs $_nfs_tcp ${_nfs_server_ip}:${_nfs_server_path} \
   1180   1.1        pk 	    /mnt2 ; then
   1181   1.1        pk 		echo "Cannot mount NFS server.  Aborting."
   1182   1.1        pk 		return
   1183   1.1        pk 	fi
   1184   1.1        pk 
   1185  1.20        is 	install_from_mounted_fs /mnt2
   1186   1.1        pk 	umount -f /mnt2 > /dev/null 2>&1
   1187   1.1        pk }
   1188   1.1        pk 
   1189   1.1        pk install_tape() {
   1190  1.11        pk 	local _xcmd
   1191  1.11        pk 
   1192   1.1        pk 	# Get the name of the tape from the user.
   1193   1.1        pk 	cat << \__install_tape_1
   1194   1.1        pk 
   1195   1.1        pk The installation program needs to know which tape device to use.  Make
   1196   1.1        pk sure you use a "no rewind on close" device.
   1197   1.1        pk 
   1198   1.1        pk __install_tape_1
   1199   1.1        pk 	_tape=`basename $TAPE`
   1200   1.1        pk 	resp=""		# force one iteration
   1201   1.1        pk 	while [ "X${resp}" = X"" ]; do
   1202   1.1        pk 		echo -n "Name of tape device? [${_tape}]"
   1203   1.1        pk 		getresp "${_tape}"
   1204   1.1        pk 	done
   1205   1.1        pk 	_tape=`basename $resp`
   1206   1.1        pk 	TAPE="/dev/${_tape}"
   1207   1.1        pk 	if [ ! -c $TAPE ]; then
   1208   1.1        pk 		echo "$TAPE does not exist or is not a character special file."
   1209   1.1        pk 		echo "Aborting."
   1210   1.1        pk 		return
   1211   1.1        pk 	fi
   1212   1.1        pk 	export TAPE
   1213   1.1        pk 
   1214   1.1        pk 	# Rewind the tape device
   1215   1.1        pk 	echo -n "Rewinding tape..."
   1216   1.1        pk 	if ! mt rewind ; then
   1217   1.1        pk 		echo "$TAPE may not be attached to the system or may not be"
   1218   1.1        pk 		echo "a tape device.  Aborting."
   1219   1.1        pk 		return
   1220   1.1        pk 	fi
   1221   1.1        pk 	echo "done."
   1222   1.1        pk 
   1223   1.1        pk 	# Get the file number
   1224   1.1        pk 	resp=""		# force one iteration
   1225   1.1        pk 	while [ "X${resp}" = X"" ]; do
   1226   1.1        pk 		echo -n "File number? "
   1227   1.1        pk 		getresp ""
   1228   1.1        pk 		case "$resp" in
   1229   1.1        pk 			[1-9]*)
   1230   1.1        pk 				_nskip=`expr $resp - 1`
   1231   1.1        pk 				;;
   1232   1.1        pk 
   1233   1.1        pk 			*)
   1234   1.1        pk 				echo "Invalid file number ${resp}."
   1235   1.1        pk 				resp=""		# fore loop to repeat
   1236   1.1        pk 				;;
   1237   1.1        pk 		esac
   1238   1.1        pk 	done
   1239   1.1        pk 
   1240   1.1        pk 	# Skip to correct file.
   1241   1.1        pk 	echo -n "Skipping to source file..."
   1242   1.1        pk 	if [ "X${_nskip}" != X"0" ]; then
   1243   1.1        pk 		if ! mt fsf $_nskip ; then
   1244   1.1        pk 			echo "Could not skip $_nskip files.  Aborting."
   1245   1.1        pk 			return
   1246   1.1        pk 		fi
   1247   1.1        pk 	fi
   1248   1.1        pk 	echo "done."
   1249   1.1        pk 
   1250   1.1        pk 	cat << \__install_tape_2
   1251   1.1        pk 
   1252   1.1        pk There are 2 different ways the file can be stored on tape:
   1253   1.1        pk 
   1254   1.1        pk 	1) an image of a gzipped tar file
   1255   1.1        pk 	2) a standard tar image
   1256   1.1        pk 
   1257   1.1        pk __install_tape_2
   1258   1.1        pk 	resp=""		# force one iteration
   1259   1.1        pk 	while [ "X${resp}" = X"" ]; do
   1260   1.1        pk 		echo -n "Which way is it? [1] "
   1261   1.1        pk 		getresp "1"
   1262   1.1        pk 		case "$resp" in
   1263  1.11        pk 		1)
   1264  1.33       mrg 			_xcmd="pax -zr${verbose_flag}pe"
   1265  1.11        pk 			;;
   1266   1.1        pk 
   1267  1.11        pk 		2)
   1268  1.33       mrg 			_xcmd="pax -r${verbose_flag}pe"
   1269  1.11        pk 			;;
   1270   1.1        pk 
   1271  1.11        pk 		*)
   1272  1.11        pk 			echo "Invalid response: $resp."
   1273  1.11        pk 			resp=""		# force loop to repeat
   1274  1.11        pk 			;;
   1275   1.1        pk 		esac
   1276  1.11        pk 		( cd /mnt; dd if=$TAPE | $_xcmd )
   1277   1.1        pk 	done
   1278   1.1        pk 	echo "Extraction complete."
   1279   1.1        pk }
   1280   1.1        pk 
   1281   1.1        pk get_timezone() {
   1282   1.1        pk 	local _a
   1283   1.6       leo 	local _zonepath
   1284   1.6       leo 
   1285   1.6       leo 	#
   1286   1.6       leo 	# If the zoneinfo is not on the installation medium or on the
   1287   1.6       leo 	# installed filesystem, set TZ to GMT and return immediatly.
   1288   1.6       leo 	#
   1289   1.9        pk 	if [ ! -e /usr/share/zoneinfo -a ! -e /mnt/usr/share/zoneinfo ]; then
   1290   1.6       leo 		TZ=GMT
   1291   1.6       leo 		return
   1292   1.6       leo 	fi
   1293   1.6       leo 	if [ ! -d /usr/share/zoneinfo ]; then
   1294   1.6       leo 		_zonepath=/mnt
   1295   1.6       leo 	else
   1296   1.6       leo 		_zonepath=""
   1297   1.6       leo 	fi
   1298   1.6       leo 		
   1299   1.1        pk cat << \__get_timezone_1
   1300   1.1        pk 
   1301   1.1        pk Select a time zone for your location. Timezones are represented on the
   1302   1.1        pk system by a directory structure rooted in "/usr/share/timezone". Most
   1303   1.1        pk timezones can be selected by entering a token like "MET" or "GMT-6".
   1304   1.1        pk Other zones are grouped by continent, with detailed zone information
   1305   1.1        pk separated by a slash ("/"), e.g. "US/Pacific".
   1306   1.1        pk 
   1307   1.1        pk To get a listing of what's available in /usr/share/zoneinfo, enter "?"
   1308   1.1        pk at the prompts below.
   1309   1.1        pk 
   1310   1.1        pk __get_timezone_1
   1311   1.1        pk 	if [ X$TZ = X ]; then
   1312  1.13        pk 		TZ=`ls -l /mnt/etc/localtime 2>/dev/null | cutlast`
   1313   1.3        pk 		TZ=${TZ#/usr/share/zoneinfo/}
   1314   1.1        pk 	fi
   1315   1.1        pk 	while :; do
   1316   1.1        pk 		echo -n	"What timezone are you in [\`?' for list] [$TZ]? "
   1317   1.1        pk 		getresp "$TZ"
   1318   1.1        pk 		case "$resp" in
   1319   1.1        pk 		"")
   1320   1.1        pk 			echo "Timezone defaults to GMT"
   1321   1.1        pk 			TZ="GMT"
   1322   1.1        pk 			break;
   1323   1.1        pk 			;;
   1324   1.1        pk 		"?")
   1325   1.6       leo 			ls ${_zonepath}/usr/share/zoneinfo
   1326   1.1        pk 			;;
   1327   1.1        pk 		*)
   1328   1.1        pk 			_a=$resp
   1329   1.6       leo 			while [ -d ${_zonepath}/usr/share/zoneinfo/$_a ]; do
   1330   1.1        pk 				echo -n "There are several timezones available"
   1331   1.1        pk 				echo " within zone '$_a'"
   1332   1.1        pk 				echo -n "Select a sub-timezone [\`?' for list]: "
   1333   1.1        pk 				getresp ""
   1334   1.1        pk 				case "$resp" in
   1335   1.6       leo 				"?") ls ${_zonepath}/usr/share/zoneinfo/$_a ;;
   1336   1.1        pk 				*)	_a=${_a}/${resp}
   1337   1.6       leo 					if [ -f ${_zonepath}/usr/share/zoneinfo/$_a ]; then
   1338   1.1        pk 						break;
   1339   1.1        pk 					fi
   1340   1.1        pk 					;;
   1341   1.1        pk 				esac
   1342   1.1        pk 			done
   1343   1.6       leo 			if [ -f ${_zonepath}/usr/share/zoneinfo/$_a ]; then
   1344   1.1        pk 				TZ="$_a"
   1345   1.1        pk 				echo "You have selected timezone \"$_a\"".
   1346   1.1        pk 				break 2
   1347   1.1        pk 			fi
   1348   1.1        pk 			echo "'/usr/share/zoneinfo/$_a' is not a valid timezone on this system."
   1349   1.1        pk 			;;
   1350   1.1        pk 		esac
   1351   1.1        pk 	done
   1352   1.1        pk }
   1353   1.1        pk 
   1354   1.1        pk install_sets()
   1355   1.1        pk {
   1356  1.13        pk 	local _yup
   1357  1.13        pk 	_yup="FALSE"
   1358  1.13        pk 
   1359  1.13        pk 	# Ask the user which media to load the distribution from.
   1360  1.33       mrg 	# Ask the user if they want verbose extraction.  They might not want
   1361  1.33       mrg 	# it on, eg, SPARC frame buffer console.
   1362  1.13        pk 	cat << \__install_sets_1
   1363   1.1        pk 
   1364   1.1        pk It is now time to extract the installation sets onto the hard disk.
   1365  1.10   thorpej Make sure the sets are either on a local device (i.e. tape, CD-ROM) or on a
   1366   1.1        pk network server.
   1367   1.1        pk 
   1368  1.33       mrg Would you like to see each file listed during extraction (verbose) mode?
   1369  1.33       mrg On some console hardware, such as serial consoles and Sun frame buffers,
   1370  1.33       mrg this can extend the total extraction time.
   1371   1.1        pk __install_sets_1
   1372  1.33       mrg 	echo -n "Use verbose listing for extractions? [y] "
   1373  1.33       mrg 	getresp "y"
   1374  1.33       mrg 	case "$resp" in
   1375  1.33       mrg 	y*|Y*)
   1376  1.33       mrg 		verbose_flag=v
   1377  1.33       mrg 		;;
   1378  1.33       mrg 	*)
   1379  1.37        is 		echo "Not using verbose listing."
   1380  1.33       mrg 		verbose_flag=""
   1381  1.33       mrg 		;;
   1382  1.33       mrg 	esac
   1383  1.13        pk 
   1384  1.31       sjg 	if [ -d ${Default_sets_dir:-/dev/null} ]; then
   1385  1.31       sjg 		if dir_has_sets $Default_sets_dir $THESETS; then
   1386  1.31       sjg 			local_sets_dir=$Default_sets_dir
   1387  1.31       sjg 		fi
   1388  1.31       sjg 	fi
   1389  1.13        pk 	if [ "X$local_sets_dir" != "X" ]; then
   1390  1.13        pk 		install_from_mounted_fs ${local_sets_dir}
   1391  1.13        pk 		if [ X"$_setsdone" != X ]; then
   1392  1.13        pk 			_yup="TRUE"
   1393  1.13        pk 		fi
   1394  1.13        pk 	fi
   1395  1.13        pk 
   1396  1.13        pk 	# Go on prodding for alternate locations
   1397  1.13        pk 	resp=""		# force at least one iteration
   1398  1.13        pk 	while [ X"${resp}" = X ]; do
   1399  1.13        pk 		# If _yup is not FALSE, it means that we extracted sets above.
   1400  1.13        pk 		# If that's the case, bypass the menu the first time.
   1401  1.13        pk 		if [ X"$_yup" = X"FALSE" ]; then
   1402  1.13        pk 			echo -n	"Install from (f)tp, (t)ape, (C)D-ROM, (N)FS"
   1403  1.13        pk 			echo -n " or local (d)isk? "
   1404  1.13        pk 			getresp ""
   1405   1.1        pk 			case "$resp" in
   1406  1.13        pk 			d*|D*)
   1407  1.13        pk 				install_disk
   1408  1.13        pk 				;;
   1409  1.13        pk 			f*|F*)
   1410  1.13        pk 				install_ftp
   1411  1.13        pk 				;;
   1412  1.13        pk 			t*|T*)
   1413  1.13        pk 				install_tape
   1414  1.13        pk 				;;
   1415  1.13        pk 			c*|C*)
   1416  1.13        pk 				install_cdrom
   1417  1.13        pk 				;;
   1418  1.13        pk 			n*|N*)
   1419  1.13        pk 				install_nfs
   1420   1.1        pk 				;;
   1421   1.1        pk 			*)
   1422  1.13        pk 				echo "Invalid response: $resp"
   1423  1.13        pk 				resp=""
   1424   1.1        pk 				;;
   1425   1.1        pk 			esac
   1426  1.13        pk 		else
   1427  1.13        pk 			_yup="FALSE"	# So we'll ask next time
   1428  1.13        pk 		fi
   1429   1.1        pk 
   1430  1.13        pk 		# Give the user the opportunity to extract more sets. They
   1431  1.13        pk 		# don't necessarily have to come from the same media.
   1432  1.13        pk 		echo	""
   1433  1.13        pk 		echo -n	"Extract more sets? [n] "
   1434  1.13        pk 		getresp "n"
   1435   1.1        pk 		case "$resp" in
   1436  1.13        pk 		y*|Y*)
   1437  1.13        pk 			# Force loop to repeat
   1438  1.13        pk 			resp=""
   1439   1.1        pk 			;;
   1440   1.1        pk 
   1441   1.1        pk 		*)
   1442   1.1        pk 			;;
   1443   1.1        pk 		esac
   1444  1.13        pk 	done
   1445   1.1        pk }
   1446   1.1        pk 
   1447   1.1        pk munge_fstab()
   1448   1.1        pk {
   1449   1.1        pk 	local _fstab
   1450   1.1        pk 	local _fstab_shadow
   1451   1.5        pk 	local _dev
   1452   1.5        pk 	local _mp
   1453   1.7       leo 	local _fstype
   1454   1.5        pk 	local _rest
   1455   1.6       leo 
   1456   1.1        pk 	# Now that the 'real' fstab is configured, we munge it into a 'shadow'
   1457   1.1        pk 	# fstab which we'll use for mounting and unmounting all of the target
   1458   1.1        pk 	# filesystems relative to /mnt.  Mount all filesystems.
   1459   1.1        pk 	_fstab=$1
   1460   1.1        pk 	_fstab_shadow=$2
   1461   1.7       leo 	( while read _dev _mp _fstype _rest; do
   1462   1.7       leo 		# Skip comment lines
   1463   1.7       leo 		case "$_dev" in
   1464   1.7       leo 			\#*)	continue;;
   1465   1.7       leo 			*)	;;
   1466   1.7       leo 		esac
   1467   1.7       leo 		# and some filesystem types (like there are swap,kernfs,...)
   1468   1.7       leo 		case "$_fstype" in
   1469   1.7       leo 			ffs|ufs|nfs)	;;
   1470   1.7       leo 			*)	continue;;
   1471   1.7       leo 		esac
   1472   1.3        pk 		if [ "$_mp" = "/" ]; then
   1473   1.8        pk 			echo $_dev /mnt $_fstype $_rest
   1474   1.1        pk 		else
   1475   1.8        pk 			echo $_dev /mnt$_mp $_fstype $_rest
   1476   1.3        pk 		fi
   1477   1.6       leo 	    done ) < $_fstab > $_fstab_shadow
   1478   1.1        pk }
   1479   1.1        pk 
   1480   1.1        pk mount_fs()
   1481   1.1        pk {
   1482   1.1        pk 	# Must mount filesystems manually, one at a time, so we can make
   1483   1.1        pk 	# sure the mount points exist.
   1484   1.1        pk 	# $1 is a file in fstab format
   1485   1.1        pk 	local _fstab
   1486   1.1        pk 
   1487   1.1        pk 	_fstab=$1
   1488   1.1        pk 
   1489   1.1        pk 	( while read line; do
   1490   1.4        pk 		set -- $line
   1491   1.4        pk 		_dev=$1
   1492   1.4        pk 		_mp=$2
   1493   1.4        pk 		_fstype=$3
   1494   1.4        pk 		_opt=$4
   1495   1.1        pk 
   1496   1.1        pk 		# If not the root filesystem, make sure the mount
   1497   1.1        pk 		# point is present.
   1498   1.1        pk 		if [ "X{$_mp}" != X"/mnt" ]; then
   1499   1.1        pk 			mkdir -p $_mp
   1500   1.1        pk 		fi
   1501   1.1        pk 
   1502   1.1        pk 		# Mount the filesystem.  If the mount fails, exit
   1503   1.1        pk 		# with an error condition to tell the outer
   1504   1.1        pk 		# later to bail.
   1505  1.29       mrg 		if ! mount -v -t $_fstype -o async -o $_opt $_dev $_mp ; then
   1506   1.1        pk 			# error message displated by mount
   1507   1.1        pk 			exit 1
   1508   1.1        pk 		fi
   1509   1.1        pk 	done ) < $_fstab
   1510   1.1        pk 
   1511   1.1        pk 	if [ "X${?}" != X"0" ]; then
   1512   1.1        pk 		cat << \__mount_filesystems_1
   1513   1.1        pk 
   1514   1.1        pk FATAL ERROR:  Cannot mount filesystems.  Double-check your configuration
   1515   1.1        pk and restart the installation process.
   1516   1.1        pk __mount_filesystems_1
   1517   1.1        pk 		exit
   1518   1.1        pk 	fi
   1519   1.1        pk }
   1520   1.1        pk 
   1521   1.1        pk unmount_fs()
   1522   1.1        pk {
   1523   1.1        pk 	# Unmount all filesystems and check their integrity.
   1524  1.13        pk 	# Usage: [-fast] <fstab file>
   1525  1.13        pk 	local _fast
   1526   1.1        pk 	local _fstab
   1527  1.13        pk 	local _pid
   1528  1.13        pk 
   1529  1.13        pk 	if [ "$1" = "-fast" ]; then
   1530  1.13        pk 		_fast=1
   1531  1.13        pk 		_fstab=$2
   1532  1.13        pk 	else
   1533  1.13        pk 		_fast=0
   1534  1.13        pk 		_fstab=$1
   1535  1.13        pk 	fi
   1536   1.1        pk 
   1537  1.13        pk 	if [ ! \( -f $_fstab -a -s $_fstab \) ]; then
   1538  1.13        pk 		echo "fstab empty" > /dev/tty
   1539  1.13        pk 		return
   1540  1.13        pk 	fi
   1541   1.1        pk 
   1542  1.13        pk 	if [ $_fast = 0 ]; then
   1543  1.13        pk 		echo -n	"Syncing disks..."
   1544  1.13        pk 		_pid=`twiddle`
   1545  1.13        pk 		sync; sleep 4; sync; sleep 2; sync; sleep 2
   1546  1.13        pk 		kill $_pid
   1547  1.13        pk 		echo	"done."
   1548  1.13        pk 	fi
   1549   1.1        pk 
   1550   1.1        pk 	(
   1551   1.1        pk 		_devs=""
   1552   1.1        pk 		_mps=""
   1553   1.1        pk 		# maintain reverse order
   1554   1.1        pk 		while read line; do
   1555   1.3        pk 			set -- $line
   1556   1.3        pk 			_devs="$1 ${_devs}"
   1557   1.3        pk 			_mps="$2 ${_mps}"
   1558   1.1        pk 		done
   1559   1.1        pk 		echo -n "Umounting filesystems... "
   1560   1.1        pk 		for _mp in ${_mps}; do
   1561   1.1        pk 			echo -n "${_mp} "
   1562   1.1        pk 			umount ${_mp}
   1563   1.1        pk 		done
   1564   1.1        pk 		echo "Done."
   1565   1.1        pk 
   1566  1.13        pk 		if [ $_fast = 0 ]; then
   1567  1.13        pk 			exit
   1568  1.13        pk 		fi
   1569   1.1        pk 		echo "Checking filesystem integrity..."
   1570   1.1        pk 		for _dev in ${_devs}; do
   1571   1.1        pk 			echo  "${_dev}"
   1572   1.1        pk 			fsck -f ${_dev}
   1573   1.1        pk 		done
   1574   1.1        pk 		echo "Done."
   1575   1.1        pk 	) < $_fstab
   1576   1.1        pk }
   1577   1.1        pk 
   1578   1.1        pk check_fs()
   1579   1.1        pk {
   1580   1.1        pk 	# Check filesystem integrity.
   1581   1.1        pk 	# $1 is a file in fstab format
   1582   1.1        pk 	local _fstab
   1583   1.1        pk 
   1584   1.1        pk 	_fstab=$1
   1585   1.1        pk 
   1586   1.1        pk 	(
   1587   1.1        pk 		_devs=""
   1588   1.1        pk 		_mps=""
   1589   1.1        pk 		while read line; do
   1590   1.3        pk 			set -- $line
   1591   1.3        pk 			_devs="$1 ${_devs}"
   1592   1.3        pk 			_mps="$2 ${_mps}"
   1593   1.1        pk 		done
   1594   1.1        pk 
   1595   1.1        pk 		echo "Checking filesystem integrity..."
   1596   1.1        pk 		for _dev in ${_devs}; do
   1597   1.1        pk 			echo  "${_dev}"
   1598   1.1        pk 			fsck -f ${_dev}
   1599   1.1        pk 		done
   1600   1.1        pk 		echo "Done."
   1601   1.1        pk 	) < $_fstab
   1602   1.1        pk }
   1603