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