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