1#!/bin/sh 2#- 3# Copyright (c) 2013 Nathan Whitehorn 4# Copyright (c) 2013-2015 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# 29############################################################ INCLUDES 30 31BSDCFG_SHARE="/usr/share/bsdconfig" 32. $BSDCFG_SHARE/common.subr || exit 1 33f_dprintf "%s: loading includes..." "$0" 34f_include $BSDCFG_SHARE/dialog.subr 35f_include $BSDCFG_SHARE/variable.subr 36 37############################################################ CONFIGURATION 38 39# VARIABLES: 40# PARTITIONS 41# DISTRIBUTIONS 42# BSDINSTALL_DISTDIR 43 44# 45# Default name of the ZFS boot-pool 46# 47: ${ZFSBOOT_POOL_NAME:=zroot} 48 49############################################################ GLOBALS 50 51: ${TMPDIR:="/tmp"} 52 53# 54# Strings that should be moved to an i18n file and loaded with f_include_lang() 55# 56msg_installation_error="Installation Error!" 57 58############################################################ FUNCTIONS 59 60error() 61{ 62 local file 63 f_getvar "$VAR_DEBUG_FILE#+" file 64 if [ "$file" ]; then 65 f_dialog_title "$msg_installation_error" 66 f_dialog_textbox "$file" 67 # No need to restore title, pining for the fjords 68 fi 69 70 [ -f "$PATH_FSTAB" ] || exit 71 if [ "$ZFSBOOT_DISKS" ]; then 72 zpool export $ZFSBOOT_POOL_NAME 73 else 74 bsdinstall umount 75 fi 76 77 exit 1 78} 79 80############################################################ MAIN 81 82set -e 83trap error EXIT 84 85SCRIPT="$1" 86shift 87 88f_dprintf "Began Installation at %s" "$( date )" 89rm -rf $BSDINSTALL_TMPETC 90mkdir $BSDINSTALL_TMPETC 91rm -f $TMPDIR/bsdinstall-installscript-setup 92 93# split script into preamble and setup script at first shebang 94awk 'BEGIN {pathb=ARGV[2]; ARGV[2]=""} /^#!/{b=1} { 95 if (b) print >pathb; else print}' \ 96 "$SCRIPT" $TMPDIR/bsdinstall-installscript-setup \ 97 >$TMPDIR/bsdinstall-installscript-preamble 98 99. $TMPDIR/bsdinstall-installscript-preamble 100: ${DISTRIBUTIONS="kernel.txz base.txz"}; export DISTRIBUTIONS 101export BSDINSTALL_DISTDIR 102 103# Re-initialize a new log if preamble changed BSDINSTALL_LOG 104if [ "$BSDINSTALL_LOG" != "${debugFile#+}" ]; then 105 export debugFile="$BSDINSTALL_LOG" 106 f_quietly f_debug_init 107 # NB: Being scripted, let debug go to terminal for invalid debugFile 108 f_dprintf "Began Installation at %s" "$( date )" 109fi 110 111# Make partitions 112rm -f $PATH_FSTAB 113touch $PATH_FSTAB 114if [ "$ZFSBOOT_DISKS" ]; then 115 bsdinstall zfsboot 116else 117 bsdinstall scriptedpart "$PARTITIONS" 118fi 119bsdinstall mount 120 121# Fetch missing distribution files, if any 122exec 5>&1 123export BSDINSTALL_DISTDIR=$(`dirname $0`/fetchmissingdists 2>&1 1>&5) 124FETCH_RESULT=$? 125exec 5>&- 126 127[ $FETCH_RESULT -ne 0 ] && error "Could not fetch remote distributions" 128 129# Unpack distributions 130bsdinstall checksum 131if [ -t 0 ]; then 132 # If install is a tty, use distextract as normal 133 bsdinstall distextract 134else 135 # Otherwise, we need to use tar (see https://reviews.freebsd.org/D10736) 136 for set in $DISTRIBUTIONS; do 137 f_dprintf "Extracting $BSDINSTALL_DISTDIR/$set" 138 # XXX: The below fails if any mountpoints are FAT, due to 139 # inability to set ctime/mtime on the root of FAT partitions, 140 # which is needed to support e.g. EFI system partitions. tar has 141 # no option to ignore this (distextract ignores them internally 142 # through a hack), and returns 1 on any warning or error, 143 # effectively turning all warnings into fatal errors. 144 # 145 # Work around this in an extremely lame way for the specific 146 # case of EFI system partitions only. This *ONLY WORKS* if 147 # /boot/efi is empty and does not handle analagous problems on 148 # other systems (ARM, PPC64). 149 tar -xf "$BSDINSTALL_DISTDIR/$set" -C $BSDINSTALL_CHROOT --exclude boot/efi 150 mkdir -p $BSDINSTALL_CHROOT/boot/efi 151 done 152fi 153 154# Configure bootloader if needed 155bsdinstall bootconfig 156 157# Finalize install 158bsdinstall config 159 160# Make sure networking is functional, if we can arrange that 161if [ ! -f $BSDINSTALL_CHROOT/etc/resolv.conf -a -f /etc/resolv.conf ]; then 162 cp /etc/resolv.conf $BSDINSTALL_CHROOT/etc/resolv.conf 163fi 164 165# Run post-install script 166if [ -f $TMPDIR/bsdinstall-installscript-setup ]; then 167 cp $TMPDIR/bsdinstall-installscript-setup \ 168 $BSDINSTALL_CHROOT/tmp/installscript 169 chmod a+x $BSDINSTALL_CHROOT/tmp/installscript 170 chroot $BSDINSTALL_CHROOT /tmp/installscript $@ 2>&1 171 rm $BSDINSTALL_CHROOT/tmp/installscript 172fi 173 174bsdinstall entropy 175bsdinstall umount 176if [ "$ZFSBOOT_DISKS" ]; then 177 zpool export $ZFSBOOT_POOL_NAME 178fi 179 180f_dprintf "Installation Completed at %s" "$( date )" 181 182trap - EXIT 183exit $SUCCESS 184 185################################################################################ 186# END 187################################################################################ 188