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