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