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