diff options
author | Steve Murphree <smurph@cvs.openbsd.org> | 2000-01-24 04:50:27 +0000 |
---|---|---|
committer | Steve Murphree <smurph@cvs.openbsd.org> | 2000-01-24 04:50:27 +0000 |
commit | 1dd0f54d3fc0977dafa06e10a8e2063a53073612 (patch) | |
tree | 678cbdbbf088a9c19736510fca4f60f6ed7d3e06 /distrib | |
parent | d461006d249b4d292b92c585af010fa062af3fdd (diff) |
Clean up mvme68k install utils and remdisk.
Diffstat (limited to 'distrib')
-rw-r--r-- | distrib/mvme68k/Makefile.inc | 5 | ||||
-rw-r--r-- | distrib/mvme68k/list2sh.awk | 36 | ||||
-rw-r--r-- | distrib/mvme68k/ramdisk/Makefile | 92 | ||||
-rw-r--r-- | distrib/mvme68k/ramdisk/Makefile.inc | 20 | ||||
-rw-r--r-- | distrib/mvme68k/ramdisk/dot.instutils | 22 | ||||
-rw-r--r-- | distrib/mvme68k/ramdisk/dot.profile | 57 | ||||
-rw-r--r-- | distrib/mvme68k/ramdisk/install.md | 34 | ||||
-rw-r--r-- | distrib/mvme68k/ramdisk/install.sub | 2519 | ||||
-rw-r--r-- | distrib/mvme68k/ramdisk/list | 169 | ||||
-rw-r--r-- | distrib/mvme68k/ramdisk/mtree.conf | 34 | ||||
-rw-r--r-- | distrib/mvme68k/ramdisk/raminst.conf | 27 | ||||
-rw-r--r-- | distrib/mvme68k/runlist.sh | 2 |
12 files changed, 2003 insertions, 1014 deletions
diff --git a/distrib/mvme68k/Makefile.inc b/distrib/mvme68k/Makefile.inc index 4d34b2d6440..8347f850efa 100644 --- a/distrib/mvme68k/Makefile.inc +++ b/distrib/mvme68k/Makefile.inc @@ -1,7 +1,6 @@ -# $OpenBSD: Makefile.inc,v 1.2 1997/09/21 11:45:57 deraadt Exp $ +# $OpenBSD: Makefile.inc,v 1.3 2000/01/24 04:50:25 smurph Exp $ -# Revision is 1.2 -REV= 12 +REV=${OSrev} LDSTATIC= -static diff --git a/distrib/mvme68k/list2sh.awk b/distrib/mvme68k/list2sh.awk index 43008da5be9..3789ef1afb3 100644 --- a/distrib/mvme68k/list2sh.awk +++ b/distrib/mvme68k/list2sh.awk @@ -1,4 +1,4 @@ -# $NetBSD: list2sh.awk,v 1.1 1995/07/18 04:12:59 briggs Exp $ +# $OpenBSD: list2sh.awk,v 1.2 2000/01/24 04:50:25 smurph Exp $ BEGIN { printf("cd ${CURDIR}\n"); @@ -10,12 +10,44 @@ BEGIN { } $1 == "COPY" { printf("echo '%s'\n", $0); + printf("rm -fr ${TARGDIR}/%s\n", $3); printf("cp %s ${TARGDIR}/%s\n", $2, $3); next; } $1 == "LINK" { printf("echo '%s'\n", $0); - printf("(cd ${TARGDIR}; ln %s %s)\n", $2, $3); + for (i = 3; i <= NF; i++) { + printf("rm -f ${TARGDIR}/%s\n", $i); + printf("(cd ${TARGDIR}; ln %s %s)\n", $2, $i); + } + next; +} +$1 == "SYMLINK" { + printf("echo '%s'\n", $0); + for (i = 3; i <= NF; i++) { + printf("rm -f ${TARGDIR}/%s\n", $i); + printf("(cd ${TARGDIR}; ln -s %s %s)\n", $2, $i); + } + next; +} +$1 == "ARGVLINK" { + # crunchgen directive; ignored here + next; +} +$1 == "SRCDIRS" { + # crunchgen directive; ignored here + next; +} +$1 == "CRUNCHSPECIAL" { + # crunchgen directive; ignored here + next; +} +$1 == "COPYDIR" { + printf("echo '%s'\n", $0); + printf("(cd ${TARGDIR}/%s && find . ! -name . | xargs /bin/rm -rf)\n", + $3); + printf("(cd %s && find . ! -name . | cpio -pdamu ${TARGDIR}/%s)\n", $2, + $3); next; } $1 == "SPECIAL" { diff --git a/distrib/mvme68k/ramdisk/Makefile b/distrib/mvme68k/ramdisk/Makefile index 7aca1c06df0..8ed5d742978 100644 --- a/distrib/mvme68k/ramdisk/Makefile +++ b/distrib/mvme68k/ramdisk/Makefile @@ -1,68 +1,51 @@ -# $OpenBSDBSD: Makefile,v 1.1 1995/07/18 04:13:06 briggs Exp $ -# $NetBSD: Makefile,v 1.1 1995/07/18 04:13:06 briggs Exp $ +# $OpenBSD: Makefile,v 1.10 2000/01/24 04:50:26 smurph Exp $ TOP= ${.CURDIR}/.. .include "${TOP}/Makefile.inc" +BSD_RD= bsd.rd IMAGE= mr.fs -CRUNCHCONF?= ${.CURDIR}/${CBIN}.conf -BASE=mr +CBIN?= instbin +LISTS= ${.CURDIR}/list +UTILS?= ${.CURDIR}/../../miniroot MOUNT_POINT= /mnt +MTREE= ${.CURDIR}/mtree.conf -#FS= ramdisk.fs VND?= svnd0 VND_DEV= /dev/${VND}a VND_RDEV= /dev/r${VND}a VND_CRDEV= /dev/r${VND}c PID!= echo $$$$ -REALIMAGE!= echo /tmp/image.${PID} -LISTFLOPPY= ${.CURDIR}/list_ramdisk - -.include "Makefile.inc" - -all: bsd.rd - -#${FS}: bsd.gz -# dd if=/dev/zero of=${REALIMAGE} count=4096 -# vnconfig -v -c ${VND} ${REALIMAGE} -# disklabel -w ${VND} rdroot -# newfs -m 0 -o space -i 8192 -c 80 ${VND_RDEV} -# mount ${VND_DEV} ${MOUNT_POINT} -# TOPDIR=${TOP} CURDIR=${.CURDIR} OBJDIR=${.OBJDIR} \ -# TARGDIR=${MOUNT_POINT} sh ${TOP}/runlist.sh ${LISTFLOPPY} -# /usr/mdec/installboot -v /mnt/boot ${DESTDIR}/usr/mdec/biosboot ${VND_CRDEV} -# @echo "" -# @df -i ${MOUNT_POINT} -# @echo "" -# umount ${MOUNT_POINT} -# vnconfig -u ${VND} -# cp ${REALIMAGE} ${FS} - -DISKTYPE= rdroot -NBLKS= 4096 -# old format, minfree, opt, b/i trks, sects, cpg + + +DISKTYPE= rdroot +NBLKS= 4096 +# minfree, opt, b/i trks, sects, cpg NEWFSARGS= -t ffs -m 0 -o space -u 32 -c 16 -bsd.gz: bsd.rd - gzip -c9 bsd.rd > bsd.gz +all: ${BSD_RD} + +${BSD_RD}: ${CBIN} ${IMAGE} bsd rdsetroot + cp bsd ${BSD_RD} + ${.OBJDIR}/rdsetroot ${BSD_RD} < ${IMAGE} -bsd.rd: ${IMAGE} bsd rdsetroot - cp bsd bsd.rd - ${.CURDIR}/${__objdir}/rdsetroot bsd.rd < ${IMAGE} +${IMAGE}: rd_setup do_files rd_teardown bsd: +.ifndef(NOBUILD) cd ${.CURDIR}/../../../sys/arch/mvme68k/conf && config MINIROOT cd ${.CURDIR}/../../../sys/arch/mvme68k/compile/MINIROOT && \ make clean && make +.endif cp ${.CURDIR}/../../../sys/arch/mvme68k/compile/MINIROOT/bsd bsd -${IMAGE}: ${CBIN} rd_setup do_files rd_teardown +rd_test: rd_setup rd_teardown -rd_setup: ${CBIN} - dd if=/dev/zero of=${REALIMAGE} bs=512 count=${NBLKS} - vnconfig -v -c ${VND} ${REALIMAGE} - disklabel -w ${VND} ${DISKTYPE} +rd_setup: + dd if=/dev/zero of=${IMAGE} bs=512 count=${NBLKS} + vnconfig -v -c ${VND} ${IMAGE} + disklabel -w -r ${VND} ${DISKTYPE} newfs ${NEWFSARGS} ${VND_RDEV} fsck ${VND_RDEV} mount ${VND_DEV} ${MOUNT_POINT} @@ -71,8 +54,6 @@ rd_teardown: @df -i ${MOUNT_POINT} -umount ${MOUNT_POINT} -vnconfig -u ${VND} - cp ${REALIMAGE} ${IMAGE} - rm ${REALIMAGE} rdsetroot: ${TOP}/common/rdsetroot.c ${HOSTCC} -DDEBUG -o rdsetroot ${TOP}/common/rdsetroot.c @@ -80,9 +61,30 @@ rdsetroot: ${TOP}/common/rdsetroot.c unconfig: -umount -f ${MOUNT_POINT} -vnconfig -u ${VND} - -/bin/rm -f ${IMAGE} .PRECIOUS: ${IMAGE} install: - cp bsd.rd ${DESTDIR}/snapshot/bsd.rd + cp ${BSD_RD} ${DESTDIR}/snapshot/${BSD_RD} + +${CBIN}.conf: ${LISTS} + awk -f ${UTILS}/makeconf.awk CBIN=${CBIN} ${LISTS} > ${CBIN}.conf + +${CBIN}.mk ${CBIN}.cache ${CBIN}.c: ${CBIN}.conf + crunchgen -D ${.CURDIR}/../../.. -L ${DESTDIR}/usr/lib ${CBIN}.conf + +${CBIN}: ${CBIN}.mk ${CBIN}.cache ${CBIN}.c + make -f ${CBIN}.mk all + +do_files: + mtree -def ${MTREE} -p ${MOUNT_POINT}/ -u + TOPDIR=${TOP} CURDIR=${.CURDIR} OBJDIR=${.OBJDIR} \ + REV=${REV} TARGDIR=${MOUNT_POINT} sh ${TOP}/runlist.sh ${LISTS} + +clean cleandir: + /bin/rm -f core ${IMAGE} ${CBIN} ${CBIN}.conf ${CBIN}.mk ${CBIN}.cache \ + *.o *.lo *.c bsd bsdmix bsdofw ${BSD_RD} ${BSDOFW_RD} ${BSDMIX_RD} \ + rdsetroot + +.include <bsd.obj.mk> +.include <bsd.subdir.mk> diff --git a/distrib/mvme68k/ramdisk/Makefile.inc b/distrib/mvme68k/ramdisk/Makefile.inc index 4bbf0d437b5..ac079eebb00 100644 --- a/distrib/mvme68k/ramdisk/Makefile.inc +++ b/distrib/mvme68k/ramdisk/Makefile.inc @@ -4,22 +4,32 @@ # TOP is assumed to be defined by Makefile including this one. -CBIN?= raminst -COMMONDIR= ${TOP}/ramdisk +CBIN?= rmainst +LISTS= ${.CURDIR}/list +UTILS?= ${.CURDIR}/../../miniroot +COMMONDIR= ${TOP}/ramdisk MOUNT_POINT?= ${TOP}/${BASE}/fs -LISTS= ${.CURDIR}/list CRUNCHCONF?= ${COMMONDIR}/${CBIN}.conf MTREE= ${COMMONDIR}/mtree.conf RAWLABEL= -${CBIN}.mk ${CBIN}.cache ${CBIN}.c: ${CRUNCHCONF} - crunchgen -D ${BSDSRCDIR} -L ${DESTDIR}/usr/lib ${CRUNCHCONF} +${CBIN}.conf: ${LISTS} + awk -f ${UTILS}/makeconf.awk CBIN=${CBIN} ${LISTS} > ${CBIN}.conf + +${CBIN}.mk ${CBIN}.cache ${CBIN}.c: ${CBIN}.conf + crunchgen -D ${BSDSRCDIR} -L ${DESTDIR}/usr/lib ${CBIN}.conf ${CBIN}: ${CBIN}.mk ${CBIN}.cache ${CBIN}.c make -f ${CBIN}.mk all +#${CBIN}.mk ${CBIN}.cache ${CBIN}.c: ${CRUNCHCONF} +# crunchgen -D ${BSDSRCDIR} -L ${DESTDIR}/usr/lib ${CRUNCHCONF} + +#${CBIN}: ${CBIN}.mk ${CBIN}.cache ${CBIN}.c +# make -f ${CBIN}.mk all + do_files: mtree -def ${MTREE} -p ${MOUNT_POINT}/ -u TOPDIR=${TOP} CURDIR=${.CURDIR} OBJDIR=${.OBJDIR} \ diff --git a/distrib/mvme68k/ramdisk/dot.instutils b/distrib/mvme68k/ramdisk/dot.instutils index 94a55659fe5..dcc01e50f08 100644 --- a/distrib/mvme68k/ramdisk/dot.instutils +++ b/distrib/mvme68k/ramdisk/dot.instutils @@ -154,3 +154,25 @@ Configure() echo "Remember to erase the miniroot name from the booter's" echo "booting preferences dialog box before booting again." } + +Bootblocks() { + local _rawdev + + if [ "X${1}" = X"" ]; then + echo "No disk device specified, you must run installboot manually." + return + fi + _rawdev=/dev/r${1}a + + # use extracted mdec if it exists (may be newer) + if [ -f /mnt/usr/mdec/installboot ]; then + cp /mnt/usr/mdec/bootsd /mnt/bootsd + /mnt/usr/mdec/installboot -v /mnt/bootsd /mnt/usr/mdec/bootxx ${_rawdev} + elif [ -f /usr/mdec/installboot ]; then + cp /usr/mdec/bootsd /mnt/bootsd + /usr/mdec/installboot -v /mnt/bootsd /usr/mdec/bootxx ${_rawdev} + else + echo "No boot block prototypes found, you must run installboot manually." + fi +} + diff --git a/distrib/mvme68k/ramdisk/dot.profile b/distrib/mvme68k/ramdisk/dot.profile index acc6e68391d..fd7550aa895 100644 --- a/distrib/mvme68k/ramdisk/dot.profile +++ b/distrib/mvme68k/ramdisk/dot.profile @@ -1,6 +1,7 @@ +# $OpenBSD: dot.profile,v 1.4 2000/01/24 04:50:26 smurph Exp $ +# $NetBSD: dot.profile,v 1.1 1995/12/18 22:54:43 pk Exp $ # -# $NetBSD: dot.profile,v 1.1 1995/07/18 04:13:09 briggs Exp $ -# +# Copyright (c) 1995 Jason R. Thorpe # Copyright (c) 1994 Christopher G. Demetriou # All rights reserved. # @@ -32,22 +33,52 @@ export PATH=/sbin:/bin:/usr/bin:/usr/sbin:/ export HISTFILE=/.sh_history -export TERM=vt200 umask 022 set -o emacs # emacs-style command line editing -# set up some sane defaults -echo 'erase ^?, werase ^H, kill ^U, intr ^C' -stty newcrt werase ^H intr ^C kill ^U erase ^? 9600 -echo '' +# XXX +# the TERM/EDITOR stuff is really well enough parameterized to be moved +# into install.sub where it could use the routines there and be invoked +# from the various (semi) MI install and upgrade scripts + +# editors believed to be in $EDITBIN, smart and dumb defaults +EDITBIN=/bin +EDITUBIN=/usr/bin +export TERM=vt100 + +if [ "X${DONEPROFILE}" = "X" ]; then + DONEPROFILE=YES + + # mount kernfs and re-mount the boot media (perhaps r/w) + mount_kernfs /kern /kern + mount_ffs -o update /dev/rd0a / + + # set up some sane defaults + echo 'erase ^?, werase ^W, kill ^U, intr ^C' + stty newcrt werase ^W intr ^C kill ^U erase ^? 9600 + + # Installing or upgrading? + _forceloop="" + while [ "X$_forceloop" = X"" ]; do + echo -n '(I)nstall, (U)pgrade or (S)hell? ' + read _forceloop + case "$_forceloop" in + i*|I*) + /install + ;; -# pull in the function definitions that people will use from the shell prompt. -. /.commonutils -. /.instutils + u*|U*) + /upgrade + ;; -mount -u /dev/rd0a / + s*|S*) + ;; -# run the installation script. -install + *) + _forceloop="" + ;; + esac + done +fi diff --git a/distrib/mvme68k/ramdisk/install.md b/distrib/mvme68k/ramdisk/install.md index d43e04f6d3c..6da77a0620d 100644 --- a/distrib/mvme68k/ramdisk/install.md +++ b/distrib/mvme68k/ramdisk/install.md @@ -1,4 +1,4 @@ -# $OpenBSD: install.md,v 1.9 1999/09/26 18:24:52 smurph Exp $ +# $OpenBSD: install.md,v 1.10 2000/01/24 04:50:26 smurph Exp $ # Copyright (c) 1996 The NetBSD Foundation, Inc. # All rights reserved. # @@ -69,8 +69,8 @@ md_set_term() { if [ ! -z "$TERM" ]; then return fi - echo -n "Specify terminal type [xterm]: " - getresp "xterm" + echo -n "Specify terminal type [vt100]: " + getresp "vt100" TERM="$resp" export TERM } @@ -80,11 +80,15 @@ md_machine_arch() { } md_get_diskdevs() { - egrep "^sd[0-9] " < /kern/msgbuf + # return available disk devices + cat /kern/msgbuf | egrep "^[sw]d[0-9]|ofdisk[0-9] " | sed -e "s/[ :(].*//" | sort -u + # egrep "^sd[0-9] " < /kern/msgbuf } md_get_cddevs() { - egrep "^cd[0-9] " < /kern/msgbuf + # return available CDROM devices + cat /kern/msgbuf | egrep "^cd[0-9] " | sed -e "s/[ :(].*//" | sort -u + # egrep "^cd[0-9] " < /kern/msgbuf } md_get_ifdevs() { @@ -103,6 +107,9 @@ md_questions() { md_installboot() { local _rawdev + + echo "" + echo "Installing boot blocks." if [ "X${1}" = X"" ]; then echo "No disk device specified, you must run installboot manually." @@ -111,12 +118,12 @@ md_installboot() { _rawdev=/dev/r${1}a # use extracted mdec if it exists (may be newer) - if [ -d /mnt/usr/mdec ]; then + if [ -f /mnt/usr/mdec/installboot ]; then cp /mnt/usr/mdec/bootsd /mnt/bootsd - /mnt/usr/mdec/installboot -v /mnt/bootsd /mnt/usr/mdec/bootxx _rawdev - elif [ -d /usr/mdec ]; then + /mnt/usr/mdec/installboot -v /mnt/bootsd /mnt/usr/mdec/bootxx ${_rawdev} + elif [ -f /usr/mdec/installboot ]; then cp /usr/mdec/bootsd /mnt/bootsd - /usr/mdec/installboot -v /mnt/bootsd /usr/mdec/bootxx _rawdev + /usr/mdec/installboot -v /mnt/bootsd /usr/mdec/bootxx ${_rawdev} else echo "No boot block prototypes found, you must run installboot manually." fi @@ -199,9 +206,10 @@ __md_prep_disklabel_1 } md_welcome_banner() { +{ if [ "$MODE" = "install" ]; then echo "" - echo "Welcome to the OpenBSD/mvme68k ${VERSION} installation program." + echo "Welcome to the OpenBSD/mvme68k ${VERSION_MAJOR}.${VERSION_MINOR} installation program." cat << \__welcome_banner_1 This program is designed to help you put OpenBSD on your disk, @@ -212,7 +220,7 @@ __welcome_banner_1 else echo "" - echo "Welcome to the OpenBSD/mvme68k ${VERSION} upgrade program." + echo "Welcome to the OpenBSD/mvme68k ${VERSION_MAJOR}.${VERSION_MINOR} upgrade program." cat << \__welcome_banner_2 This program is designed to help you upgrade your OpenBSD system in a @@ -238,6 +246,7 @@ prompt, you may have to hit return. Also, quitting in the middle of installation may leave your system in an inconsistent state. __welcome_banner_3 +} | more } md_not_going_to_install() { @@ -267,8 +276,9 @@ __congratulations_1 md_native_fstype() { } - md_makerootwritable() { +} +md_makerootwritable2() { if [ -e ${TMPWRITEABLE} ] then diff --git a/distrib/mvme68k/ramdisk/install.sub b/distrib/mvme68k/ramdisk/install.sub index f4605fe299f..72695d9f433 100644 --- a/distrib/mvme68k/ramdisk/install.sub +++ b/distrib/mvme68k/ramdisk/install.sub @@ -1,7 +1,36 @@ #!/bin/sh -# $OpenBSD: install.sub,v 1.4 1998/11/03 04:35:16 aaron Exp $ +# $OpenBSD: install.sub,v 1.5 2000/01/24 04:50:26 smurph Exp $ # $NetBSD: install.sub,v 1.5.2.8 1996/09/02 23:25:02 pk Exp $ # +# Copyright (c) 1997,1998 Todd Miller, Theo de Raadt +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# 3. All advertising materials mentioning features or use of this software +# must display the following acknowledgement: +# This product includes software developed by Todd Miller and +# Theo de Raadt +# 4. The name of the author may not be used to endorse or promote products +# derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# # Copyright (c) 1996 The NetBSD Foundation, Inc. # All rights reserved. # @@ -39,36 +68,81 @@ # OpenBSD installation/upgrade script - common subroutines. -ROOTDISK="" # filled in below -VERSION= # filled in automatically (see list) -export VERSION - -ALLSETS="base comp etc games man misc text" # default install sets -UPGRSETS="base comp games man misc text" # default upgrade sets +ROOTDISK= # filled in below +VERSION=26 +VERSION_MAJOR=$(( $VERSION / 10 )) +VERSION_MINOR=$(( $VERSION % 10 )) +export VERSION VERSION_MAJOR VERSION_MINOR + +# extra "site" set can be provided by person doing install +ALLSETS="base etc misc comp man game xbase xshare xfont xserv site" # install +UPGRSETS="base misc comp man game xbase xshare xfont xserv site" # upgrade +SNAPSETS="bin dev etc games man misc sbin \ + usr.bin usr.binutils usr.games usr.include \ + usr.lib usr.libexec usr.misc usr.sbin usr.share var" THESETS= # one of the above -local_sets_dir="" # Path searched for sets by install_sets - # on the local filesystems +# Path searched for sets by install_sets on the local filesystems +local_sets_dir= # decide upon an editor -if [ X$EDITOR = X ]; then +if [ "X$EDITOR" = X ]; then if [ -x /usr/bin/vi ]; then EDITOR=vi else EDITOR=ed fi + export EDITOR fi +# Please don't use the 1 of n form below, good idea, wrong implementation! +# get a reponse with default[s] getresp() { - read resp - if [ "X$resp" = "X" ]; then - resp=$1 + local _shell_aware=0 + + # -s option means exit after a shell (caller is shell-aware) + if [ "$1" = "-s" ]; then + _shell_aware=1 + shift fi + + set -o noglob + valid="false" + while [ "X$valid" = "Xfalse" ]; do + read resp + case "$resp" in + "") resp=$1 + ;; + !) echo "Type 'exit' to return to install." + sh + test $_shell_aware -eq 0 && continue + ;; + !*) + eval ${resp#?} + test $_shell_aware -eq 0 && continue + ;; + esac + if [ $# -gt 1 ]; then + for i in $@; do + if [ "X$resp" = "X$i" ]; then + valid="true" + fi + done + else + valid="true" + fi + if [ "X$valid" = "Xfalse" ]; then + echo "Try again: Enter one of [$@]" + fi + done + set +o noglob } isin() { # test the first argument against the remaining ones, return succes on a match - _a=$1; shift + local _a=$1 + + shift while [ $# != 0 ]; do if [ "$_a" = "$1" ]; then return 0; fi shift @@ -76,45 +150,60 @@ isin() { return 1 } +addel() { +# add first argument to list formed by the remaining arguments +# adds to the tail if the element does not already exist + local _a=$1 _seen= + + shift + while [ $# != 0 ]; do + echo "$1" + if [ "$_a" = "$1" ]; then + _seen="yes" + fi + shift + done + if [ "X$_seen" = "X" ]; then + echo "$_a" + fi +} + rmel() { # remove first argument from list formed by the remaining arguments - local _a + local _a=$1 - _a=$1; shift + shift while [ $# != 0 ]; do if [ "$_a" != "$1" ]; then - echo "$1"; + echo "$1" fi shift done } cutword () { -# read a line of data, return Nth element. - local _a - local _n - local _oifs +# read lines on stdin, return Nth element of each line, like cut(1) + local _a _n _oifs="$IFS" # optional field separator - _oifs="$IFS" case "$1" in -t?*) IFS=${1#-t}; shift;; esac _n=$1 - read _a; set -- $_a + while read _a; do + set -- $_a + test "$1" = "" && break + eval echo \$$_n + done IFS="$_oifs" - if [ "$1" = "" ]; then return; fi - eval echo \$$_n } cutlast () { # read a line of data, return last element. Equiv. of awk '{print $NF}'. - local _a - local _oifs + local _a _oifs="$IFS" # optional field separator - _oifs="$IFS" case "$1" in -t?*) IFS=${1#-t}; shift;; esac @@ -128,8 +217,8 @@ cutlast () { firstchar () { # return first character of argument - local _a - _a=$1 + local _a=$1 + while [ ${#_a} != 1 ]; do _a=${_a%?} done @@ -138,6 +227,7 @@ firstchar () { basename () { local _oifs + if [ "$1" = "" ]; then return; fi _oifs="$IFS" IFS="/" @@ -147,42 +237,87 @@ basename () { eval echo \$$# } +isnumeric() { + local _a=$1 + + while [ ${#_a} != 0 ]; do + case $_a in + [0-9]*) ;; + *) echo 0; return;; + esac + _a=${_a#?} + done + echo 1; return +} + +get_ifdevs() { + # return available network devices + /sbin/ifconfig -a | egrep -v '^([[:space:]]|(lo|enc|ppp|sl|tun|bridge)[[:digit:]])' | cutword -t: 1 +} + dir_has_sets() { # return true when the directory $1 contains a set for $2...$n - local _dir - local _file + local _dir=$1 _file + + shift + for _file in $* + do + if [ -f $_dir/${_file}${VERSION}.tar.gz ]; then + return 0 + fi + # Try for stupid msdos convention + if [ -f $_dir/${_file}${VERSION}.tgz ]; then + return 0 + fi + # Special check for kernel + if [ $_file = "kernel" -a -f $_dir/bsd ]; then + return 0 + fi + done + return 1 +} + +list_has_sets() { + # return true when the list $1 contains a set, given dir $2 for $3...$n + local _list=$1 _file - _dir=$1; shift + shift for _file in $* do - if [ -f $_dir/${_file}.tar.gz ]; then + if isin ${_file}${VERSION}.tar.gz $_list; then return 0 fi # Try for stupid msdos convention - if [ -f $_dir/${_file}.tgz ]; then + if isin ${_file}${VERSION}.tgz $_list; then + return 0 + fi + # Special check for kernel + if test $_file = "kernel" && isin bsd $_list; then return 0 fi done return 1 } -twiddle() { -# spin the propeller so we don't get bored - while : ; do - sleep 1; echo -n "\010/"; - sleep 1; echo -n "\010-"; - sleep 1; echo -n "\010\\\\"; - sleep 1; echo -n "\010|"; - done >> /dev/tty & echo $! +ftp_list_files() { + # log in via ftp to host $1 as user $2 with password $3 + # and return a list of all files in the directory $4 on stdout + local _host=$1 _user=$2 _pass=$3 _dir=$4 + + shift; shift; shift; shift + + ftp ${_ftp_active} -V -n $_host << __ptf +user $_user $_pass +cd $_dir +ls +quit +__ptf } get_localdir() { # $1 is relative mountpoint - local _mp - local _dir + local _mp=$1 _dir= - _mp=$1 - _dir= while : ; do echo -n "Enter the pathname where the sets are stored [$_dir] " getresp "$_dir" @@ -207,17 +342,17 @@ get_localdir() { local_sets_dir="$_mp/$_dir" break else - cat << __get_reldir_1 + cat << __EOT The directory \"$local_sets_dir\" does not exist, or does not hold any of the upgrade sets. -__get_reldir_1 +__EOT echo -n "Re-enter pathname? [y] " getresp "y" case "$resp" in y*|Y*) ;; *) - local_sets_dir="" + local_sets_dir= break ;; esac @@ -225,54 +360,58 @@ __get_reldir_1 done } -getrootdisk() { - cat << \__getrootdisk_1 +getanotherdisk() { + cat << __EOT -The installation program needs to know which disk to consider -the root disk. Note the unit number may be different than -the unit number you used in the standalone installation -program. +Now you can select another disk to initialize. (Do not re-select a disk +you have already entered information for). Available disks are: -Available disks are: - -__getrootdisk_1 +__EOT _DKDEVS=`md_get_diskdevs` echo "$_DKDEVS" - echo "" - echo -n "Which disk is the root disk? " + echo + echo -n "Which one? [done] " getresp "" - if isin $resp $_DKDEVS ; then - ROOTDISK="$resp" + if [ "X${resp}" = "X" ]; then + DISK=done + elif [ "X${resp}" = "Xdone" ]; then + DISK=done + elif isin $resp $_DKDEVS ; then + DISK="$resp" else - echo "" + echo echo "The disk $resp does not exist." - ROOTDISK="" + DISK= fi } -labelmoredisks() { - cat << \__labelmoredisks_1 +getrootdisk() { + cat << __EOT -You may label the following disks: +The installation program needs to know which disk to consider the root disk. +Note the unit number may be different than the unit number you used in the +boot program (especially on a PC with multiple disk controllers). +Available disks are: -__labelmoredisks_1 - echo "$_DKDEVS" - echo "" - echo -n "Label which disk? [done] " - getresp "done" - case "$resp" in - done) - ;; +__EOT + local _defdsk; - *) - if isin $resp $_DKDEVS ; then - md_labeldisk $resp - else - echo "" - echo "The disk $resp does not exist." - fi - ;; - esac + _DKDEVS=`md_get_diskdevs` + _defdsk=`echo $_DKDEVS | cutlast` + if [ "${_defdsk}" != "${_DKDEVS}" ]; then + _defdsk= + fi + echo "$_DKDEVS" + echo + echo -n "Which disk is the root disk? [${_defdsk}] " + getresp "${_defdsk}" + if isin $resp $_DKDEVS ; then + ROOTDISK="$resp" + else + echo + echo "The disk $resp does not exist." + ROOTDISK= + fi } addhostent() { @@ -280,16 +419,16 @@ addhostent() { # $2 - symbolic name # Create an entry in the hosts table. If no host table - # exists, create one. If the IP address already exists, + # exists, create one. If the symbolic name already exists, # replace its entry. if [ ! -f /tmp/hosts ]; then echo "127.0.0.1 localhost" > /tmp/hosts fi - sed "/^$1 /d" < /tmp/hosts > /tmp/hosts.new + sed "/ $2.$FQDN $2\$/d" < /tmp/hosts > /tmp/hosts.new mv /tmp/hosts.new /tmp/hosts - echo "$1 $2 $2.$FQDN" >> /tmp/hosts + echo "$1 $2.$FQDN $2" >> /tmp/hosts } addifconfig() { @@ -297,138 +436,221 @@ addifconfig() { # $2 - interface symbolic name # $3 - interface IP address # $4 - interface netmask - # $5 - (optional) interface link-layer directives + # $5 - (optional) interface media directives # Create a hostname.* file for the interface. - echo "inet $2 $4 NONE $5" > /tmp/hostname.$1 - - addhostent $3 $2 + if [ "$3" = "dhcp" ]; then + echo "dhcp NONE NONE NONE $5" > /tmp/hostname.$1 + addhostent 127.0.0.1 $2 + else + echo "inet $3 $4 NONE $5" > /tmp/hostname.$1 + addhostent $3 $2 + fi } configurenetwork() { - local _ifsdone - local _ifs + local _ifsdone= _ifs _ouranswer= _reprompt=1 - _IFS=`md_get_ifdevs` - _ifsdone="" - resp="" # force at least one iteration + _IFS=`get_ifdevs` + resp= # force at least one iteration while [ "X${resp}" != X"done" ]; do - cat << \__configurenetwork_1 + if [ $_reprompt = 1 ]; then + cat << __EOT You may configure the following network interfaces (the interfaces marked with [X] have been succesfully configured): -__configurenetwork_1 +__EOT - for _ifs in $_IFS; do - if isin $_ifs $_ifsdone ; then - echo -n "[X] " - else - echo -n " " - fi - echo $_ifs - done - echo "" - echo -n "Configure which interface? [done] " - getresp "done" + for _ifs in $_IFS; do + if [ "X${_ouranswer}" = "X" ]; then + _ouranswer=$_ifs + fi + if isin $_ifs $_ifsdone ; then + echo -n " [X] " + else + echo -n " [ ] " + fi + echo $_ifs + done + echo + fi + echo -n "Configure which interface? (or, enter 'done') [$_ouranswer] " + getresp "$_ouranswer" case "$resp" in "done") ;; + "") + _reprompt=0 + ;; *) _ifs=$resp + _ouranswer="done" if isin $_ifs $_IFS ; then if configure_ifs $_ifs ; then _ifsdone="$_ifs $_ifsdone" + else + _ouranswer= fi else echo "Invalid response: \"$resp\" is not in list" fi + _reprompt=1 ;; esac + done } configure_ifs() { - local _up - local _interface_name - local _interface_ip - local _interface_mask - local _interface_symname - local _interface_extra - - _interface_name=$1 + local _up _if_name=$1 _if_ip _if_mask + local _if_symname _if_extra _hostname + local _dhcp_prompt - set -- `ifconfig $_interface_name | sed -n ' + set -- `ifconfig $_if_name | sed -n ' 1s/.*<UP,.*$/UP/p 1s/.*<.*>*$/DOWN/p - 2s/inet// - 2s/--> [0-9.][0-9.]*// - 2s/netmask// - 2s/broadcast// - 2p'` + /media:/s/^.*$// + /status:/s/^.*$// + /inet/s/--> [0-9.][0-9.]*// + /inet/s/netmask// + /inet/s/broadcast// + /inet/s/inet// p'` _up=$1 - _interface_ip=$2 - _interface_mask=$3 + _if_ip=$2 + _if_mask=$3 + + if [ $_up = "UP" ]; then + ifconfig $_if_name delete down + fi + + if [ ! -x /sbin/dhclient ]; then + echo "DHCP install not supported" + echo + else + _dhcp_prompt=" (or 'dhcp')" + fi # Get IP address - resp="" # force one iteration + resp= # force one iteration while [ "X${resp}" = X"" ]; do - echo -n "IP address? [$_interface_ip] " - getresp "$_interface_ip" - _interface_ip=$resp + echo -n "IP address${_dhcp_prompt} ? [$_if_ip] " + getresp "$_if_ip" + if [ ! -x /sbin/dhclient -a "X$resp" == "Xdhcp" ]; then + resp= + fi + _if_ip=$resp done # Get symbolic name - resp="" # force one iteration + _hostname=`hostname` + resp= # force one iteration while [ "X${resp}" = X"" ]; do - echo -n "Symbolic (host) name? " - getresp "" - _interface_symname=$resp + echo -n "Symbolic (host) name? [$_hostname] " + getresp "$_hostname" + _if_symname=$resp done # Get netmask - resp="" # force one iteration - while [ "X${resp}" = X"" ]; do - echo -n "Netmask? [$_interface_mask] " - getresp "$_interface_mask" - _interface_mask=$resp - done + if [ "$_if_ip" != "dhcp" ]; then + resp= + if [ "X${_if_mask}" = X"" ]; then + _if_mask=255.255.255.0 + fi + while [ "X${resp}" = X"" ]; do + echo -n "Netmask ? [$_if_mask] " + getresp "$_if_mask" + _if_mask=$resp + done + fi - echo "Your network interface might require additional link-layer" - echo "directives (like \`link0'). If this is the case you can enter" - echo "these at the next prompt." - echo "" - echo -n "Additional link-layer arguments? [$_interface_extra] " - getresp "$_interface_extra" - if [ "X${resp}" != X"" ]; then - _interface_extra=$resp + if [ -n "`ifconfig -m ${_if_name} | sed -n '/media/p'`" ]; then + echo "Your use of the network interface may require non-default" + echo "media directives. The default media is:" + ifconfig -m ${_if_name} | sed -n ' + /supported/D + /media:/p' + echo "This is a list of supported media:" + ifconfig -m ${_if_name} | sed -n ' + /media:/D + s/^ // + /media/p' + echo "If the default is not satisfactory, and you wish to use another" + echo "media, copy that line from above (ie. \"media 100baseTX\")" + echo -n "Media directives? [$_if_extra] " + getresp "$_if_extra" + if [ "X${resp}" != X"" ]; then + _if_extra=$resp + fi fi # Configure the interface. If it # succeeds, add it to the permanent # network configuration info. - if [ $_up != "UP" ]; then - ifconfig ${_interface_name} down - if ifconfig ${_interface_name} inet \ - ${_interface_ip} \ - netmask ${_interface_mask} ${_interface_extra} up ; then - addifconfig \ - ${_interface_name} \ - ${_interface_symname} \ - ${_interface_ip} \ - ${_interface_mask} ${_interface_extra} + if [ "$_if_ip" = "dhcp" ]; then + ifconfig ${_if_name} down ${_if_extra} +cat > /etc/dhclient.conf << __EOT +initial-interval 1; +send host-name "$_hostname"; +request subnet-mask, broadcast-address, routers, + domain-name, domain-name-servers, host-name; +__EOT + dhclient -1 ${_if_name} + + set -- `ifconfig $_if_name | sed -n ' + 1s/.*<UP,.*$/UP/p + 1s/.*<.*>*$/DOWN/p + /media:/s/^.*$// + /status:/s/^.*$// + /inet/s/--> [0-9.][0-9.]*// + /inet/s/netmask// + /inet/s/broadcast// + /inet/s/inet// p'` + + if [ $1 = "UP" -a $2 = "0.0.0.0" ]; then + echo "hostname-associated DHCP attempt for $_if_name failed..." + ifconfig $_if_name delete down + + cat > /etc/dhclient.conf << __EOT +initial-interval 1; +request subnet-mask, broadcast-address, routers, + domain-name, domain-name-servers, host-name; +__EOT + dhclient -1 ${_if_name} + set -- `ifconfig $_if_name | sed -n ' + 1s/.*<UP,.*$/UP/p + 1s/.*<.*>*$/DOWN/p + /media:/s/^.*$// + /status:/s/^.*$// + /inet/s/--> [0-9.][0-9.]*// + /inet/s/netmask// + /inet/s/broadcast// + /inet/s/inet// p'` + + if [ $1 = "UP" -a $2 = "0.0.0.0" ]; then + echo "free-roaming DHCP attempt for $_if_name failed." + ifconfig $_if_name delete down + return 1 + else + echo "DHCP attempt for $_if_name successful." + addifconfig ${_if_name} ${_if_symname} ${_if_ip} + return 0 + fi + else + echo "DHCP configuration of $_if_name successful." + addifconfig ${_if_name} ${_if_symname} ${_if_ip} return 0 fi else - echo "Interface ${_interface_name} is already active." - echo "Just saving configuration on new root filesystem." - addifconfig \ - ${_interface_name} \ - ${_interface_symname} \ - ${_interface_ip} \ - ${_interface_mask} ${_interface_extra} + ifconfig ${_if_name} down + if ifconfig ${_if_name} inet \ + ${_if_ip} \ + netmask ${_if_mask} ${_if_extra} up ; then + addifconfig ${_if_name} ${_if_symname} ${_if_ip} ${_if_mask} "${_if_extra}" + return 0 + fi fi return 1 } @@ -459,7 +681,7 @@ enable_network() { read dt dtaddr if [ ! -n "$name" ]; then - echo "/etc/hostname.$1: invalid network configuration file" + echo "/etc/hostname.$1: invalid network configuration file" exit fi @@ -498,834 +720,1491 @@ enable_network() { # Display results... echo "Network interface configuration:" - ifconfig -a + ifconfig -am - echo "" + echo if [ "X${_resolver_enabled}" = X"TRUE" ]; then - netstat -r - echo "" + route show + echo echo "Resolver enabled." else - netstat -rn - echo "" + route -n show + echo echo "Resolver not enabled." fi return 0 } -install_ftp() { - # Get several parameters from the user, and create - # a shell script that directs the appropriate - # commands into ftp. - cat << \__install_ftp_1 +# Print the selector and get a response +# The list of sets is passed in as $1, sets $resp +get_selection() { + local _next= _f _sets=$1 + + for _f in $_sets ; do + if isin $_f $_setsdone ; then + echo -n " [X] " + _next= + else + echo -n " [ ] " + if [ -z "$_next" ]; then + _next=$_f + fi + fi + echo $_f + done + + # Get the name of the file. + echo -n "File name? [$_next] " + getresp "$_next" +} + +# Do globbing on the selection and parse +/-, sets _get_files and _setsdone +# (which must exist in the local namespace) as side effects. +glob_selection() { + local _selection="$1" _parent_dir="$2" _sets="$3" + local _action _matched _tfile _f + + if [ "X${_selection}" = X"" ]; then + return + fi -This is an automated ftp-based installation process. You will be asked -several questions. The correct set of commands will be placed in a script -that will be fed to ftp(1). + # Change +/- into add/remove + _action=add + case "$_selection" in + +*) _selection="${_selection#?}" + ;; + -*) _selection="${_selection#?}" + _action=remove + ;; + esac + + # Major hack to allow the user to select globbing patterns + set -o noglob + if [ X"$_selection" = X"all" ]; then + _selection=* + fi + _tfile=/tmp/install_case.$$ # safe in single user mode + cat >$_tfile << OOF + case \$_f in + $_selection) # Add/remove file to extraction list + if [ "\$_action" = "add" ]; then + _get_files=\`addel \${_f} \${_get_files}\` + _setsdone=\`addel \${_f} \${_setsdone}\` + elif [ "\$_action" = "remove" ]; then + _get_files=\`rmel \${_f} \${_get_files}\` + _setsdone=\`rmel \${_f} \${_setsdone}\` + else + echo "Unknown action: \$_action" + fi + _matched=\$(( \$_matched + 1 )) + ;; + esac +OOF + set +o noglob + + # Eww. + _matched=0 + for _f in $_sets; do + . $_tfile + done + rm -f $_tfile + + if [ $_matched -eq 0 ]; then + echo "File $_parent_dir/$_selection does not exist. Check to make" + echo "sure you entered the information properly or enter 'list' for a file list." + fi +} + +install_url() { +# Get several parameters from the user, and xfer +# files from the server. +# Note: _ftp_server_ip, _ftp_server_dir, _ftp_server_login, +# _ftp_server_password, and _ftp_active must be global. + +local _sets _kernel _f _file_list _get_files _failed_files _osetsdone +local _url_type _url_base _reuse _minpat + +# Parse arguments, shell style +while test $# != 0; do + case "$1" in + -ftp) _url_type=ftp ;; + -html) _url_type=html ;; + -reuse) _reuse=1 ;; + -minpat) shift; _minpat="$1" ;; + esac + shift +done +if [ X"${_minpat}" = X ]; then + _minpat='base*.tar.gz|base*.tgz|man*.tar.gz|man*.tgz|etc*.tar.gz|etc*.tgz|bsd' +fi + +echo +echo "This is an automated ${_url_type}-based installation process. You will be asked" +echo "questions and then the files will be retrieved iteratively via ftp(1)." +echo + +# Reuse old values w/o prompting for anything? +if [ X"$_reuse" = X"1" ]; then + _reuse= + if eval test X"\$_installed_via_${_url_type}" = X"1"; then + echo -n "Use values from previous ${_url_type} install? [y] " + getresp y + case "$resp" in + y*|Y*) + _reuse=1;; + esac + fi +fi +if [ X"$_reuse" = X ]; then + # Proxy the connections? + if [ "X${_proxy_host}" = X"" ]; then + _proxy_host=none + fi + echo -n "HTTP/FTP proxy URL? (ie. \"http://proxy:8080\", or \"none\") [${_proxy_host}] " + getresp "${_proxy_host}" + if [ "X${resp}" = X"none" ]; then + unset _proxy_host ftp_proxy http_proxy + else + _proxy_host=$resp + export ftp_proxy=${_proxy_host} + export http_proxy=${_proxy_host} + fi + if [ "${_url_type}" = "ftp" -a "X$ftp_proxy" = "X" ]; then + # Use active mode ftp? (irrelevant if using a proxy) + case "${_ftp_active}" in + -A) resp=y ;; + *) resp=n ;; + esac + echo "By default, ftp will attempt a passive connection and fall back to a normal" + echo "(active) connection if that doesn't work. However, there are some very" + echo "old ftp servers that claim to support passive mode, but really do not." + echo "In this case, you should explicitly request an active session." + echo -n "Do you want to use active ftp? [${resp}] " + getresp "${resp}" + case "$resp" in + y*|Y*) _ftp_active=-A ;; + *) unset _ftp_active ;; + esac + fi + + # Provide a list of possible servers + test -z "$_ftp_getlist" && _ftp_getlist=y + echo -n "Do you want a list of potential ${_url_type} servers? [${_ftp_getlist}] " + getresp $_ftp_getlist + case "$resp" in + n*|N*) _ftp_getlist=n + ;; + *) + _ftp_getlist=y + ftphost=129.128.5.191 + if [ "X${_resolver_enabled}" = X"TRUE" ]; then + ftphost=ftp.openbsd.org + fi + ftp ${_ftp_active} -V -a -o /tmp/ftplist ftp://${ftphost}/pub/OpenBSD/${VERSION_MAJOR}.${VERSION_MINOR}/ftplist > /dev/null + cat /tmp/ftplist | grep "^${_url_type}:" | cat -n | less -XE + ;; + esac -__install_ftp_1 # Get server IP address - resp="" # force one iteration + resp= # force one iteration while [ "X${resp}" = X"" ]; do - echo -n "Server IP? [${_ftp_server_ip}] " - getresp "${_ftp_server_ip}" - _ftp_server_ip=$resp + if [ -f /tmp/ftplist ]; then + eval echo -n "Server IP address, hostname, or list#? [\$_${_url_type}_server_ip]\ " + else + eval echo -n "Server IP address, or hostname? [\$_${_url_type}_server_ip]\ " + fi + eval getresp "\$_${_url_type}_server_ip" + if [ "X$resp" = "X?" -a -f /tmp/ftplist ]; then + cat /tmp/ftplist | grep "^${_url_type}:" | cat -n | less -XE + resp= + elif [ -n "$resp" -a `isnumeric $resp` -eq 1 -a ${resp:-0} -ge 1 \ + -a -f /tmp/ftplist ]; then + maxlines=`grep "^${_url_type}:" /tmp/ftplist | cat -n | + sed -n -e '$p' | cutword 1` + if [ $maxlines -lt $resp ]; then + echo "There is no ${resp}th line in the list." + resp= + continue + fi + tline=`grep "^${_url_type}:" /tmp/ftplist | sed -n -e "${resp}p"` + url=`echo $tline | sed -e "s/^${_url_type}:\/\///" | + cutword -t' ' 1 | cutword -t' ' 1` + host=`echo $url | cutword -t/ 1` + path=`echo $url | sed -e "s/^${host}\///"` + path="${path}/${VERSION_MAJOR}.${VERSION_MINOR}/${ARCH}" + eval _${_url_type}_server_ip=$host + eval _${_url_type}_server_dir=$path + resp= # do it again, just to double check + echo "Using $tline" + else + eval _${_url_type}_server_ip="$resp" + fi done # Get server directory - resp="" # force one iteration + if [ "${_url_type}" = "ftp" -a "X${_ftp_server_dir}" = X"" ]; then + # Default ftp dir + _ftp_server_dir="pub/OpenBSD/${VERSION_MAJOR}.${VERSION_MINOR}/${ARCH}" + fi + resp= # force one iteration while [ "X${resp}" = X"" ]; do - echo -n "Server directory? [${_ftp_server_dir}] " - getresp "${_ftp_server_dir}" - _ftp_server_dir=$resp + eval echo -n "Server directory? [\$_${_url_type}_server_dir]\ " + eval getresp "\$_${_url_type}_server_dir" + eval _${_url_type}_server_dir=$resp done - # Get login name - resp="" # force one iteration - while [ "X${resp}" = X"" ]; do - echo -n "Login? [${_ftp_server_login}] " - getresp "${_ftp_server_login}" - _ftp_server_login=$resp - done + if [ "${_url_type}" = "ftp" ]; then + # Need default values even if we proxy ftp... + if [ "X${_ftp_server_login}" = X"" ]; then + _ftp_server_login=anonymous + fi + if [ "X${_ftp_server_password}" = X"" ]; then + _ftp_server_password=root@`hostname`.${FQDN} + fi - # Get password - resp="" # force one iteration - while [ "X${resp}" = X"" ]; do - echo -n "Password? [${_ftp_server_password}] " - getresp "${_ftp_server_password}" - _ftp_server_password=$resp + # Get login name + resp= # force one iteration + while [ "X${resp}" = X"" ]; do + echo -n "Login? [${_ftp_server_login}] " + getresp "${_ftp_server_login}" + _ftp_server_login=$resp + done + + # Get password unless anonymous + if [ ${_ftp_server_login} != "anonymous" ]; then + resp= # force one iteration + while [ "X${resp}" = X"" ]; do + echo -n "Password (will not echo): " + stty -echo + getresp "${_ftp_server_password}" + stty echo + echo + _ftp_server_password=$resp + done + else + # only used by ftp_list_files() + _ftp_server_password=root@`hostname`.${FQDN} + fi + fi +fi + +# Build up the base url since it is so nasty... +if [ "${_url_type}" = "ftp" -a "${_ftp_server_login}" != "anonymous" ]; then + eval _url_base=${_url_type}://${_ftp_server_login}:${_ftp_server_password}@\$_${_url_type}_server_ip/\$_${_url_type}_server_dir +else + eval _url_base=${_url_type}://\$_${_url_type}_server_ip/\$_${_url_type}_server_dir +fi + +# Get list of files from the server. +# XXX - check for nil $_file_list and deal +if [ "${_url_type}" = "ftp" -a "X${ftp_proxy}" = X"" ]; then + _file_list=`ftp_list_files "$_ftp_server_ip" "$_ftp_server_login" "$_ftp_server_password" "$_ftp_server_dir"` +else + # Assumes index file is "index.txt" for http (or proxy) + # We can't use index.html since the format is server-dependent + _file_list=`ftp -o - -V ${_url_base}/index.txt | sed 's/
//'` +fi + +_sets= +if list_has_sets "$_file_list" $THESETS; then + for _f in $THESETS ; do + if [ "X${_f}" = "Xkernel" ]; then + if isin bsd $_file_list; then + _kernel=bsd + fi + elif isin ${_f}${VERSION}.tar.gz $_file_list; then + _sets="$_sets ${_f}${VERSION}.tar.gz" + elif isin ${_f}${VERSION}.tgz $_file_list; then + _sets="$_sets ${_f}${VERSION}.tgz" + fi + done +else + eval echo "There are no OpenBSD install sets available in \"\$_${_url_type}_server_dir\"." + echo -n "Search for *.tar.gz and *.tgz files? [y] " + getresp "y" + case "$resp" in + n*|N*) return ;; + *) ;; + esac + # *.tar.gz and *.tgz are possible sets + _sets= + _kernel= + for _f in ${_file_list} ; do + case "$_f" in + *.tar.gz|*.tgz) _sets="$_sets ${_f}" + esac done + if [ "X${_sets}" = X"" ]; then + echo "There are no *.tar.gz or *.tgz files in that dir." + echo -n "See a directory listing? [y] " + getresp "y" + case "$resp" in + n*|N*) return ;; + *) ;; + esac + echo + echo "${_file_list}" + echo + return + else + echo "Adding *.tar.gz and *.tgz files to selector." + fi +fi - # Get list of files for mget. - cat << \__install_ftp_2 +# Yes, all those blackslashes really are necesary... +eval echo "\\\\n"\ +"You will now be asked for files to extract. In addition to the files listed,\\\\n"\ +"you may select any file located at\\\\n"\ +" \$_${_url_type}_server_ip:\$_${_url_type}_server_dir\\\\n"\ +"You can also enter \'all\' to install all the standard sets, or \'list\' to list\\\\n"\ +"the files available. When you are done selecting files, enter \'done\'. Some of\\\\n"\ +"these sets are required for your ${MODE} and some are optional -- you will want\\\\n"\ +"at least the base and bsd sets. Consult the installation notes if you are not\\\\n"\ +"sure which sets are required!" +_osetsdone="$_setsdone" +# Set the minimal default +for _f in $_sets $_kernel; do + eval "case $_f in \ + ${_minpat}) \ + if ! isin \${_f} \${_setsdone}; then \ + _get_files=\`addel \${_f} \${_get_files}\` ; \ + _setsdone=\`addel \${_f} \${_setsdone}\` ; \ + fi ;; \ + esac" +done + +# Allow the user to select/de-select additional sets +while : ; do + echo + echo "The following sets are available for extraction." + echo "Enter filename, \`list', \`all', or \`done'." + echo "You may de-select a set by prepending a '-' to its name." + echo + get_selection "$_sets $_kernel" + + if [ "X${resp}" = X"done" ]; then + break + elif [ "X${resp}" = X"list" ]; then + echo + eval echo "\$_${_url_type}_server_dir:" + echo "${_file_list}" + continue + fi -You will now be asked for files to extract. Enter one file at a time. -When you are done entering files, enter 'done'. + eval glob_selection \"$resp\" \$_${_url_type}_server_dir \"$_sets $_kernel\" +done -__install_ftp_2 - echo "#!/bin/sh" > /tmp/ftp-script.sh - echo "cd /mnt" >> /tmp/ftp-script.sh - echo "ftp -i -n $_ftp_server_ip << \__end_commands" >> \ - /tmp/ftp-script.sh - echo "user $_ftp_server_login $_ftp_server_password" >> \ - /tmp/ftp-script.sh - echo "bin" >> /tmp/ftp-script.sh - echo "cd $_ftp_server_dir" >> /tmp/ftp-script.sh +# User may have said "done" without selecting any files +if [ "X${_get_files}" = X"" ]; then + return +fi + +# Stash the fact that we configured and downloaded via this url method +eval _installed_via_${_url_type}=1 + +echo +echo "Fetching files via ${_url_type} may take a long time, especially over a slow network" +echo -n "connection. Ready to download files? [y] " +getresp "y" +case "$resp" in + y*|Y*) + ;; + *) + _setsdone="$_osetsdone" + return + ;; +esac + +# Download the files one at a time and keep track of which ones failed +while test -n "${_get_files}" ; do + _failed_files= + echo + for _f in $_get_files ; do + echo "Getting ${_f} ..." + if [ "X${_f}" = "Xssl${VERSION}.tar.gz" -o \ + "X${_f}" = "XsslUSA${VERSION}.tar.gz" ]; then + ( cd /mnt ; ftp ${_ftp_active} -o - -V -m ${_url_base}/${_f} | /mnt/usr/sbin/chroot /mnt /usr/sbin/pkg_add -I -) + elif [ "X${_f}" = "X${_kernel}" ]; then + ( cd /mnt ; ftp ${_ftp_active} -V -m ${_url_base}/${_f} ) + else + ( cd /mnt ; ftp ${_ftp_active} -o - -V -m ${_url_base}/${_f} | tar zxpf - ) + fi + if [ $? -ne 0 ]; then + # Mark xfer as having failed,. + _setsdone=`rmel $_f $_setsdone` + _failed_files="${_failed_files} ${_f}" + elif [ "X${_f}" = "Xssl${VERSION}.tar.gz" -o \ + "X${_f}" = "XsslUSA${VERSION}.tar.gz" ]; then + ssl=1 + fi + done + + # Give them the option of refetching failed files. + _get_files= + while test -n "${_failed_files}" ; do + echo + echo "The following files failed to transfer and extract correctly:" + echo "Choose which one(s) to refetch or 'done' to exit selector." + echo "You may de-select a file by prepending a '-' to its name." + echo + get_selection "$_failed_files" - resp="" # force one interation - while [ "X${resp}" != X"done" ]; do - echo -n "File? [done] " - getresp "done" if [ "X${resp}" = X"done" ]; then break + elif [ "X${resp}" = X"list" ]; then + echo + eval echo "\$_${_url_type}_server_dir:" + echo "${_file_list}" + echo + continue fi - _ftp_file=`echo ${resp} | cutword 1'` - echo "get ${_ftp_file} |\"pax -r -z -v\"" >> \ - /tmp/ftp-script.sh + eval glob_selection \"$resp\" \$_${_url_type}_server_dir \"$_failed_files\" done - - echo "quit" >> /tmp/ftp-script.sh - echo "__end_commands" >> /tmp/ftp-script.sh - - sh /tmp/ftp-script.sh - rm -f /tmp/ftp-script.sh - echo "Extraction complete." +done } install_from_mounted_fs() { - # $1 - directory containing installation sets - local _filename - local _sets - local _next - local _f - - _sets="" - if dir_has_sets $1 $THESETS; then - for _f in $THESETS ; do - if [ -f $1/${_f}.tar.gz ]; then - _sets="$_sets ${_f}.tar.gz" - elif [ -f $1/${_f}.tgz ]; then - _sets="$_sets ${_f}.tgz" +# $1 - directory containing installation sets +local _sets= _kernel _f _get_files _failed_files _osetsdone + +if [ ! -d $1 ]; then + echo "No such directory: $1" + return +fi + +if dir_has_sets $1 $THESETS; then + for _f in $THESETS ; do + if [ "X${_f}" = "Xkernel" ]; then + if [ -f $1/bsd ]; then + _kernel=bsd fi - done - else - echo "There are no OpenBSD install sets available in \"$1\"" + elif [ -f $1/${_f}${VERSION}.tar.gz ]; then + _sets="$_sets ${_f}${VERSION}.tar.gz" + elif [ -f $1/${_f}${VERSION}.tgz ]; then + _sets="$_sets ${_f}${VERSION}.tgz" + fi + done +else + echo "There are no OpenBSD install sets available in \"$1\"." + echo -n "Search for *.tar.gz and *.tgz files? [y] " + getresp "y" + case "$resp" in + n*|N*) return ;; + *) ;; + esac + # *.tar.gz and *.tgz are possible sets + _sets= + _kernel= + _sets=`cd $1 ; echo *.tar.gz *.tgz` + if [ "X${_sets}" = X'*.tar.gz *.tgz' ]; then + echo "There are no *.tar.gz or *.tgz files in that dir." + echo -n "See a directory listing? [y] " + getresp "y" + case "$resp" in + n*|N*) return ;; + *) ;; + esac + echo + ( cd $1 && ls ) + echo return + else + echo "Adding *.tar.gz and *.tgz files to selector." fi +fi - while : ; do - echo "The following sets are available for extraction:" - echo "(marked sets have already been extracted)" - echo "" - - _next="" - for _f in $_sets ; do - if isin $_f $_setsdone; then - echo -n "[X] " - _next="" - else - echo -n " " - if [ -z "$_next" ]; then _next=$_f; fi +echo "\n"\ +"You will now be asked for files to extract. In addition to the\n"\ +"files listed in the selector you may enter any file located in\n"\ +"$1. You can also enter 'all' to install all the standard\n"\ +"sets, or 'list' to list the files avilable in $1.\n"\ +"When you are done selecting files, enter 'done'.\n"\ +"Some of these sets are required for your ${MODE} and some are optional --\n"\ +"You will want at least the base and bsd sets.\n"\ +"Consult the installation notes if you are not sure which sets are required!" +_osetsdone="$_setsdone" +# Set a minimal default +for _f in $_sets $_kernel; do + case "$_f" in + base*.tar.gz|base*.tgz|man*.tar.gz|man*.tgz|etc*.tar.gz|etc*.tgz|bsd) + if ! isin ${_f} ${_setsdone}; then + _get_files=`addel ${_f} ${_get_files}` + _setsdone=`addel ${_f} ${_setsdone}` fi - echo $_f - done - echo "" + ;; + esac +done + +# Allow the user to select/de-select additional sets +while : ; do + echo + echo "The following sets are available for extraction." + echo "Enter filename, \`list', \`all', or \`done'." + echo "You may de-select a set by prepending a '-' to its name." + echo + get_selection "$_sets $_kernel" + + if [ "X${resp}" = X"done" ]; then + break + elif [ "X${resp}" = X"list" ]; then + echo + echo "${1}:" + ( cd $1 && ls ) + continue + fi - # Get the name of the file. - if [ "X$_next" = "X" ]; then resp=n; else resp=y; fi - echo -n "Continue extraction [$resp]?" - getresp "$resp" - if [ "$resp" = "n" ]; then - break + glob_selection "$resp" "$1" "$_sets $_kernel" +done + +# User may have said "done" without selecting any files +if [ "X${_get_files}" = X"" ]; then + return +fi + +echo +echo -n "Ready to extract selected file sets? [y] " +getresp "y" +case "$resp" in + y*|Y*) + ;; + *) + _setsdone="$_osetsdone" + return + ;; +esac + +# Extract the files one at a time and keep track of which ones failed +while test -n "${_get_files}" ; do + _failed_files= + echo + for _f in $_get_files ; do + echo "$1/${_f}:" + if [ "X${_f}" = "Xssl${VERSION}.tar.gz" -o \ + "X${_f}" = "XsslUSA${VERSION}.tar.gz" ]; then + ( cd /mnt ; ftp -o - -V -m file:$1/${_f} | /mnt/usr/sbin/chroot /mnt /usr/sbin/pkg_add -I -) + elif [ "X${_f}" = "X${_kernel}" ]; then + cp $1/$_f /mnt/$_f + else + cat $1/$_f | (cd /mnt; tar -zxvpf -) + fi + if [ $? -ne 0 ]; then + # Mark xfer as having failed,. + _setsdone=`rmel $_f $_setsdone` + _failed_files="${_failed_files} ${_f}" + elif [ "X${_f}" = "Xssl${VERSION}.tar.gz" -o \ + "X${_f}" = "XsslUSA${VERSION}.tar.gz" ]; then + ssl=1 fi + done - echo -n "File name [$_next]? " - getresp "$_next" - _f=$resp - _filename="/$1/$_f" + # Give them the option of retrying failed files. + _get_files= + while test -n "${_failed_files}" ; do + echo + echo "The following files failed to extract correctly:" + echo "Choose which one(s) to retry or 'done' to exit selector." + echo "You may de-select a file by prepending a '-' to its name." + echo + get_selection "$_failed_files" - # Ensure file exists - if [ ! -f $_filename ]; then - echo "File $_filename does not exist. Check to make" - echo "sure you entered the information properly." + if [ "X${resp}" = X"done" ]; then + break + elif [ "X${resp}" = X"list" ]; then + echo + echo "${1}:" + ( cd $1 && ls ) + echo continue fi - # Extract file - cat $_filename | (cd /mnt; pax -r -pe -z ) - echo "Extraction complete." - _setsdone="$_f $_setsdone" - + glob_selection "$resp" "$1" "$_failed_files" done +done } install_cdrom() { - local _drive - local _partition_range - local _partition - local _fstype - local _directory +local _drive _partition_range _partition _fstype _directory - # Get the cdrom device info - cat << \__install_cdrom_1 +# Get the cdrom device info +cat << __EOT The following CD-ROM devices are installed on your system; please select the CD-ROM device containing the partition with the installation sets: -__install_cdrom_1 - _CDDEVS=`md_get_cddevs` - echo "$_CDDEVS" - echo "" - echo -n "Which is the CD-ROM with the installation media? [abort] " - getresp "abort" - case "$resp" in - abort) +__EOT +_CDDEVS=`md_get_cddevs` +echo "$_CDDEVS" +echo +echo -n "Which is the CD-ROM with the installation media? [abort] " +getresp "abort" +case "$resp" in + abort) + echo "Aborting." + return + ;; + + *) + if isin $resp $_CDDEVS ; then + _drive=$resp + else + echo + echo "The CD-ROM $resp does not exist." echo "Aborting." return + fi + ;; +esac + +# Get partition +_partition_range=`md_get_partition_range` +resp= # force one iteration +while [ "X${resp}" = X"" ]; do + echo -n "CD-ROM partition to mount (normally \"c\")? [c] " + getresp "c" + case "$resp" in + $_partition_range) + _partition=$resp ;; *) - if isin $resp $_CDDEVS ; then - _drive=$resp - else - echo "" - echo "The CD-ROM $resp does not exist." - echo "Aborting." - return - fi + echo "Invalid response: $resp" + resp= # force loop to repeat ;; esac +done - # Get partition - _partition_range=`md_get_partition_range` - resp="" # force one iteration - while [ "X${resp}" = X"" ]; do - echo -n "Partition? [c] " - getresp "c" - case "$resp" in - $_partition_range) - _partition=$resp - ;; - - *) - echo "Invalid response: $resp" - resp="" # force loop to repeat - ;; - esac - done - - # Ask for filesystem type - cat << \__install_cdrom_2 +# Ask for filesystem type +cat << __EOT There are two CD-ROM filesystem types currently supported by this program: - 1) ISO-9660 (cd9660) - 2) Berkeley Fast Filesystem (ffs) - -__install_cdrom_2 - resp="" # force one iteration - while [ "X${resp}" = X"" ]; do - echo -n "Which filesystem type? [cd9660] " - getresp "cd9660" - case "$resp" in - cd9660|ffs) - _fstype=$resp - ;; - - *) - echo "Invalid response: $resp" - resp="" # force loop to repeat - ;; - esac - done +cd9660 ISO-9660 +ffs Berkeley Fast Filesystem + +__EOT +resp= # force one iteration +while [ "X${resp}" = X"" ]; do + echo -n "Which filesystem type (Official OpenBSD CD-ROM is cd9660)? [cd9660] " + getresp "cd9660" + case "$resp" in + cd9660|ffs) + _fstype=$resp + ;; - # Mount the CD-ROM - if ! mount -t ${_filesystem} -o ro \ - /dev/${_drive}${_partition} /mnt2 ; then - echo "Cannot mount CD-ROM drive. Aborting." - return - fi + *) + echo "Invalid response: $resp" + resp= # force loop to repeat + ;; + esac +done - # Get the directory where the file lives - resp="" # force one iteration - while [ "X${resp}" = X"" ]; do - echo "Enter the directory relative to the mount point that" - echo -n "contains the file. [${_directory}] " - getresp "${_directory}" - done - _directory=$resp +# Mount the CD-ROM +if ! mount -t ${_fstype} -o ro \ + /dev/${_drive}${_partition} /mnt2 ; then + echo "Cannot mount CD-ROM drive. Aborting." + return +fi - install_from_mounted_fs /mnt2/${_directory} - umount -f /mnt2 > /dev/null 2>&1 +# Get the directory where the file lives +if [ "X${_directory}" = X"" ]; then + _directory="/${VERSION_MAJOR}.${VERSION_MINOR}/${ARCH}" +fi +resp= # force one iteration +while [ "X${resp}" = X"" ]; do + echo "Enter the directory relative to the mount point that" + echo -n "contains the file. [${_directory}] " + getresp "${_directory}" +done +_directory=$resp + +install_from_mounted_fs /mnt2/${_directory} +umount -f /mnt2 > /dev/null 2>&1 } mount_a_disk() { - # Mount a disk on /mnt2. The set of disk devices to choose from - # is $_DKDEVS. - # returns 0 on failure. - - local _drive - local _partition_range - local _partition - local _fstype - local _fsopts - local _directory - local _md_fstype - local _md_fsopts - - getresp "abort" - case "$resp" in - abort) +# Mount a disk on /mnt2. The set of disk devices to choose from +# is $_DKDEVS. +# returns 0 on failure. + +local _drive _def_partition _partition_range _partition _fstype +local _fsopts _directory _md_fstype _md_fsopts + +getresp "abort" +case "$resp" in + abort) + echo "Aborting." + return 0 + ;; + + *) + if isin $resp $_DKDEVS ; then + _drive=$resp + else + echo + echo "The disk $resp does not exist." echo "Aborting." return 0 + fi + ;; +esac + +# Get partition +cat << __EOT + +The following partitions have been found on $_drive: + +__EOT +disklabel $_drive 2>/dev/null | grep '^ .:' +echo +_likely_partition_range=`disklabel $_drive 2>/dev/null | \ + sed -n -e '/swap/s/.*//' -e '/unused/s/.*//' \ + -e '/^ .:/{s/^ \(.\).*/\1/;H;}' \ + -e '${g;s/\n//g;s/^/[/;s/$/]/p;}'` +_partition_range=`disklabel $_drive 2>/dev/null | \ + sed -n -e '/^ .:/{s/^ \(.\).*/\1/;H;}' \ + -e '${g;s/\n//g;s/^/[/;s/$/]/p;}'` +_def_partition=`echo $_likely_partition_range | \ + sed -n 's/^\[\(.\).*\]/\1/p'` +if [ -z "$_def_partition" ]; then + _def_partition=`echo $_partition_range | \ + sed -n 's/^\[\(.\).*\]/\1/p'` + if [ -z "$_def_partition" ]; then + echo "There are no usable partitions on that disk" + return 0 + fi +fi +resp= # force one iteration +while [ "X${resp}" = X"" ]; do + echo -n "Partition? [$_def_partition] " + getresp "$_def_partition" + case "$resp" in + $_partition_range) + _partition=$resp ;; *) - if isin $resp $_DKDEVS ; then - _drive=$resp - else - echo "" - echo "The disk $resp does not exist." - echo "Aborting." - return 0 - fi + echo "Invalid response: $resp" + resp= # force loop to repeat ;; esac +done - # Get partition - _partition_range=`md_get_partition_range` - resp="" # force one iteration - while [ "X${resp}" = X"" ]; do - echo -n "Partition? [d] " - getresp "d" - case "$resp" in - $_partition_range) - _partition=$resp - ;; - - *) - echo "Invalid response: $resp" - resp="" # force loop to repeat - ;; - esac - done - - # Ask for filesystem type - cat << \__mount_a_disk_2 +# Ask for filesystem type +cat << __EOT The following filesystem types are supported: - 1) ffs -__mount_a_disk_2 - _md_fstype=`md_native_fstype` - _md_fsopts=`md_native_fsopts` - if [ ! -z "$_md_fstype" ]; then - echo " 2) $_md_fstype" - else - _md_fstype="_undefined_" - fi - resp="" # force one iteration - while [ "X${resp}" = X"" ]; do - echo -n "Which filesystem type? [ffs] " - getresp "ffs" - case "$resp" in - ffs) - _fstype=$resp - _fsopts="ro" - ;; - $_md_fstype) - _fstype=$resp - _fsopts=$_md_fsopts - ;; - *) - echo "Invalid response: $resp" - resp="" # force loop to repeat - ;; - esac - done +default (deduced from the disklabel) +ffs +__EOT +_md_fstype=`md_native_fstype` +_md_fsopts=`md_native_fsopts` +if [ ! -z "$_md_fstype" ]; then + echo " $_md_fstype" +else + _md_fstype="_undefined_" +fi +resp= # force one iteration +while [ "X${resp}" = X"" ]; do + echo -n "Which filesystem type? [default] " + getresp "default" + case "$resp" in + default) + _fstype= + _fsopts="ro" + ;; + ffs) + _fstype="-t $resp" + _fsopts="async,ro" + ;; + $_md_fstype) + _fstype="-t $resp" + _fsopts=$_md_fsopts + ;; + *) + echo "Invalid response: $resp" + resp= # force loop to repeat + ;; + esac +done - # Mount the disk - if ! mount -t ${_fstype} -o $_fsopts \ - /dev/${_drive}${_partition} /mnt2 ; then - echo "Cannot mount disk. Aborting." - return 0 - fi - return 1 +# Mount the disk +if ! mount $_fstype -o $_fsopts /dev/${_drive}${_partition} /mnt2; then + echo "Cannot mount disk. Aborting." + return 0 +fi +return 1 } install_disk() { - local _directory +local _directory - cat << \__install_disk_1 +cat << __EOT The following disk devices are installed on your system; please select the disk device containing the partition with the installation sets: -__install_disk_1 - _DKDEVS=`md_get_diskdevs` - echo "$_DKDEVS" - echo "" - echo -n "Which is the disk with the installation sets? [abort] " - - if mount_a_disk ; then - return - fi +__EOT +_DKDEVS=`md_get_diskdevs` +echo "$_DKDEVS" +echo +echo -n "Which is the disk with the installation sets? [abort] " - # Get the directory where the file lives - resp="" # force one iteration - while [ "X${resp}" = X"" ]; do - echo "Enter the directory relative to the mount point that" - echo -n "contains the file. [${_directory}] " - getresp "${_directory}" - done - _directory=$resp +if mount_a_disk ; then + return +fi - install_from_mounted_fs /mnt2/${_directory} - umount -f /mnt2 > /dev/null 2>&1 +# Get the directory where the file lives +resp= # force one iteration +while [ "X${resp}" = X"" ]; do + echo "Enter the directory relative to the mount point that" + echo -n "contains the file. [${_directory}] " + getresp "${_directory}" +done +_directory=$resp + +install_from_mounted_fs /mnt2/${_directory} +umount -f /mnt2 > /dev/null 2>&1 } install_nfs() { - # Get the IP address of the server - resp="" # force one iteration - while [ "X${resp}" = X"" ]; do - echo -n "Server IP address? [${_nfs_server_ip}] " - getresp "${_nfs_server_ip}" - done - _nfs_server_ip=$resp +# Get the IP address of the server +resp= # force one iteration +while [ "X${resp}" = X"" ]; do + echo -n "Server IP address or hostname? [${_nfs_server_ip}] " + getresp "${_nfs_server_ip}" +done +_nfs_server_ip=$resp + +# Get server path to mount +resp= # force one iteration +while [ "X${resp}" = X"" ]; do + echo -n "Filesystem on server to mount? [${_nfs_server_path}] " + getresp "${_nfs_server_path}" +done +_nfs_server_path=$resp + +# Determine use of TCP +echo -n "Use TCP transport (only works with capable NFS server)? [n] " +getresp "n" +case "$resp" in + y*|Y*) + _nfs_tcp="-T" + ;; + + *) + _nfs_tcp= + ;; +esac + +# Mount the server +mkdir /mnt2 > /dev/null 2>&1 +if ! mount_nfs $_nfs_tcp ${_nfs_server_ip}:${_nfs_server_path} \ + /mnt2 ; then + echo "Cannot mount NFS server. Aborting." + return +fi - # Get server path to mount - resp="" # force one iteration - while [ "X${resp}" = X"" ]; do - echo -n "Filesystem on server to mount? [${_nfs_server_path}] " - getresp "${_nfs_server_path}" - done - _nfs_server_path=$resp +# Get the directory where the file lives +resp= # force one iteration +while [ "X${resp}" = X"" ]; do + echo "Enter the directory relative to the mount point that" + echo -n "contains the file. [${_nfs_directory}] " + getresp "${_nfs_directory}" +done +_nfs_directory=$resp + +install_from_mounted_fs /mnt2/${_nfs_directory} +umount -f /mnt2 > /dev/null 2>&1 +} - # Determine use of TCP - echo -n "Use TCP transport (only works with capable NFS server)? [n] " - getresp "n" +install_tape() { +local _xcmd + +# Get the name of the tape from the user. +cat << __EOT + +The installation program needs to know which tape device to use. Make +sure you use a "no rewind on close" device. + +__EOT +_tape=`basename $TAPE` +resp= # force one iteration +while [ "X${resp}" = X"" ]; do + echo -n "Name of tape device? [${_tape}]" + getresp "${_tape}" +done +_tape=`basename $resp` +TAPE="/dev/${_tape}" +if [ ! -c $TAPE ]; then + echo "$TAPE does not exist or is not a character special file." + echo "Aborting." + return +fi +export TAPE + +# Rewind the tape device +echo -n "Rewinding tape..." +if ! mt rewind ; then + echo "$TAPE may not be attached to the system or may not be" + echo "a tape device. Aborting." + return +fi +echo "done." + +# Get the file number +resp= # force one iteration +while [ "X${resp}" = X"" ]; do + echo -n "File number? " + getresp "" case "$resp" in - y*|Y*) - _nfs_tcp="-T" + [1-9]*) + _nskip=$(( $resp - 1 )) ;; *) - _nfs_tcp="" + echo "Invalid file number ${resp}." + resp= # force loop to repeat ;; esac +done - # Mount the server - mkdir /mnt2 > /dev/null 2>&1 - if ! mount_nfs $_nfs_tcp ${_nfs_server_ip}:${_nfs_server_path} \ - /mnt2 ; then - echo "Cannot mount NFS server. Aborting." +# Skip to correct file. +echo -n "Skipping to source file..." +if [ "X${_nskip}" != X"0" ]; then + if ! mt fsf $_nskip ; then + echo "Could not skip $_nskip files. Aborting." return fi +fi +echo "done." - # Get the directory where the file lives - resp="" # force one iteration - while [ "X${resp}" = X"" ]; do - echo "Enter the directory relative to the mount point that" - echo -n "contains the file. [${_nfs_directory}] " - getresp "${_nfs_directory}" - done - _nfs_directory=$resp +cat << __EOT - install_from_mounted_fs /mnt2/${_nfs_directory} - umount -f /mnt2 > /dev/null 2>&1 -} +There are 2 different ways the file can be stored on tape: -install_tape() { - local _xcmd +1) an image of a gzipped tar file +2) a standard tar image - # Get the name of the tape from the user. - cat << \__install_tape_1 +__EOT +resp= # force one iteration +while [ "X${resp}" = X"" ]; do + echo -n "Which way is it? [1] " + getresp "1" + case "$resp" in + 1) + _xcmd="tar -zxvpf -" + ;; + + 2) + _xcmd="tar -xvpf -" + ;; + + *) + echo "Invalid response: $resp." + resp= # force loop to repeat + ;; + esac + ( cd /mnt; dd if=$TAPE | $_xcmd ) +done +echo "Extraction complete." +} -The installation program needs to know which tape device to use. Make -sure you use a "no rewind on close" device. +get_timezone() { +local _a _zonepath -__install_tape_1 - _tape=`basename $TAPE` - resp="" # force one iteration - while [ "X${resp}" = X"" ]; do - echo -n "Name of tape device? [${_tape}]" - getresp "${_tape}" - done - _tape=`basename $resp` - TAPE="/dev/${_tape}" - if [ ! -c $TAPE ]; then - echo "$TAPE does not exist or is not a character special file." - echo "Aborting." - return - fi - export TAPE +# +# If the zoneinfo is not on the installation medium or on the +# installed filesystem, set TZ to GMT and return immediatly. +# +if [ ! -e /usr/share/zoneinfo -a ! -e /mnt/usr/share/zoneinfo ]; then + TZ=GMT + return +fi +if [ ! -d /usr/share/zoneinfo ]; then + _zonepath=/mnt +else + _zonepath= +fi + +cat << __EOT - # Rewind the tape device - echo -n "Rewinding tape..." - if ! mt rewind ; then - echo "$TAPE may not be attached to the system or may not be" - echo "a tape device. Aborting." - return - fi - echo "done." +Select a time zone for your location. Timezones are represented on the system +by a directory structure rooted in "/usr/share/timezone". Most timezones can +be selected by entering a token like "MET" or "GMT-6". Other zones are +grouped by continent or country, with detailed zone information separated by +a slash ("/"), e.g. "US/Pacific" or "Canada/Mountain". - # Get the file number - resp="" # force one iteration - while [ "X${resp}" = X"" ]; do - echo -n "File number? " - getresp "" - case "$resp" in - [1-9]*) - _nskip=`expr $resp - 1` - ;; +To get a listing of what's available in /usr/share/zoneinfo, enter "?" +at the prompts below. - *) - echo "Invalid file number ${resp}." - resp="" # fore loop to repeat +__EOT +if [ X$TZ = X ]; then + TZ=`ls -l /mnt/etc/localtime 2>/dev/null | cutlast` + TZ=${TZ#/usr/share/zoneinfo/} +fi +while : ; do + echo -n "What timezone are you in? [\`?' for list] [$TZ] " + getresp "$TZ" + case "$resp" in + "") + echo "Timezone defaults to GMT" + TZ="GMT" + break; + ;; + "?") + ls -F ${_zonepath}/usr/share/zoneinfo + ;; + *) + _a=$resp + while [ -d ${_zonepath}/usr/share/zoneinfo/$_a ]; do + echo -n "There are several timezones available" + echo " within zone '$_a'" + echo -n "Select a sub-timezone [\`?' for list]: " + getresp "" + case "$resp" in + "?") ls -F ${_zonepath}/usr/share/zoneinfo/$_a ;; + *) _a=${_a}/${resp} + if [ -f ${_zonepath}/usr/share/zoneinfo/$_a ]; then + break; + fi ;; - esac - done - - # Skip to correct file. - echo -n "Skipping to source file..." - if [ "X${_nskip}" != X"0" ]; then - if ! mt fsf $_nskip ; then - echo "Could not skip $_nskip files. Aborting." + esac + done + if [ -f ${_zonepath}/usr/share/zoneinfo/$_a ]; then + TZ="$_a" + echo "You have selected timezone \"$_a\"". return fi - fi - echo "done." - - cat << \__install_tape_2 + echo "'/usr/share/zoneinfo/$_a' is not a valid timezone on this system." + ;; + esac +done +} -There are 2 different ways the file can be stored on tape: +sane_install() { + if [ ! -s /mnt/bsd ]; then + cat << __EOT + +Warning, no kernel (/mnt/bsd) installed! You did not unpack a file set +containing a kernel--this is needed to boot. Please note that the install +kernel is *not* suitable for general use. +__EOT + elif [ ! -f /mnt/bin/cat ]; then + cat << __EOT + +You still do not have a /bin/cat in your filesystem (ie. a sample random file +which you probably want). This seems to indicate that you are still missing +important distribution files. +__EOT + elif [ ! -d /mnt/etc -o ! -d /mnt/usr/share/zoneinfo -o ! -d /mnt/dev ]; then + cat << __EOT + +Something needed to complete the installation seems to be missing, did you +forget to extract a required set? +__EOT + else + return 0; + fi - 1) an image of a gzipped tar file - 2) a standard tar image + cat << __EOT -__install_tape_2 - resp="" # force one iteration - while [ "X${resp}" = X"" ]; do - echo -n "Which way is it? [1] " - getresp "1" - case "$resp" in - 1) - _xcmd="pax -r -pe -z" - ;; +You will now be given the chance to install the missing set(s). You can +enter '!' at the prompt to escape to a shell and fix things by hand if you wish. - 2) - _xcmd="pax -r -pe" - ;; +__EOT - *) - echo "Invalid response: $resp." - resp="" # force loop to repeat - ;; - esac - ( cd /mnt; dd if=$TAPE | $_xcmd ) - done - echo "Extraction complete." + return 1 } -get_timezone() { - local _a - local _zonepath - - # - # If the zoneinfo is not on the installation medium or on the - # installed filesystem, set TZ to GMT and return immediatly. - # - if [ ! -e /usr/share/zoneinfo -a ! -e /mnt/usr/share/zoneinfo ]; then - TZ=GMT - return - fi - if [ ! -d /usr/share/zoneinfo ]; then - _zonepath=/mnt - else - _zonepath="" - fi - -cat << \__get_timezone_1 +install_sets() { +local _yup="FALSE" _have_nfs -Select a time zone for your location. Timezones are represented on the -system by a directory structure rooted in "/usr/share/timezone". Most -timezones can be selected by entering a token like "MET" or "GMT-6". -Other zones are grouped by continent, with detailed zone information -separated by a slash ("/"), e.g. "US/Pacific". +# Can we do an NFS install? +test -f /sbin/mount_nfs && _have_nfs=true -To get a listing of what's available in /usr/share/zoneinfo, enter "?" -at the prompts below. +# Ask the user which media to load the distribution from. +cat << __EOT +It is now time to extract the installation sets onto the hard disk. Make sure +the sets are either on a local device (i.e. tape, CD-ROM) or on a network +server. You will have the chance to repeat this step or to extract sets from +several places, so you don't have to try to load all the sets in one try and +can recover from some errors. -__get_timezone_1 - if [ X$TZ = X ]; then - TZ=`ls -l /mnt/etc/localtime 2>/dev/null | cutlast` - TZ=${TZ#/usr/share/zoneinfo/} +__EOT + +if [ "X$local_sets_dir" != "X" ]; then + install_from_mounted_fs ${local_sets_dir} + if [ X"$_setsdone" != X ]; then + _yup="TRUE" fi - while :; do - echo -n "What timezone are you in [\`?' for list] [$TZ]? " - getresp "$TZ" +fi + +# Go on prodding for alternate locations +resp= # force at least one iteration +while [ X"${resp}" = X ]; do + # If _yup is not FALSE, it means that we extracted sets above. + # If that's the case, bypass the menu the first time. + if [ X"$_yup" = X"FALSE" ]; then + echo -n "Install from (f)tp, (h)ttp, (t)ape, (C)D-ROM" + test -n "$_have_nfs" && echo -n ", (N)FS" + echo -n " or local (d)isk? " + getresp "" case "$resp" in - "") - echo "Timezone defaults to GMT" - TZ="GMT" - break; + d*|D*) + install_disk + resp=d ;; - "?") - ls ${_zonepath}/usr/share/zoneinfo + f*|F*) + test -n "$_didnet" || donetconfig + install_url -ftp + resp=f ;; - *) - _a=$resp - while [ -d ${_zonepath}/usr/share/zoneinfo/$_a ]; do - echo -n "There are several timezones available" - echo " within zone '$_a'" - echo -n "Select a sub-timezone [\`?' for list]: " - getresp "" - case "$resp" in - "?") ls ${_zonepath}/usr/share/zoneinfo/$_a ;; - *) _a=${_a}/${resp} - if [ -f ${_zonepath}/usr/share/zoneinfo/$_a ]; then - break; - fi - ;; - esac - done - if [ -f ${_zonepath}/usr/share/zoneinfo/$_a ]; then - TZ="$_a" - echo "You have selected timezone \"$_a\"". - break 2 + h*|H*) + test -n "$_didnet" || donetconfig + install_url -http + resp=h + ;; + t*|T*) + install_tape + resp=t + ;; + c*|C*) + install_cdrom + resp=c + ;; + n*|N*) + test -n "$_didnet" || donetconfig + if [ -n "$_have_nfs" ]; then + install_nfs + resp=n + else + echo "Invalid response: $resp" + resp= fi - echo "'/usr/share/zoneinfo/$_a' is not a valid timezone on this system." + ;; + *) + echo "Invalid response: $resp" + resp= ;; esac - done -} - -install_sets() -{ - local _yup - _yup="FALSE" - - # Ask the user which media to load the distribution from. - cat << \__install_sets_1 - -It is now time to extract the installation sets onto the hard disk. -Make sure the sets are either on a local device (i.e. tape, CD-ROM) or on a -network server. - -__install_sets_1 - - if [ "X$local_sets_dir" != "X" ]; then - install_from_mounted_fs ${local_sets_dir} - if [ X"$_setsdone" != X ]; then - _yup="TRUE" - fi + else + _yup="FALSE" # So we'll ask next time fi - # Go on prodding for alternate locations - resp="" # force at least one iteration - while [ X"${resp}" = X ]; do - # If _yup is not FALSE, it means that we extracted sets above. - # If that's the case, bypass the menu the first time. - if [ X"$_yup" = X"FALSE" ]; then - echo -n "Install from (f)tp, (t)ape, (C)D-ROM, (N)FS" - echo -n " or local (d)isk? " - getresp "" - case "$resp" in - d*|D*) - install_disk - ;; - f*|F*) - install_ftp - ;; - t*|T*) - install_tape - ;; - c*|C*) - install_cdrom - ;; - n*|N*) - install_nfs - ;; - *) - echo "Invalid response: $resp" - resp="" - ;; - esac - else - _yup="FALSE" # So we'll ask next time - fi - + # Perform sanity checks... + if sane_install; then # Give the user the opportunity to extract more sets. They # don't necessarily have to come from the same media. - echo "" + echo echo -n "Extract more sets? [n] " getresp "n" case "$resp" in y*|Y*) # Force loop to repeat - resp="" + resp= ;; *) ;; esac - done + else + # Not sane, don't exit loop. + resp= + fi +done } -munge_fstab() -{ - local _fstab - local _fstab_shadow - local _dev - local _mp - local _fstype - local _rest - - # Now that the 'real' fstab is configured, we munge it into a 'shadow' - # fstab which we'll use for mounting and unmounting all of the target - # filesystems relative to /mnt. Mount all filesystems. - _fstab=$1 - _fstab_shadow=$2 - ( while read _dev _mp _fstype _rest; do - # Skip comment lines - case "$_dev" in - \#*) continue;; - *) ;; - esac - # and some filesystem types (like there are swap,kernfs,...) - case "$_fstype" in - ffs|ufs|nfs) ;; - *) continue;; - esac - if [ "$_mp" = "/" ]; then - echo $_dev /mnt $_fstype $_rest - else - echo $_dev /mnt$_mp $_fstype $_rest - fi - done ) < $_fstab > $_fstab_shadow +munge_fstab() { +local _fstab _fstab_shadow _dev _mp _fstype _rest + +# Now that the 'real' fstab is configured, we munge it into a 'shadow' +# fstab which we'll use for mounting and unmounting all of the target +# filesystems relative to /mnt. Mount all filesystems. +_fstab=$1 +_fstab_shadow=$2 +( while read _dev _mp _fstype _rest; do + # Skip comment lines + case "$_dev" in + \#*) continue;; + *) ;; + esac + # and some filesystem types (like there are swap,kernfs,...) + case "$_fstype" in + ffs|ufs|nfs) ;; + *) continue;; + esac + if [ "$_mp" = "/" ]; then + echo $_dev /mnt $_fstype $_rest + else + echo $_dev /mnt$_mp $_fstype $_rest + fi + done ) < $_fstab > $_fstab_shadow } -mount_fs() -{ - # Must mount filesystems manually, one at a time, so we can make - # sure the mount points exist. - # $1 is a file in fstab format - local _fstab - - _fstab=$1 - - ( while read line; do - set -- $line - _dev=$1 - _mp=$2 - _fstype=$3 - _opt=$4 - - # If not the root filesystem, make sure the mount - # point is present. - if [ "X{$_mp}" != X"/mnt" ]; then - mkdir -p $_mp - fi +mount_fs() { +# Must mount filesystems manually, one at a time, so we can make +# sure the mount points exist. +# $1 is a file in fstab format +local _fstab=$1 +local _async=$2 + +( while read line; do + set -- $line + _dev=$1 + _mp=$2 + _fstype=$3 + _opt=$4 + + # If not the root filesystem, make sure the mount + # point is present. + if [ "X{$_mp}" != X"/mnt" ]; then + mkdir -p $_mp + fi - # Mount the filesystem. If the mount fails, exit - # with an error condition to tell the outer - # later to bail. - if ! mount -v -t $_fstype -o $_opt $_dev $_mp ; then - # error message displated by mount - exit 1 - fi - done ) < $_fstab + # Mount the filesystem. If the mount fails, exit + # with an error condition to tell the outer + # later to bail. + if ! mount -v -t $_fstype $_async -o $_opt $_dev $_mp ; then + # error message displayed by mount + exit 1 + fi +done ) < $_fstab - if [ "X${?}" != X"0" ]; then - cat << \__mount_filesystems_1 +if [ "X${?}" != X"0" ]; then + cat << __EOT FATAL ERROR: Cannot mount filesystems. Double-check your configuration and restart the installation process. -__mount_filesystems_1 - exit - fi +__EOT + exit +fi } -unmount_fs() -{ - # Unmount all filesystems and check their integrity. - # Usage: [-fast] <fstab file> - local _fast - local _fstab - local _pid - - if [ "$1" = "-fast" ]; then - _fast=1 - _fstab=$2 - else - _fast=0 - _fstab=$1 - fi +unmount_fs() { +# Unmount all filesystems and check their integrity. +# Usage: [-check] <fstab file> +local _check _fstab _pid - if [ ! \( -f $_fstab -a -s $_fstab \) ]; then - echo "fstab empty" > /dev/tty - return - fi +if [ "$1" = "-check" ]; then + _check=1 + _fstab=$2 +else + _check=0 + _fstab=$1 +fi - if [ $_fast = 0 ]; then - echo -n "Syncing disks..." - _pid=`twiddle` - sync; sleep 4; sync; sleep 2; sync; sleep 2 - kill $_pid - echo "done." - fi +if [ ! \( -f $_fstab -a -s $_fstab \) ]; then + echo "fstab empty" > /dev/tty + return +fi - ( - _devs="" - _mps="" - # maintain reverse order - while read line; do - set -- $line - _devs="$1 ${_devs}" - _mps="$2 ${_mps}" - done - echo -n "Umounting filesystems... " - for _mp in ${_mps}; do - echo -n "${_mp} " - umount ${_mp} - done - echo "Done." +( + _devs= + _mps= + # maintain reverse order + while read line; do + set -- $line + _devs="$1 ${_devs}" + _mps="$2 ${_mps}" + done + echo -n "Unmounting filesystems... " + for _mp in ${_mps}; do + echo -n "${_mp} " + umount ${_mp} + done + echo "... Done." - if [ $_fast = 0 ]; then - exit - fi + if [ $_check = 1 ]; then echo "Checking filesystem integrity..." for _dev in ${_devs}; do echo "${_dev}" fsck -f ${_dev} done - echo "Done." - ) < $_fstab + fi + echo "Done." +) < $_fstab } -check_fs() -{ - # Check filesystem integrity. - # $1 is a file in fstab format - local _fstab +remount_fs() { +( while read line; do + set -- $line + _dev=$1 + _mp=$2 + _fstype=$3 + _opt=$4 + + if ! mount -u -o $_opt $_dev $_mp ; then + # error message displayed by mount + exit 1 + fi +done ) < $1 +} - _fstab=$1 +check_fs() { +# Check filesystem integrity. +# $1 is a file in fstab format +local _fstab=$1 - ( - _devs="" - _mps="" - while read line; do - set -- $line - _devs="$1 ${_devs}" - _mps="$2 ${_mps}" - done +( + _devs= + _mps= + while read line; do + set -- $line + _devs="$1 ${_devs}" + _mps="$2 ${_mps}" + done - echo "Checking filesystem integrity..." - for _dev in ${_devs}; do - echo "${_dev}" - fsck -f ${_dev} + echo "Checking filesystem integrity..." + for _dev in ${_devs}; do + echo "${_dev}" + fsck -f ${_dev} + done + echo "Done." +) < $_fstab +} + +donetconfig() { + _didnet=1 + resp= # force at least one iteration + _nam= + if [ -f /tmp/myname ]; then + _nam=`cat /tmp/myname` + fi + while [ "X${resp}" = X"" ]; do + echo -n "Enter system hostname (short form, ie. \"foo\"): [$_nam] " + getresp "$_nam" + done + hostname $resp + echo $resp > /tmp/myname + + resp= # force at least one iteration + if [ -f /tmp/resolv.conf ]; then + FQDN=`grep '^domain ' /tmp/resolv.conf | \ + sed -e 's/^domain //'` + elif [ -f /tmp/resolv.conf.shadow ]; then + FQDN=`grep '^domain ' /tmp/resolv.conf.shadow | \ + sed -e 's/^domain //'` + fi + while [ "X${resp}" = X"" ]; do + echo -n "Enter DNS domain name (ie. \"bar.com\"): [$FQDN] " + getresp "$FQDN" + done + FQDN=$resp + + echo + echo "If you have any devices being configured by a DHCP server" + echo "it is recommended that you do not enter a default route or" + echo "any name servers." + echo + + configurenetwork + + resp=`route -n show | + grep '^default' | + sed -e 's/^default //' -e 's/ .*//'` + if [ "X${resp}" = "X" ]; then + resp=none + if [ -f /tmp/mygate ]; then + resp=`cat /etc/mygate` + if [ "X${resp}" = "X" ]; then + resp="none"; + fi + fi + fi + echo -n "Enter IP address of default route: [$resp] " + getresp "$resp" + if [ "X${resp}" != X"none" ]; then + route delete default > /dev/null 2>&1 + if route add default $resp > /dev/null ; then + echo $resp > /tmp/mygate + fi + fi + + resp="none" + if [ -f /etc/resolv.conf ]; then + resp= + for n in `grep '^nameserver ' /etc/resolv.conf | \ + sed -e 's/^nameserver //'`; do + if [ "X${resp}" = "X" ]; then + resp="$n" + else + resp="$resp $n" + fi done - echo "Done." - ) < $_fstab + elif [ -f /tmp/resolv.conf ]; then + resp= + for n in `grep '^nameserver ' /tmp/resolv.conf | \ + sed -e 's/^nameserver //'`; do + if [ "X${resp}" = "X" ]; then + resp="$n" + else + resp="$resp $n" + fi + done + fi + echo -n "Enter IP address of primary nameserver: [$resp] " + getresp "$resp" + if [ "X${resp}" != X"none" ]; then + echo "search $FQDN" > /tmp/resolv.conf + for n in `echo ${resp}`; do + echo "nameserver $n" >> /tmp/resolv.conf + done + echo "lookup file bind" >> /tmp/resolv.conf + + echo -n "Would you like to use the nameserver now? [y] " + getresp "y" + case "$resp" in + y*|Y*) + cp /tmp/resolv.conf \ + /tmp/resolv.conf.shadow + ;; + + *) + ;; + esac + fi + + if [ ! -f /tmp/resolv.conf.shadow ]; then + echo + echo "The host table is as follows:" + echo + cat /tmp/hosts + cat << __hosts_table_1 + +You may want to edit the host table in the event that you are doing an +NFS installation or an FTP installation without a name server and want +to refer to the server by name rather than by its numeric ip address. +__hosts_table_1 + echo -n "Would you like to edit the host table with ${EDITOR}? [n] " + getresp "n" + case "$resp" in + y*|Y*) + ${EDITOR} /tmp/hosts + ;; + + *) + ;; + esac + fi + + cat << \__network_config_2 + +You will now be given the opportunity to escape to the command shell to do +any additional network configuration you may need. This may include adding +additional routes, if needed. In addition, you might take this opportunity +to redo the default route in the event that it failed above. +__network_config_2 + echo -n "Escape to shell? [n] " + getresp "n" + case "$resp" in + y*|Y*) + echo "Type 'exit' to return to install." + sh + ;; + + *) + ;; + esac } diff --git a/distrib/mvme68k/ramdisk/list b/distrib/mvme68k/ramdisk/list index 93c6bdaf107..e4bc81a5599 100644 --- a/distrib/mvme68k/ramdisk/list +++ b/distrib/mvme68k/ramdisk/list @@ -1,90 +1,105 @@ -# $OpenBSD: list,v 1.4 1997/05/12 03:25:19 deraadt Exp $ +# $OpenBSD: list,v 1.5 2000/01/24 04:50:26 smurph Exp $ +SRCDIRS distrib/special +SRCDIRS usr.bin bin sbin usr.sbin gnu/usr.bin +SRCDIRS usr.sbin/pppd +SRCDIRS usr.bin/vi -COPY ${OBJDIR}/raminst raminst -LINK raminst bin/cat -LINK raminst bin/chmod -LINK raminst bin/cp -LINK raminst bin/df -LINK raminst bin/dd -LINK raminst bin/ed -LINK raminst bin/expr -LINK raminst bin/ln -LINK raminst bin/ls -LINK raminst bin/kill -LINK raminst bin/hostname -LINK raminst bin/mkdir -LINK raminst bin/mv -LINK raminst bin/pwd -LINK raminst bin/rm -LINK raminst bin/sh -LINK bin/sh bin/-sh -LINK raminst bin/stty -LINK raminst bin/sleep -LINK raminst bin/sync -LINK raminst bin/test -LINK raminst bin/[ -LINK raminst sbin/disklabel -LINK raminst sbin/fsck -LINK raminst sbin/halt -LINK raminst sbin/ifconfig -LINK raminst sbin/init -LINK raminst sbin/mknod -LINK raminst sbin/mount -LINK raminst sbin/mount_cd9660 -LINK raminst sbin/mount_ffs -LINK raminst sbin/mount_kernfs -LINK raminst sbin/mount_nfs -LINK raminst sbin/mount_mfs -LINK raminst sbin/newfs -LINK raminst sbin/reboot -LINK raminst sbin/route -LINK raminst sbin/slattach -LINK raminst sbin/umount -LINK raminst usr/bin/chgrp -LINK raminst usr/bin/cut -LINK raminst usr/bin/ftp -LINK raminst usr/bin/egrep -LINK raminst usr/bin/grep -LINK raminst usr/bin/gzip -LINK raminst usr/bin/more -LINK raminst usr/bin/less -LINK raminst usr/bin/sed -LINK raminst usr/bin/sort -LINK raminst usr/bin/pax -LINK raminst usr/bin/tip -LINK raminst usr/sbin/chown -SPECIAL /bin/rm raminst +# copy the crunched binary, link to it, and kill it +COPY ${OBJDIR}/instbin instbin +LINK instbin bin/cat +LINK instbin bin/chmod +LINK instbin bin/cp +LINK instbin bin/dd +LINK instbin bin/df +LINK instbin bin/ed +LINK instbin bin/expr +LINK instbin bin/hostname +LINK instbin bin/ln +LINK instbin bin/ls +LINK instbin bin/mkdir +LINK instbin bin/mt +LINK instbin bin/mv +LINK instbin bin/pax bin/tar bin/cpio +LINK instbin bin/rm +LINK instbin bin/ksh bin/sh +ARGVLINK ksh -sh +#LINK instbin bin/sleep +LINK instbin bin/stty +#LINK instbin bin/sync +LINK instbin bin/test bin/[ +#LINK instbin sbin/dhclient +LINK instbin sbin/disklabel +LINK instbin sbin/fsck +LINK instbin sbin/fsck_ffs +LINK instbin sbin/reboot sbin/halt +LINK instbin sbin/ifconfig +LINK instbin sbin/init +LINK instbin sbin/mknod +LINK instbin sbin/mount +LINK instbin sbin/mount_cd9660 +LINK instbin sbin/mount_ffs +LINK instbin sbin/mount_nfs +LINK instbin sbin/mount_kernfs +LINK instbin sbin/newfs +LINK instbin sbin/ping +#LINK instbin sbin/restore +LINK instbin sbin/route +#LINK instbin sbin/slattach +#LINK instbin sbin/scsi +LINK instbin sbin/umount +LINK instbin usr/bin/awk +LINK instbin usr/bin/grep usr/bin/fgrep usr/bin/egrep +LINK instbin usr/bin/less usr/bin/more +LINK instbin usr/bin/rsh +LINK instbin usr/bin/sort +#LINK instbin usr/bin/tip +LINK instbin usr/bin/tr +LINK instbin usr/sbin/chat +LINK instbin usr/sbin/pppd +SYMLINK ../../instbin usr/bin/build usr/bin/vi +SYMLINK ../../instbin usr/sbin/chown usr/bin/chgrp +SYMLINK ../../instbin usr/bin/ftp +SYMLINK ../../instbin usr/bin/gzip usr/bin/gunzip usr/bin/gzcat +SYMLINK ../../instbin usr/bin/sed # copy the MAKEDEV script and make some devices COPY ${DESTDIR}/dev/MAKEDEV dev/MAKEDEV SPECIAL cd dev; sh MAKEDEV raminst +SPECIAL /bin/rm dev/MAKEDEV -# we need the contents of /usr/mdec (XXX) -# COPY ${DESTDIR}/usr/mdec/* usr/mdec +# we need the contents of /usr/mdec +COPY ${DESTDIR}/usr/mdec/netboot usr/mdec/netboot +COPY ${DESTDIR}/usr/mdec/bootxx usr/mdec/bootxx +COPY ${DESTDIR}/usr/mdec/bootsd usr/mdec/bootsd +COPY ${DESTDIR}/usr/mdec/installboot usr/mdec/installboot # various files that we need in /etc for the install -COPY ${DESTDIR}/etc/group etc -COPY ${DESTDIR}/etc/master.passwd etc -COPY ${DESTDIR}/etc/passwd etc -COPY ${DESTDIR}/etc/protocols etc -COPY ${DESTDIR}/etc/pwd.db etc -COPY ${DESTDIR}/etc/services etc -COPY ${DESTDIR}/etc/spwd.db etc +COPY ${DESTDIR}/etc/group etc/group +COPY ${DESTDIR}/etc/protocols etc/protocols +COPY ${DESTDIR}/etc/services etc/services +COPY ${DESTDIR}/etc/spwd.db etc/spwd.db +COPY ${DESTDIR}/etc/disktab etc/disktab +COPY disktab.preinstall etc/disktab.preinstall +SYMLINK /tmp/disktab.shadow etc/disktab +SYMLINK /tmp/fstab.shadow etc/fstab +SYMLINK /tmp/resolv.conf.shadow etc/resolv.conf +SYMLINK /tmp/hosts etc/hosts -# and the common installation tools -COPY ${TOPDIR}/common/dot.commonutils .commonutils -COPY ${TOPDIR}/common/termcap.vt usr/share/misc/termcap +COPYDIR ${DESTDIR}/etc/ppp etc/ppp + +# we strip comments from files since we need the space... -# the disktab explanation file -COPY disktab.preinstall etc +# and the common installation tools +SPECIAL sed -e '/^#[ ].*$/d' < ${TOPDIR}/common/dot.commonutils > .commonutils +SPECIAL sed -e '/^#[ ].*$/d' < ${TOPDIR}/common/termcap.vt > usr/share/misc/termcap # and the installation tools -LINK sbin/init usr/bin/vi -COPY dot.profile .profile -COPY dot.instutils .instutils -COPY install.sh install -COPY install.md install.md -COPY install.sub install.sub -COPY disktab.shadow etc/disktab.shadow +SPECIAL sed -e '/^#[ ].*$/d' < ${CURDIR}/dot.profile > .profile +SPECIAL sed -e '/^#[ ].*$/d' < ${CURDIR}/dot.instutils > .instutils +SPECIAL sed -e '/^#[ ].*$/d' < ${CURDIR}/install.md > install.md +SPECIAL sed -e '/^#[ ].*$/d' < ${CURDIR}/../../miniroot/install.sh > install +SPECIAL sed -e '/^#[ ].*$/d' < ${CURDIR}/../../miniroot/upgrade.sh > upgrade +SPECIAL sed -e '/^#[ ].*$/d' < ${CURDIR}/install.sub > install.sub +#SPECIAL sed -e "/^VERSION=/s/=.*/=${REV}/" -e '/^#[ ].*$/d' < ${CURDIR}/../../miniroot/install.sub > install.sub -SPECIAL chmod 755 install +SPECIAL chmod 755 install upgrade diff --git a/distrib/mvme68k/ramdisk/mtree.conf b/distrib/mvme68k/ramdisk/mtree.conf index 6add6806ec5..9e9a07d9f1a 100644 --- a/distrib/mvme68k/ramdisk/mtree.conf +++ b/distrib/mvme68k/ramdisk/mtree.conf @@ -1,6 +1,4 @@ -# -# $NetBSD: mtree.conf,v 1.1 1995/07/18 04:13:24 briggs Exp $ -# +# $OpenBSD: mtree.conf,v 1.2 2000/01/24 04:50:26 smurph Exp $ /set type=dir uname=root gname=wheel mode=0755 # . @@ -18,6 +16,12 @@ dev # ./etc etc + +# ./etc/ppp +ppp +# ./etc/ppp +.. + # ./etc .. @@ -31,21 +35,21 @@ mnt2 # ./mnt2 .. +# ./kern +kern +# ./kern +.. + # ./sbin sbin # ./sbin .. # ./tmp -tmp +tmp mode=01777 # ./tmp .. -# ./kern -kern -# ./kern -.. - # ./usr usr @@ -77,3 +81,15 @@ misc # ./usr .. + +# ./var +var + +# ./var/tmp +tmp mode=0177 + +# ./var/tmp +.. + +# ./var +.. diff --git a/distrib/mvme68k/ramdisk/raminst.conf b/distrib/mvme68k/ramdisk/raminst.conf deleted file mode 100644 index 79d3720f0f2..00000000000 --- a/distrib/mvme68k/ramdisk/raminst.conf +++ /dev/null @@ -1,27 +0,0 @@ -# -# $NetBSD: raminst.conf,v 1.3 1995/09/30 20:00:47 briggs Exp $ -# -# ram.conf - unified binary for the RAM disk -# - -srcdirs distrib/special -srcdirs bin sbin usr.bin usr.sbin usr.bin/vi -srcdirs gnu/usr.bin - -progs cat chmod chown cut cp dd df disklabel ed grep expr fsck_ffs ftp -progs gzip ifconfig init hostname kill ln ls mkdir mknod less mount -progs mount_cd9660 mount_kernfs mount_ffs mount_msdos mount_nfs -progs mv newfs pwd reboot rm route sed sleep ksh slattach sort stty -progs sync pax test tip umount build - -ln build vi -ln chown chgrp -ln fsck_ffs fsck -ln less more -ln ksh sh -ln ksh -sh # init invokes the shell this way -ln test [ -ln reboot halt -ln grep egrep - -libs -lutil -lcurses -ll -lm diff --git a/distrib/mvme68k/runlist.sh b/distrib/mvme68k/runlist.sh index 8693fe51865..172a536138c 100644 --- a/distrib/mvme68k/runlist.sh +++ b/distrib/mvme68k/runlist.sh @@ -4,7 +4,7 @@ if [ "X$1" = "X-d" ]; then SHELLCMD=cat shift else - SHELLCMD="sh" + SHELLCMD="sh -e" fi ( while [ "X$1" != "X" ]; do |