diff options
Diffstat (limited to 'bsdinstall/scripts/auto')
-rwxr-xr-x | bsdinstall/scripts/auto | 444 |
1 files changed, 444 insertions, 0 deletions
diff --git a/bsdinstall/scripts/auto b/bsdinstall/scripts/auto new file mode 100755 index 000000000000..9f8946880f61 --- /dev/null +++ b/bsdinstall/scripts/auto @@ -0,0 +1,444 @@ +#!/bin/sh +#- +# Copyright (c) 2011 Nathan Whitehorn +# Copyright (c) 2013-2018 Devin Teske +# 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. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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. +# +# $FreeBSD$ +# +############################################################ INCLUDES + +BSDCFG_SHARE="/usr/share/bsdconfig" +. $BSDCFG_SHARE/common.subr || exit 1 +f_include $BSDCFG_SHARE/dialog.subr + +############################################################ GLOBALS + +# +# Strings that should be moved to an i18n file and loaded with f_include_lang() +# +hline_arrows_tab_enter="Press arrows, TAB or ENTER" +hline_arrows_tab_space_enter="Press arrows, TAB, SPACE or ENTER" +msg_abort="Abort" +msg_an_installation_step_has_been_aborted="An installation step has been aborted. Would you like\nto restart the installation or exit the installer?" +msg_auto_ufs="Auto (UFS)" +msg_auto_ufs_desc="Guided UFS Disk Setup" +msg_auto_ufs_help="Menu options help choose which disk to setup using UFS and standard partitions" +msg_auto_zfs="Auto (ZFS)" +msg_auto_zfs_desc="Guided Root-on-ZFS" +msg_auto_zfs_help="To use ZFS with less than 8GB RAM, see https://wiki.freebsd.org/ZFSTuningGuide" +msg_exit="Exit" +msg_freebsd_installer="FreeBSD Installer" +msg_gpt_active_fix="Your hardware is known to have issues booting in CSM/Legacy/BIOS mode from GPT partitions that are not set active. Would you like the installer to apply this workaround for you?" +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?" +msg_manual="Manual" +msg_manual_desc="Manual Disk Setup (experts)" +msg_manual_help="Create customized partitions from menu options" +msg_no="NO" +msg_restart="Restart" +msg_shell="Shell" +msg_shell_desc="Open a shell and partition by hand" +msg_shell_help="Create customized partitions using command-line utilities" +msg_yes="YES" + +############################################################ FUNCTIONS + +# error [$msg] +# +# Display generic error message when a script fails. An optional message +# argument can preceed the generic message. User is given the choice of +# restarting the installer or exiting. +# +error() +{ + local title="$msg_abort" + local btitle="$msg_freebsd_installer" + local prompt="${1:+$1\n\n}$msg_an_installation_step_has_been_aborted" + local hline="$hline_arrows_tab_space_enter" + + [ -f "$PATH_FSTAB" ] && bsdinstall umount + + local height width + f_dialog_buttonbox_size height width \ + "$title" "$btitle" "$prompt" "$hline" + + if $DIALOG \ + --title "$title" \ + --backtitle "$btitle" \ + --hline "$hline" \ + --no-label "$msg_exit" \ + --yes-label "$msg_restart" \ + --yesno "$prompt" $height $width + then + exec $0 + # NOTREACHED + fi + exit 1 +} + +# dialog_workaround +# +# Ask the user if they wish to apply a workaround +# +dialog_workaround() +{ + local passed_msg="$1" + local title="$DIALOG_TITLE" + local btitle="$DIALOG_BACKTITLE" + local prompt # Calculated below + local hline="$hline_arrows_tab_enter" + + local height=8 width=50 prefix=" " + local plen=${#prefix} list= line= + local max_width=$(( $width - 3 - $plen )) + + local yes no defaultno extra_args format + if [ "$USE_XDIALOG" ]; then + yes=ok no=cancel defaultno=default-no + extra_args="--wrap --left" + format="$passed_msg" + else + yes=yes no=no defaultno=defaultno + extra_args="--cr-wrap" + format="$passed_msg" + fi + + # Add height for Xdialog(1) + [ "$USE_XDIALOG" ] && height=$(( $height + $height / 5 + 3 )) + + prompt=$( printf "$format" ) + f_dprintf "%s: Workaround prompt" "$0" + $DIALOG \ + --title "$title" \ + --backtitle "$btitle" \ + --hline "$hline" \ + --$yes-label "$msg_yes" \ + --$no-label "$msg_no" \ + $extra_args \ + --yesno "$prompt" $height $width +} + +############################################################ MAIN + +f_dprintf "Began Installation at %s" "$( date )" + +rm -rf $BSDINSTALL_TMPETC +mkdir $BSDINSTALL_TMPETC + +trap true SIGINT # This section is optional +bsdinstall keymap + +trap error SIGINT # Catch cntrl-C here +bsdinstall hostname || error "Set hostname failed" + +export DISTRIBUTIONS="base.txz kernel.txz" +if [ -f $BSDINSTALL_DISTDIR/MANIFEST ]; then + DISTMENU=`awk -F'\t' '!/^(kernel\.txz|base\.txz)/{print $1,$5,$6}' $BSDINSTALL_DISTDIR/MANIFEST` + DISTMENU="$(echo ${DISTMENU} | sed -E 's/\.txz//g')" + + if [ -n "$DISTMENU" ]; then + exec 3>&1 + EXTRA_DISTS=$( eval dialog \ + --backtitle \"FreeBSD Installer\" \ + --title \"Distribution Select\" --nocancel --separate-output \ + --checklist \"Choose optional system components to install:\" \ + 0 0 0 $DISTMENU \ + 2>&1 1>&3 ) + for dist in $EXTRA_DISTS; do + export DISTRIBUTIONS="$DISTRIBUTIONS $dist.txz" + done + fi +fi + +FETCH_DISTRIBUTIONS="" +for dist in $DISTRIBUTIONS; do + if [ ! -f $BSDINSTALL_DISTDIR/$dist ]; then + FETCH_DISTRIBUTIONS="$FETCH_DISTRIBUTIONS $dist" + fi +done + +if [ -n "$FETCH_DISTRIBUTIONS" -a -n "$BSDINSTALL_CONFIGCURRENT" ]; then + dialog --backtitle "FreeBSD Installer" --title "Network Installation" --msgbox "Some installation files were not 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 + bsdinstall netconfig || error + NETCONFIG_DONE=yes +fi + +rm -f $PATH_FSTAB +touch $PATH_FSTAB + +# +# Try to detect known broken platforms and apply their workarounds +# + +if f_interactive; then + sys_maker=$( kenv -q smbios.system.maker ) + f_dprintf "smbios.system.maker=[%s]" "$sys_maker" + sys_model=$( kenv -q smbios.system.product ) + f_dprintf "smbios.system.product=[%s]" "$sys_model" + sys_version=$( kenv -q smbios.system.version ) + f_dprintf "smbios.system.version=[%s]" "$sys_version" + sys_mb_maker=$( kenv -q smbios.planar.maker ) + f_dprintf "smbios.planar.maker=[%s]" "$sys_mb_maker" + sys_mb_product=$( kenv -q smbios.planar.product ) + f_dprintf "smbios.planar.product=[%s]" "$sys_mb_product" + + # + # Laptop Models + # + case "$sys_maker" in + "LENOVO") + case "$sys_version" in + "ThinkPad X220"|"ThinkPad T420"|"ThinkPad T520"|"ThinkPad W520"|"ThinkPad X1") + dialog_workaround "$msg_lenovo_fix" + retval=$? + f_dprintf "lenovofix_prompt=[%s]" "$retval" + if [ $retval -eq $DIALOG_OK ]; then + export ZFSBOOT_PARTITION_SCHEME="GPT + Lenovo Fix" + export WORKAROUND_LENOVO=1 + fi + ;; + esac + ;; + "Dell Inc.") + case "$sys_model" in + "Latitude E6330"|"Latitude E7440"|"Latitude E7240"|"Precision Tower 5810") + dialog_workaround "$msg_gpt_active_fix" + retval=$? + f_dprintf "gpt_active_fix_prompt=[%s]" "$retval" + if [ $retval -eq $DIALOG_OK ]; then + export ZFSBOOT_PARTITION_SCHEME="GPT + Active" + export WORKAROUND_GPTACTIVE=1 + fi + ;; + esac + ;; + "Hewlett-Packard") + case "$sys_model" in + "HP ProBook 4330s") + dialog_workaround "$msg_gpt_active_fix" + retval=$? + f_dprintf "gpt_active_fix_prompt=[%s]" "$retval" + if [ $retval -eq $DIALOG_OK ]; then + export ZFSBOOT_PARTITION_SCHEME="GPT + Active" + export WORKAROUND_GPTACTIVE=1 + fi + ;; + esac + ;; + esac + # + # Motherboard Models + # + case "$sys_mb_maker" in + "Intel Corporation") + case "$sys_mb_product" in + "DP965LT"|"D510MO") + dialog_workaround "$msg_gpt_active_fix" + retval=$? + f_dprintf "gpt_active_fix_prompt=[%s]" "$retval" + if [ $retval -eq $DIALOG_OK ]; then + export ZFSBOOT_PARTITION_SCHEME="GPT + Active" + export WORKAROUND_GPTACTIVE=1 + fi + ;; + esac + ;; + "Acer") + case "$sys_mb_product" in + "Veriton M6630G") + dialog_workaround "$msg_gpt_active_fix" + retval=$? + f_dprintf "gpt_active_fix_prompt=[%s]" "$retval" + if [ $retval -eq $DIALOG_OK ]; then + export ZFSBOOT_PARTITION_SCHEME="GPT + Active" + export WORKAROUND_GPTACTIVE=1 + fi + ;; + esac + ;; + esac +fi + +PMODES=" + '$msg_auto_ufs' '$msg_auto_ufs_desc' '$msg_auto_ufs_help' + '$msg_manual' '$msg_manual_desc' '$msg_manual_help' + '$msg_shell' '$msg_shell_desc' '$msg_shell_help' +" # END-QUOTE + +CURARCH=$( uname -m ) +case $CURARCH in + amd64|arm64|i386|riscv) # Booting ZFS Supported + PMODES=" + '$msg_auto_zfs' '$msg_auto_zfs_desc' '$msg_auto_zfs_help' + $PMODES + " # END-QUOTE + ;; + *) # Booting ZFS Unsupported + ;; +esac + +exec 3>&1 +PARTMODE=`echo $PMODES | xargs dialog --backtitle "FreeBSD Installer" \ + --title "Partitioning" \ + --item-help \ + --menu "How would you like to partition your disk?" \ + 0 0 0 2>&1 1>&3` || exit 1 +exec 3>&- + +case "$PARTMODE" in +"$msg_auto_zfs") # ZFS + bsdinstall zfsboot || error "ZFS setup failed" + bsdinstall mount || error "Failed to mount filesystem" + ;; +"$msg_auto_ufs") # Guided UFS + bsdinstall autopart || error "Partitioning error" + bsdinstall mount || error "Failed to mount filesystem" + ;; +"$msg_shell") # Shell + clear + 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'." + sh 2>&1 + ;; +"$msg_manual") # Manual + if f_isset debugFile; then + # Give partedit the path to our logfile so it can append + BSDINSTALL_LOG="${debugFile#+}" bsdinstall partedit || error "Partitioning error" + else + bsdinstall partedit || error "Partitioning error" + fi + bsdinstall mount || error "Failed to mount filesystem" + ;; +*) + error "Unknown partitioning mode" + ;; +esac + +if [ -n "$FETCH_DISTRIBUTIONS" ]; then + exec 3>&1 + export BSDINSTALL_DISTDIR=$(`dirname $0`/fetchmissingdists 2>&1 1>&3) + FETCH_RESULT=$? + exec 3>&- + + [ $FETCH_RESULT -ne 0 ] && error "Could not fetch remote distributions" +fi +bsdinstall checksum || error "Distribution checksum failed" +bsdinstall distextract || error "Distribution extract failed" + +# Set up boot loader +bsdinstall bootconfig || error "Failed to configure bootloader" + +bsdinstall rootpass || error "Could not set root password" + +trap true SIGINT # This section is optional +if [ "$NETCONFIG_DONE" != yes ]; then + bsdinstall netconfig # Don't check for errors -- the user may cancel +fi +bsdinstall time +bsdinstall services +bsdinstall hardening + +dialog --backtitle "FreeBSD Installer" --title "Add User Accounts" --yesno \ + "Would you like to add users to the installed system now?" 0 0 && \ + bsdinstall adduser + +finalconfig() { + exec 3>&1 + REVISIT=$(dialog --backtitle "FreeBSD Installer" \ + --title "Final Configuration" --no-cancel --menu \ + "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 \ + "Exit" "Apply configuration and exit installer" \ + "Add User" "Add a user to the system" \ + "Root Password" "Change root password" \ + "Hostname" "Set system hostname" \ + "Network" "Networking configuration" \ + "Services" "Set daemons to run on startup" \ + "System Hardening" "Set security options" \ + "Time Zone" "Set system timezone" \ + "Handbook" "Install FreeBSD Handbook (requires network)" 2>&1 1>&3) + exec 3>&- + + case "$REVISIT" in + "Add User") + bsdinstall adduser + finalconfig + ;; + "Root Password") + bsdinstall rootpass + finalconfig + ;; + "Hostname") + bsdinstall hostname + finalconfig + ;; + "Network") + bsdinstall netconfig + finalconfig + ;; + "Services") + bsdinstall services + finalconfig + ;; + "System Hardening") + bsdinstall hardening + finalconfig + ;; + "Time Zone") + bsdinstall time + finalconfig + ;; + "Handbook") + bsdinstall docsinstall + finalconfig + ;; + esac +} + +# Allow user to change his mind +finalconfig + +trap error SIGINT # SIGINT is bad again +bsdinstall config || error "Failed to save config" + +if [ ! -z "$BSDINSTALL_FETCHDEST" ]; then + rm -rf "$BSDINSTALL_FETCHDEST" +fi + +dialog --backtitle "FreeBSD Installer" --title "Manual Configuration" \ + --default-button no --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 +if [ $? -eq 0 ]; then + clear + echo This shell is operating in a chroot in the new system. \ + When finished making configuration changes, type \"exit\". + chroot "$BSDINSTALL_CHROOT" /bin/sh 2>&1 +fi + +bsdinstall entropy +bsdinstall umount + +f_dprintf "Installation Completed at %s" "$( date )" + +################################################################################ +# END +################################################################################ |