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