xref: /freebsd/usr.sbin/bsdinstall/scripts/auto (revision a95ecdf0cfc553f16ab02c4c42d8d56aa8d8e56e)
1#!/bin/sh
2#-
3# Copyright (c) 2011 Nathan Whitehorn
4# Copyright (c) 2013 Devin Teske
5# All rights reserved.
6#
7# Redistribution and use in source and binary forms, with or without
8# modification, are permitted provided that the following conditions
9# are met:
10# 1. Redistributions of source code must retain the above copyright
11#    notice, this list of conditions and the following disclaimer.
12# 2. Redistributions in binary form must reproduce the above copyright
13#    notice, this list of conditions and the following disclaimer in the
14#    documentation and/or other materials provided with the distribution.
15#
16# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26# SUCH DAMAGE.
27#
28# $FreeBSD$
29#
30############################################################ INCLUDES
31
32BSDCFG_SHARE="/usr/share/bsdconfig"
33. $BSDCFG_SHARE/common.subr || exit 1
34
35############################################################ FUNCTIONS
36
37error() {
38	test -n "$DISTDIR_IS_UNIONFS" && umount -f $BSDINSTALL_DISTDIR
39	test -f $PATH_FSTAB && bsdinstall umount
40	dialog --backtitle "FreeBSD Installer" --title "Abort" \
41	    --no-label "Exit" --yes-label "Restart" --yesno \
42	    "An installation step has been aborted. Would you like to restart the installation or exit the installer?" 0 0
43	if [ $? -ne 0 ]; then
44		exit 1
45	else
46		exec $0
47	fi
48}
49
50############################################################ MAIN
51
52# Don't send ESC on function-key 62/63 (left/right command key)
53f_quietly kbdcontrol -f 62 ''
54f_quietly kbdcontrol -f 63 ''
55
56f_dprintf "Began Installation at %s" "$( date )"
57
58rm -rf $BSDINSTALL_TMPETC
59mkdir $BSDINSTALL_TMPETC
60
61trap true SIGINT	# This section is optional
62bsdinstall keymap
63
64trap error SIGINT	# Catch cntrl-C here
65bsdinstall hostname || error
66
67export DISTRIBUTIONS="base.txz kernel.txz"
68if [ -f $BSDINSTALL_DISTDIR/MANIFEST ]; then
69	DISTMENU=`awk -F'\t' '!/^(kernel|base)/{print $4,$5,$6}' $BSDINSTALL_DISTDIR/MANIFEST`
70
71	exec 3>&1
72	EXTRA_DISTS=$( eval dialog \
73	    --backtitle \"FreeBSD Installer\" \
74	    --title \"Distribution Select\" --nocancel --separate-output \
75	    --checklist \"Choose optional system components to install:\" \
76	    0 0 0 $DISTMENU \
77	2>&1 1>&3 )
78	for dist in $EXTRA_DISTS; do
79		export DISTRIBUTIONS="$DISTRIBUTIONS $dist.txz"
80	done
81fi
82
83FETCH_DISTRIBUTIONS=""
84for dist in $DISTRIBUTIONS; do
85	if [ ! -f $BSDINSTALL_DISTDIR/$dist ]; then
86		FETCH_DISTRIBUTIONS="$FETCH_DISTRIBUTIONS $dist"
87	fi
88done
89FETCH_DISTRIBUTIONS=`echo $FETCH_DISTRIBUTIONS`	# Trim white space
90
91if [ -n "$FETCH_DISTRIBUTIONS" -a -n "$BSDINSTALL_CONFIGCURRENT" ]; then
92	dialog --backtitle "FreeBSD Installer" --title "Network Installation" --msgbox "No installation files were found on the boot volume. The next few screens will allow you to configure networking so that they can be downloaded from the Internet." 0 0
93	bsdinstall netconfig || error
94	NETCONFIG_DONE=yes
95fi
96
97if [ -n "$FETCH_DISTRIBUTIONS" ]; then
98	exec 3>&1
99	BSDINSTALL_DISTSITE=$(`dirname $0`/mirrorselect 2>&1 1>&3)
100	MIRROR_BUTTON=$?
101	exec 3>&-
102	test $MIRROR_BUTTON -eq 0 || error
103	export BSDINSTALL_DISTSITE
104fi
105
106rm $PATH_FSTAB
107touch $PATH_FSTAB
108
109PMODES="\
110Guided \"Partitioning Tool (Recommended for Beginners)\" \
111Manual \"Manually Configure Partitions (Expert)\" \
112Shell \"Open a shell and partition by hand\""
113
114CURARCH=$( uname -m )
115case $CURARCH in
116	amd64|i386)	# Booting ZFS Supported
117		PMODES="$PMODES ZFS \"Automatic Root-on-ZFS (Experimental)\""
118		;;
119	*)		# Booting ZFS Unspported
120		;;
121esac
122
123exec 3>&1
124PARTMODE=`echo $PMODES | xargs dialog --backtitle "FreeBSD Installer" \
125	--title "Partitioning" \
126	--menu "How would you like to partition your disk?" \
127	0 0 0 2>&1 1>&3`
128if [ $? -eq $DIALOG_CANCEL ]; then exit 1; fi
129exec 3>&-
130
131case "$PARTMODE" in
132"Guided")	# Guided
133	bsdinstall autopart || error
134	bsdinstall mount || error
135	;;
136"Shell")	# Shell
137	clear
138	echo "Use this shell to set up partitions for the new system. When finished, mount the system at $BSDINSTALL_CHROOT and place an fstab file for the new system at $PATH_FSTAB. Then type 'exit'. You can also enter the partition editor at any time by entering 'bsdinstall partedit'."
139	sh 2>&1
140	;;
141"Manual")	# Manual
142	if f_isset debugFile; then
143		# Give partedit the path to our logfile so it can append
144		BSDINSTALL_LOG="${debugFile#+}" bsdinstall partedit || error
145	else
146		bsdinstall partedit || error
147	fi
148	bsdinstall mount || error
149	;;
150"ZFS")	# ZFS
151	bsdinstall zfsboot || error
152	bsdinstall mount || error
153	;;
154*)
155	error
156	;;
157esac
158
159if [ ! -z "$FETCH_DISTRIBUTIONS" ]; then
160	ALL_DISTRIBUTIONS="$DISTRIBUTIONS"
161
162	# Download to a directory in the new system as scratch space
163	BSDINSTALL_FETCHDEST="$BSDINSTALL_CHROOT/usr/freebsd-dist"
164	mkdir -p "$BSDINSTALL_FETCHDEST" || error
165
166	export DISTRIBUTIONS="$FETCH_DISTRIBUTIONS"
167	# Try to use any existing distfiles
168	if [ -d $BSDINSTALL_DISTDIR ]; then
169		DISTDIR_IS_UNIONFS=1
170		mount_nullfs -o union "$BSDINSTALL_FETCHDEST" "$BSDINSTALL_DISTDIR"
171	else
172		export DISTRIBUTIONS="MANIFEST $ALL_DISTRIBUTIONS"
173		export BSDINSTALL_DISTDIR="$BSDINSTALL_FETCHDEST"
174	fi
175
176	export FTP_PASSIVE_MODE=YES
177	bsdinstall distfetch || error
178	export DISTRIBUTIONS="$ALL_DISTRIBUTIONS"
179fi
180
181bsdinstall checksum || error
182bsdinstall distextract || error
183bsdinstall rootpass || error
184
185trap true SIGINT	# This section is optional
186if [ "$NETCONFIG_DONE" != yes ]; then
187	bsdinstall netconfig	# Don't check for errors -- the user may cancel
188fi
189bsdinstall time
190bsdinstall services
191
192dialog --backtitle "FreeBSD Installer" --title "Add User Accounts" --yesno \
193    "Would you like to add users to the installed system now?" 0 0 && \
194    bsdinstall adduser
195
196finalconfig() {
197	exec 3>&1
198	REVISIT=$(dialog --backtitle "FreeBSD Installer" \
199	    --title "Final Configuration" --no-cancel --menu \
200	    "Setup of your FreeBSD system is nearly complete. You can now modify your configuration choices. After this screen, you will have an opportunity to make more complex changes using a shell." 0 0 0 \
201		"Exit" "Apply configuration and exit installer" \
202		"Add User" "Add a user to the system" \
203		"Root Password" "Change root password" \
204		"Hostname" "Set system hostname" \
205		"Network" "Networking configuration" \
206		"Services" "Set daemons to run on startup" \
207		"Time Zone" "Set system timezone" \
208		"Handbook" "Install FreeBSD Handbook (requires network)" 2>&1 1>&3)
209	exec 3>&-
210
211	case "$REVISIT" in
212	"Add User")
213		bsdinstall adduser
214		finalconfig
215		;;
216	"Root Password")
217		bsdinstall rootpass
218		finalconfig
219		;;
220	"Hostname")
221		bsdinstall hostname
222		finalconfig
223		;;
224	"Network")
225		bsdinstall netconfig
226		finalconfig
227		;;
228	"Services")
229		bsdinstall services
230		finalconfig
231		;;
232	"Time Zone")
233		bsdinstall time
234		finalconfig
235		;;
236	"Handbook")
237		bsdinstall docsinstall
238		finalconfig
239		;;
240	esac
241}
242
243# Allow user to change his mind
244finalconfig
245
246trap error SIGINT	# SIGINT is bad again
247bsdinstall config  || error
248
249if [ ! -z "$BSDINSTALL_FETCHDEST" ]; then
250	[ "$BSDINSTALL_FETCHDEST" != "$BSDINSTALL_DISTDIR" ] && \
251	    umount "$BSDINSTALL_DISTDIR"
252	rm -rf "$BSDINSTALL_FETCHDEST"
253fi
254
255dialog --backtitle "FreeBSD Installer" --title "Manual Configuration" \
256    --yesno "The installation is now finished. Before exiting the installer, would you like to open a shell in the new system to make any final manual modifications?" 0 0
257if [ $? -eq 0 ]; then
258	clear
259	mount -t devfs devfs "$BSDINSTALL_CHROOT/dev"
260	echo This shell is operating in a chroot in the new system. \
261	    When finished making configuration changes, type \"exit\".
262	chroot "$BSDINSTALL_CHROOT" /bin/sh 2>&1
263fi
264
265bsdinstall entropy
266bsdinstall umount
267
268f_dprintf "Installation Completed at %s" "$( date )"
269
270################################################################################
271# END
272################################################################################
273