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