Home | History | Annotate | Line # | Download | only in miniroot
install.sub revision 1.1
      1  1.1  pk #!/bin/sh
      2  1.1  pk #	$NetBSD: install.sub,v 1.1 1996/01/06 22:45:13 pk Exp $
      3  1.1  pk #
      4  1.1  pk # Copyright (c) 1995 Jason R. Thorpe.
      5  1.1  pk # All rights reserved.
      6  1.1  pk #
      7  1.1  pk # Redistribution and use in source and binary forms, with or without
      8  1.1  pk # modification, are permitted provided that the following conditions
      9  1.1  pk # are met:
     10  1.1  pk # 1. Redistributions of source code must retain the above copyright
     11  1.1  pk #    notice, this list of conditions and the following disclaimer.
     12  1.1  pk # 2. Redistributions in binary form must reproduce the above copyright
     13  1.1  pk #    notice, this list of conditions and the following disclaimer in the
     14  1.1  pk #    documentation and/or other materials provided with the distribution.
     15  1.1  pk # 3. All advertising materials mentioning features or use of this software
     16  1.1  pk #    must display the following acknowledgement:
     17  1.1  pk #	This product includes software developed for the NetBSD Project
     18  1.1  pk #	by Jason R. Thorpe.
     19  1.1  pk # 4. The name of the author may not be used to endorse or promote products
     20  1.1  pk #    derived from this software without specific prior written permission
     21  1.1  pk #
     22  1.1  pk # THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
     23  1.1  pk # IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     24  1.1  pk # OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     25  1.1  pk # IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
     26  1.1  pk # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
     27  1.1  pk # NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     28  1.1  pk # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     29  1.1  pk # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     30  1.1  pk # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
     31  1.1  pk # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     32  1.1  pk #
     33  1.1  pk 
     34  1.1  pk #	NetBSD installation/upgrade script - common subroutines.
     35  1.1  pk 
     36  1.1  pk VERSION=1.1A
     37  1.1  pk export VERSION				# XXX needed in subshell
     38  1.1  pk ROOTDISK=""				# filled in below
     39  1.1  pk 
     40  1.1  pk ALLSETS="base comp etc games man misc text"	# default install sets
     41  1.1  pk UPGRSETS="base comp games man misc text"	# default upgrade sets
     42  1.1  pk 
     43  1.1  pk getresp() {
     44  1.1  pk 	read resp
     45  1.1  pk 	if [ "X$resp" = "X" ]; then
     46  1.1  pk 		resp=$1
     47  1.1  pk 	fi
     48  1.1  pk }
     49  1.1  pk 
     50  1.1  pk isin() {
     51  1.1  pk # test the first argument against the remaining ones, return succes on a match
     52  1.1  pk 	_a=$1; shift
     53  1.1  pk 	while [ $# != 0 ]; do
     54  1.1  pk 		if [ "$_a" = "$1" ]; then return 0; fi
     55  1.1  pk 		shift
     56  1.1  pk 	done
     57  1.1  pk 	return 1
     58  1.1  pk }
     59  1.1  pk 
     60  1.1  pk rmel() {
     61  1.1  pk # remove first argument from list formed by the remaining arguments
     62  1.1  pk 	_a=$1; shift
     63  1.1  pk 	while [ $# != 0 ]; do
     64  1.1  pk 		if [ "$_a" != "$1" ]; then
     65  1.1  pk 			echo "$1";
     66  1.1  pk 		fi
     67  1.1  pk 		shift
     68  1.1  pk 	done
     69  1.1  pk }
     70  1.1  pk 
     71  1.1  pk twiddle() {
     72  1.1  pk # spin the propeller so we don't get bored
     73  1.1  pk 	while : ; do  
     74  1.1  pk 		sleep 1; echo -n "/";
     75  1.1  pk 		sleep 1; echo -n "-";
     76  1.1  pk 		sleep 1; echo -n "\\";
     77  1.1  pk 		sleep 1; echo -n "|";
     78  1.1  pk 	done > /dev/tty & echo $!
     79  1.1  pk }
     80  1.1  pk 
     81  1.1  pk . install.md
     82  1.1  pk 
     83  1.1  pk do_mfs_mount() {
     84  1.1  pk 	# $1 is the mount point
     85  1.1  pk 	# $2 is the size in DEV_BIZE blocks
     86  1.1  pk 
     87  1.1  pk 	umount $1 > /dev/null 2>&1
     88  1.1  pk 	if ! mount_mfs -s $2 swap $1 ; then
     89  1.1  pk 		cat << \__mfs_failed_1
     90  1.1  pk 
     91  1.1  pk FATAL ERROR: Can't mount the memory filesystem.
     92  1.1  pk 
     93  1.1  pk __mfs_failed_1
     94  1.1  pk 		exit
     95  1.1  pk 	fi
     96  1.1  pk 
     97  1.1  pk 	# Bleh.  Give mount_mfs a chance to DTRT.
     98  1.1  pk 	sleep 2
     99  1.1  pk }
    100  1.1  pk 
    101  1.1  pk getrootdisk() {
    102  1.1  pk 	cat << \__getrootdisk_1
    103  1.1  pk 
    104  1.1  pk The installation program needs to know which disk to consider
    105  1.1  pk the root disk.  Note the unit number may be different than
    106  1.1  pk the unit number you used in the standalone installation
    107  1.1  pk program.
    108  1.1  pk 
    109  1.1  pk Available disks are:
    110  1.1  pk 
    111  1.1  pk __getrootdisk_1
    112  1.1  pk 	_DKDEVS=`md_get_diskdevs`
    113  1.1  pk 	echo	"$_DKDEVS"
    114  1.1  pk 	echo	""
    115  1.1  pk 	echo -n	"Which disk is the root disk? "
    116  1.1  pk 	getresp ""
    117  1.1  pk 	if isin $resp $_DKDEVS ; then
    118  1.1  pk 		ROOTDISK="$resp"
    119  1.1  pk 	else
    120  1.1  pk 		echo ""
    121  1.1  pk 		echo "The disk $resp does not exist."
    122  1.1  pk 		ROOTDISK=""
    123  1.1  pk 	fi
    124  1.1  pk }
    125  1.1  pk 
    126  1.1  pk labelmoredisks() {
    127  1.1  pk 	cat << \__labelmoredisks_1
    128  1.1  pk 
    129  1.1  pk You may label the following disks:
    130  1.1  pk 
    131  1.1  pk __labelmoredisks_1
    132  1.1  pk 	echo "$_DKDEVS"
    133  1.1  pk 	echo	""
    134  1.1  pk 	echo -n	"Label which disk? [done] "
    135  1.1  pk 	getresp "done"
    136  1.1  pk 	case "$resp" in
    137  1.1  pk 		done)
    138  1.1  pk 			;;
    139  1.1  pk 
    140  1.1  pk 		*)
    141  1.1  pk 			if echo "$_DKDEVS" | grep "^$resp" > /dev/null ; then
    142  1.1  pk 				md_labeldisk $resp
    143  1.1  pk 			else
    144  1.1  pk 				echo ""
    145  1.1  pk 				echo "The disk $resp does not exist."
    146  1.1  pk 			fi
    147  1.1  pk 			;;
    148  1.1  pk 	esac
    149  1.1  pk }
    150  1.1  pk 
    151  1.1  pk addhostent() {
    152  1.1  pk 	# $1 - IP address
    153  1.1  pk 	# $2 - symbolic name
    154  1.1  pk 
    155  1.1  pk 	# Create an entry in the hosts table.  If no host table
    156  1.1  pk 	# exists, create one.  If the IP address already exists,
    157  1.1  pk 	# replace it's entry.
    158  1.1  pk 	if [ ! -f /tmp/hosts ]; then
    159  1.1  pk 		echo "127.0.0.1 localhost" > /tmp/hosts
    160  1.1  pk 	fi
    161  1.1  pk 
    162  1.1  pk 	if grep "^$1 " /tmp/hosts > /dev/null; then
    163  1.1  pk 		grep -v "^$1 " /tmp/hosts > /tmp/hosts.new
    164  1.1  pk 		mv /tmp/hosts.new /tmp/hosts
    165  1.1  pk 	fi
    166  1.1  pk 
    167  1.1  pk 	echo "$1 $2 $2.$FQDN" >> /tmp/hosts
    168  1.1  pk }
    169  1.1  pk 
    170  1.1  pk addifconfig() {
    171  1.1  pk 	# $1 - interface name
    172  1.1  pk 	# $2 - interface symbolic name
    173  1.1  pk 	# $3 - interface IP address
    174  1.1  pk 	# $4 - interface netmask
    175  1.1  pk 
    176  1.1  pk 	# Create a hostname.* file for the interface.
    177  1.1  pk 	echo "inet $2 $4" > /tmp/hostname.$1
    178  1.1  pk 
    179  1.1  pk 	addhostent $3 $2
    180  1.1  pk }
    181  1.1  pk 
    182  1.1  pk configurenetwork() {
    183  1.1  pk 	local _ifsdone
    184  1.1  pk 	local _ifs
    185  1.1  pk 
    186  1.1  pk 	_IFS=`md_get_ifdevs`
    187  1.1  pk 	_ifsdone=""
    188  1.1  pk 	resp=""		# force at least one iteration
    189  1.1  pk 	while [ "X${resp}" != X"done" ]; do
    190  1.1  pk 	cat << \__configurenetwork_1
    191  1.1  pk 
    192  1.1  pk You may configure the following network interfaces (the interfaces
    193  1.1  pk marked with [X] have been succesfully configured):
    194  1.1  pk 
    195  1.1  pk __configurenetwork_1
    196  1.1  pk 
    197  1.1  pk 		for _ifs in $_IFS; do
    198  1.1  pk 			if isin $_ifs $_ifsdone ; then
    199  1.1  pk 				echo -n "[X] "
    200  1.1  pk 			else
    201  1.1  pk 				echo -n "    "
    202  1.1  pk 			fi
    203  1.1  pk 			echo $_ifs
    204  1.1  pk 		done
    205  1.1  pk 		echo	""
    206  1.1  pk 		echo -n	"Configure which interface? [done] "
    207  1.1  pk 		getresp "done"
    208  1.1  pk 		case "$resp" in
    209  1.1  pk 		"done")
    210  1.1  pk 			;;
    211  1.1  pk 		*)
    212  1.1  pk 			_ifs=$resp
    213  1.1  pk 			if isin $_ifs $_IFS ; then
    214  1.1  pk 				if configure_ifs $_ifs ; then
    215  1.1  pk 					_ifsdone="$_ifs $_ifsdone"
    216  1.1  pk 				fi
    217  1.1  pk 			else
    218  1.1  pk 				echo "Invalid response: \"$resp\" is not in list"
    219  1.1  pk 			fi
    220  1.1  pk 			;;
    221  1.1  pk 		esac
    222  1.1  pk 	done
    223  1.1  pk }
    224  1.1  pk 
    225  1.1  pk configure_ifs() {
    226  1.1  pk 
    227  1.1  pk 	_interface_name=$1
    228  1.1  pk 
    229  1.1  pk 	# Get IP address
    230  1.1  pk 	resp=""		# force one iteration
    231  1.1  pk 	while [ "X${resp}" = X"" ]; do
    232  1.1  pk 		echo -n "IP address? "
    233  1.1  pk 		getresp ""
    234  1.1  pk 		_interface_ip=$resp
    235  1.1  pk 	done
    236  1.1  pk 
    237  1.1  pk 	# Get symbolic name
    238  1.1  pk 	resp=""		# force one iteration
    239  1.1  pk 	while [ "X${resp}" = X"" ]; do
    240  1.1  pk 		echo -n "Symbolic (host) name? "
    241  1.1  pk 		getresp ""
    242  1.1  pk 		_interface_symname=$resp
    243  1.1  pk 	done
    244  1.1  pk 
    245  1.1  pk 	# Get netmask
    246  1.1  pk 	resp=""		# force one iteration
    247  1.1  pk 	while [ "X${resp}" = X"" ]; do
    248  1.1  pk 		echo -n "Netmask? "
    249  1.1  pk 		getresp ""
    250  1.1  pk 		_interface_mask=$resp
    251  1.1  pk 	done
    252  1.1  pk 
    253  1.1  pk 	# Configure the interface.  If it
    254  1.1  pk 	# succeeds, add it to the permanent
    255  1.1  pk 	# network configuration info.
    256  1.1  pk 	ifconfig ${_interface_name} down
    257  1.1  pk 	if ifconfig ${_interface_name} inet \
    258  1.1  pk 	    ${_interface_ip} \
    259  1.1  pk 	    netmask ${_interface_mask} up ; then
    260  1.1  pk 		addifconfig \
    261  1.1  pk 		    ${_interface_name} \
    262  1.1  pk 		    ${_interface_symname} \
    263  1.1  pk 		    ${_interface_ip} \
    264  1.1  pk 		    ${_interface_mask}
    265  1.1  pk 		return 0
    266  1.1  pk 	fi
    267  1.1  pk 	return 1
    268  1.1  pk }
    269  1.1  pk 
    270  1.1  pk # Much of this is gratuitously stolen from /etc/netstart.
    271  1.1  pk enable_network() {
    272  1.1  pk 
    273  1.1  pk 	# Set up the hostname.
    274  1.1  pk 	if [ ! -f /mnt/etc/myname ]; then
    275  1.1  pk 		echo "ERROR: no /etc/myname!"
    276  1.1  pk 		return 1
    277  1.1  pk 	fi
    278  1.1  pk 	hostname=`cat /mnt/etc/myname`
    279  1.1  pk 	hostname $hostname
    280  1.1  pk 
    281  1.1  pk 	# configure all the interfaces which we know about.
    282  1.1  pk (
    283  1.1  pk 	tmp="$IFS"
    284  1.1  pk 	IFS="$IFS."
    285  1.1  pk 	set -- `echo /mnt/etc/hostname*`
    286  1.1  pk 	IFS=$tmp
    287  1.1  pk 	unset tmp
    288  1.1  pk 
    289  1.1  pk 	while [ $# -ge 2 ] ; do
    290  1.1  pk 		shift		# get rid of "hostname"
    291  1.1  pk 		(
    292  1.1  pk 			read af name mask bcaddr extras
    293  1.1  pk 			read dt dtaddr
    294  1.1  pk 
    295  1.1  pk 			if [ ! -n "$name" ]; then
    296  1.1  pk 		    echo "/etc/hostname.$1: invalid network configuration file"
    297  1.1  pk 				exit
    298  1.1  pk 			fi
    299  1.1  pk 
    300  1.1  pk 			cmd="ifconfig $1 $af $name "
    301  1.1  pk 			if [ "${dt}" = "dest" ]; then cmd="$cmd $dtaddr"; fi
    302  1.1  pk 			if [ -n "$mask" ]; then cmd="$cmd netmask $mask"; fi
    303  1.1  pk 			if [ -n "$bcaddr" -a "X$bcaddr" != "XNONE" ]; then
    304  1.1  pk 				cmd="$cmd broadcast $bcaddr";
    305  1.1  pk 			fi
    306  1.1  pk 			cmd="$cmd $extras"
    307  1.1  pk 
    308  1.1  pk 			$cmd
    309  1.1  pk 		) < /mnt/etc/hostname.$1
    310  1.1  pk 		shift
    311  1.1  pk 	done
    312  1.1  pk )
    313  1.1  pk 
    314  1.1  pk 	# set the address for the loopback interface
    315  1.1  pk 	ifconfig lo0 inet localhost
    316  1.1  pk 
    317  1.1  pk 	# use loopback, not the wire
    318  1.1  pk 	route add $hostname localhost
    319  1.1  pk 
    320  1.1  pk 	# /etc/mygate, if it exists, contains the name of my gateway host
    321  1.1  pk 	# that name must be in /etc/hosts.
    322  1.1  pk 	if [ -f /mnt/etc/mygate ]; then
    323  1.1  pk 		route delete default > /dev/null 2>&1
    324  1.1  pk 		route add default `cat /mnt/etc/mygate`
    325  1.1  pk 	fi
    326  1.1  pk 
    327  1.1  pk 	# enable the resolver, if appropriate.
    328  1.1  pk 	if [ -f /mnt/etc/resolv.conf ]; then
    329  1.1  pk 		_resolver_enabled="TRUE"
    330  1.1  pk 		cp /mnt/etc/resolv.conf /tmp/resolv.conf.shadow
    331  1.1  pk 	fi
    332  1.1  pk 
    333  1.1  pk 	# Display results...
    334  1.1  pk 	echo	"Network interface configuration:"
    335  1.1  pk 	ifconfig -a
    336  1.1  pk 
    337  1.1  pk 	echo	""
    338  1.1  pk 
    339  1.1  pk 	if [ "X${_resolver_enabled}" = X"TRUE" ]; then
    340  1.1  pk 		netstat -r
    341  1.1  pk 		echo	""
    342  1.1  pk 		echo	"Resolver enabled."
    343  1.1  pk 	else
    344  1.1  pk 		netstat -rn
    345  1.1  pk 		echo	""
    346  1.1  pk 		echo	"Resolver not enabled."
    347  1.1  pk 	fi
    348  1.1  pk 
    349  1.1  pk 	return 0
    350  1.1  pk }
    351  1.1  pk 
    352  1.1  pk install_ftp() {
    353  1.1  pk 	# Get several parameters from the user, and create
    354  1.1  pk 	# a shell script that directs the appropriate
    355  1.1  pk 	# commands into ftp.
    356  1.1  pk 	cat << \__install_ftp_1
    357  1.1  pk 
    358  1.1  pk This is an automated ftp-based installation process.  You will be asked
    359  1.1  pk several questions.  The correct set of commands will be placed in a script
    360  1.1  pk that will be fed to ftp(1).
    361  1.1  pk 
    362  1.1  pk __install_ftp_1
    363  1.1  pk 	# Get server IP address
    364  1.1  pk 	resp=""		# force one iteration
    365  1.1  pk 	while [ "X${resp}" = X"" ]; do
    366  1.1  pk 		echo -n "Server IP? [${_ftp_server_ip}] "
    367  1.1  pk 		getresp "${_ftp_server_ip}"
    368  1.1  pk 		_ftp_server_ip=$resp
    369  1.1  pk 	done
    370  1.1  pk 
    371  1.1  pk 	# Get server directory
    372  1.1  pk 	resp=""		# force one iteration
    373  1.1  pk 	while [ "X${resp}" = X"" ]; do
    374  1.1  pk 		echo -n "Server directory? [${_ftp_server_dir}] "
    375  1.1  pk 		getresp "${_ftp_server_dir}"
    376  1.1  pk 		_ftp_server_dir=$resp
    377  1.1  pk 	done
    378  1.1  pk 
    379  1.1  pk 	# Get login name
    380  1.1  pk 	resp=""		# force one iteration
    381  1.1  pk 	while [ "X${resp}" = X"" ]; do
    382  1.1  pk 		echo -n "Login? [${_ftp_server_login}] "
    383  1.1  pk 		getresp "${_ftp_server_login}"
    384  1.1  pk 		_ftp_server_login=$resp 
    385  1.1  pk 	done
    386  1.1  pk 
    387  1.1  pk 	# Get password
    388  1.1  pk 	resp=""		# force one iteration
    389  1.1  pk 	while [ "X${resp}" = X"" ]; do
    390  1.1  pk 		echo -n "Password? [${_ftp_server_password}] "
    391  1.1  pk 		getresp "${_ftp_server_password}"
    392  1.1  pk 		_ftp_server_password=$resp
    393  1.1  pk 	done
    394  1.1  pk 
    395  1.1  pk 	# Get list of files for mget.
    396  1.1  pk 	cat << \__install_ftp_2
    397  1.1  pk 
    398  1.1  pk You will now be asked for files to extract.  Enter one file at a time.
    399  1.1  pk When you are done entering files, enter 'done'.
    400  1.1  pk 
    401  1.1  pk __install_ftp_2
    402  1.1  pk 	echo "#!/bin/sh" > /tmp/ftp-script.sh
    403  1.1  pk 	echo "cd /mnt" >> /tmp/ftp-script.sh
    404  1.1  pk 	echo "ftp -i -n $_ftp_server_ip << \__end_commands" >> \
    405  1.1  pk 	    /tmp/ftp-script.sh
    406  1.1  pk 	echo "user $_ftp_server_login $_ftp_server_password" >> \
    407  1.1  pk 	    /tmp/ftp-script.sh
    408  1.1  pk 	echo "bin" >> /tmp/ftp-script.sh
    409  1.1  pk 	echo "cd $_ftp_server_dir" >> /tmp/ftp-script.sh
    410  1.1  pk 
    411  1.1  pk 	resp=""		# force one interation
    412  1.1  pk 	while [ "X${resp}" != X"done" ]; do
    413  1.1  pk 		echo -n "File? [done] "
    414  1.1  pk 		getresp "done"
    415  1.1  pk 		if [ "X${resp}" = X"done" ]; then
    416  1.1  pk 			break
    417  1.1  pk 		fi
    418  1.1  pk 
    419  1.1  pk 		_ftp_file=`echo ${resp} | awk '{print $1}'`
    420  1.1  pk 		echo "get ${_ftp_file} |\"tar --unlink -zxvpf -\"" >> \
    421  1.1  pk 		    /tmp/ftp-script.sh
    422  1.1  pk 	done
    423  1.1  pk 
    424  1.1  pk 	echo "quit" >> /tmp/ftp-script.sh
    425  1.1  pk 	echo "__end_commands" >> /tmp/ftp-script.sh
    426  1.1  pk 
    427  1.1  pk 	sh /tmp/ftp-script.sh
    428  1.1  pk 	rm -f /tmp/ftp-script.sh
    429  1.1  pk 	echo "Extraction complete."
    430  1.1  pk }
    431  1.1  pk 
    432  1.1  pk install_common_nfs_cdrom() {
    433  1.1  pk 	# $1 - directory containing file
    434  1.1  pk 	local _filename
    435  1.1  pk 	local _setsdone
    436  1.1  pk 	local _prev
    437  1.1  pk 	local _f
    438  1.1  pk 
    439  1.1  pk 	_sets=`(cd /mnt2/$1; ls *.tar.gz)`
    440  1.1  pk 	if [ -z "$_sets" ]; then
    441  1.1  pk 		echo "There are no NetBSD install sets available in \"$1\""
    442  1.1  pk 		return
    443  1.1  pk 	fi
    444  1.1  pk 
    445  1.1  pk 	_setsdone=""
    446  1.1  pk 	while : ; do
    447  1.1  pk 		echo "The following sets are available for extraction:"
    448  1.1  pk 		echo "(marked sets have already been extracted)"
    449  1.1  pk 		echo ""
    450  1.1  pk 
    451  1.1  pk 		_prev=""
    452  1.1  pk 		for _f in $_sets ; do
    453  1.1  pk 			if isin $_f $_setsdone; then
    454  1.1  pk 				echo -n "[X] "
    455  1.1  pk 			else
    456  1.1  pk 				echo -n "    "
    457  1.1  pk 				if [ -z "$_prev" ]; then _prev=$_f; fi
    458  1.1  pk 			fi
    459  1.1  pk 			echo $_f
    460  1.1  pk 		done
    461  1.1  pk 		echo ""
    462  1.1  pk 
    463  1.1  pk 		# Get the name of the file.
    464  1.1  pk 		if [ "X$_prev" = "X" ]; then resp=n; else resp=y; fi
    465  1.1  pk 		echo -n "Continue extraction [$resp]?"
    466  1.1  pk 		getresp "$resp"
    467  1.1  pk 		if [ "$resp" = "n" ]; then
    468  1.1  pk 			break
    469  1.1  pk 		fi
    470  1.1  pk 
    471  1.1  pk 		echo -n "File name [$_prev]? "
    472  1.1  pk 		getresp "$_prev"
    473  1.1  pk 		_f=$resp
    474  1.1  pk 		_filename="/mnt2/$1/$_f"
    475  1.1  pk 
    476  1.1  pk 		# Ensure file exists
    477  1.1  pk 		if [ ! -f $_filename ]; then
    478  1.1  pk 			echo "File $_filename does not exist.  Check to make"
    479  1.1  pk 			echo "sure you entered the information properly."
    480  1.1  pk 			continue
    481  1.1  pk 		fi
    482  1.1  pk 
    483  1.1  pk 		# Extract file
    484  1.1  pk 		cat $_filename | (cd /mnt; tar -zxvpf -)
    485  1.1  pk 		echo "Extraction complete."
    486  1.1  pk 		_setsdone="$_f $_setsdone"
    487  1.1  pk 
    488  1.1  pk 	done
    489  1.1  pk }
    490  1.1  pk 
    491  1.1  pk install_cdrom() {
    492  1.1  pk 	# Get the cdrom device info
    493  1.1  pk 	cat << \__install_cdrom_1
    494  1.1  pk 
    495  1.1  pk The following CD-ROM devices are installed on your system; please select
    496  1.1  pk the CD-ROM device containing the installation media:
    497  1.1  pk 
    498  1.1  pk __install_cdrom_1
    499  1.1  pk 	_CDDEVS=`md_get_cddevs`
    500  1.1  pk 	echo    "$_CDDEVS"
    501  1.1  pk 	echo	""
    502  1.1  pk 	echo -n	"Which is the CD-ROM with the installation media? [abort] "
    503  1.1  pk 	getresp "abort"
    504  1.1  pk 	case "$resp" in
    505  1.1  pk 		abort)
    506  1.1  pk 			echo "Aborting."
    507  1.1  pk 			return
    508  1.1  pk 			;;
    509  1.1  pk 
    510  1.1  pk 		*)
    511  1.1  pk 			if isin $resp $_CDDEVS ; then
    512  1.1  pk 				_cdrom_drive=$resp
    513  1.1  pk 			else
    514  1.1  pk 				echo ""
    515  1.1  pk 				echo "The CD-ROM $resp does not exist."
    516  1.1  pk 				echo "Aborting."
    517  1.1  pk 				return
    518  1.1  pk 			fi
    519  1.1  pk 			;;
    520  1.1  pk 	esac
    521  1.1  pk 
    522  1.1  pk 	# Get partition
    523  1.1  pk 	resp=""		# force one iteration
    524  1.1  pk 	while [ "X${resp}" = X"" ]; do
    525  1.1  pk 		echo -n "Partition? [c] "
    526  1.1  pk 		getresp "c"
    527  1.1  pk 		case "$resp" in
    528  1.1  pk 			[a-h])
    529  1.1  pk 				_cdrom_partition=$resp
    530  1.1  pk 				;;
    531  1.1  pk 
    532  1.1  pk 			*)
    533  1.1  pk 				echo "Invalid response: $resp"
    534  1.1  pk 				resp=""		# force loop to repeat
    535  1.1  pk 				;;
    536  1.1  pk 		esac
    537  1.1  pk 	done
    538  1.1  pk 
    539  1.1  pk 	# Ask for filesystem type
    540  1.1  pk 	cat << \__install_cdrom_2
    541  1.1  pk 
    542  1.1  pk There are two CD-ROM filesystem types currently supported by this program:
    543  1.1  pk 	1) ISO-9660 (cd9660)
    544  1.1  pk 	2) Berkeley Fast Filesystem (ffs)
    545  1.1  pk 
    546  1.1  pk __install_cdrom_2
    547  1.1  pk 	resp=""		# force one iteration
    548  1.1  pk 	while [ "X${resp}" = X"" ]; do
    549  1.1  pk 		echo -n "Which filesystem type? [cd9660] "
    550  1.1  pk 		getresp "cd9660"
    551  1.1  pk 		case "$resp" in
    552  1.1  pk 			cd9660|ffs)
    553  1.1  pk 				_cdrom_filesystem=$resp
    554  1.1  pk 				;;
    555  1.1  pk 
    556  1.1  pk 			*)
    557  1.1  pk 				echo "Invalid response: $resp"
    558  1.1  pk 				resp=""		# force loop to repeat
    559  1.1  pk 				;;
    560  1.1  pk 		esac
    561  1.1  pk 	done
    562  1.1  pk 
    563  1.1  pk 	# Mount the CD-ROM
    564  1.1  pk 	if ! mount -t ${_cdrom_filesystem} -o ro \
    565  1.1  pk 	    /dev/${_cdrom_drive}${_cdrom_partition} /mnt2 ; then
    566  1.1  pk 		echo "Cannot mount CD-ROM drive.  Aborting."
    567  1.1  pk 		return
    568  1.1  pk 	fi
    569  1.1  pk 
    570  1.1  pk 	# Get the directory where the file lives
    571  1.1  pk 	resp=""		# force one iteration
    572  1.1  pk 	while [ "X${resp}" = X"" ]; do
    573  1.1  pk 		echo "Enter the directory relative to the mount point that"
    574  1.1  pk 		echo -n "contains the file. [${_cdrom_directory}] "
    575  1.1  pk 		getresp "${_cdrom_directory}"
    576  1.1  pk 	done
    577  1.1  pk 	_cdrom_directory=$resp
    578  1.1  pk 
    579  1.1  pk 	install_common_nfs_cdrom ${_cdrom_directory}
    580  1.1  pk 	umount -f /mnt2 > /dev/null 2>&1
    581  1.1  pk }
    582  1.1  pk 
    583  1.1  pk install_nfs() {
    584  1.1  pk 	# Get the IP address of the server
    585  1.1  pk 	resp=""		# force one iteration
    586  1.1  pk 	while [ "X${resp}" = X"" ]; do
    587  1.1  pk 		echo -n "Server IP address? [${_nfs_server_ip}] "
    588  1.1  pk 		getresp "${_nfs_server_ip}"
    589  1.1  pk 	done
    590  1.1  pk 	_nfs_server_ip=$resp
    591  1.1  pk 
    592  1.1  pk 	# Get server path to mount
    593  1.1  pk 	resp=""		# force one iteration
    594  1.1  pk 	while [ "X${resp}" = X"" ]; do
    595  1.1  pk 		echo -n "Filesystem on server to mount? [${_nfs_server_path}] "
    596  1.1  pk 		getresp "${_nfs_server_path}"
    597  1.1  pk 	done
    598  1.1  pk 	_nfs_server_path=$resp
    599  1.1  pk 
    600  1.1  pk 	# Determine use of TCP
    601  1.1  pk 	echo -n "Use TCP transport (only works with capable NFS server)? [n] "
    602  1.1  pk 	getresp "n"
    603  1.1  pk 	case "$resp" in
    604  1.1  pk 		y*|Y*)
    605  1.1  pk 			_nfs_tcp="-T"
    606  1.1  pk 			;;
    607  1.1  pk 
    608  1.1  pk 		*)
    609  1.1  pk 			_nfs_tcp=""
    610  1.1  pk 			;;
    611  1.1  pk 	esac
    612  1.1  pk 
    613  1.1  pk 	# Mount the server
    614  1.1  pk 	mkdir /mnt2 > /dev/null 2>&1
    615  1.1  pk 	if ! mount_nfs $_nfs_tcp ${_nfs_server_ip}:${_nfs_server_path} \
    616  1.1  pk 	    /mnt2 ; then
    617  1.1  pk 		echo "Cannot mount NFS server.  Aborting."
    618  1.1  pk 		return
    619  1.1  pk 	fi
    620  1.1  pk 
    621  1.1  pk 	# Get the directory where the file lives
    622  1.1  pk 	resp=""		# force one iteration
    623  1.1  pk 	while [ "X${resp}" = X"" ]; do
    624  1.1  pk 		echo "Enter the directory relative to the mount point that"
    625  1.1  pk 		echo -n "contains the file. [${_nfs_directory}] "
    626  1.1  pk 		getresp "${_nfs_directory}"
    627  1.1  pk 	done
    628  1.1  pk 	_nfs_directory=$resp
    629  1.1  pk 
    630  1.1  pk 	install_common_nfs_cdrom ${_nfs_directory}
    631  1.1  pk 	umount -f /mnt2 > /dev/null 2>&1
    632  1.1  pk }
    633  1.1  pk 
    634  1.1  pk install_tape() {
    635  1.1  pk 	# Get the name of the tape from the user.
    636  1.1  pk 	cat << \__install_tape_1
    637  1.1  pk 
    638  1.1  pk The installation program needs to know which tape device to use.  Make
    639  1.1  pk sure you use a "no rewind on close" device.
    640  1.1  pk 
    641  1.1  pk __install_tape_1
    642  1.1  pk 	_tape=`basename $TAPE`
    643  1.1  pk 	resp=""		# force one iteration
    644  1.1  pk 	while [ "X${resp}" = X"" ]; do
    645  1.1  pk 		echo -n "Name of tape device? [${_tape}]"
    646  1.1  pk 		getresp "${_tape}"
    647  1.1  pk 	done
    648  1.1  pk 	_tape=`basename $resp`
    649  1.1  pk 	TAPE="/dev/${_tape}"
    650  1.1  pk 	if [ ! -c $TAPE ]; then
    651  1.1  pk 		echo "$TAPE does not exist or is not a character special file."
    652  1.1  pk 		echo "Aborting."
    653  1.1  pk 		return
    654  1.1  pk 	fi
    655  1.1  pk 	export TAPE
    656  1.1  pk 
    657  1.1  pk 	# Rewind the tape device
    658  1.1  pk 	echo -n "Rewinding tape..."
    659  1.1  pk 	if ! mt rewind ; then
    660  1.1  pk 		echo "$TAPE may not be attached to the system or may not be"
    661  1.1  pk 		echo "a tape device.  Aborting."
    662  1.1  pk 		return
    663  1.1  pk 	fi
    664  1.1  pk 	echo "done."
    665  1.1  pk 
    666  1.1  pk 	# Get the file number
    667  1.1  pk 	resp=""		# force one iteration
    668  1.1  pk 	while [ "X${resp}" = X"" ]; do
    669  1.1  pk 		echo -n "File number? "
    670  1.1  pk 		getresp ""
    671  1.1  pk 		case "$resp" in
    672  1.1  pk 			[1-9]*)
    673  1.1  pk 				_nskip=`expr $resp - 1`
    674  1.1  pk 				;;
    675  1.1  pk 
    676  1.1  pk 			*)
    677  1.1  pk 				echo "Invalid file number ${resp}."
    678  1.1  pk 				resp=""		# fore loop to repeat
    679  1.1  pk 				;;
    680  1.1  pk 		esac
    681  1.1  pk 	done
    682  1.1  pk 
    683  1.1  pk 	# Skip to correct file.
    684  1.1  pk 	echo -n "Skipping to source file..."
    685  1.1  pk 	if [ "X${_nskip}" != X"0" ]; then
    686  1.1  pk 		if ! mt fsf $_nskip ; then
    687  1.1  pk 			echo "Could not skip $_nskip files.  Aborting."
    688  1.1  pk 			return
    689  1.1  pk 		fi
    690  1.1  pk 	fi
    691  1.1  pk 	echo "done."
    692  1.1  pk 
    693  1.1  pk 	cat << \__install_tape_2
    694  1.1  pk 
    695  1.1  pk There are 2 different ways the file can be stored on tape:
    696  1.1  pk 
    697  1.1  pk 	1) an image of a gzipped tar file
    698  1.1  pk 	2) a standard tar image
    699  1.1  pk 
    700  1.1  pk __install_tape_2
    701  1.1  pk 	resp=""		# force one iteration
    702  1.1  pk 	while [ "X${resp}" = X"" ]; do
    703  1.1  pk 		echo -n "Which way is it? [1] "
    704  1.1  pk 		getresp "1"
    705  1.1  pk 		case "$resp" in
    706  1.1  pk 			1)
    707  1.1  pk 				(
    708  1.1  pk 					cd /mnt
    709  1.1  pk 					dd if=$TAPE | tar --unlink -zxvpf -
    710  1.1  pk 				)
    711  1.1  pk 				;;
    712  1.1  pk 
    713  1.1  pk 			2)
    714  1.1  pk 				(
    715  1.1  pk 					cd /mnt
    716  1.1  pk 					dd if=$TAPE | tar --unlink -xvpf -
    717  1.1  pk 				)
    718  1.1  pk 				;;
    719  1.1  pk 
    720  1.1  pk 			*)
    721  1.1  pk 				echo "Invalid response: $resp."
    722  1.1  pk 				resp=""		# force loop to repeat
    723  1.1  pk 				;;
    724  1.1  pk 		esac
    725  1.1  pk 	done
    726  1.1  pk 	echo "Extraction complete."
    727  1.1  pk }
    728  1.1  pk 
    729  1.1  pk get_timezone() {
    730  1.1  pk 	local _a
    731  1.1  pk cat << \__get_timezone_1
    732  1.1  pk 
    733  1.1  pk Select a time zone for your location. Timezones are represented on the
    734  1.1  pk system by a directory structure rooted in "/usr/share/timezone". Most
    735  1.1  pk timezones can be selected by entering a token like "MET" or "GMT-6".
    736  1.1  pk Other zones are grouped by continent, with detailed zone information
    737  1.1  pk separated by a slash ("/"), e.g. "US/Pacific".
    738  1.1  pk 
    739  1.1  pk To get a listing of what's available in /usr/share/zoneinfo, enter "?"
    740  1.1  pk at the prompts below.
    741  1.1  pk 
    742  1.1  pk __get_timezone_1
    743  1.1  pk 	if [ X$TZ = X ]; then
    744  1.1  pk 		TZ=`ls -l /etc/timezone 2>/dev/null | awk '{print $NF}' |
    745  1.1  pk 			sed -e 's?/usr/share/zoneinfo/??'`
    746  1.1  pk 	fi
    747  1.1  pk 	while :; do
    748  1.1  pk 		echo -n	"What timezone are you in [\`?' for list] [$TZ]? "
    749  1.1  pk 		getresp "$TZ"
    750  1.1  pk 		case "$resp" in
    751  1.1  pk 		"")
    752  1.1  pk 			echo "Timezone defaults to GMT"
    753  1.1  pk 			TZ="GMT"
    754  1.1  pk 			break;
    755  1.1  pk 			;;
    756  1.1  pk 		"?")
    757  1.1  pk 			ls /usr/share/zoneinfo
    758  1.1  pk 			;;
    759  1.1  pk 		*)
    760  1.1  pk 			_a=$resp
    761  1.1  pk 			while [ -d /usr/share/zoneinfo/$_a ]; do
    762  1.1  pk 				echo -n "There are several timezones available"
    763  1.1  pk 				echo " within zone '$_a'"
    764  1.1  pk 				echo -n "Select a sub-timezone [\`?' for list]: "
    765  1.1  pk 				getresp ""
    766  1.1  pk 				case "$resp" in
    767  1.1  pk 				"?") ls /usr/share/zoneinfo/$_a ;;
    768  1.1  pk 				*)	_a=${_a}/${resp}
    769  1.1  pk 					if [ -f /usr/share/zoneinfo/$_a ]; then
    770  1.1  pk 						break;
    771  1.1  pk 					fi
    772  1.1  pk 					;;
    773  1.1  pk 				esac
    774  1.1  pk 			done
    775  1.1  pk 			if [ -f /usr/share/zoneinfo/$_a ]; then
    776  1.1  pk 				TZ="$_a"
    777  1.1  pk 				echo "You have selected timezone \"$_a\"".
    778  1.1  pk 				break 2
    779  1.1  pk 			fi
    780  1.1  pk 			echo "'/usr/share/zoneinfo/$_a' is not a valid timezone on this system."
    781  1.1  pk 			;;
    782  1.1  pk 		esac
    783  1.1  pk 	done
    784  1.1  pk }
    785  1.1  pk 
    786  1.1  pk install_sets()
    787  1.1  pk {
    788  1.1  pk # arguments: the base names of the distribution sets to consider
    789  1.1  pk # Ask the user which media to load the distribution from.
    790  1.1  pk cat << \__install_sets_1
    791  1.1  pk 
    792  1.1  pk It is now time to extract the installation sets onto the hard disk.
    793  1.1  pk Make sure The sets are either on a local device (i.e. tape, CD-ROM) or on a
    794  1.1  pk network server.
    795  1.1  pk 
    796  1.1  pk __install_sets_1
    797  1.1  pk if [ -f $RELDIR/$1.tar.gz ]; then
    798  1.1  pk 	echo -n "Install from sets in the current root filesystem? [y] "
    799  1.1  pk 	getresp "y"
    800  1.1  pk 	case "$resp" in
    801  1.1  pk 	y*|Y*)
    802  1.1  pk 		for _f do
    803  1.1  pk 			if [ ! -f $RELDIR/${_f}.tar.gz ]; then
    804  1.1  pk 				continue
    805  1.1  pk 			fi
    806  1.1  pk 			echo -n "Install \"$_f\" ? [y]"
    807  1.1  pk 			getresp "y"
    808  1.1  pk 			case "$resp" in
    809  1.1  pk 			y*|Y*)
    810  1.1  pk 			     cat $RELDIR/${_f}.tar.gz |
    811  1.1  pk 					(cd /mnt; tar --unlink -zxvpf -)
    812  1.1  pk 				_yup="TRUE"
    813  1.1  pk 				echo "Extraction complete."
    814  1.1  pk 				;;
    815  1.1  pk 			*)
    816  1.1  pk 				echo "Skipping \"$_f\"."
    817  1.1  pk 				;;
    818  1.1  pk 			esac
    819  1.1  pk 		done
    820  1.1  pk 		;;
    821  1.1  pk 	*)
    822  1.1  pk 		_yup="FALSE"
    823  1.1  pk 		;;
    824  1.1  pk 	esac
    825  1.1  pk else
    826  1.1  pk 	_yup="FALSE"
    827  1.1  pk fi
    828  1.1  pk 
    829  1.1  pk # Go on prodding for alternate locations
    830  1.1  pk resp=""		# force at least one iteration
    831  1.1  pk while [ "X${resp}" = X"" ]; do
    832  1.1  pk 	# If _yup is not FALSE, it means that we extracted sets above.
    833  1.1  pk 	# If that's the case, bypass the menu the first time.
    834  1.1  pk 	if [ X"$_yup" = X"FALSE" ]; then
    835  1.1  pk 		echo -n	"Install from (f)tp, (t)ape, (C)D-ROM, or (N)FS? [f] "
    836  1.1  pk 		getresp "f"
    837  1.1  pk 		case "$resp" in
    838  1.1  pk 		f*|F*)
    839  1.1  pk 			install_ftp
    840  1.1  pk 			;;
    841  1.1  pk 
    842  1.1  pk 		t*|T*)
    843  1.1  pk 			install_tape
    844  1.1  pk 			;;
    845  1.1  pk 
    846  1.1  pk 		c*|C*)
    847  1.1  pk 			install_cdrom
    848  1.1  pk 			;;
    849  1.1  pk 
    850  1.1  pk 		n*|N*)
    851  1.1  pk 			install_nfs
    852  1.1  pk 			;;
    853  1.1  pk 
    854  1.1  pk 		*)
    855  1.1  pk 			echo "Invalid response: $resp"
    856  1.1  pk 			resp=""
    857  1.1  pk 			;;
    858  1.1  pk 		esac
    859  1.1  pk 	else
    860  1.1  pk 		_yup="FALSE"	# So we'll ask next time
    861  1.1  pk 	fi
    862  1.1  pk 
    863  1.1  pk 	# Give the user the opportunity to extract more sets.  They don't
    864  1.1  pk 	# necessarily have to come from the same media.
    865  1.1  pk 	echo	""
    866  1.1  pk 	echo -n	"Extract more sets? [n] "
    867  1.1  pk 	getresp "n"
    868  1.1  pk 	case "$resp" in
    869  1.1  pk 	y*|Y*)
    870  1.1  pk 		# Force loop to repeat
    871  1.1  pk 		resp=""
    872  1.1  pk 		;;
    873  1.1  pk 
    874  1.1  pk 	*)
    875  1.1  pk 		;;
    876  1.1  pk 	esac
    877  1.1  pk done
    878  1.1  pk }
    879  1.1  pk 
    880  1.1  pk munge_fstab()
    881  1.1  pk {
    882  1.1  pk 	local _fstab
    883  1.1  pk 	local _fstab_shadow
    884  1.1  pk 	# Now that the 'real' fstab is configured, we munge it into a 'shadow'
    885  1.1  pk 	# fstab which we'll use for mounting and unmounting all of the target
    886  1.1  pk 	# filesystems relative to /mnt.  Mount all filesystems.
    887  1.1  pk 	_fstab=$1
    888  1.1  pk 	_fstab_shadow=$2
    889  1.1  pk 	awk '{
    890  1.1  pk 		if ($2 == "/")
    891  1.1  pk 		    printf("%s /mnt %s %s %s %s\n", $1, $3, $4, $5, $6)
    892  1.1  pk 		else
    893  1.1  pk 		    printf("%s /mnt%s %s %s %s %s\n", $1, $2, $3, $4, $5, $6)
    894  1.1  pk 	}' < $_fstab > $_fstab_shadow
    895  1.1  pk }
    896  1.1  pk 
    897  1.1  pk mount_fs()
    898  1.1  pk {
    899  1.1  pk 	# Must mount filesystems manually, one at a time, so we can make
    900  1.1  pk 	# sure the mount points exist.
    901  1.1  pk 	# $1 is a file in fstab format
    902  1.1  pk 	local _fstab
    903  1.1  pk 
    904  1.1  pk 	_fstab=$1
    905  1.1  pk 
    906  1.1  pk 	( while read line; do
    907  1.1  pk 		_dev=`echo $line | awk '{print $1}'`
    908  1.1  pk 		_mp=`echo $line | awk '{print $2}'`
    909  1.1  pk 		_fstype=`echo $line | awk '{print $3}'`
    910  1.1  pk 		_opt=`echo $line | awk '{print $4}'`
    911  1.1  pk 
    912  1.1  pk 		# If not the root filesystem, make sure the mount
    913  1.1  pk 		# point is present.
    914  1.1  pk 		if [ "X{$_mp}" != X"/mnt" ]; then
    915  1.1  pk 			mkdir -p $_mp
    916  1.1  pk 		fi
    917  1.1  pk 
    918  1.1  pk 		# Mount the filesystem.  If the mount fails, exit
    919  1.1  pk 		# with an error condition to tell the outer
    920  1.1  pk 		# later to bail.
    921  1.1  pk 		if ! mount -v -t $_fstype -o $_opt $_dev $_mp ; then
    922  1.1  pk 			# error message displated by mount
    923  1.1  pk 			exit 1
    924  1.1  pk 		fi
    925  1.1  pk 	done ) < $_fstab
    926  1.1  pk 
    927  1.1  pk 	if [ "X${?}" != X"0" ]; then
    928  1.1  pk 		cat << \__mount_filesystems_1
    929  1.1  pk 
    930  1.1  pk FATAL ERROR:  Cannot mount filesystems.  Double-check your configuration
    931  1.1  pk and restart the installation process.
    932  1.1  pk __mount_filesystems_1
    933  1.1  pk 		exit
    934  1.1  pk 	fi
    935  1.1  pk }
    936  1.1  pk 
    937  1.1  pk unmount_fs()
    938  1.1  pk {
    939  1.1  pk 	# Unmount all filesystems and check their integrity.
    940  1.1  pk 	# $1 is a file in fstab format
    941  1.1  pk 	local _fstab
    942  1.1  pk 
    943  1.1  pk 	_fstab=$1
    944  1.1  pk 
    945  1.1  pk 	echo -n	"Syncing disks..."
    946  1.1  pk 	pid=`twiddle`
    947  1.1  pk 	sync; sleep 4; sync; sleep 2; sync; sleep 2
    948  1.1  pk 	kill $pid
    949  1.1  pk 	echo	"done."
    950  1.1  pk 
    951  1.1  pk 	(
    952  1.1  pk 		_devs=""
    953  1.1  pk 		_mps=""
    954  1.1  pk 		# maintain reverse order
    955  1.1  pk 		while read line; do
    956  1.1  pk 			_devs="`echo $line | awk '{print $1}'` ${_devs}"
    957  1.1  pk 			_mps="`echo $line | awk '{print $2}'` ${_mps}"
    958  1.1  pk 		done
    959  1.1  pk 		echo -n "Umounting filesystems... "
    960  1.1  pk 		for _mp in ${_mps}; do
    961  1.1  pk 			echo -n "${_mp} "
    962  1.1  pk 			umount ${_mp}
    963  1.1  pk 		done
    964  1.1  pk 		echo "Done."
    965  1.1  pk 
    966  1.1  pk 		echo "Checking filesystem integrity..."
    967  1.1  pk 		for _dev in ${_devs}; do
    968  1.1  pk 			echo  "${_dev}"
    969  1.1  pk 			fsck -f ${_dev}
    970  1.1  pk 		done
    971  1.1  pk 		echo "Done."
    972  1.1  pk 	) < $_fstab
    973  1.1  pk }
    974  1.1  pk 
    975  1.1  pk check_fs()
    976  1.1  pk {
    977  1.1  pk 	# Check filesystem integrity.
    978  1.1  pk 	# $1 is a file in fstab format
    979  1.1  pk 	local _fstab
    980  1.1  pk 
    981  1.1  pk 	_fstab=$1
    982  1.1  pk 
    983  1.1  pk 	(
    984  1.1  pk 		_devs=""
    985  1.1  pk 		_mps=""
    986  1.1  pk 		while read line; do
    987  1.1  pk 			_devs="`echo $line | awk '{print $1}'` ${_devs}"
    988  1.1  pk 			_mps="`echo $line | awk '{print $2}'` ${_mps}"
    989  1.1  pk 		done
    990  1.1  pk 
    991  1.1  pk 		echo "Checking filesystem integrity..."
    992  1.1  pk 		for _dev in ${_devs}; do
    993  1.1  pk 			echo  "${_dev}"
    994  1.1  pk 			fsck -f ${_dev}
    995  1.1  pk 		done
    996  1.1  pk 		echo "Done."
    997  1.1  pk 	) < $_fstab
    998  1.1  pk }
    999