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