diff options
author | Dale Rahn <drahn@cvs.openbsd.org> | 2001-09-01 16:47:04 +0000 |
---|---|---|
committer | Dale Rahn <drahn@cvs.openbsd.org> | 2001-09-01 16:47:04 +0000 |
commit | 6045d5bb00b12a1d49c45cf8fc91d13b2ec1ab0d (patch) | |
tree | 15914a003f9e3260a244479c8057231d5f8456ba /distrib/macppc/ramdisk | |
parent | 5cd95bbee8e1e0fd211b3f68255c23edbc21b8e0 (diff) |
Move the powerpc ramdisk building support from powerpc to macppc.
Diffstat (limited to 'distrib/macppc/ramdisk')
-rw-r--r-- | distrib/macppc/ramdisk/Makefile | 106 | ||||
-rw-r--r-- | distrib/macppc/ramdisk/Makefile.inc | 4 | ||||
-rw-r--r-- | distrib/macppc/ramdisk/dot.profile | 72 | ||||
-rw-r--r-- | distrib/macppc/ramdisk/install.md | 439 | ||||
-rw-r--r-- | distrib/macppc/ramdisk/install.sub | 2071 | ||||
-rw-r--r-- | distrib/macppc/ramdisk/instbin.conf | 34 | ||||
-rw-r--r-- | distrib/macppc/ramdisk/list | 105 | ||||
-rw-r--r-- | distrib/macppc/ramdisk/mtree.conf | 90 |
8 files changed, 2921 insertions, 0 deletions
diff --git a/distrib/macppc/ramdisk/Makefile b/distrib/macppc/ramdisk/Makefile new file mode 100644 index 00000000000..350993de8d2 --- /dev/null +++ b/distrib/macppc/ramdisk/Makefile @@ -0,0 +1,106 @@ +# $OpenBSD: Makefile,v 1.1 2001/09/01 16:47:03 drahn Exp $ + +TOP= ${.CURDIR}/.. + +.include "${TOP}/Makefile.inc" +BSD_RD= bsd.rd +IMAGE= mr.fs +CBIN?= instbin +LISTS= ${.CURDIR}/list +UTILS?= ${.CURDIR}/../../miniroot + +MOUNT_POINT= /mnt +MTREE= ${.CURDIR}/mtree.conf + +VND?= svnd0 +VND_DEV= /dev/${VND}a +VND_RDEV= /dev/r${VND}a +VND_CRDEV= /dev/r${VND}c +PID!= echo $$$$ + + +DISKTYPE= rdroot +NBLKS= 8192 +# minfree, opt, b/i trks, sects, cpg +NEWFSARGS= -m 0 -o space -c 16 -i 4096 + +.ifndef DESTDIR +all ${IMAGE}: + @echo setenv DESTDIR before making a ramdisk! + @false +.else + +# mix config is not needed. +all: ${BSD_RD} cd + +${BSD_RD}: ${CBIN} ${IMAGE} bsd rdsetroot + cp bsd ${BSD_RD} + ${.OBJDIR}/rdsetroot ${BSD_RD} < ${IMAGE} + +cd: ${BSD_RD} + -rm -rf ${.OBJDIR}/cd-dir/ + -@mkdir -p ${.OBJDIR}/cd-dir/${OSREV}/powerpc/ + cp bsd.rd ${.OBJDIR}/cd-dir/${OSREV}/powerpc/bsd.rd + strip ${.OBJDIR}/cd-dir/${OSREV}/powerpc/bsd.rd + gzip -9 ${.OBJDIR}/cd-dir/${OSREV}/powerpc/bsd.rd + mv ${.OBJDIR}/cd-dir/${OSREV}/powerpc/bsd.rd.gz ${.OBJDIR}/cd-dir/${OSREV}/powerpc/bsd.rd + cp ${DESTDIR}/usr/mdec/ofwboot ${.OBJDIR}/cd-dir/ + mkhybrid -r -part -hfs -o ${.OBJDIR}/cd${OSrev}.fs ${.OBJDIR}/cd-dir + + +${IMAGE}: rd_setup do_files rd_teardown + +.endif + +bsd: + cd ${TOP}/../../sys/arch/powerpc/conf && config RAMDISK + cd ${TOP}/../../sys/arch/powerpc/compile/RAMDISK && \ + make clean && make depend && make + cp ${TOP}/../../sys/arch/powerpc/compile/RAMDISK/bsd bsd + +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} + +rd_teardown: + @df -i ${MOUNT_POINT} + -umount ${MOUNT_POINT} + -vnconfig -u ${VND} + +rdsetroot: ${TOP}/common/rdsetroot.c + ${HOSTCC} -DDEBUG -o rdsetroot ${TOP}/common/rdsetroot.c + +unconfig: + -umount -f ${MOUNT_POINT} + -vnconfig -u ${VND} + +.PRECIOUS: ${IMAGE} + +install: + cp ${BSD_RD} cd${REV}.fs ${DESTDIR}/snapshot/ + +${CBIN}.mk ${CBIN}.cache ${CBIN}.c: ${CBIN}.conf + crunchgen -E -D ${.CURDIR}/../../.. -L ${DESTDIR}/usr/lib ${.ALLSRC} + +${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}.mk ${CBIN}.cache \ + *.o *.lo *.c bsd ${BSD_RD} \ + rdsetroot + +beforeinstall: + cp ${BSD.RD} cd${REV}.fs ${DESTDIR}/snapshot + +.include <bsd.obj.mk> +.include <bsd.subdir.mk> diff --git a/distrib/macppc/ramdisk/Makefile.inc b/distrib/macppc/ramdisk/Makefile.inc new file mode 100644 index 00000000000..1f0b7f4d374 --- /dev/null +++ b/distrib/macppc/ramdisk/Makefile.inc @@ -0,0 +1,4 @@ +# $OpenBSD: Makefile.inc,v 1.1 2001/09/01 16:47:03 drahn Exp $ + +CRUNCHGENOPTS= -E + diff --git a/distrib/macppc/ramdisk/dot.profile b/distrib/macppc/ramdisk/dot.profile new file mode 100644 index 00000000000..0a7a49c5dd0 --- /dev/null +++ b/distrib/macppc/ramdisk/dot.profile @@ -0,0 +1,72 @@ +# $OpenBSD: dot.profile,v 1.1 2001/09/01 16:47:03 drahn Exp $ +# +# Copyright (c) 1994 Christopher G. Demetriou +# 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 Christopher G. Demetriou. +# 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. +# + +export PATH=/sbin:/bin:/usr/bin:/usr/sbin:/ +export HISTFILE=/.sh_history +export HOME=/ + +umask 022 + +set -o emacs # emacs-style command line editing + +if [ "X${DONEPROFILE}" = "X" ]; then + DONEPROFILE=YES + + mount_ffs -o update /dev/rd0a / + + # set up some sane defaults + echo 'erase ^?, werase ^W, kill ^U, intr ^C, status ^T' + stty newcrt werase ^W intr ^C kill ^U erase ^? status ^T 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 + ;; + + u*|U*) + /upgrade + ;; + + s*|S*) + ;; + + *) + _forceloop="" + ;; + esac + done +fi diff --git a/distrib/macppc/ramdisk/install.md b/distrib/macppc/ramdisk/install.md new file mode 100644 index 00000000000..8901dd45602 --- /dev/null +++ b/distrib/macppc/ramdisk/install.md @@ -0,0 +1,439 @@ +# $OpenBSD: install.md,v 1.1 2001/09/01 16:47:03 drahn Exp $ +# +# +# Copyright rc) 1996 The NetBSD Foundation, Inc. +# All rights reserved. +# +# This code is derived from software contributed to The NetBSD Foundation +# by Jason R. Thorpe. +# +# 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 the NetBSD +# Foundation, Inc. and its contributors. +# 4. Neither the name of The NetBSD Foundation nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS +# ``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 REGENTS OR CONTRIBUTORS 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. +# + +# +# machine dependent section of installation/upgrade script. +# + +# Machine-dependent install sets +MDSETS="kernel" +ARCH=ARCH + +md_set_term() { + test -n "$TERM" && return + echo -n "Specify terminal type [vt220]: " + getresp vt220 + TERM=$resp + export TERM +} + +md_get_diskdevs() { + # return available disk devices + bsort `dmesg | egrep -a "^[sw]d[0-9]+ " | cutword 1` +} + +md_get_cddevs() { + # return available CDROM devices + bsort `dmesg | egrep -a "^cd[0-9]+ " | cutword 1` +} + +md_get_partition_range() { + # return range of valid partition letters + echo [a-p] +} + +md_questions() { + : +} + +md_installboot() { + if [[ $disklabeltype = "HFS" ]] + then + echo "the 'ofwboot' program needs to be copied to the first HFS partition" + echo "of the disk to allow booting of OpenBSD" + elif [[ $disklabeltype = "MBR" ]] + then + echo "Installing boot in the msdos partition /dev/${1}i" + if mount -t msdos /dev/${1}i /mnt2 ; then + cp /usr/mdec/ofwboot /mnt2 + umount /mnt2 + else + echo "Failed, you will not be able to boot from /dev/${1}." + fi + fi +} + +md_native_fstype() { + echo "msdos" +} + +md_native_fsopts() { + echo "ro" +} + +md_init_mbr() { + # $1 is the disk to init + echo + echo "You will now be asked if you want to initialize the disk with a 1Mb" + echo "MSDOS partition. This is the recomended setup and will allow you to" + echo "store the boot and other interesting things here." + echo + echo "If you want to have a different setup, exit 'install' now and do" + echo "the MBR initialization by hand using the 'fdisk' program." + echo + echo "If you choose to manually setup the MSDOS partition, " + echo "consult your PowerPC OpenFirmware manual -and- the" + echo "PowerPC OpenBSD Installation Guide for doing setup this way." + echo + echo -n "Do you want to init the MBR and the MSDOS partition? [y] " + getresp "y" + case "$resp" in + n*|N*) + exit 0;; + *) + echo + echo "An MBR record with an OpenBSD usable partition table will now be copied" + echo "to your disk. Unless you have special requirements you will not need" + echo "to edit this MBR. After the MBR is copied an empty 1Mb MSDOS partition" + echo "will be created on the disk. You *MUST* setup the OpenBSD disklabel" + echo "to have a partition include this MSDOS partition." + echo "You will have an opportunity to do this shortly." + echo + echo "You will probably see a few '...: no disk label' messages" + echo "It's completely normal. The disk has no label yet." + echo "This will take a minute or two..." + sleep 2 + echo -n "Creating Master Boot Record (MBR)..." + fdisk -i -f /usr/mdec/mbr $1 + echo "..done." + echo -n "Copying 1MB MSDOS partition to disk..." + gunzip < /usr/mdec/msdos1mb.gz | dd of=/dev/r$1c bs=512 seek=1 >/dev/null 2>&1 + echo "..done." + ;; + esac +} + +md_init_hfs() { + pdisk /dev/${1}c +} +md_checkfordisklabel() { + # $1 is the disk to check + local rval + + echo + echo "Apple systems have two methods to label/partition a boot disk." + echo "Either the disk can be partitioned with Apple HFS partition" + echo "tools to contain an \"Unused\" partition, or without any" + echo "MacOS tools, the disk can be labled using an MBR partition table" + echo "If the HFS (DPME) partition table is used, after the disk is" + echo "partitioned with the Apple software, the \"Unused\" section" + echo "must be changed to type \"OpenBSD\" name \"OpenBSD\" using the" + echo "pdisk tool contained on this ramdisk. The disklabel can" + echo "then be edited normally" + echo "WARNING: the MBR partitioning code will HAPPILY overwrite/destroy" + echo "any HFS partitions on the disk, including the partition table." + echo "Choose the MBR option carefully, knowing this fact." + + echo -n "Do you want to choose (H)FS labeling or (M)BR labeling [H] " + getresp "h" + case "$resp" in + m*|M*) + export disklabeltype=MBR + md_checkforMBRdisklabel $1 + rval=$? + ;; + *) + export disklabeltype=HFS + md_init_hfs $1 + rval=$? + ;; + esac + return $rval +} +md_checkforMBRdisklabel() { + + echo "You have chosen to put a MBR disklabel on the disk." + echo -n "Is this correct? [n] " + getresp "n" + case "$resp" in + n*|N*) + echo "aborting install" + exit 0;; + *) + ;; + esac + + echo -n "Have you initialized an MSDOS partition using OpenFirmware? [n] " + getresp "n" + case "$resp" in + n*|N*) + md_init_mbr $1;; + *) + echo + echo "You may keep your current setup if you want to be able to use any" + echo "already loaded OS. However you will be asked to prepare an empty" + echo "partition for OpenBSD later. There must also be at least ~0.5Mb free space" + echo "in the boot partition to hold the OpenBSD bootloader." + echo + echo "Also note that the boot partition must be included as partition" + echo "'i' in the OpenBSD disklabel." + echo + echo -n "Do you want to keep the current MSDOS partition setup? [y]" + getresp "y" + case "$resp" in + n*|N*) + md_init_mbr $1;; + *) + ;; + esac + ;; + esac + + disklabel -r $1 > /dev/null 2> /tmp/checkfordisklabel + if grep "no disk label" /tmp/checkfordisklabel; then + rval=1 + elif grep "disk label corrupted" /tmp/checkfordisklabel; then + rval=2 + else + rval=0 + fi + + rm -f /tmp/checkfordisklabel + return $rval +} + +md_prep_fdisk() +{ + local _disk + local _done + + _disk=$1 + echo + echo "This disk has not previously been used with OpenBSD. You may share" + echo "this disk with other operating systems. However, to be able to boot" + echo "the system you will need a small DOS partition in the beginning of" + echo "the disk to hold the kernel boot. OpenFirmware understands" + echo "how to read an MSDOS style format from the disk." + echo + echo "This DOS style partitioning has been taken care of if" + echo "you chose to do that initialization earlier in the install." + echo + echo "WARNING: Wrong information in the BIOS partition table might" + echo "render the disk unusable." + + echo -n "Press [Enter] to continue " + getresp "" + + echo + echo "Current partition information is:" + fdisk ${_disk} + echo -n "Press [Enter] to continue " + getresp "" + + _done=0 + while [ $_done = 0 ]; do + echo + cat << \__md_prep_fdisk_1 + +An OpenBSD partition should have type (i.d.) of 166 (A6), and should be the +only partition marked as active. Also make sure that the size of the partition +to be used by OpenBSD is correct, otherwise OpenBSD disklabel installation +will fail. Furthermore, the partitions must NOT overlap each others. + +The fdisk utility will be started update mode (interactive.) +You will be able to add / modify this information as needed. +If you make a mistake, simply exit fdisk without storing the new +information, and you will be allowed to start over. +__md_prep_fdisk_1 + echo + echo -n "Press [Enter] to continue " + getresp "" + + fdisk -e ${_disk} + + echo + echo "The new partition information is:" + fdisk ${_disk} + + echo + echo "(You will be permitted to edit this information again.)" + echo "-------------------------------------------------------" + echo -n "Is the above information correct? [n] " + getresp "n" + + case "$resp" in + n*|N*) ;; + *) _done=1 ;; + esac + done + + echo + echo "Please take note of the offset and size of the OpenBSD partition" + echo "*AND* the MSDOS partitions you may want to access from OpenBSD." + echo "At least the MSDOS partition used for booting must be accessible" + echo "by OpenBSD as partition 'i'. You may need this information to " + echo "fill in the OpenBSD disk label later." + echo -n "Press [Enter] to continue " + getresp "" +} + +md_prep_disklabel() +{ + local _disk + + _disk=$1 + md_checkfordisklabel $_disk + case $? in + 0) + echo -n "Do you wish to edit the disklabel on $_disk? [y] " + ;; + 1) + md_prep_fdisk ${_disk} + echo "WARNING: Disk $_disk has no label" + echo -n "Do you want to create one with the disklabel editor? [y] " + ;; + 2) + echo "WARNING: Label on disk $_disk is corrupted" + echo -n "Do you want to try and repair the damage using the disklabel editor? [y] " + ;; + + esac + + getresp "y" + case "$resp" in + y*|Y*) ;; + *) return ;; + esac + + # display example + cat << \__md_prep_disklabel_1 + +Disk partition sizes and offsets are in sector (most likely 512 bytes) units. +You may set these size/offset pairs on cylinder boundaries + (the number of sector per cylinder is given in ) + (the `sectors/cylinder' entry, which is not shown here) +Also, you *must* make sure that the 'i' partition points at the MSDOS +partition that will be used for booting. The 'c' partition shall start +at offset 0 and include the entire disk. This is most likely correct when +you see the default label in the editor. + +Do not change any parameters except the partition layout and the label name. + + [Here is an example of what the partition information may look like.] +10 partitions: +# size offset fstype [fsize bsize cpg] + a: 120832 10240 4.2BSD 1024 8192 16 # (Cyl. 11*- 142*) + b: 131072 131072 swap # (Cyl. 142*- 284*) + c: 6265200 0 unused 1024 8192 # (Cyl. 0 - 6809) + e: 781250 262144 4.2BSD 1024 8192 16 # (Cyl. 284*- 1134*) + f: 1205000 1043394 4.2BSD 1024 8192 16 # (Cyl. 1134*- 2443*) + g: 2008403 2248394 4.2BSD 1024 8192 16 # (Cyl. 2443*- 4626*) + h: 2008403 4256797 4.2BSD 1024 8192 16 # (Cyl. 4626*- 6809*) + i: 10208 32 MSDOS # (Cyl. 0*- 11*) +[End of example] +__md_prep_disklabel_1 + echo -n "Press [Enter] to continue " + getresp "" + if [[ $disklabeltype = "HFS" ]] + then + disklabel -c -f /tmp/fstab.${_disk} -E ${_disk} + elif [[ $disklabeltype = "MBR" ]] + then + disklabel -W ${_disk} + disklabel ${_disk} >/tmp/label.$$ + disklabel -r -R ${_disk} /tmp/label.$$ + rm -f /tmp/label.$$ + disklabel -f /tmp/fstab.${_disk} -E ${_disk} + else + echo "unknown disk label type" + fi +} + +md_welcome_banner() { +{ + if [ "$MODE" = install ]; then + cat << __EOT +Welcome to the OpenBSD/powerpc ${VERSION_MAJOR}.${VERSION_MINOR} installation program. + +This program is designed to help you put OpenBSD on your disk in a simple and +rational way. +__EOT + + else + cat << __EOT +Welcome to the OpenBSD/powerpc ${VERSION_MAJOR}.${VERSION_MINOR} upgrade program. + +This program is designed to help you upgrade your OpenBSD system in a simple +and rational way. As a reminder, installing the 'etc' binary set is NOT +recommended. Once the rest of your system has been upgraded, you should +manually merge any changes to files in the 'etc' set into those files which +already exist on your system. + +__EOT + fi + +cat << __EOT + +As with anything which modifies your disk's contents, this program can cause +SIGNIFICANT data loss, and you are advised to make sure your data is backed +up before beginning the installation process. + +Default answers are displayed in brackets after the questions. You can hit +Control-C at any time to quit, but if you do so at a prompt, you may have +to hit return. Also, quitting in the middle of installation may leave your +system in an inconsistent state. If you hit Control-C and restart the +install, the install program will remember many of your old answers. + +__EOT +} | more +} + +md_not_going_to_install() { + cat << __EOT + +OK, then. Enter 'reboot' at the prompt to reset the machine. Once the machine +has rebooted, use Open Firmware to load the new boot code. + +__EOT +} + +md_congrats() { + local what; + if [ "$MODE" = install ]; then + what=installed + else + what=upgraded + fi + cat << __EOT + +CONGRATULATIONS! You have successfully $what OpenBSD! To boot the +installed system, enter reboot at the command prompt. Once the machine +has rebooted, use Open Firmware to boot into OpenBSD. + +__EOT +} diff --git a/distrib/macppc/ramdisk/install.sub b/distrib/macppc/ramdisk/install.sub new file mode 100644 index 00000000000..04bac194646 --- /dev/null +++ b/distrib/macppc/ramdisk/install.sub @@ -0,0 +1,2071 @@ +#!/bin/sh +# $OpenBSD: install.sub,v 1.1 2001/09/01 16:47:03 drahn 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. +# +# This code is derived from software contributed to The NetBSD Foundation +# by Jason R. Thorpe. +# +# 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 the NetBSD +# Foundation, Inc. and its contributors. +# 4. Neither the name of The NetBSD Foundation nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS +# ``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 REGENTS OR CONTRIBUTORS 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. +# + +# OpenBSD installation/upgrade script - common subroutines. + +ROOTDISK="" # filled in below +VERSION= +VERSION_MAJOR=$(( $VERSION / 10 )) +VERSION_MINOR=$(( $VERSION % 10 )) +export VERSION VERSION_MAJOR VERSION_MINOR + +ALLSETS="base etc misc comp man game xbase xshare xfont xserv" # install +UPGRSETS="base misc comp man game xbase xshare xfont xserv" # 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 + +# decide upon an editor +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() { + set -o noglob + valid="false" + while [ "X$valid" = "Xfalse" ]; do + read resp + if [ "X$resp" = "X" ]; then + resp=$1 + fi + 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 + local _a + + _a=$1; shift + while [ $# != 0 ]; do + if [ "$_a" = "$1" ]; then return 0; fi + shift + done + 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 + local _seen + + _seen="" + _a=$1; 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 + + _a=$1; shift + while [ $# != 0 ]; do + if [ "$_a" != "$1" ]; then + echo "$1" + fi + shift + done +} + +cutword () { +# read a line of data, return Nth element. + local _a + local _n + local _oifs + + # optional field separator + _oifs="$IFS" + case "$1" in + -t?*) IFS=${1#-t}; shift;; + esac + + _n=$1 + read _a; set -- $_a + 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 + + # optional field separator + _oifs="$IFS" + case "$1" in + -t?*) IFS=${1#-t}; shift;; + esac + + read _a; set -- $_a + IFS="$_oifs" + if [ "$1" = "" ]; then return; fi + while [ "$#" -gt 10 ]; do shift 10; done + eval echo \$$# +} + +firstchar () { +# return first character of argument + local _a + _a=$1 + while [ ${#_a} != 1 ]; do + _a=${_a%?} + done + echo $_a +} + +basename () { + local _oifs + if [ "$1" = "" ]; then return; fi + _oifs="$IFS" + IFS="/" + set -- $1 + IFS="$_oifs" + while [ "$#" -gt 10 ]; do shift 10; done + eval echo \$$# +} + +dir_has_sets() { + # return true when the directory $1 contains a set for $2...$n + local _dir + local _file + + _dir=$1; 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 + local _file + + _list=$1; shift + for _file in $* + do + if isin ${_file}${VERSION}.tar.gz $_list; then + return 0 + fi + # Try for stupid msdos convention + 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 +} + +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 + local _user + local _pass + local _dir + + _host=$1; shift + _user=$1; shift + _pass=$1; shift + _dir=$1; shift + + ftp ${_ftp_active} -V -n $_host <<__ptf +user $_user $_pass +cd $_dir +ls +quit +__ptf +} + +twiddle() { +# spin the propeller so we don't get bored + while : ; do + sleep 1; echo -n "/"; + sleep 1; echo -n "-"; + sleep 1; echo -n "\\"; + sleep 1; echo -n "|"; + done > /dev/tty & echo $! +} + +get_localdir() { + # $1 is relative mountpoint + local _mp + local _dir + + _mp=$1 + _dir= + while : ; do + echo -n "Enter the pathname where the sets are stored [$_dir] " + getresp "$_dir" + _dir=$resp + + # Allow break-out with empty response + if [ -z "$_dir" ]; then + echo -n "Are you sure you don't want to set the pathname? [n] " + getresp "n" + case "$resp" in + y*|Y*) + break + ;; + *) + continue + ;; + esac + fi + + if dir_has_sets "$_mp/$_dir" $THESETS + then + local_sets_dir="$_mp/$_dir" + break + else + cat << __get_reldir_1 +The directory \"$local_sets_dir\" does not exist, or does not hold any of the +upgrade sets. +__get_reldir_1 + echo -n "Re-enter pathname? [y] " + getresp "y" + case "$resp" in + y*|Y*) + ;; + *) + local_sets_dir="" + break + ;; + esac + fi + done +} + +getanotherdisk() { + cat << \__getanotherdisk_1 + +Now you can select another disk to initialize. (Do not re-select a disk +you have already entered information for). Available disks are: + +__getanotherdisk_1 + _DKDEVS=`md_get_diskdevs` + echo "$_DKDEVS" + echo "" + echo -n "Which one? [done] " + getresp "" + if [ "X${resp}" = "X" ]; then + DISK=done + elif isin $resp $_DKDEVS ; then + DISK="$resp" + else + echo "" + echo "The disk $resp does not exist." + DISK="" + fi +} + +getrootdisk() { + cat << \__getrootdisk_1 + +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: + +__getrootdisk_1 + local _defdsk; + + _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 +} + +labelmoredisks() { + cat << \__labelmoredisks_1 + +You may label the following disks: + +__labelmoredisks_1 + echo "$_DKDEVS" + echo "" + echo -n "Label which disk? [done] " + getresp "done" + case "$resp" in + done) + ;; + + *) + if isin $resp $_DKDEVS ; then + md_labeldisk $resp + else + echo "" + echo "The disk $resp does not exist." + fi + ;; + esac +} + +addhostent() { + # $1 - IP address + # $2 - symbolic name + + # Create an entry in the hosts table. If no host table + # exists, create one. If the IP address 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 + mv /tmp/hosts.new /tmp/hosts + + echo "$1 $2 $2.$FQDN" >> /tmp/hosts +} + +addifconfig() { + # $1 - interface name + # $2 - interface symbolic name + # $3 - interface IP address + # $4 - interface netmask + # $5 - (optional) interface link-layer directives + + # Create a hostname.* file for the interface. + echo "inet $2 $4 NONE $5" > /tmp/hostname.$1 + + addhostent $3 $2 +} + +configurenetwork() { + local _ifsdone + local _ifs + local _ouranswer + local _reprompt + + _IFS=`md_get_ifdevs` + _ifsdone="" + _ouranswer="" + _reprompt=1 + resp="" # force at least one iteration + while [ "X${resp}" != X"done" ]; do + if [ $_reprompt = 1 ]; then + cat << \__configurenetwork_1 + +You may configure the following network interfaces (the interfaces +marked with [X] have been succesfully configured): + +__configurenetwork_1 + + 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 + if isin $_ifs $_IFS ; then + if configure_ifs $_ifs ; then + _ifsdone="$_ifs $_ifsdone" + fi + else + echo "Invalid response: \"$resp\" is not in list" + fi + _ouranswer="done" + _reprompt=1 + ;; + esac + + done +} + +configure_ifs() { + + local _up + local _interface_name + local _interface_ip + local _interface_mask + local _interface_symname + local _interface_extra + local _hostname + + _interface_name=$1 + + set -- `ifconfig $_interface_name | sed -n ' + 1s/.*<UP,.*$/UP/p + 1s/.*<.*>*$/DOWN/p + 2s/inet// + 2s/--> [0-9.][0-9.]*// + 2s/netmask// + 2s/broadcast// + 2p'` + + _up=$1 + _interface_ip=$2 + _interface_mask=$3 + + # Get IP address + resp="" # force one iteration + while [ "X${resp}" = X"" ]; do + echo -n "IP address? [$_interface_ip] " + getresp "$_interface_ip" + _interface_ip=$resp + done + + # Get symbolic name + _hostname=`hostname` + resp="" # force one iteration + while [ "X${resp}" = X"" ]; do + echo -n "Symbolic (host) name? [$_hostname] " + getresp "$_hostname" + _interface_symname=$resp + done + + # Get netmask + resp="" + if [ "X${_interface_mask}" = X"" ]; then + _interface_mask=255.255.255.0 + fi + while [ "X${resp}" = X"" ]; do + echo -n "Netmask ? [$_interface_mask] " + getresp "$_interface_mask" + _interface_mask=$resp + done + + 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. Values used by some drivers are:" + echo " -link0 BNC" + echo " link0 -link1 AUI" + echo " link0 link1 UTP" + echo "(But please keep in mind not all drivers use flags like this)." + echo -n "Additional link-layer arguments? [$_interface_extra] " + getresp "$_interface_extra" + if [ "X${resp}" != X"" ]; then + _interface_extra=$resp + 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}" + 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}" + fi + return 1 +} + +# Much of this is gratuitously stolen from /etc/netstart. +enable_network() { + + # Set up the hostname. + if [ ! -f /mnt/etc/myname ]; then + echo "ERROR: no /etc/myname!" + return 1 + fi + hostname=`cat /mnt/etc/myname` + hostname $hostname + + # configure all the interfaces which we know about. +( + tmp="$IFS" + IFS="$IFS." + set -- `echo /mnt/etc/hostname*` + IFS=$tmp + unset tmp + + while [ $# -ge 2 ] ; do + shift # get rid of "hostname" + ( + read af name mask bcaddr extras + read dt dtaddr + + if [ ! -n "$name" ]; then + echo "/etc/hostname.$1: invalid network configuration file" + exit + fi + + cmd="ifconfig $1 $af $name " + if [ "${dt}" = "dest" ]; then cmd="$cmd $dtaddr"; fi + if [ -n "$mask" ]; then cmd="$cmd netmask $mask"; fi + if [ -n "$bcaddr" -a "X$bcaddr" != "XNONE" ]; then + cmd="$cmd broadcast $bcaddr"; + fi + cmd="$cmd $extras" + + $cmd + ) < /mnt/etc/hostname.$1 + shift + done +) + + # set the address for the loopback interface + ifconfig lo0 inet localhost + + # use loopback, not the wire + route add $hostname localhost + + # /etc/mygate, if it exists, contains the name of my gateway host + # that name must be in /etc/hosts. + if [ -f /mnt/etc/mygate ]; then + route delete default > /dev/null 2>&1 + route add default `cat /mnt/etc/mygate` + fi + + # enable the resolver, if appropriate. + if [ -f /mnt/etc/resolv.conf ]; then + _resolver_enabled="TRUE" + cp /mnt/etc/resolv.conf /tmp/resolv.conf.shadow + fi + + # Display results... + echo "Network interface configuration:" + ifconfig -a + + echo "" + + if [ "X${_resolver_enabled}" = X"TRUE" ]; then + route show + echo "" + echo "Resolver enabled." + else + route -n show + echo "" + echo "Resolver not enabled." + fi + + return 0 +} + +# Print the selector and get a response +# The list of sets is passed in as $1, sets $resp +get_selection() { + local _next + local _f + local _sets + + _sets=$1 + _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 + fi + echo $_f + done + + # Get the name of the file. + echo -n "File name [$_next]? " + getresp "$_next" +} + +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 +local _kernel +local _f +local _file_list +local _get_files +local _failed_files +local _osetsdone +local _url_type +local _url_base +local _tfile +local _matched +local _action + +# Is this an ftp or http install? +_url_type=$1; shift + +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 + +# Proxy the connections? +if [ "X${_proxy_host}" = X"" ]; then + _proxy_host=none +fi +echo -n "HTTP/FTP proxy URL? (if you use a proxy) [${_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 explicately 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 +echo -n "Do you want a list of potential ${_url_type} servers? [y] " +getresp "y" +case "$resp" in +n*|N*) ;; +*) + ftp ${_ftp_active} -V -a -o - ftp://ftp.openbsd.org/pub/OpenBSD/${VERSION_MAJOR}.${VERSION_MINOR}/ftplist | grep "^${_url_type}:" + ;; +esac + +# Get server IP address +resp="" # force one iteration +while [ "X${resp}" = X"" ]; do + eval echo -n "Server IP address or hostname? [\$_${_url_type}_server_ip]\ " + eval getresp "\$_${_url_type}_server_ip" + eval _${_url_type}_server_ip=$resp +done + +# Get server directory +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 + eval echo -n "Server directory? [\$_${_url_type}_server_dir]\ " + eval getresp "\$_${_url_type}_server_dir" + eval _${_url_type}_server_dir=$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 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 + + echo -n "Password (again): " + stty -echo + getresp "${_ftp_server_password}" + stty echo + echo "" + if [ "${_ftp_server_password}" != "${resp}" ]; then + echo "Passwords do not match, try again." + resp="" + fi + done + else + # only used by ftp_list_files() + _ftp_server_password=root@`hostname`.${FQDN} + 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 + +# Yes, all those blackslashes really are necesary... +eval 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 at\\\\n"\ +"\$_${_url_type}_server_ip:\$_${_url_type}_server_dir. You can also enter\\\\n"\ +"'all' to install all the standard sets, or 'list' to list the\\\\n"\ +"files avilable at \$_${_url_type}_server_ip:\$_${_url_type}_server_dir.\\\\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|etc*.tar.gz|etc*.tgz|bsd|bsdofw) + 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 + elif [ "X${resp}" = X"all" ]; then + _get_files="$_sets $_kernel" + _setsdone="$_sets $_kernel" + break + fi + + # Change +/- into add/remove + _action=add + case "$resp" in + +*) resp="${resp#?}" + ;; + -*) resp="${resp#?}" + _action=remove + ;; + esac + + # Major hack to allow the user to select globbing patterns + set -o noglob + _tfile=/tmp/install_case.$$ # safe in single user mode + cat >$_tfile << OOF + case \$_f in + $resp) # 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 $_kernel; do + . $_tfile + done + rm -f $_tfile + + if [ $_matched -eq 0 ]; then + eval echo "File \$_${_url_type}_server_dir/$resp does not exist. Check to make" + echo "sure you entered the information properly or enter 'list' for a file list." + fi +done + +# User may have said "done" without selecting any files +if [ "X${_get_files}" = X"" ]; then + return +fi + +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="" + for _f in $_get_files ; do + echo "" + if [ "X${_f}" = "X${_kernel}" ]; then + ( cd /mnt ; ftp ${_ftp_active} -V ${_url_base}/${_f} ) + else + ( cd /mnt ; ftp ${_ftp_active} -o - -V ${_url_base}/${_f} | tar zxvpf - ) + fi + if [ $? -ne 0 ]; then + # Mark xfer as having failed,. + _setsdone=`rmel $_f $_setsdone` + _failed_files="${_failed_files} ${_f}" + 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" + + 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 + + # Change +/- into add/remove + _action=add + case "$resp" in + +*) resp="${resp#?}" + ;; + -*) resp="${resp#?}" + _action=remove + ;; + esac + + # Major hack to allow the user to select globbing patterns + set -o noglob + _tfile=/tmp/install_case.$$ # safe in single user mode + cat >$_tfile << OOF + case \$_f in + $resp) # 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 $_failed_files; do + . $_tfile + done + rm -f $_tfile + + if [ $_matched -eq 0 ]; then + eval echo "File \$_${_url_type}_server_dir/$resp does not exist. Check to make" + echo "sure you entered the information properly or enter 'list' for a file list." + fi + done +done +} + +install_from_mounted_fs() { +# $1 - directory containing installation sets +local _sets +local _kernel +local _f +local _get_files +local _failed_files +local _osetsdone +local _tfile +local _matched +local _action + +if [ ! -d $1 ]; then + echo "No such directory: $1" + return +fi + +_sets="" +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 + 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 + +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 intallation 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|etc*.tar.gz|etc*.tgz|bsd|bsdofw) + 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 "" + echo "${1}:" + ( cd $1 && ls ) + continue + elif [ "X${resp}" = X"all" ]; then + _get_files="$_sets $_kernel" + _setsdone="$_sets $_kernel" + break + fi + + # Change +/- into add/remove + _action=add + case "$resp" in + +*) resp="${resp#?}" + ;; + -*) resp="${resp#?}" + _action=remove + ;; + esac + + # Major hack to allow the user to select globbing patterns + set -o noglob + _tfile=/tmp/install_case.$$ # safe in single user mode + cat >$_tfile << OOF + case \$_f in + $resp) # 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 $_kernel; do + . $_tfile + done + rm -f $_tfile + + if [ $_matched = 0 ]; then + echo "File $1/$resp does not exist. Check to make" + echo "sure you entered the information properly or enter 'list' for a file list." + fi +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="" + for _f in $_get_files ; do + echo "" + echo "$1/${_f}:" + if [ "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}" + fi + done + + # 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" + + if [ "X${resp}" = X"done" ]; then + break + elif [ "X${resp}" = X"list" ]; then + echo "" + echo "${1}:" + ( cd $1 && ls ) + echo "" + continue + fi + + # Change +/- into add/remove + _action=add + case "$resp" in + +*) resp="${resp#?}" + ;; + -*) resp="${resp#?}" + _action=remove + ;; + esac + + # Major hack to allow the user to select globbing patterns + set -o noglob + _tfile=/tmp/install_case.$$ # safe in single user mode + cat >$_tfile << OOF + case \$_f in + $resp) # 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 $_failed_files; do + . $_tfile + done + rm -f $_tfile + + if [ $_matched = 0 ]; then + echo "File $1/$resp does not exist. Check to make" + echo "sure you entered the information properly or enter 'list' for a file list." + fi + done +done +} + +install_cdrom() { +local _drive +local _partition_range +local _partition +local _fstype +local _directory + +# Get the cdrom device info +cat << \__install_cdrom_1 + +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) + 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 "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 + +There are two CD-ROM filesystem types currently supported by this program: +cd9660 ISO-9660 +ffs Berkeley Fast Filesystem + +__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 + +# Mount the CD-ROM +if ! mount -t ${_fstype} -o ro \ + /dev/${_drive}${_partition} /mnt2 ; then + echo "Cannot mount CD-ROM drive. Aborting." + return +fi + +# 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 _def_partition +local _partition_range +local _partition +local _fstype +local _fsopts +local _directory +local _md_fstype +local _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 <<__mount_a_disk_1 + +The following partitions have been found on $_drive: + +__mount_a_disk_1 +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 + ;; + + *) + echo "Invalid response: $resp" + resp="" # force loop to repeat + ;; + esac +done + +# Ask for filesystem type +cat << \__mount_a_disk_2 + +The following filesystem types are supported: +default (deduced from the disklabel) +ffs +__mount_a_disk_2 +_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="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 $_fstype -o $_fsopts /dev/${_drive}${_partition} /mnt2; then + echo "Cannot mount disk. Aborting." + return 0 +fi +return 1 +} + +install_disk() { +local _directory + +cat << \__install_disk_1 + +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 + +# 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 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 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 +} + +install_tape() { +local _xcmd + +# Get the name of the tape from the user. +cat << \__install_tape_1 + +The installation program needs to know which tape device to use. Make +sure you use a "no rewind on close" device. + +__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 + +# 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 + [1-9]*) + _nskip=`expr $resp - 1` + ;; + + *) + echo "Invalid file number ${resp}." + resp="" # fore loop to repeat + ;; + 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." + return + fi +fi +echo "done." + +cat << \__install_tape_2 + +There are 2 different ways the file can be stored on tape: + +1) an image of a gzipped tar file +2) a standard tar image + +__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="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." +} + +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 + +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 "CET" or "GMT-6". +Other zones are grouped by continent, with detailed zone information +separated by a slash ("/"), e.g. "US/Pacific" or "Canada/Mountain". + +To get a listing of what's available in /usr/share/zoneinfo, enter "?" +at the prompts below. + +__get_timezone_1 +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 + if [ -f ${_zonepath}/usr/share/zoneinfo/$_a ]; then + TZ="$_a" + echo "You have selected timezone \"$_a\"". + return + fi + echo "'/usr/share/zoneinfo/$_a' is not a valid timezone on this system." + ;; + 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. 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. + +__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 +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," + echo -n " (N)FS or local (d)isk? " + getresp "" + case "$resp" in + d*|D*) + install_disk + resp=d + ;; + f*|F*) + install_url ftp + resp=f + ;; + h*|H*) + install_url http + resp=h + ;; + t*|T*) + install_tape + resp=t + ;; + c*|C*) + install_cdrom + resp=c + ;; + n*|N*) + install_nfs + resp=n + ;; + *) + echo "Invalid response: $resp" + resp="" + ;; + esac + else + _yup="FALSE" # So we'll ask next time + fi + + if [ ! -f /mnt/bsd ]; then + cat << \__install_sets_2 + +You still do not have a /bsd in your filesystem (ie. the kernel), which +seems to indicate that you are still missing important distribution files. +So please continue installing... +__install_sets_2 + resp="" + fi + if [ ! -f /mnt/bin/cat ]; then + cat << \__install_sets_3 + +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. So please continue installing... +__install_sets_3 + resp="" + fi + + # Give the user the opportunity to extract more sets. They + # don't necessarily have to come from the same media. + echo "" + echo -n "Extract more sets? [n] " + getresp "n" + case "$resp" in + y*|Y*) + # Force loop to repeat + resp="" + ;; + + *) + ;; + esac +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 +} + +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 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 + +if [ "X${?}" != X"0" ]; then + cat << \__mount_filesystems_1 + +FATAL ERROR: Cannot mount filesystems. Double-check your configuration +and restart the installation process. +__mount_filesystems_1 + exit +fi +} + +unmount_fs() +{ +# Unmount all filesystems and check their integrity. +# Usage: [-check] <fstab file> +local _check +local _fstab +local _pid + +if [ "$1" = "-check" ]; then + _check=1 + _fstab=$2 +else + _check=0 + _fstab=$1 +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." + + if [ $_check = 1 ]; then + echo "Checking filesystem integrity..." + for _dev in ${_devs}; do + echo "${_dev}" + fsck -f ${_dev} + done + fi + echo "Done." +) < $_fstab +} + +check_fs() +{ +# Check filesystem integrity. +# $1 is a file in fstab format +local _fstab + +_fstab=$1 + +( + _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} + done + echo "Done." +) < $_fstab +} diff --git a/distrib/macppc/ramdisk/instbin.conf b/distrib/macppc/ramdisk/instbin.conf new file mode 100644 index 00000000000..2c379a285f6 --- /dev/null +++ b/distrib/macppc/ramdisk/instbin.conf @@ -0,0 +1,34 @@ +# $OpenBSD: instbin.conf,v 1.1 2001/09/01 16:47:03 drahn Exp $ +# +# instbin.conf - unified binary for the inst/upgr floppies +# + +srcdirs distrib/special +srcdirs usr.bin bin sbin usr.sbin gnu/usr.bin + +progs dd mount_cd9660 df dhclient mount mount_ext2fs sync restore newfs_msdos +progs stty ln disklabel pax ping cat ifconfig dmesg ls +progs less mount_nfs pdisk fdisk grep umount mount_msdos rsh fsck +progs scsi mknod route ftp mount_ffs reboot ed +progs cp gzip chmod fsck_ffs sort init newfs mount_kernfs +progs tip rm mt mkdir sed ksh sleep +progs mv expr test hostname +progs wicontrol ancontrol +progs mg + +ln mt eject +ln chmod chgrp +ln chmod chown +ln pax tar +ln pax cpio +ln less more +ln grep fgrep +ln grep egrep +ln reboot halt +ln gzip gunzip +ln gzip gzcat +ln ksh sh +ln ksh -sh +ln test [ + +libs -ledit -lutil -lcurses -ll -lm -lkvm -lz -lkrb -ldes diff --git a/distrib/macppc/ramdisk/list b/distrib/macppc/ramdisk/list new file mode 100644 index 00000000000..92f874b415c --- /dev/null +++ b/distrib/macppc/ramdisk/list @@ -0,0 +1,105 @@ +# $OpenBSD: list,v 1.1 2001/09/01 16:47:03 drahn Exp $ + +SRCDIRS distrib/special +SRCDIRS usr.bin bin sbin usr.sbin gnu/usr.bin +#SRCDIRS usr.bin/vi + +# copy the crunched binary, link to it, and kill it +COPY ${OBJDIR}/instbin instbin +LINK instbin bin/cat +LINK instbin bin/chmod bin/chgrp sbin/chown +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 bin/eject +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/disklabel +LINK instbin sbin/ancontrol +LINK instbin sbin/pdisk +LINK instbin sbin/fdisk +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/dhclient +LINK instbin sbin/dmesg +LINK instbin sbin/mknod +LINK instbin sbin/mount +LINK instbin sbin/mount_cd9660 +LINK instbin sbin/mount_ffs +LINK instbin sbin/mount_msdos +LINK instbin sbin/mount_nfs +LINK instbin sbin/mount_kernfs +LINK instbin sbin/mount_ext2fs +LINK instbin sbin/newfs +LINK instbin sbin/newfs_msdos +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 sbin/wicontrol +LINK instbin usr/bin/grep usr/bin/fgrep usr/bin/egrep +LINK instbin usr/bin/mg +LINK instbin usr/bin/ftp +LINK instbin usr/bin/gzip usr/bin/gunzip usr/bin/gzcat +LINK instbin usr/bin/less usr/bin/more +LINK instbin usr/bin/rsh +LINK instbin usr/bin/sed +LINK instbin usr/bin/sort +LINK instbin usr/bin/tip +LINK instbin usr/sbin/chat +#SYMLINK ../../instbin usr/bin/build usr/bin/vi + +# copy the MAKEDEV script and make some devices +COPY ${DESTDIR}/dev/MAKEDEV dev/MAKEDEV +SPECIAL cd dev; sh MAKEDEV ramdisk +#SPECIAL /bin/rm dev/MAKEDEV + +# we need the contents of /usr/mdec +COPY ${DESTDIR}/usr/mdec/ofwboot usr/mdec/ofwboot +COPY ${DESTDIR}/usr/mdec/mbr usr/mdec/mbr +COPY ${DESTDIR}/usr/mdec/msdos1mb.gz usr/mdec/msdos1mb.gz + +# various files that we need in /etc for the install +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 +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 + +# dhcp things +COPY ${DESTDIR}/sbin/dhclient-script sbin/dhclient-script + +# and the common installation tools +COPY ${TOPDIR}/common/termcap.vt usr/share/misc/termcap +#COPY ${DESTDIR}/usr/share/misc/scsi_modes usr/share/misc/scsi_modes + +# and the installation tools +COPY dot.profile .profile +SPECIAL sed -e '/^[ ]*#[ ].*$/d' -e '/^[ ]*#$/d' -e "s/^ARCH=ARCH$/ARCH=`arch -s`/" < ${CURDIR}/install.md > install.md +COPY ${CURDIR}/../../miniroot/install.sh install +COPY ${CURDIR}/../../miniroot/upgrade.sh upgrade +#SPECIAL sed "/^VERSION=/s/=.*/=${REV}/" < ${CURDIR}/install.sub > install.sub +SPECIAL sed "/^VERSION=/s/=.*/=${REV}/" < ${CURDIR}/../../miniroot/install.sub > install.sub +SPECIAL chmod 755 install upgrade diff --git a/distrib/macppc/ramdisk/mtree.conf b/distrib/macppc/ramdisk/mtree.conf new file mode 100644 index 00000000000..443802bfb29 --- /dev/null +++ b/distrib/macppc/ramdisk/mtree.conf @@ -0,0 +1,90 @@ +# $OpenBSD: mtree.conf,v 1.1 2001/09/01 16:47:03 drahn Exp $ + +/set type=dir uname=root gname=wheel mode=0755 +# . +. + +# ./bin +bin +# ./bin +.. + +# ./dev +dev +# ./dev +.. + +# ./etc +etc + +# ./etc +.. + +# ./mnt +mnt +# ./mnt +.. + +# ./mnt2 +mnt2 +# ./mnt2 +.. + +# ./sbin +sbin +# ./sbin +.. + +# ./tmp +tmp mode=01777 +# ./tmp +.. + +# ./usr +usr + +# ./usr/bin +bin +# ./usr/bin +.. + +# ./usr/mdec +mdec +# ./usr/mdec +.. + +# ./usr/sbin +sbin +# ./usr/sbin +.. + +# ./usr/share +share + +# ./usr/share/misc +misc +# ./usr/share/misc +.. + +# ./usr/share +.. + +# ./usr +.. + +# ./var +var + +# ./var/tmp +tmp mode=0177 + +# ./var/tmp +.. + +# ./var/db +db +# ./var/db +.. + +# ./var +.. |