summaryrefslogtreecommitdiff
path: root/distrib
diff options
context:
space:
mode:
authorSteve Murphree <smurph@cvs.openbsd.org>2000-01-24 04:50:27 +0000
committerSteve Murphree <smurph@cvs.openbsd.org>2000-01-24 04:50:27 +0000
commit1dd0f54d3fc0977dafa06e10a8e2063a53073612 (patch)
tree678cbdbbf088a9c19736510fca4f60f6ed7d3e06 /distrib
parentd461006d249b4d292b92c585af010fa062af3fdd (diff)
Clean up mvme68k install utils and remdisk.
Diffstat (limited to 'distrib')
-rw-r--r--distrib/mvme68k/Makefile.inc5
-rw-r--r--distrib/mvme68k/list2sh.awk36
-rw-r--r--distrib/mvme68k/ramdisk/Makefile92
-rw-r--r--distrib/mvme68k/ramdisk/Makefile.inc20
-rw-r--r--distrib/mvme68k/ramdisk/dot.instutils22
-rw-r--r--distrib/mvme68k/ramdisk/dot.profile57
-rw-r--r--distrib/mvme68k/ramdisk/install.md34
-rw-r--r--distrib/mvme68k/ramdisk/install.sub2519
-rw-r--r--distrib/mvme68k/ramdisk/list169
-rw-r--r--distrib/mvme68k/ramdisk/mtree.conf34
-rw-r--r--distrib/mvme68k/ramdisk/raminst.conf27
-rw-r--r--distrib/mvme68k/runlist.sh2
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