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
52f_dprintf "Began Installation at %s" "$( date )"
53
54rm -rf $BSDINSTALL_TMPETC
55mkdir $BSDINSTALL_TMPETC
56
57trap true SIGINT	# This section is optional
58bsdinstall keymap
59
60trap error SIGINT	# Catch cntrl-C here
61bsdinstall hostname || error
62
63export DISTRIBUTIONS="base.txz kernel.txz"
64if [ -f $BSDINSTALL_DISTDIR/MANIFEST ]; then
65	DISTMENU=`awk -F'\t' '!/^(kernel|base)/{print $4,$5,$6}' $BSDINSTALL_DISTDIR/MANIFEST`
66
67	exec 3>&1
68	EXTRA_DISTS=$( eval dialog \
69	    --backtitle \"FreeBSD Installer\" \
70	    --title \"Distribution Select\" --nocancel --separate-output \
71	    --checklist \"Choose optional system components to install:\" \
72	    0 0 0 $DISTMENU \
73	2>&1 1>&3 )
74	for dist in $EXTRA_DISTS; do
75		export DISTRIBUTIONS="$DISTRIBUTIONS $dist.txz"
76	done
77fi
78
79FETCH_DISTRIBUTIONS=""
80for dist in $DISTRIBUTIONS; do
81	if [ ! -f $BSDINSTALL_DISTDIR/$dist ]; then
82		FETCH_DISTRIBUTIONS="$FETCH_DISTRIBUTIONS $dist"
83	fi
84done
85FETCH_DISTRIBUTIONS=`echo $FETCH_DISTRIBUTIONS`	# Trim white space
86
87if [ -n "$FETCH_DISTRIBUTIONS" -a -n "$BSDINSTALL_CONFIGCURRENT" ]; then
88	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
89	bsdinstall netconfig || error
90	NETCONFIG_DONE=yes
91fi
92
93if [ -n "$FETCH_DISTRIBUTIONS" ]; then
94	exec 3>&1
95	BSDINSTALL_DISTSITE=$(`dirname $0`/mirrorselect 2>&1 1>&3)
96	MIRROR_BUTTON=$?
97	exec 3>&-
98	test $MIRROR_BUTTON -eq 0 || error
99	export BSDINSTALL_DISTSITE
100fi
101
102rm -f $PATH_FSTAB
103touch $PATH_FSTAB
104
105PMODES="\
106Guided \"Partitioning Tool (Recommended for Beginners)\" \
107Manual \"Manually Configure Partitions (Expert)\" \
108Shell \"Open a shell and partition by hand\""
109
110CURARCH=$( uname -m )
111case $CURARCH in
112	amd64|i386)	# Booting ZFS Supported
113		PMODES="$PMODES ZFS \"Automatic Root-on-ZFS (Experimental)\""
114		;;
115	*)		# Booting ZFS Unspported
116		;;
117esac
118
119exec 3>&1
120PARTMODE=`echo $PMODES | xargs dialog --backtitle "FreeBSD Installer" \
121	--title "Partitioning" \
122	--menu "How would you like to partition your disk?" \
123	0 0 0 2>&1 1>&3` || exit 1
124exec 3>&-
125
126case "$PARTMODE" in
127"Guided")	# Guided
128	bsdinstall autopart || error
129	bsdinstall mount || error
130	;;
131"Shell")	# Shell
132	clear
133	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'."
134	sh 2>&1
135	;;
136"Manual")	# Manual
137	if f_isset debugFile; then
138		# Give partedit the path to our logfile so it can append
139		BSDINSTALL_LOG="${debugFile#+}" bsdinstall partedit || error
140	else
141		bsdinstall partedit || error
142	fi
143	bsdinstall mount || error
144	;;
145"ZFS")	# ZFS
146	bsdinstall zfsboot || error
147	bsdinstall mount || error
148	;;
149*)
150	error
151	;;
152esac
153
154if [ ! -z "$FETCH_DISTRIBUTIONS" ]; then
155	ALL_DISTRIBUTIONS="$DISTRIBUTIONS"
156
157	# Download to a directory in the new system as scratch space
158	BSDINSTALL_FETCHDEST="$BSDINSTALL_CHROOT/usr/freebsd-dist"
159	mkdir -p "$BSDINSTALL_FETCHDEST" || error
160
161	export DISTRIBUTIONS="$FETCH_DISTRIBUTIONS"
162	# Try to use any existing distfiles
163	if [ -d $BSDINSTALL_DISTDIR ]; then
164		DISTDIR_IS_UNIONFS=1
165		mount_nullfs -o union "$BSDINSTALL_FETCHDEST" "$BSDINSTALL_DISTDIR"
166	else
167		export DISTRIBUTIONS="MANIFEST $ALL_DISTRIBUTIONS"
168		export BSDINSTALL_DISTDIR="$BSDINSTALL_FETCHDEST"
169	fi
170		
171	export FTP_PASSIVE_MODE=YES
172	bsdinstall distfetch || error
173	export DISTRIBUTIONS="$ALL_DISTRIBUTIONS"
174fi
175
176bsdinstall checksum || error
177bsdinstall distextract || error
178bsdinstall rootpass || error
179
180trap true SIGINT	# This section is optional
181if [ "$NETCONFIG_DONE" != yes ]; then
182	bsdinstall netconfig	# Don't check for errors -- the user may cancel
183fi
184bsdinstall time
185bsdinstall services
186
187dialog --backtitle "FreeBSD Installer" --title "Add User Accounts" --yesno \
188    "Would you like to add users to the installed system now?" 0 0 && \
189    bsdinstall adduser
190
191finalconfig() {
192	exec 3>&1
193	REVISIT=$(dialog --backtitle "FreeBSD Installer" \
194	    --title "Final Configuration" --no-cancel --menu \
195	    "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 \
196		"Exit" "Apply configuration and exit installer" \
197		"Add User" "Add a user to the system" \
198		"Root Password" "Change root password" \
199		"Hostname" "Set system hostname" \
200		"Network" "Networking configuration" \
201		"Services" "Set daemons to run on startup" \
202		"Time Zone" "Set system timezone" \
203		"Handbook" "Install FreeBSD Handbook (requires network)" 2>&1 1>&3)
204	exec 3>&-
205
206	case "$REVISIT" in
207	"Add User")
208		bsdinstall adduser
209		finalconfig
210		;;
211	"Root Password")
212		bsdinstall rootpass 
213		finalconfig
214		;;
215	"Hostname")
216		bsdinstall hostname
217		finalconfig
218		;;
219	"Network")
220		bsdinstall netconfig
221		finalconfig
222		;;
223	"Services")
224		bsdinstall services
225		finalconfig
226		;;
227	"Time Zone")
228		bsdinstall time
229		finalconfig
230		;;
231	"Handbook")
232		bsdinstall docsinstall
233		finalconfig
234		;;
235	esac
236}
237
238# Allow user to change his mind
239finalconfig
240
241trap error SIGINT	# SIGINT is bad again
242bsdinstall config  || error
243
244if [ ! -z "$BSDINSTALL_FETCHDEST" ]; then
245	[ "$BSDINSTALL_FETCHDEST" != "$BSDINSTALL_DISTDIR" ] && \
246	    umount "$BSDINSTALL_DISTDIR"
247	rm -rf "$BSDINSTALL_FETCHDEST"
248fi
249
250dialog --backtitle "FreeBSD Installer" --title "Manual Configuration" \
251    --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
252if [ $? -eq 0 ]; then
253	clear
254	mount -t devfs devfs "$BSDINSTALL_CHROOT/dev"
255	echo This shell is operating in a chroot in the new system. \
256	    When finished making configuration changes, type \"exit\".
257	chroot "$BSDINSTALL_CHROOT" /bin/sh 2>&1
258fi
259
260bsdinstall entropy
261bsdinstall umount
262
263f_dprintf "Installation Completed at %s" "$( date )"
264
265################################################################################
266# END
267################################################################################
268