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