]> CyberLeo.Net >> Repos - FreeBSD/releng/10.2.git/blob - usr.sbin/bsdinstall/scripts/auto
- Copy stable/10@285827 to releng/10.2 in preparation for 10.2-RC1
[FreeBSD/releng/10.2.git] / usr.sbin / bsdinstall / scripts / auto
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
32 BSDCFG_SHARE="/usr/share/bsdconfig"
33 . $BSDCFG_SHARE/common.subr || exit 1
34 f_include $BSDCFG_SHARE/dialog.subr
35
36 ############################################################ FUNCTIONS
37
38 error() {
39         local msg
40         if [ -n "$1" ]; then
41                 msg="$1\n\n"
42         fi
43         test -n "$DISTDIR_IS_UNIONFS" && umount -f $BSDINSTALL_DISTDIR
44         test -f $PATH_FSTAB && bsdinstall umount
45         dialog --backtitle "FreeBSD Installer" --title "Abort" \
46             --no-label "Exit" --yes-label "Restart" --yesno \
47             "${msg}An installation step has been aborted. Would you like to restart the installation or exit the installer?" 0 0
48         if [ $? -ne 0 ]; then
49                 exit 1
50         else
51                 exec $0
52         fi
53 }
54
55 hline_arrows_tab_enter="Press arrows, TAB or ENTER"
56 msg_gpt_active_fix="Your hardware is known to have issues booting in BIOS mode from GPT partitions that are not set active. Would you like the installer to apply this workaround for you?"
57 msg_lenovo_fix="Your model of Lenovo is known to have a BIOS bug that prevents it booting from GPT partitions without UEFI. Would you like the installer to apply a workaround for you?"
58 msg_no="NO"
59 msg_yes="YES"
60
61 # dialog_workaround
62 #
63 # Ask the user if they wish to apply a workaround
64 #
65 dialog_workaround()
66 {
67         local passed_msg="$1"
68         local title="$DIALOG_TITLE"
69         local btitle="$DIALOG_BACKTITLE"
70         local prompt # Calculated below
71         local hline="$hline_arrows_tab_enter"
72
73         local height=8 width=50 prefix="   "
74         local plen=${#prefix} list= line=
75         local max_width=$(( $width - 3 - $plen ))
76
77         local yes no defaultno extra_args format
78         if [ "$USE_XDIALOG" ]; then
79                 yes=ok no=cancel defaultno=default-no
80                 extra_args="--wrap --left"
81                 format="$passed_msg"
82         else
83                 yes=yes no=no defaultno=defaultno
84                 extra_args="--cr-wrap"
85                 format="$passed_msg"
86         fi
87
88         # Add height for Xdialog(1)
89         [ "$USE_XDIALOG" ] && height=$(( $height + $height / 5 + 3 ))
90
91         prompt=$( printf "$format" )
92         f_dprintf "%s: Workaround prompt" "$0"
93         $DIALOG \
94                 --title "$title"        \
95                 --backtitle "$btitle"   \
96                 --hline "$hline"        \
97                 --$yes-label "$msg_yes" \
98                 --$no-label "$msg_no"   \
99                 $extra_args             \
100                 --yesno "$prompt" $height $width
101 }
102
103 ############################################################ MAIN
104
105 f_dprintf "Began Installation at %s" "$( date )"
106
107 rm -rf $BSDINSTALL_TMPETC
108 mkdir $BSDINSTALL_TMPETC
109
110 trap true SIGINT        # This section is optional
111 bsdinstall keymap
112
113 trap error SIGINT       # Catch cntrl-C here
114 bsdinstall hostname || error "Set hostname failed"
115
116 export DISTRIBUTIONS="base.txz kernel.txz"
117 if [ -f $BSDINSTALL_DISTDIR/MANIFEST ]; then
118         DISTMENU=`awk -F'\t' '!/^(kernel|base)/{print $4,$5,$6}' $BSDINSTALL_DISTDIR/MANIFEST`
119
120         exec 3>&1
121         EXTRA_DISTS=$( eval dialog \
122             --backtitle \"FreeBSD Installer\" \
123             --title \"Distribution Select\" --nocancel --separate-output \
124             --checklist \"Choose optional system components to install:\" \
125             0 0 0 $DISTMENU \
126         2>&1 1>&3 )
127         for dist in $EXTRA_DISTS; do
128                 export DISTRIBUTIONS="$DISTRIBUTIONS $dist.txz"
129         done
130 fi
131
132 FETCH_DISTRIBUTIONS=""
133 for dist in $DISTRIBUTIONS; do
134         if [ ! -f $BSDINSTALL_DISTDIR/$dist ]; then
135                 FETCH_DISTRIBUTIONS="$FETCH_DISTRIBUTIONS $dist"
136         fi
137 done
138 FETCH_DISTRIBUTIONS=`echo $FETCH_DISTRIBUTIONS` # Trim white space
139
140 if [ -n "$FETCH_DISTRIBUTIONS" -a -n "$BSDINSTALL_CONFIGCURRENT" ]; then
141         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
142         bsdinstall netconfig || error
143         NETCONFIG_DONE=yes
144 fi
145
146 if [ -n "$FETCH_DISTRIBUTIONS" ]; then
147         exec 3>&1
148         BSDINSTALL_DISTSITE=$(`dirname $0`/mirrorselect 2>&1 1>&3)
149         MIRROR_BUTTON=$?
150         exec 3>&-
151         test $MIRROR_BUTTON -eq 0 || error "No mirror selected"
152         export BSDINSTALL_DISTSITE
153 fi
154
155 rm -f $PATH_FSTAB
156 touch $PATH_FSTAB
157
158 #
159 # Try to detect known broken platforms and apply their workarounds
160 #
161
162 if f_interactive; then
163         sys_maker=$( kenv -q smbios.system.maker )
164         f_dprintf "smbios.system.maker=[%s]" "$sys_maker"
165         sys_model=$( kenv -q smbios.system.product )
166         f_dprintf "smbios.system.product=[%s]" "$sys_model"
167         sys_version=$( kenv -q smbios.system.version )
168         f_dprintf "smbios.system.version=[%s]" "$sys_version"
169         case "$sys_maker" in
170         "LENOVO")
171                 case "$sys_version" in
172                 "ThinkPad X220"|"ThinkPad T420"|"ThinkPad T520")
173                         dialog_workaround "$msg_lenovo_fix"
174                         retval=$?
175                         f_dprintf "lenovofix_prompt=[%s]" "$retval"
176                         if [ $retval -eq $DIALOG_OK ]; then
177                                 export ZFSBOOT_PARTITION_SCHEME="GPT + Lenovo Fix"
178                                 export WORKAROUND_LENOVO=1
179                         fi
180                         ;;
181                 esac
182                 ;;
183         "Dell Inc.")
184                 case "$sys_model" in
185                 "Latitude E7440")
186                         dialog_workaround "$msg_gpt_active_fix"
187                         retval=$?
188                         f_dprintf "gpt_active_fix_prompt=[%s]" "$retval"
189                         if [ $retval -eq $DIALOG_OK ]; then
190                                 export ZFSBOOT_PARTITION_SCHEME="GPT + Active"
191                                 export WORKAROUND_GPTACTIVE=1
192                         fi
193                         ;;
194                 esac
195                 ;;
196         esac
197 fi
198
199 PMODES="\
200 \"Auto (UFS)\" \"Guided Disk Setup\" \
201 Manual \"Manual Disk Setup (experts)\" \
202 Shell \"Open a shell and partition by hand\""
203
204 CURARCH=$( uname -m )
205 case $CURARCH in
206         amd64|i386)     # Booting ZFS Supported
207                 PMODES="$PMODES \"Auto (ZFS)\" \"Guided Root-on-ZFS\""
208                 ;;
209         *)              # Booting ZFS Unspported
210                 ;;
211 esac
212
213 exec 3>&1
214 PARTMODE=`echo $PMODES | xargs dialog --backtitle "FreeBSD Installer" \
215         --title "Partitioning" \
216         --menu "How would you like to partition your disk?" \
217         0 0 0 2>&1 1>&3` || exit 1
218 exec 3>&-
219
220 case "$PARTMODE" in
221 "Auto (UFS)")   # Guided
222         bsdinstall autopart || error "Partitioning error"
223         bsdinstall mount || error "Failed to mount filesystem"
224         ;;
225 "Shell")        # Shell
226         clear
227         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'."
228         sh 2>&1
229         ;;
230 "Manual")       # Manual
231         if f_isset debugFile; then
232                 # Give partedit the path to our logfile so it can append
233                 BSDINSTALL_LOG="${debugFile#+}" bsdinstall partedit || error "Partitioning error"
234         else
235                 bsdinstall partedit || error "Partitioning error"
236         fi
237         bsdinstall mount || error "Failed to mount filesystem"
238         ;;
239 "Auto (ZFS)")   # ZFS
240         bsdinstall zfsboot || error "ZFS setup failed"
241         bsdinstall mount || error "Failed to mount filesystem"
242         ;;
243 *)
244         error "Unknown partitioning mode"
245         ;;
246 esac
247
248 if [ ! -z "$FETCH_DISTRIBUTIONS" ]; then
249         ALL_DISTRIBUTIONS="$DISTRIBUTIONS"
250
251         # Download to a directory in the new system as scratch space
252         BSDINSTALL_FETCHDEST="$BSDINSTALL_CHROOT/usr/freebsd-dist"
253         mkdir -p "$BSDINSTALL_FETCHDEST" || error "Could not create directory $BSDINSTALL_FETCHDEST"
254
255         export DISTRIBUTIONS="$FETCH_DISTRIBUTIONS"
256         # Try to use any existing distfiles
257         if [ -d $BSDINSTALL_DISTDIR ]; then
258                 DISTDIR_IS_UNIONFS=1
259                 mount_nullfs -o union "$BSDINSTALL_FETCHDEST" "$BSDINSTALL_DISTDIR"
260         else
261                 export DISTRIBUTIONS="MANIFEST $ALL_DISTRIBUTIONS"
262                 export BSDINSTALL_DISTDIR="$BSDINSTALL_FETCHDEST"
263         fi
264                 
265         export FTP_PASSIVE_MODE=YES
266         bsdinstall distfetch || error "Failed to fetch distribution"
267         export DISTRIBUTIONS="$ALL_DISTRIBUTIONS"
268 fi
269
270 bsdinstall checksum || error "Distribution checksum failed"
271 bsdinstall distextract || error "Distribution extract failed"
272 bsdinstall rootpass || error "Could not set root password"
273
274 trap true SIGINT        # This section is optional
275 if [ "$NETCONFIG_DONE" != yes ]; then
276         bsdinstall netconfig    # Don't check for errors -- the user may cancel
277 fi
278 bsdinstall time
279 bsdinstall services
280
281 dialog --backtitle "FreeBSD Installer" --title "Add User Accounts" --yesno \
282     "Would you like to add users to the installed system now?" 0 0 && \
283     bsdinstall adduser
284
285 finalconfig() {
286         exec 3>&1
287         REVISIT=$(dialog --backtitle "FreeBSD Installer" \
288             --title "Final Configuration" --no-cancel --menu \
289             "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 \
290                 "Exit" "Apply configuration and exit installer" \
291                 "Add User" "Add a user to the system" \
292                 "Root Password" "Change root password" \
293                 "Hostname" "Set system hostname" \
294                 "Network" "Networking configuration" \
295                 "Services" "Set daemons to run on startup" \
296                 "Time Zone" "Set system timezone" \
297                 "Handbook" "Install FreeBSD Handbook (requires network)" 2>&1 1>&3)
298         exec 3>&-
299
300         case "$REVISIT" in
301         "Add User")
302                 bsdinstall adduser
303                 finalconfig
304                 ;;
305         "Root Password")
306                 bsdinstall rootpass 
307                 finalconfig
308                 ;;
309         "Hostname")
310                 bsdinstall hostname
311                 finalconfig
312                 ;;
313         "Network")
314                 bsdinstall netconfig
315                 finalconfig
316                 ;;
317         "Services")
318                 bsdinstall services
319                 finalconfig
320                 ;;
321         "Time Zone")
322                 bsdinstall time
323                 finalconfig
324                 ;;
325         "Handbook")
326                 bsdinstall docsinstall
327                 finalconfig
328                 ;;
329         esac
330 }
331
332 # Allow user to change his mind
333 finalconfig
334
335 trap error SIGINT       # SIGINT is bad again
336 bsdinstall config  || error "Failed to save config"
337
338 if [ ! -z "$BSDINSTALL_FETCHDEST" ]; then
339         [ "$BSDINSTALL_FETCHDEST" != "$BSDINSTALL_DISTDIR" ] && \
340             umount "$BSDINSTALL_DISTDIR"
341         rm -rf "$BSDINSTALL_FETCHDEST"
342 fi
343
344 dialog --backtitle "FreeBSD Installer" --title "Manual Configuration" \
345     --default-button no --yesno \
346    "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
347 if [ $? -eq 0 ]; then
348         clear
349         mount -t devfs devfs "$BSDINSTALL_CHROOT/dev"
350         echo This shell is operating in a chroot in the new system. \
351             When finished making configuration changes, type \"exit\".
352         chroot "$BSDINSTALL_CHROOT" /bin/sh 2>&1
353 fi
354
355 bsdinstall entropy
356 bsdinstall umount
357
358 f_dprintf "Installation Completed at %s" "$( date )"
359
360 ################################################################################
361 # END
362 ################################################################################