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