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