upgrade.sh revision 1.3
1#!/bin/sh
2#	$NetBSD: upgrade.sh,v 1.3 1996/05/27 12:39:06 leo Exp $
3#
4# Copyright (c) 1996 The NetBSD Foundation, Inc.
5# All rights reserved.
6#
7# This code is derived from software contributed to The NetBSD Foundation
8# by Jason R. Thorpe.
9#
10# Redistribution and use in source and binary forms, with or without
11# modification, are permitted provided that the following conditions
12# are met:
13# 1. Redistributions of source code must retain the above copyright
14#    notice, this list of conditions and the following disclaimer.
15# 2. Redistributions in binary form must reproduce the above copyright
16#    notice, this list of conditions and the following disclaimer in the
17#    documentation and/or other materials provided with the distribution.
18# 3. All advertising materials mentioning features or use of this software
19#    must display the following acknowledgement:
20#        This product includes software developed by the NetBSD
21#        Foundation, Inc. and its contributors.
22# 4. Neither the name of The NetBSD Foundation nor the names of its
23#    contributors may be used to endorse or promote products derived
24#    from this software without specific prior written permission.
25#
26# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
27# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
28# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
29# PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE
30# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
31# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
32# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
33# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
34# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
35# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
36# POSSIBILITY OF SUCH DAMAGE.
37#
38
39#	NetBSD installation script.
40#	In a perfect world, this would be a nice C program, with a reasonable
41#	user interface.
42
43ROOTDISK=""				# filled in below
44RELDIR=""				# Path searched for sets by install_sets
45export RELDIR				# on the local filesystems
46
47trap "umount -a > /dev/null 2>&1" 0
48
49MODE="upgrade"
50
51# include machine-dependent functions
52# The following functions must be provided:
53#	md_copy_kernel()	- copy a kernel to the installed disk
54#	md_get_diskdevs()	- return available disk devices
55#	md_get_cddevs()		- return available CD-ROM devices
56#	md_get_ifdevs()		- return available network interfaces
57#	md_get_partition_range() - return range of valid partition letters
58#	md_installboot()	- install boot-blocks on disk
59#	md_checkfordisklabel()	- check for valid disklabel
60#	md_labeldisk()		- put label on a disk
61#	md_welcome_banner()	- display friendly message
62#	md_not_going_to_install() - display friendly message
63#	md_congrats()		- display friendly message
64
65# include machine dependent subroutines
66. install.md
67
68# include common subroutines
69. install.sub
70
71# include version number
72. VERSION
73
74get_reldir() {
75	while : ; do
76	    echo -n "Enter the pathname where the sets are stored [$RELDIR] "
77	    getresp "$RELDIR"
78	    RELDIR=$resp
79
80	    # Allow break-out with empty response
81	    if [ -z "$RELDIR" ]; then
82		echo -n "Are you sure you don't want to set the pathname? [n] "
83		getresp "n"
84		case "$resp" in
85			y*|Y*)
86				break
87				;;
88			*)
89				continue
90				;;
91		esac
92	    fi
93	    if [ -f "/mnt/$RELDIR/base.tar.gz" ]; then
94		break
95	    else
96		echo -n "The directory $RELDIR does not exist, retry? [y] "
97		getresp "y"
98		case "$resp" in
99			y*|Y*)
100				;;
101			*)
102				break
103				;;
104		esac
105	    fi
106	done
107}
108
109# Good {morning,afternoon,evening,night}.
110md_welcome_banner
111echo -n "Proceed with upgrade? [n] "
112getresp "n"
113case "$resp" in
114	y*|Y*)
115		echo	"Cool!  Let's get to it..."
116		;;
117	*)
118		md_not_going_to_install
119		exit
120		;;
121esac
122
123# Deal with terminal issues
124md_set_term
125
126# XXX Work around vnode aliasing bug (thanks for the tip, Chris...)
127ls -l /dev > /dev/null 2>&1
128
129# We don't like it, but it sure makes a few things a lot easier.
130do_mfs_mount "/tmp" "2048"
131
132while [ "X${ROOTDISK}" = "X" ]; do
133	getrootdisk
134done
135
136# Make sure there's a disklabel there.  If there isn't, puke after
137# disklabel prints the error message.
138md_checkfordisklabel ${ROOTDISK}
139case $rval in
140	1)
141		cat << \__disklabel_not_present_1
142
143FATAL ERROR: There is no disklabel present on the root disk!  You must
144label the disk with SYS_INST before continuing.
145
146__disklabel_not_present_1
147		exit
148		;;
149
150	2)
151		cat << \__disklabel_corrupted_1
152
153FATAL ERROR: The disklabel on the root disk is corrupted!  You must
154re-label the disk with SYS_INST before continuing.
155
156__disklabel_corrupted_1
157		exit
158		;;
159
160	*)
161		;;
162esac
163
164# Assume partition 'a' of $ROOTDISK is for the root filesystem.  Confirm
165# this with the user.  Check and mount the root filesystem.
166resp=""			# force one iteration
167while [ "X${resp}" = "X" ]; do
168	echo -n	"Root filesystem? [${ROOTDISK}a] "
169	getresp "${ROOTDISK}a"
170	_root_filesystem="/dev/`basename $resp`"
171	if [ ! -b ${_root_filesystem} ]; then
172		echo "Sorry, ${resp} is not a block device."
173		resp=""	# force loop to repeat
174	fi
175done
176
177echo	"Checking root filesystem..."
178if ! fsck -pf ${_root_filesystem}; then
179	echo	"ERROR: can't check root filesystem!"
180	exit 1
181fi
182
183echo	"Mounting root filesystem..."
184if ! mount -o ro ${_root_filesystem} /mnt; then
185	echo	"ERROR: can't mount root filesystem!"
186	exit 1
187fi
188
189# Grab the fstab so we can munge it for our own use.
190if [ ! -f /mnt/etc/fstab ]; then
191	echo	"ERROR: no /etc/fstab!"
192	exit 1
193fi
194cp /mnt/etc/fstab /tmp/fstab
195
196# Grab the hosts table so we can use it.
197if [ ! -f /mnt/etc/hosts ]; then
198	echo	"ERROR: no /etc/hosts!"
199	exit 1
200fi
201cp /mnt/etc/hosts /tmp/hosts
202
203# Start up the network in same/similar configuration as the installed system
204# uses.
205cat << \__network_config_1
206
207The upgrade program would now like to enable the network.  It will use the
208configuration already stored on the root filesystem.  This is required
209if you wish to use the network installation capabilities of this program.
210
211__network_config_1
212echo -n	"Enable network? [y] "
213getresp "y"
214case "$resp" in
215	y*|Y*)
216		if ! enable_network; then
217			echo "ERROR: can't enable network!"
218			exit 1
219		fi
220
221		cat << \__network_config_2
222
223You will now be given the opportunity to escape to the command shell to
224do any additional network configuration you may need.  This may include
225adding additional routes, if needed.  In addition, you might take this
226opportunity to redo the default route in the event that it failed above.
227
228__network_config_2
229		echo -n "Escape to shell? [n] "
230		getresp "n"
231		case "$resp" in
232			y*|Y*)
233				echo "Type 'exit' to return to upgrade."
234				sh
235				;;
236
237			*)
238				;;
239		esac
240		;;
241	*)
242		;;
243esac
244
245# Now that the network has been configured, it is safe to configure the
246# fstab.  We remove all but ufs/ffs/nfs.
247(
248	rm -f /tmp/fstab.new
249	while read line; do
250		_fstype=`echo $line | cutword 3`
251		if [ "X${_fstype}" = X"ufs" -o \
252		    "X${_fstype}" = X"ffs" -o \
253		    "X${_fstype}" = X"nfs" ]; then
254			echo $line >> /tmp/fstab.new
255		fi
256	done
257) < /tmp/fstab
258
259if [ ! -f /tmp/fstab.new ]; then
260	echo	"ERROR: strange fstab!"
261	exit 1
262fi
263
264# Convert ufs to ffs.
265sed -e 's/ufs/ffs/' < /tmp/fstab.new > /tmp/fstab
266rm -f /tmp/fstab.new
267
268echo	"The fstab is configured as follows:"
269echo	""
270cat /tmp/fstab
271cat << \__fstab_config_1
272
273You may wish to edit the fstab.  For example, you may need to resolve
274dependencies in the order which the filesystems are mounted.  Note that
275this fstab is only for installation purposes, and will not be copied into
276the root filesystem.
277
278__fstab_config_1
279echo -n	"Edit the fstab? [n] "
280getresp "n"
281case "$resp" in
282	y*|Y*)
283		${EDITOR} /tmp/fstab
284		;;
285
286	*)
287		;;
288esac
289
290echo	""
291munge_fstab /tmp/fstab /tmp/fstab.shadow
292
293if ! umount /mnt; then
294	echo	"ERROR: can't unmount previously mounted root!"
295	exit 1
296fi
297
298# Check all of the filesystems.
299check_fs /tmp/fstab.shadow
300
301# Mount filesystems.
302mount_fs /tmp/fstab.shadow
303
304
305echo -n	"Are the upgrade sets on one of your normally mounted filesystems? [y] "
306getresp "y"
307case "$resp" in
308	y*|Y*)
309		get_reldir
310		;;
311	*)
312		;;
313esac
314
315# Install sets.
316install_sets $UPGRSETS
317
318# Get timezone info
319get_timezone
320
321# Fix up the fstab.
322echo -n	"Converting ufs to ffs in /etc/fstab..."
323sed -e 's/ufs/ffs/' < /mnt/etc/fstab > /tmp/fstab
324echo	"done."
325echo -n	"Would you like to edit the resulting fstab? [y] "
326getresp "y"
327case "$resp" in
328	y*|Y*)
329		${EDITOR} /tmp/fstab
330		;;
331
332	*)
333		;;
334esac
335
336# Copy in configuration information and make devices in target root.
337(
338	cd /tmp
339	for file in fstab; do
340		if [ -f $file ]; then
341			echo -n "Copying $file..."
342			cp $file /mnt/etc/$file
343			echo "done."
344		fi
345	done
346
347	echo -n "Installing timezone link..."
348	rm -f /mnt/etc/localtime
349	ln -s /usr/share/zoneinfo/$TZ /mnt/etc/localtime
350	echo "done."
351
352	echo -n "Making devices..."
353	pid=`twiddle`
354	cd /mnt/dev
355	sh MAKEDEV all
356	kill $pid
357	echo "done."
358
359	md_copy_kernel
360
361	md_installboot ${ROOTDISK}
362)
363
364unmount_fs /tmp/fstab.shadow
365
366# Pat on the back.
367md_congrats
368
369# ALL DONE!
370exit 0
371