install.sub revision 1.28 1 1.1 pk #!/bin/sh
2 1.28 is # $NetBSD: install.sub,v 1.28 1999/05/16 20:42:27 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.28 is local _m
377 1.8 pk
378 1.1 pk _interface_name=$1
379 1.16 pk _up=DOWN
380 1.16 pk if isin $_interface_name `ifconfig -l -u` ; then
381 1.16 pk _up=UP
382 1.16 pk fi
383 1.16 pk
384 1.16 pk _interface_supported_media=`ifconfig -m $_interface_name | sed -n '
385 1.16 pk 3s/supported media: //p'`
386 1.1 pk
387 1.8 pk set -- `ifconfig $_interface_name | sed -n '
388 1.16 pk 2s/media: \([^ ][^ ]*\).*/\1/p
389 1.16 pk 3s/inet//
390 1.16 pk 3s/--> [0-9.][0-9.]*//
391 1.16 pk 3s/netmask//
392 1.16 pk 3s/broadcast//
393 1.16 pk 3p'`
394 1.8 pk
395 1.19 pk if [ "$1" != "manual" ]; then
396 1.19 pk _interface_mediumtype=$1
397 1.19 pk fi
398 1.8 pk _interface_ip=$2
399 1.8 pk _interface_mask=$3
400 1.8 pk
401 1.1 pk # Get IP address
402 1.1 pk resp="" # force one iteration
403 1.1 pk while [ "X${resp}" = X"" ]; do
404 1.8 pk echo -n "IP address? [$_interface_ip] "
405 1.8 pk getresp "$_interface_ip"
406 1.1 pk _interface_ip=$resp
407 1.1 pk done
408 1.1 pk
409 1.1 pk # Get symbolic name
410 1.1 pk resp="" # force one iteration
411 1.1 pk while [ "X${resp}" = X"" ]; do
412 1.1 pk echo -n "Symbolic (host) name? "
413 1.1 pk getresp ""
414 1.1 pk _interface_symname=$resp
415 1.1 pk done
416 1.1 pk
417 1.1 pk # Get netmask
418 1.1 pk resp="" # force one iteration
419 1.1 pk while [ "X${resp}" = X"" ]; do
420 1.8 pk echo -n "Netmask? [$_interface_mask] "
421 1.8 pk getresp "$_interface_mask"
422 1.1 pk _interface_mask=$resp
423 1.1 pk done
424 1.1 pk
425 1.16 pk echo "Your network interface might require explicit selection"
426 1.16 pk echo "of the type of network medium attached. Supported media:"
427 1.16 pk echo " $_interface_supported_media."
428 1.16 pk echo -n "Additional media type arguments? [$_interface_mediumtype] "
429 1.16 pk getresp "$_interface_mediumtype"
430 1.28 is _m=""
431 1.16 pk if [ "X${resp}" != X"" ]; then
432 1.16 pk _interface_mediumtype=$resp
433 1.28 is _m="media ${resp}"
434 1.16 pk fi
435 1.16 pk
436 1.16 pk
437 1.15 gwr echo "Your network interface might require additional link-layer"
438 1.15 gwr echo "directives (like \`link0'). If this is the case you can enter"
439 1.15 gwr echo "these at the next prompt."
440 1.15 gwr echo ""
441 1.15 gwr echo -n "Additional link-layer arguments? [$_interface_extra] "
442 1.15 gwr getresp "$_interface_extra"
443 1.15 gwr if [ "X${resp}" != X"" ]; then
444 1.15 gwr _interface_extra=$resp
445 1.15 gwr fi
446 1.15 gwr
447 1.1 pk # Configure the interface. If it
448 1.1 pk # succeeds, add it to the permanent
449 1.1 pk # network configuration info.
450 1.8 pk if [ $_up != "UP" ]; then
451 1.8 pk ifconfig ${_interface_name} down
452 1.8 pk if ifconfig ${_interface_name} inet \
453 1.8 pk ${_interface_ip} \
454 1.28 is netmask ${_interface_mask} \
455 1.28 is ${_interface_extra} ${_m} up ; then
456 1.8 pk addifconfig \
457 1.28 is "${_interface_name}" \
458 1.28 is "${_interface_symname}" \
459 1.28 is "${_interface_ip}" \
460 1.28 is "${_interface_mask}" \
461 1.28 is "${_interface_mediumtype}" \
462 1.28 is "${_interface_extra}"
463 1.8 pk return 0
464 1.8 pk fi
465 1.8 pk else
466 1.8 pk echo "Interface ${_interface_name} is already active."
467 1.8 pk echo "Just saving configuration on new root filesystem."
468 1.1 pk addifconfig \
469 1.28 is "${_interface_name}" \
470 1.28 is "${_interface_symname}" \
471 1.28 is "${_interface_ip}" \
472 1.28 is "${_interface_mask}" \
473 1.28 is "${_interface_mediumtype}" \
474 1.28 is "${_interface_extra}"
475 1.1 pk fi
476 1.1 pk return 1
477 1.1 pk }
478 1.1 pk
479 1.1 pk # Much of this is gratuitously stolen from /etc/netstart.
480 1.1 pk enable_network() {
481 1.1 pk
482 1.1 pk # Set up the hostname.
483 1.1 pk if [ ! -f /mnt/etc/myname ]; then
484 1.1 pk echo "ERROR: no /etc/myname!"
485 1.1 pk return 1
486 1.1 pk fi
487 1.1 pk hostname=`cat /mnt/etc/myname`
488 1.1 pk hostname $hostname
489 1.1 pk
490 1.1 pk # configure all the interfaces which we know about.
491 1.16 pk if [ -f /mnt/etc/rc.conf ]; then
492 1.16 pk (
493 1.16 pk # assume network interface configuration style 1.2D and up
494 1.16 pk . /mnt/etc/rc.conf
495 1.16 pk
496 1.16 pk if [ "$net_interfaces" != NO ]; then
497 1.24 pk if [ "$auto_ifconfig" = YES ]; then
498 1.16 pk tmp="`ifconfig -l`"
499 1.16 pk else
500 1.16 pk tmp="$net_interfaces"
501 1.16 pk fi
502 1.16 pk echo -n "configuring network interfaces:"
503 1.16 pk for i in $tmp; do
504 1.16 pk eval `echo 'args=$ifconfig_'$i`
505 1.16 pk if [ ! -z "$args" ]; then
506 1.16 pk echo -n " $i"
507 1.16 pk ifconfig $i $args
508 1.16 pk elif [ -f /mnt/etc/ifconfig.$i ]; then
509 1.16 pk echo -n " $i"
510 1.16 pk (while read args; do
511 1.16 pk ifconfig $i $args
512 1.16 pk done) < /mnt/etc/ifconfig.$i
513 1.24 pk elif [ "$auto_ifconfig" != YES ]; then
514 1.16 pk echo
515 1.16 pk echo -n "/mnt/etc/ifconfig.$i missing"
516 1.16 pk echo -n "& ifconfig_$i not set"
517 1.16 pk echo "; interface $i can't be configured"
518 1.16 pk fi
519 1.16 pk done
520 1.16 pk echo "."
521 1.16 pk fi
522 1.16 pk )
523 1.16 pk else
524 1.1 pk (
525 1.1 pk tmp="$IFS"
526 1.1 pk IFS="$IFS."
527 1.1 pk set -- `echo /mnt/etc/hostname*`
528 1.1 pk IFS=$tmp
529 1.1 pk unset tmp
530 1.1 pk
531 1.1 pk while [ $# -ge 2 ] ; do
532 1.1 pk shift # get rid of "hostname"
533 1.1 pk (
534 1.1 pk read af name mask bcaddr extras
535 1.1 pk read dt dtaddr
536 1.1 pk
537 1.1 pk if [ ! -n "$name" ]; then
538 1.1 pk echo "/etc/hostname.$1: invalid network configuration file"
539 1.1 pk exit
540 1.1 pk fi
541 1.1 pk
542 1.1 pk cmd="ifconfig $1 $af $name "
543 1.1 pk if [ "${dt}" = "dest" ]; then cmd="$cmd $dtaddr"; fi
544 1.1 pk if [ -n "$mask" ]; then cmd="$cmd netmask $mask"; fi
545 1.1 pk if [ -n "$bcaddr" -a "X$bcaddr" != "XNONE" ]; then
546 1.1 pk cmd="$cmd broadcast $bcaddr";
547 1.1 pk fi
548 1.1 pk cmd="$cmd $extras"
549 1.1 pk
550 1.1 pk $cmd
551 1.1 pk ) < /mnt/etc/hostname.$1
552 1.1 pk shift
553 1.1 pk done
554 1.1 pk )
555 1.16 pk fi
556 1.1 pk
557 1.1 pk # set the address for the loopback interface
558 1.1 pk ifconfig lo0 inet localhost
559 1.1 pk
560 1.1 pk # use loopback, not the wire
561 1.1 pk route add $hostname localhost
562 1.1 pk
563 1.1 pk # /etc/mygate, if it exists, contains the name of my gateway host
564 1.1 pk # that name must be in /etc/hosts.
565 1.1 pk if [ -f /mnt/etc/mygate ]; then
566 1.1 pk route delete default > /dev/null 2>&1
567 1.1 pk route add default `cat /mnt/etc/mygate`
568 1.1 pk fi
569 1.1 pk
570 1.1 pk # enable the resolver, if appropriate.
571 1.1 pk if [ -f /mnt/etc/resolv.conf ]; then
572 1.1 pk _resolver_enabled="TRUE"
573 1.1 pk cp /mnt/etc/resolv.conf /tmp/resolv.conf.shadow
574 1.1 pk fi
575 1.1 pk
576 1.1 pk # Display results...
577 1.1 pk echo "Network interface configuration:"
578 1.1 pk ifconfig -a
579 1.1 pk
580 1.1 pk echo ""
581 1.1 pk
582 1.1 pk if [ "X${_resolver_enabled}" = X"TRUE" ]; then
583 1.1 pk netstat -r
584 1.1 pk echo ""
585 1.1 pk echo "Resolver enabled."
586 1.1 pk else
587 1.1 pk netstat -rn
588 1.1 pk echo ""
589 1.1 pk echo "Resolver not enabled."
590 1.1 pk fi
591 1.1 pk
592 1.1 pk return 0
593 1.1 pk }
594 1.1 pk
595 1.1 pk install_ftp() {
596 1.21 leo local _f
597 1.21 leo local _sets
598 1.21 leo local _next
599 1.21 leo
600 1.21 leo # Build a script to extract valid files from a list
601 1.21 leo # of filenames on stdin.
602 1.21 leo # XXX : Can we use this on more places? Leo.
603 1.21 leo
604 1.21 leo echo "#!/bin/sh" > /tmp/fname_filter.sh
605 1.21 leo echo "while read line; do" >> /tmp/fname_filter.sh
606 1.21 leo echo " case \$line in" >> /tmp/fname_filter.sh
607 1.21 leo for _f in $THESETS; do
608 1.21 leo echo " $_f.tar.gz|$_f.tgz|$_f.${VERSION}.aa)" \
609 1.21 leo >> /tmp/fname_filter.sh
610 1.21 leo echo ' echo -n "$line ";;' \
611 1.21 leo >> /tmp/fname_filter.sh
612 1.21 leo done
613 1.21 leo echo " *) ;;" >> /tmp/fname_filter.sh
614 1.21 leo echo " esac" >> /tmp/fname_filter.sh
615 1.21 leo echo "done" >> /tmp/fname_filter.sh
616 1.21 leo
617 1.1 pk # Get several parameters from the user, and create
618 1.1 pk # a shell script that directs the appropriate
619 1.1 pk # commands into ftp.
620 1.1 pk cat << \__install_ftp_1
621 1.1 pk
622 1.1 pk This is an automated ftp-based installation process. You will be asked
623 1.1 pk several questions. The correct set of commands will be placed in a script
624 1.1 pk that will be fed to ftp(1).
625 1.1 pk
626 1.1 pk __install_ftp_1
627 1.1 pk # Get server IP address
628 1.1 pk resp="" # force one iteration
629 1.1 pk while [ "X${resp}" = X"" ]; do
630 1.1 pk echo -n "Server IP? [${_ftp_server_ip}] "
631 1.1 pk getresp "${_ftp_server_ip}"
632 1.1 pk _ftp_server_ip=$resp
633 1.1 pk done
634 1.1 pk
635 1.1 pk # Get login name
636 1.1 pk resp="" # force one iteration
637 1.1 pk while [ "X${resp}" = X"" ]; do
638 1.1 pk echo -n "Login? [${_ftp_server_login}] "
639 1.1 pk getresp "${_ftp_server_login}"
640 1.1 pk _ftp_server_login=$resp
641 1.1 pk done
642 1.1 pk
643 1.1 pk # Get password
644 1.1 pk resp="" # force one iteration
645 1.1 pk while [ "X${resp}" = X"" ]; do
646 1.16 pk echo -n "Password? "
647 1.16 pk stty -echo
648 1.16 pk getresp ""
649 1.16 pk echo ""
650 1.16 pk stty echo
651 1.1 pk _ftp_server_password=$resp
652 1.1 pk done
653 1.1 pk
654 1.1 pk cat << \__install_ftp_2
655 1.1 pk
656 1.21 leo You will be asked to enter the name of the directory that contains the
657 1.21 leo installation sets. When you enter a '?' you will see a listing of the
658 1.21 leo current directory on the server.
659 1.21 leo __install_ftp_2
660 1.21 leo _sets=""
661 1.21 leo while [ -z "$_sets" ]
662 1.21 leo do
663 1.21 leo resp="" # force one iteration
664 1.21 leo while [ "X${resp}" = X"" ]; do
665 1.21 leo echo -n "Server directory? [${_ftp_server_dir}] "
666 1.21 leo getresp "${_ftp_server_dir}"
667 1.21 leo if [ "X$resp" = 'X?' -a -z "$_ftp_server_dir" ]; then
668 1.21 leo resp=""
669 1.21 leo fi
670 1.21 leo done
671 1.21 leo if [ $resp != '?' ]; then
672 1.21 leo _ftp_server_dir=$resp
673 1.21 leo fi
674 1.21 leo
675 1.21 leo # Build the basics of an ftp-script...
676 1.21 leo echo "#!/bin/sh" > /tmp/ftp-script.sh
677 1.21 leo echo "cd /mnt" >> /tmp/ftp-script.sh
678 1.26 is echo "ftp -e -i -n $_ftp_server_ip << \__end_commands" >> \
679 1.21 leo /tmp/ftp-script.sh
680 1.21 leo echo "user $_ftp_server_login $_ftp_server_password" >> \
681 1.21 leo /tmp/ftp-script.sh
682 1.21 leo echo "bin" >> /tmp/ftp-script.sh
683 1.21 leo echo "cd $_ftp_server_dir" >> /tmp/ftp-script.sh
684 1.21 leo
685 1.21 leo # Make a copy of this script that lists the directory
686 1.21 leo # contents, and use that to determine the files to get.
687 1.21 leo cat /tmp/ftp-script.sh > /tmp/ftp-dir.sh
688 1.21 leo echo "ls" >> /tmp/ftp-dir.sh
689 1.21 leo echo "quit" >> /tmp/ftp-dir.sh
690 1.21 leo echo "__end_commands" >> /tmp/ftp-dir.sh
691 1.21 leo
692 1.21 leo if [ $resp = '?' ]; then
693 1.21 leo sh /tmp/ftp-dir.sh
694 1.21 leo else
695 1.21 leo _sets=`sh /tmp/ftp-dir.sh | sh /tmp/fname_filter.sh`
696 1.21 leo fi
697 1.21 leo done
698 1.21 leo rm -f /tmp/ftp-dir.sh /tmp/fname_filter.sh
699 1.21 leo
700 1.21 leo while : ; do
701 1.21 leo echo "The following sets are available for extraction:"
702 1.27 is echo "(marked sets are already on the extraction list)"
703 1.21 leo echo ""
704 1.1 pk
705 1.21 leo _next=""
706 1.21 leo for _f in $_sets ; do
707 1.21 leo if isin $_f $_setsdone; then
708 1.21 leo echo -n "[X] "
709 1.21 leo _next=""
710 1.21 leo else
711 1.21 leo echo -n " "
712 1.21 leo if [ -z "$_next" ]; then _next=$_f; fi
713 1.21 leo fi
714 1.21 leo echo $_f
715 1.21 leo done
716 1.21 leo echo ""
717 1.1 pk
718 1.21 leo # Get name of the file and add extraction command
719 1.21 leo # to the ftp-script.
720 1.21 leo if [ "X$_next" = "X" ]; then resp=n; else resp=y; fi
721 1.21 leo echo -n "Continue to add filenames [$resp]? "
722 1.21 leo getresp "$resp"
723 1.21 leo if [ "$resp" = "n" ]; then
724 1.1 pk break
725 1.1 pk fi
726 1.1 pk
727 1.21 leo echo -n "File name [$_next]? "
728 1.21 leo getresp "$_next"
729 1.21 leo if isin $resp $_sets; then
730 1.25 garbled echo "get $resp |\"pax -zrvpe\"" >> \
731 1.21 leo /tmp/ftp-script.sh
732 1.21 leo _setsdone="$resp $_setsdone"
733 1.21 leo else
734 1.21 leo echo "You entered an invalid filename."
735 1.21 leo echo ""
736 1.21 leo fi
737 1.1 pk done
738 1.1 pk
739 1.1 pk echo "quit" >> /tmp/ftp-script.sh
740 1.1 pk echo "__end_commands" >> /tmp/ftp-script.sh
741 1.1 pk
742 1.1 pk sh /tmp/ftp-script.sh
743 1.1 pk rm -f /tmp/ftp-script.sh
744 1.1 pk echo "Extraction complete."
745 1.1 pk }
746 1.1 pk
747 1.11 pk install_from_mounted_fs() {
748 1.13 pk # $1 - directory containing installation sets
749 1.1 pk local _filename
750 1.13 pk local _sets
751 1.12 pk local _next
752 1.1 pk local _f
753 1.18 is local _dirname
754 1.1 pk
755 1.18 is _dirname=$1
756 1.13 pk _sets=""
757 1.20 is
758 1.20 is echo ""
759 1.20 is echo "The directory at the mount point, \"${_dirname}\", contains: "
760 1.20 is echo ""
761 1.20 is ls -F ${_dirname}
762 1.20 is echo ""
763 1.20 is echo "Enter the subdirectory relative to the mountpoint, that"
764 1.20 is echo -n "contains the savesets: [try this directory] "
765 1.20 is getresp ""
766 1.20 is if [ "X${resp}" != "X" ]; then
767 1.20 is _dirname=${_dirname}/$resp
768 1.20 is fi
769 1.20 is
770 1.18 is while ! dir_has_sets ${_dirname} $THESETS; do
771 1.18 is echo ""
772 1.18 is echo -n "There are no NetBSD install sets available in "
773 1.18 is echo "\"${_dirname}\"."
774 1.18 is echo "\"${_dirname}\" contains: "
775 1.18 is echo ""
776 1.18 is ls -F ${_dirname}
777 1.18 is echo ""
778 1.18 is echo -n "Enter subdirectory: [try other install media] "
779 1.18 is getresp ""
780 1.18 is if [ "X${resp}" = "X" ]; then
781 1.18 is return
782 1.18 is fi
783 1.18 is if [ ! -d ${_dirname}/${resp} ]; then
784 1.18 is echo "\"${resp}\" is no directory; try again."
785 1.18 is else
786 1.18 is _dirname=${_dirname}/$resp
787 1.18 is fi
788 1.18 is done
789 1.18 is
790 1.18 is for _f in $THESETS ; do
791 1.18 is if [ -f ${_dirname}/${_f}.tar.gz ]; then
792 1.18 is _sets="$_sets ${_f}.tar.gz"
793 1.18 is elif [ -f ${_dirname}/${_f}.tgz ]; then
794 1.18 is _sets="$_sets ${_f}.tgz"
795 1.18 is elif [ -f ${_dirname}/${_f}${VERSION}.aa ]; then
796 1.18 is _sets="$_sets ${_f}${VERSION}"
797 1.18 is fi
798 1.18 is done
799 1.1 pk
800 1.1 pk while : ; do
801 1.1 pk echo "The following sets are available for extraction:"
802 1.1 pk echo "(marked sets have already been extracted)"
803 1.1 pk echo ""
804 1.1 pk
805 1.12 pk _next=""
806 1.1 pk for _f in $_sets ; do
807 1.1 pk if isin $_f $_setsdone; then
808 1.1 pk echo -n "[X] "
809 1.12 pk _next=""
810 1.1 pk else
811 1.1 pk echo -n " "
812 1.12 pk if [ -z "$_next" ]; then _next=$_f; fi
813 1.1 pk fi
814 1.1 pk echo $_f
815 1.1 pk done
816 1.1 pk echo ""
817 1.1 pk
818 1.1 pk # Get the name of the file.
819 1.12 pk if [ "X$_next" = "X" ]; then resp=n; else resp=y; fi
820 1.1 pk echo -n "Continue extraction [$resp]?"
821 1.1 pk getresp "$resp"
822 1.1 pk if [ "$resp" = "n" ]; then
823 1.1 pk break
824 1.1 pk fi
825 1.1 pk
826 1.12 pk echo -n "File name [$_next]? "
827 1.12 pk getresp "$_next"
828 1.1 pk _f=$resp
829 1.18 is _filename="/${_dirname}/$_f"
830 1.1 pk
831 1.1 pk # Ensure file exists
832 1.1 pk if [ ! -f $_filename ]; then
833 1.18 is if [ -f ${_filename}.aa ]; then
834 1.18 is _filename=${_filename}.\?\?
835 1.18 is else
836 1.18 is echo "File $_filename does not exist. Check to make"
837 1.18 is echo "sure you entered the information properly."
838 1.18 is continue
839 1.18 is fi
840 1.1 pk fi
841 1.1 pk
842 1.1 pk # Extract file
843 1.25 garbled cat $_filename | (cd /mnt; pax -zrvpe)
844 1.1 pk echo "Extraction complete."
845 1.1 pk _setsdone="$_f $_setsdone"
846 1.1 pk
847 1.1 pk done
848 1.1 pk }
849 1.1 pk
850 1.1 pk install_cdrom() {
851 1.5 pk local _drive
852 1.6 leo local _partition_range
853 1.5 pk local _partition
854 1.5 pk local _fstype
855 1.5 pk local _directory
856 1.5 pk
857 1.1 pk # Get the cdrom device info
858 1.1 pk cat << \__install_cdrom_1
859 1.1 pk
860 1.1 pk The following CD-ROM devices are installed on your system; please select
861 1.6 leo the CD-ROM device containing the partition with the installation sets:
862 1.1 pk
863 1.1 pk __install_cdrom_1
864 1.1 pk _CDDEVS=`md_get_cddevs`
865 1.1 pk echo "$_CDDEVS"
866 1.1 pk echo ""
867 1.1 pk echo -n "Which is the CD-ROM with the installation media? [abort] "
868 1.1 pk getresp "abort"
869 1.1 pk case "$resp" in
870 1.1 pk abort)
871 1.1 pk echo "Aborting."
872 1.1 pk return
873 1.1 pk ;;
874 1.1 pk
875 1.1 pk *)
876 1.1 pk if isin $resp $_CDDEVS ; then
877 1.5 pk _drive=$resp
878 1.1 pk else
879 1.1 pk echo ""
880 1.1 pk echo "The CD-ROM $resp does not exist."
881 1.1 pk echo "Aborting."
882 1.1 pk return
883 1.1 pk fi
884 1.1 pk ;;
885 1.1 pk esac
886 1.1 pk
887 1.1 pk # Get partition
888 1.6 leo _partition_range=`md_get_partition_range`
889 1.1 pk resp="" # force one iteration
890 1.1 pk while [ "X${resp}" = X"" ]; do
891 1.17 is echo -n "Partition? [a] "
892 1.17 is getresp "a"
893 1.1 pk case "$resp" in
894 1.6 leo $_partition_range)
895 1.5 pk _partition=$resp
896 1.1 pk ;;
897 1.1 pk
898 1.1 pk *)
899 1.1 pk echo "Invalid response: $resp"
900 1.1 pk resp="" # force loop to repeat
901 1.1 pk ;;
902 1.1 pk esac
903 1.1 pk done
904 1.1 pk
905 1.1 pk # Ask for filesystem type
906 1.1 pk cat << \__install_cdrom_2
907 1.1 pk
908 1.1 pk There are two CD-ROM filesystem types currently supported by this program:
909 1.1 pk 1) ISO-9660 (cd9660)
910 1.1 pk 2) Berkeley Fast Filesystem (ffs)
911 1.1 pk
912 1.1 pk __install_cdrom_2
913 1.1 pk resp="" # force one iteration
914 1.1 pk while [ "X${resp}" = X"" ]; do
915 1.1 pk echo -n "Which filesystem type? [cd9660] "
916 1.1 pk getresp "cd9660"
917 1.1 pk case "$resp" in
918 1.1 pk cd9660|ffs)
919 1.5 pk _fstype=$resp
920 1.1 pk ;;
921 1.1 pk
922 1.1 pk *)
923 1.1 pk echo "Invalid response: $resp"
924 1.1 pk resp="" # force loop to repeat
925 1.1 pk ;;
926 1.1 pk esac
927 1.1 pk done
928 1.1 pk
929 1.1 pk # Mount the CD-ROM
930 1.17 is if ! mount -t ${_fstype} -o ro \
931 1.5 pk /dev/${_drive}${_partition} /mnt2 ; then
932 1.1 pk echo "Cannot mount CD-ROM drive. Aborting."
933 1.1 pk return
934 1.1 pk fi
935 1.1 pk
936 1.20 is install_from_mounted_fs /mnt2
937 1.5 pk umount -f /mnt2 > /dev/null 2>&1
938 1.5 pk }
939 1.5 pk
940 1.14 leo mount_a_disk() {
941 1.14 leo # Mount a disk on /mnt2. The set of disk devices to choose from
942 1.14 leo # is $_DKDEVS.
943 1.14 leo # returns 0 on failure.
944 1.14 leo
945 1.5 pk local _drive
946 1.6 leo local _partition_range
947 1.5 pk local _partition
948 1.5 pk local _fstype
949 1.5 pk local _fsopts
950 1.5 pk local _directory
951 1.5 pk local _md_fstype
952 1.5 pk local _md_fsopts
953 1.5 pk
954 1.5 pk getresp "abort"
955 1.5 pk case "$resp" in
956 1.5 pk abort)
957 1.5 pk echo "Aborting."
958 1.14 leo return 0
959 1.5 pk ;;
960 1.5 pk
961 1.5 pk *)
962 1.5 pk if isin $resp $_DKDEVS ; then
963 1.5 pk _drive=$resp
964 1.5 pk else
965 1.5 pk echo ""
966 1.5 pk echo "The disk $resp does not exist."
967 1.5 pk echo "Aborting."
968 1.14 leo return 0
969 1.5 pk fi
970 1.5 pk ;;
971 1.5 pk esac
972 1.5 pk
973 1.5 pk # Get partition
974 1.6 leo _partition_range=`md_get_partition_range`
975 1.5 pk resp="" # force one iteration
976 1.5 pk while [ "X${resp}" = X"" ]; do
977 1.5 pk echo -n "Partition? [d] "
978 1.5 pk getresp "d"
979 1.5 pk case "$resp" in
980 1.6 leo $_partition_range)
981 1.5 pk _partition=$resp
982 1.5 pk ;;
983 1.5 pk
984 1.5 pk *)
985 1.5 pk echo "Invalid response: $resp"
986 1.5 pk resp="" # force loop to repeat
987 1.5 pk ;;
988 1.5 pk esac
989 1.5 pk done
990 1.5 pk
991 1.5 pk # Ask for filesystem type
992 1.14 leo cat << \__mount_a_disk_2
993 1.5 pk
994 1.5 pk The following filesystem types are supported:
995 1.5 pk 1) ffs
996 1.14 leo __mount_a_disk_2
997 1.5 pk _md_fstype=`md_native_fstype`
998 1.5 pk _md_fsopts=`md_native_fsopts`
999 1.5 pk if [ ! -z "$_md_fstype" ]; then
1000 1.5 pk echo " 2) $_md_fstype"
1001 1.5 pk else
1002 1.5 pk _md_fstype="_undefined_"
1003 1.5 pk fi
1004 1.5 pk resp="" # force one iteration
1005 1.5 pk while [ "X${resp}" = X"" ]; do
1006 1.5 pk echo -n "Which filesystem type? [ffs] "
1007 1.5 pk getresp "ffs"
1008 1.5 pk case "$resp" in
1009 1.5 pk ffs)
1010 1.5 pk _fstype=$resp
1011 1.5 pk _fsopts="ro"
1012 1.5 pk ;;
1013 1.5 pk $_md_fstype)
1014 1.5 pk _fstype=$resp
1015 1.5 pk _fsopts=$_md_fsopts
1016 1.5 pk ;;
1017 1.5 pk *)
1018 1.5 pk echo "Invalid response: $resp"
1019 1.5 pk resp="" # force loop to repeat
1020 1.5 pk ;;
1021 1.5 pk esac
1022 1.5 pk done
1023 1.5 pk
1024 1.5 pk # Mount the disk
1025 1.5 pk if ! mount -t ${_fstype} -o $_fsopts \
1026 1.5 pk /dev/${_drive}${_partition} /mnt2 ; then
1027 1.5 pk echo "Cannot mount disk. Aborting."
1028 1.14 leo return 0
1029 1.14 leo fi
1030 1.14 leo return 1
1031 1.14 leo }
1032 1.14 leo
1033 1.14 leo install_disk() {
1034 1.14 leo local _directory
1035 1.14 leo
1036 1.14 leo cat << \__install_disk_1
1037 1.14 leo
1038 1.14 leo The following disk devices are installed on your system; please select
1039 1.14 leo the disk device containing the partition with the installation sets:
1040 1.14 leo
1041 1.14 leo __install_disk_1
1042 1.14 leo _DKDEVS=`md_get_diskdevs`
1043 1.14 leo echo "$_DKDEVS"
1044 1.14 leo echo ""
1045 1.14 leo echo -n "Which is the disk with the installation sets? [abort] "
1046 1.14 leo
1047 1.14 leo if mount_a_disk ; then
1048 1.5 pk return
1049 1.5 pk fi
1050 1.5 pk
1051 1.20 is install_from_mounted_fs /mnt2
1052 1.1 pk umount -f /mnt2 > /dev/null 2>&1
1053 1.1 pk }
1054 1.1 pk
1055 1.1 pk install_nfs() {
1056 1.1 pk # Get the IP address of the server
1057 1.1 pk resp="" # force one iteration
1058 1.1 pk while [ "X${resp}" = X"" ]; do
1059 1.1 pk echo -n "Server IP address? [${_nfs_server_ip}] "
1060 1.1 pk getresp "${_nfs_server_ip}"
1061 1.1 pk done
1062 1.1 pk _nfs_server_ip=$resp
1063 1.1 pk
1064 1.1 pk # Get server path to mount
1065 1.1 pk resp="" # force one iteration
1066 1.1 pk while [ "X${resp}" = X"" ]; do
1067 1.1 pk echo -n "Filesystem on server to mount? [${_nfs_server_path}] "
1068 1.1 pk getresp "${_nfs_server_path}"
1069 1.1 pk done
1070 1.1 pk _nfs_server_path=$resp
1071 1.1 pk
1072 1.1 pk # Determine use of TCP
1073 1.1 pk echo -n "Use TCP transport (only works with capable NFS server)? [n] "
1074 1.1 pk getresp "n"
1075 1.1 pk case "$resp" in
1076 1.1 pk y*|Y*)
1077 1.1 pk _nfs_tcp="-T"
1078 1.1 pk ;;
1079 1.1 pk
1080 1.1 pk *)
1081 1.1 pk _nfs_tcp=""
1082 1.1 pk ;;
1083 1.1 pk esac
1084 1.1 pk
1085 1.1 pk # Mount the server
1086 1.1 pk mkdir /mnt2 > /dev/null 2>&1
1087 1.1 pk if ! mount_nfs $_nfs_tcp ${_nfs_server_ip}:${_nfs_server_path} \
1088 1.1 pk /mnt2 ; then
1089 1.1 pk echo "Cannot mount NFS server. Aborting."
1090 1.1 pk return
1091 1.1 pk fi
1092 1.1 pk
1093 1.20 is install_from_mounted_fs /mnt2
1094 1.1 pk umount -f /mnt2 > /dev/null 2>&1
1095 1.1 pk }
1096 1.1 pk
1097 1.1 pk install_tape() {
1098 1.11 pk local _xcmd
1099 1.11 pk
1100 1.1 pk # Get the name of the tape from the user.
1101 1.1 pk cat << \__install_tape_1
1102 1.1 pk
1103 1.1 pk The installation program needs to know which tape device to use. Make
1104 1.1 pk sure you use a "no rewind on close" device.
1105 1.1 pk
1106 1.1 pk __install_tape_1
1107 1.1 pk _tape=`basename $TAPE`
1108 1.1 pk resp="" # force one iteration
1109 1.1 pk while [ "X${resp}" = X"" ]; do
1110 1.1 pk echo -n "Name of tape device? [${_tape}]"
1111 1.1 pk getresp "${_tape}"
1112 1.1 pk done
1113 1.1 pk _tape=`basename $resp`
1114 1.1 pk TAPE="/dev/${_tape}"
1115 1.1 pk if [ ! -c $TAPE ]; then
1116 1.1 pk echo "$TAPE does not exist or is not a character special file."
1117 1.1 pk echo "Aborting."
1118 1.1 pk return
1119 1.1 pk fi
1120 1.1 pk export TAPE
1121 1.1 pk
1122 1.1 pk # Rewind the tape device
1123 1.1 pk echo -n "Rewinding tape..."
1124 1.1 pk if ! mt rewind ; then
1125 1.1 pk echo "$TAPE may not be attached to the system or may not be"
1126 1.1 pk echo "a tape device. Aborting."
1127 1.1 pk return
1128 1.1 pk fi
1129 1.1 pk echo "done."
1130 1.1 pk
1131 1.1 pk # Get the file number
1132 1.1 pk resp="" # force one iteration
1133 1.1 pk while [ "X${resp}" = X"" ]; do
1134 1.1 pk echo -n "File number? "
1135 1.1 pk getresp ""
1136 1.1 pk case "$resp" in
1137 1.1 pk [1-9]*)
1138 1.1 pk _nskip=`expr $resp - 1`
1139 1.1 pk ;;
1140 1.1 pk
1141 1.1 pk *)
1142 1.1 pk echo "Invalid file number ${resp}."
1143 1.1 pk resp="" # fore loop to repeat
1144 1.1 pk ;;
1145 1.1 pk esac
1146 1.1 pk done
1147 1.1 pk
1148 1.1 pk # Skip to correct file.
1149 1.1 pk echo -n "Skipping to source file..."
1150 1.1 pk if [ "X${_nskip}" != X"0" ]; then
1151 1.1 pk if ! mt fsf $_nskip ; then
1152 1.1 pk echo "Could not skip $_nskip files. Aborting."
1153 1.1 pk return
1154 1.1 pk fi
1155 1.1 pk fi
1156 1.1 pk echo "done."
1157 1.1 pk
1158 1.1 pk cat << \__install_tape_2
1159 1.1 pk
1160 1.1 pk There are 2 different ways the file can be stored on tape:
1161 1.1 pk
1162 1.1 pk 1) an image of a gzipped tar file
1163 1.1 pk 2) a standard tar image
1164 1.1 pk
1165 1.1 pk __install_tape_2
1166 1.1 pk resp="" # force one iteration
1167 1.1 pk while [ "X${resp}" = X"" ]; do
1168 1.1 pk echo -n "Which way is it? [1] "
1169 1.1 pk getresp "1"
1170 1.1 pk case "$resp" in
1171 1.11 pk 1)
1172 1.25 garbled _xcmd="pax -zrvpe"
1173 1.11 pk ;;
1174 1.1 pk
1175 1.11 pk 2)
1176 1.25 garbled _xcmd="tar -rvpe"
1177 1.11 pk ;;
1178 1.1 pk
1179 1.11 pk *)
1180 1.11 pk echo "Invalid response: $resp."
1181 1.11 pk resp="" # force loop to repeat
1182 1.11 pk ;;
1183 1.1 pk esac
1184 1.11 pk ( cd /mnt; dd if=$TAPE | $_xcmd )
1185 1.1 pk done
1186 1.1 pk echo "Extraction complete."
1187 1.1 pk }
1188 1.1 pk
1189 1.1 pk get_timezone() {
1190 1.1 pk local _a
1191 1.6 leo local _zonepath
1192 1.6 leo
1193 1.6 leo #
1194 1.6 leo # If the zoneinfo is not on the installation medium or on the
1195 1.6 leo # installed filesystem, set TZ to GMT and return immediatly.
1196 1.6 leo #
1197 1.9 pk if [ ! -e /usr/share/zoneinfo -a ! -e /mnt/usr/share/zoneinfo ]; then
1198 1.6 leo TZ=GMT
1199 1.6 leo return
1200 1.6 leo fi
1201 1.6 leo if [ ! -d /usr/share/zoneinfo ]; then
1202 1.6 leo _zonepath=/mnt
1203 1.6 leo else
1204 1.6 leo _zonepath=""
1205 1.6 leo fi
1206 1.6 leo
1207 1.1 pk cat << \__get_timezone_1
1208 1.1 pk
1209 1.1 pk Select a time zone for your location. Timezones are represented on the
1210 1.1 pk system by a directory structure rooted in "/usr/share/timezone". Most
1211 1.1 pk timezones can be selected by entering a token like "MET" or "GMT-6".
1212 1.1 pk Other zones are grouped by continent, with detailed zone information
1213 1.1 pk separated by a slash ("/"), e.g. "US/Pacific".
1214 1.1 pk
1215 1.1 pk To get a listing of what's available in /usr/share/zoneinfo, enter "?"
1216 1.1 pk at the prompts below.
1217 1.1 pk
1218 1.1 pk __get_timezone_1
1219 1.1 pk if [ X$TZ = X ]; then
1220 1.13 pk TZ=`ls -l /mnt/etc/localtime 2>/dev/null | cutlast`
1221 1.3 pk TZ=${TZ#/usr/share/zoneinfo/}
1222 1.1 pk fi
1223 1.1 pk while :; do
1224 1.1 pk echo -n "What timezone are you in [\`?' for list] [$TZ]? "
1225 1.1 pk getresp "$TZ"
1226 1.1 pk case "$resp" in
1227 1.1 pk "")
1228 1.1 pk echo "Timezone defaults to GMT"
1229 1.1 pk TZ="GMT"
1230 1.1 pk break;
1231 1.1 pk ;;
1232 1.1 pk "?")
1233 1.6 leo ls ${_zonepath}/usr/share/zoneinfo
1234 1.1 pk ;;
1235 1.1 pk *)
1236 1.1 pk _a=$resp
1237 1.6 leo while [ -d ${_zonepath}/usr/share/zoneinfo/$_a ]; do
1238 1.1 pk echo -n "There are several timezones available"
1239 1.1 pk echo " within zone '$_a'"
1240 1.1 pk echo -n "Select a sub-timezone [\`?' for list]: "
1241 1.1 pk getresp ""
1242 1.1 pk case "$resp" in
1243 1.6 leo "?") ls ${_zonepath}/usr/share/zoneinfo/$_a ;;
1244 1.1 pk *) _a=${_a}/${resp}
1245 1.6 leo if [ -f ${_zonepath}/usr/share/zoneinfo/$_a ]; then
1246 1.1 pk break;
1247 1.1 pk fi
1248 1.1 pk ;;
1249 1.1 pk esac
1250 1.1 pk done
1251 1.6 leo if [ -f ${_zonepath}/usr/share/zoneinfo/$_a ]; then
1252 1.1 pk TZ="$_a"
1253 1.1 pk echo "You have selected timezone \"$_a\"".
1254 1.1 pk break 2
1255 1.1 pk fi
1256 1.1 pk echo "'/usr/share/zoneinfo/$_a' is not a valid timezone on this system."
1257 1.1 pk ;;
1258 1.1 pk esac
1259 1.1 pk done
1260 1.1 pk }
1261 1.1 pk
1262 1.1 pk install_sets()
1263 1.1 pk {
1264 1.13 pk local _yup
1265 1.13 pk _yup="FALSE"
1266 1.13 pk
1267 1.13 pk # Ask the user which media to load the distribution from.
1268 1.13 pk cat << \__install_sets_1
1269 1.1 pk
1270 1.1 pk It is now time to extract the installation sets onto the hard disk.
1271 1.10 thorpej Make sure the sets are either on a local device (i.e. tape, CD-ROM) or on a
1272 1.1 pk network server.
1273 1.1 pk
1274 1.1 pk __install_sets_1
1275 1.13 pk
1276 1.13 pk if [ "X$local_sets_dir" != "X" ]; then
1277 1.13 pk install_from_mounted_fs ${local_sets_dir}
1278 1.13 pk if [ X"$_setsdone" != X ]; then
1279 1.13 pk _yup="TRUE"
1280 1.13 pk fi
1281 1.13 pk fi
1282 1.13 pk
1283 1.13 pk # Go on prodding for alternate locations
1284 1.13 pk resp="" # force at least one iteration
1285 1.13 pk while [ X"${resp}" = X ]; do
1286 1.13 pk # If _yup is not FALSE, it means that we extracted sets above.
1287 1.13 pk # If that's the case, bypass the menu the first time.
1288 1.13 pk if [ X"$_yup" = X"FALSE" ]; then
1289 1.13 pk echo -n "Install from (f)tp, (t)ape, (C)D-ROM, (N)FS"
1290 1.13 pk echo -n " or local (d)isk? "
1291 1.13 pk getresp ""
1292 1.1 pk case "$resp" in
1293 1.13 pk d*|D*)
1294 1.13 pk install_disk
1295 1.13 pk ;;
1296 1.13 pk f*|F*)
1297 1.13 pk install_ftp
1298 1.13 pk ;;
1299 1.13 pk t*|T*)
1300 1.13 pk install_tape
1301 1.13 pk ;;
1302 1.13 pk c*|C*)
1303 1.13 pk install_cdrom
1304 1.13 pk ;;
1305 1.13 pk n*|N*)
1306 1.13 pk install_nfs
1307 1.1 pk ;;
1308 1.1 pk *)
1309 1.13 pk echo "Invalid response: $resp"
1310 1.13 pk resp=""
1311 1.1 pk ;;
1312 1.1 pk esac
1313 1.13 pk else
1314 1.13 pk _yup="FALSE" # So we'll ask next time
1315 1.13 pk fi
1316 1.1 pk
1317 1.13 pk # Give the user the opportunity to extract more sets. They
1318 1.13 pk # don't necessarily have to come from the same media.
1319 1.13 pk echo ""
1320 1.13 pk echo -n "Extract more sets? [n] "
1321 1.13 pk getresp "n"
1322 1.1 pk case "$resp" in
1323 1.13 pk y*|Y*)
1324 1.13 pk # Force loop to repeat
1325 1.13 pk resp=""
1326 1.1 pk ;;
1327 1.1 pk
1328 1.1 pk *)
1329 1.1 pk ;;
1330 1.1 pk esac
1331 1.13 pk done
1332 1.1 pk }
1333 1.1 pk
1334 1.1 pk munge_fstab()
1335 1.1 pk {
1336 1.1 pk local _fstab
1337 1.1 pk local _fstab_shadow
1338 1.5 pk local _dev
1339 1.5 pk local _mp
1340 1.7 leo local _fstype
1341 1.5 pk local _rest
1342 1.6 leo
1343 1.1 pk # Now that the 'real' fstab is configured, we munge it into a 'shadow'
1344 1.1 pk # fstab which we'll use for mounting and unmounting all of the target
1345 1.1 pk # filesystems relative to /mnt. Mount all filesystems.
1346 1.1 pk _fstab=$1
1347 1.1 pk _fstab_shadow=$2
1348 1.7 leo ( while read _dev _mp _fstype _rest; do
1349 1.7 leo # Skip comment lines
1350 1.7 leo case "$_dev" in
1351 1.7 leo \#*) continue;;
1352 1.7 leo *) ;;
1353 1.7 leo esac
1354 1.7 leo # and some filesystem types (like there are swap,kernfs,...)
1355 1.7 leo case "$_fstype" in
1356 1.7 leo ffs|ufs|nfs) ;;
1357 1.7 leo *) continue;;
1358 1.7 leo esac
1359 1.3 pk if [ "$_mp" = "/" ]; then
1360 1.8 pk echo $_dev /mnt $_fstype $_rest
1361 1.1 pk else
1362 1.8 pk echo $_dev /mnt$_mp $_fstype $_rest
1363 1.3 pk fi
1364 1.6 leo done ) < $_fstab > $_fstab_shadow
1365 1.1 pk }
1366 1.1 pk
1367 1.1 pk mount_fs()
1368 1.1 pk {
1369 1.1 pk # Must mount filesystems manually, one at a time, so we can make
1370 1.1 pk # sure the mount points exist.
1371 1.1 pk # $1 is a file in fstab format
1372 1.1 pk local _fstab
1373 1.1 pk
1374 1.1 pk _fstab=$1
1375 1.1 pk
1376 1.1 pk ( while read line; do
1377 1.4 pk set -- $line
1378 1.4 pk _dev=$1
1379 1.4 pk _mp=$2
1380 1.4 pk _fstype=$3
1381 1.4 pk _opt=$4
1382 1.1 pk
1383 1.1 pk # If not the root filesystem, make sure the mount
1384 1.1 pk # point is present.
1385 1.1 pk if [ "X{$_mp}" != X"/mnt" ]; then
1386 1.1 pk mkdir -p $_mp
1387 1.1 pk fi
1388 1.1 pk
1389 1.1 pk # Mount the filesystem. If the mount fails, exit
1390 1.1 pk # with an error condition to tell the outer
1391 1.1 pk # later to bail.
1392 1.1 pk if ! mount -v -t $_fstype -o $_opt $_dev $_mp ; then
1393 1.1 pk # error message displated by mount
1394 1.1 pk exit 1
1395 1.1 pk fi
1396 1.1 pk done ) < $_fstab
1397 1.1 pk
1398 1.1 pk if [ "X${?}" != X"0" ]; then
1399 1.1 pk cat << \__mount_filesystems_1
1400 1.1 pk
1401 1.1 pk FATAL ERROR: Cannot mount filesystems. Double-check your configuration
1402 1.1 pk and restart the installation process.
1403 1.1 pk __mount_filesystems_1
1404 1.1 pk exit
1405 1.1 pk fi
1406 1.1 pk }
1407 1.1 pk
1408 1.1 pk unmount_fs()
1409 1.1 pk {
1410 1.1 pk # Unmount all filesystems and check their integrity.
1411 1.13 pk # Usage: [-fast] <fstab file>
1412 1.13 pk local _fast
1413 1.1 pk local _fstab
1414 1.13 pk local _pid
1415 1.13 pk
1416 1.13 pk if [ "$1" = "-fast" ]; then
1417 1.13 pk _fast=1
1418 1.13 pk _fstab=$2
1419 1.13 pk else
1420 1.13 pk _fast=0
1421 1.13 pk _fstab=$1
1422 1.13 pk fi
1423 1.1 pk
1424 1.13 pk if [ ! \( -f $_fstab -a -s $_fstab \) ]; then
1425 1.13 pk echo "fstab empty" > /dev/tty
1426 1.13 pk return
1427 1.13 pk fi
1428 1.1 pk
1429 1.13 pk if [ $_fast = 0 ]; then
1430 1.13 pk echo -n "Syncing disks..."
1431 1.13 pk _pid=`twiddle`
1432 1.13 pk sync; sleep 4; sync; sleep 2; sync; sleep 2
1433 1.13 pk kill $_pid
1434 1.13 pk echo "done."
1435 1.13 pk fi
1436 1.1 pk
1437 1.1 pk (
1438 1.1 pk _devs=""
1439 1.1 pk _mps=""
1440 1.1 pk # maintain reverse order
1441 1.1 pk while read line; do
1442 1.3 pk set -- $line
1443 1.3 pk _devs="$1 ${_devs}"
1444 1.3 pk _mps="$2 ${_mps}"
1445 1.1 pk done
1446 1.1 pk echo -n "Umounting filesystems... "
1447 1.1 pk for _mp in ${_mps}; do
1448 1.1 pk echo -n "${_mp} "
1449 1.1 pk umount ${_mp}
1450 1.1 pk done
1451 1.1 pk echo "Done."
1452 1.1 pk
1453 1.13 pk if [ $_fast = 0 ]; then
1454 1.13 pk exit
1455 1.13 pk fi
1456 1.1 pk echo "Checking filesystem integrity..."
1457 1.1 pk for _dev in ${_devs}; do
1458 1.1 pk echo "${_dev}"
1459 1.1 pk fsck -f ${_dev}
1460 1.1 pk done
1461 1.1 pk echo "Done."
1462 1.1 pk ) < $_fstab
1463 1.1 pk }
1464 1.1 pk
1465 1.1 pk check_fs()
1466 1.1 pk {
1467 1.1 pk # Check filesystem integrity.
1468 1.1 pk # $1 is a file in fstab format
1469 1.1 pk local _fstab
1470 1.1 pk
1471 1.1 pk _fstab=$1
1472 1.1 pk
1473 1.1 pk (
1474 1.1 pk _devs=""
1475 1.1 pk _mps=""
1476 1.1 pk while read line; do
1477 1.3 pk set -- $line
1478 1.3 pk _devs="$1 ${_devs}"
1479 1.3 pk _mps="$2 ${_mps}"
1480 1.1 pk done
1481 1.1 pk
1482 1.1 pk echo "Checking filesystem integrity..."
1483 1.1 pk for _dev in ${_devs}; do
1484 1.1 pk echo "${_dev}"
1485 1.1 pk fsck -f ${_dev}
1486 1.1 pk done
1487 1.1 pk echo "Done."
1488 1.1 pk ) < $_fstab
1489 1.1 pk }
1490