summaryrefslogtreecommitdiffstats
path: root/usr/sbin/pc-sysinstall/backend
diff options
context:
space:
mode:
Diffstat (limited to 'usr/sbin/pc-sysinstall/backend')
-rw-r--r--usr/sbin/pc-sysinstall/backend/Makefile15
-rw-r--r--usr/sbin/pc-sysinstall/backend/functions-bsdlabel.sh641
-rw-r--r--usr/sbin/pc-sysinstall/backend/functions-cleanup.sh420
-rw-r--r--usr/sbin/pc-sysinstall/backend/functions-disk.sh672
-rw-r--r--usr/sbin/pc-sysinstall/backend/functions-extractimage.sh337
-rw-r--r--usr/sbin/pc-sysinstall/backend/functions-ftp.sh374
-rw-r--r--usr/sbin/pc-sysinstall/backend/functions-installcomponents.sh166
-rw-r--r--usr/sbin/pc-sysinstall/backend/functions-localize.sh474
-rw-r--r--usr/sbin/pc-sysinstall/backend/functions-mountdisk.sh190
-rw-r--r--usr/sbin/pc-sysinstall/backend/functions-mountoptical.sh153
-rw-r--r--usr/sbin/pc-sysinstall/backend/functions-networking.sh356
-rw-r--r--usr/sbin/pc-sysinstall/backend/functions-newfs.sh182
-rw-r--r--usr/sbin/pc-sysinstall/backend/functions-packages.sh148
-rw-r--r--usr/sbin/pc-sysinstall/backend/functions-parse.sh231
-rw-r--r--usr/sbin/pc-sysinstall/backend/functions-runcommands.sh102
-rw-r--r--usr/sbin/pc-sysinstall/backend/functions-unmount.sh206
-rw-r--r--usr/sbin/pc-sysinstall/backend/functions-upgrade.sh247
-rw-r--r--usr/sbin/pc-sysinstall/backend/functions-users.sh175
-rw-r--r--usr/sbin/pc-sysinstall/backend/functions.sh284
-rw-r--r--usr/sbin/pc-sysinstall/backend/parseconfig.sh167
-rw-r--r--usr/sbin/pc-sysinstall/backend/startautoinstall.sh136
21 files changed, 5676 insertions, 0 deletions
diff --git a/usr/sbin/pc-sysinstall/backend/Makefile b/usr/sbin/pc-sysinstall/backend/Makefile
new file mode 100644
index 0000000..b4c517b
--- /dev/null
+++ b/usr/sbin/pc-sysinstall/backend/Makefile
@@ -0,0 +1,15 @@
+# $FreeBSD: src/usr.sbin/pc-sysinstall/backend/Makefile,v 1.4 2010/07/13 23:47:12 imp Exp $
+
+FILES= functions-bsdlabel.sh functions-cleanup.sh functions-disk.sh \
+ functions-extractimage.sh functions-ftp.sh functions-installcomponents.sh \
+ functions-localize.sh functions-mountdisk.sh \
+ functions-mountoptical.sh functions-networking.sh \
+ functions-newfs.sh functions-packages.sh functions-parse.sh \
+ functions-runcommands.sh functions-unmount.sh \
+ functions-upgrade.sh functions-users.sh \
+ functions.sh parseconfig.sh startautoinstall.sh
+FILESMODE= ${BINMODE}
+FILESDIR=${SHAREDIR}/pc-sysinstall/backend
+NO_OBJ=
+
+.include <bsd.prog.mk>
diff --git a/usr/sbin/pc-sysinstall/backend/functions-bsdlabel.sh b/usr/sbin/pc-sysinstall/backend/functions-bsdlabel.sh
new file mode 100644
index 0000000..c8cb4f1
--- /dev/null
+++ b/usr/sbin/pc-sysinstall/backend/functions-bsdlabel.sh
@@ -0,0 +1,641 @@
+#!/bin/sh
+#-
+# Copyright (c) 2010 iXsystems, Inc. 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: src/usr.sbin/pc-sysinstall/backend/functions-bsdlabel.sh,v 1.2 2010/06/27 16:46:11 imp Exp $
+
+# Functions related to disk operations using bsdlabel
+
+# Check if we are are provided a geli password on the nextline of the config
+check_for_enc_pass()
+{
+ CURLINE="${1}"
+
+ get_next_cfg_line "${CFGF}" "${CURLINE}"
+ echo ${VAL} | grep "^encpass=" >/dev/null 2>/dev/null
+ if [ "$?" = "0" ] ; then
+ # Found a password, return it
+ get_value_from_string "${VAL}"
+ return
+ fi
+
+ VAL="" ; export VAL
+ return
+};
+
+# On check on the disk-label line if we have any extra vars for this device
+# Only enabled for ZFS devices now, may add other xtra options in future for other FS's
+get_fs_line_xvars()
+{
+ ACTIVEDEV="${1}"
+ LINE="${2}"
+
+ echo $LINE | grep ' (' >/dev/null 2>/dev/null
+ if [ "$?" = "0" ] ; then
+
+ # See if we are looking for ZFS specific options
+ echo $LINE | grep '^ZFS' >/dev/null 2>/dev/null
+ if [ "$?" = "0" ] ; then
+ ZTYPE="NONE"
+ ZFSVARS="`echo $LINE | cut -d '(' -f 2- | cut -d ')' -f 1`"
+
+ # Check if we are doing raidz setup
+ echo $ZFSVARS | grep "^raidz:" >/dev/null 2>/dev/null
+ if [ "$?" = "0" ] ; then
+ ZTYPE="raidz"
+ ZFSVARS="`echo $ZFSVARS | sed 's|raidz: ||g' | sed 's|raidz:||g'`"
+ fi
+
+ echo $ZFSVARS | grep "^mirror:" >/dev/null 2>/dev/null
+ if [ "$?" = "0" ] ; then
+ ZTYPE="mirror"
+ ZFSVARS="`echo $ZFSVARS | sed 's|mirror: ||g' | sed 's|mirror:||g'`"
+ fi
+
+ # Return the ZFS options
+ if [ "${ZTYPE}" = "NONE" ] ; then
+ VAR="${ACTIVEDEV} ${ZFSVARS}"
+ else
+ VAR="${ZTYPE} ${ACTIVEDEV} ${ZFSVARS}"
+ fi
+ export VAR
+ return
+ fi # End of ZFS block
+
+
+ fi # End of xtra-options block
+
+ # If we got here, set VAR to empty and export
+ VAR=""
+ export VAR
+ return
+};
+
+# Init each zfs mirror disk with a boot sector so we can failover
+setup_zfs_mirror_parts() {
+
+ _nZFS=""
+ # Using mirroring, setup boot partitions on each disk
+ _mirrline="`echo ${1} | sed 's|mirror ||g'`"
+ for _zvars in $_mirrline
+ do
+ echo "Looping through _zvars: $_zvars" >>${LOGOUT}
+ echo "$_zvars" | grep "${2}" >/dev/null 2>/dev/null
+ if [ "$?" = "0" ] ; then continue ; fi
+ if [ -z "$_zvars" ] ; then continue ; fi
+
+ is_disk "$_zvars" >/dev/null 2>/dev/null
+ if [ "$?" = "0" ] ; then
+ echo "Setting up ZFS mirror disk $_zvars" >>${LOGOUT}
+ init_gpt_full_disk "$_zvars" >/dev/null 2>/dev/null
+ rc_halt "gpart bootcode -p /boot/gptzfsboot -i 1 ${_zvars}" >/dev/null 2>/dev/null
+ rc_halt "gpart add -t freebsd-zfs ${_zvars}" >/dev/null 2>/dev/null
+ _nZFS="$_nZFS ${_zvars}p2"
+ else
+ _nZFS="$_nZFS ${_zvars}"
+ fi
+ done
+ echo "mirror $2 `echo $_nZFS | tr -s ' '`"
+} ;
+
+# Function which creates a unique label name for the specified mount
+gen_glabel_name()
+{
+ MOUNT="$1"
+ TYPE="$2"
+ NUM="0"
+ MAXNUM="20"
+
+ # Check if we are doing /, and rename it
+ if [ "$MOUNT" = "/" ]
+ then
+ NAME="rootfs"
+ else
+ # If doing a swap partition, also rename it
+ if [ "${TYPE}" = "SWAP" ]
+ then
+ NAME="swap"
+ else
+ NAME="`echo $MOUNT | sed 's|/||g' | sed 's| ||g'`"
+ fi
+ fi
+
+ # Loop through and break when we find our first available label
+ while
+ Z=1
+ do
+ glabel status | grep "${NAME}${NUM}" >/dev/null 2>/dev/null
+ if [ "$?" != "0" ]
+ then
+ break
+ else
+ NUM="`expr ${NUM} + 1`"
+ fi
+
+ if [ $NUM -gt $MAXNUM ]
+ then
+ exit_err "Cannot allocate additional glabel name for $NAME"
+ break
+ fi
+ done
+
+
+ VAL="${NAME}${NUM}"
+ export VAL
+};
+
+# Function to setup / stamp a legacy MBR bsdlabel
+setup_mbr_partitions()
+{
+
+ DISKTAG="$1"
+ WRKSLICE="$2"
+ FOUNDPARTS="1"
+
+
+ # Lets setup the BSDLABEL
+ BSDLABEL="${TMPDIR}/bsdLabel-${WRKSLICE}"
+ export BSDLABEL
+ rm $BSDLABEL >/dev/null 2>/dev/null
+ echo "# /dev/${WRKSLICE}" >>$BSDLABEL
+ echo "8 partitions:" >>$BSDLABEL
+ echo "# size offset fstype bsize bps/cpg" >>$BSDLABEL
+
+ PARTLETTER="a"
+
+ # Lets read in the config file now and populate this
+ while read line
+ do
+ # Check for data on this slice
+ echo $line | grep "^${DISKTAG}-part=" >/dev/null 2>/dev/null
+ if [ "$?" = "0" ]
+ then
+ # Found a slice- entry, lets get the slice info
+ get_value_from_string "${line}"
+ STRING="$VAL"
+ FOUNDPARTS="0"
+
+ # We need to split up the string now, and pick out the variables
+ FS=`echo $STRING | tr -s '\t' ' ' | cut -d ' ' -f 1`
+ SIZE=`echo $STRING | tr -s '\t' ' ' | cut -d ' ' -f 2`
+ MNT=`echo $STRING | tr -s '\t' ' ' | cut -d ' ' -f 3`
+
+ # Check if we have a .eli extension on this FS
+ echo ${FS} | grep ".eli" >/dev/null 2>/dev/null
+ if [ "$?" = "0" ]
+ then
+ FS="`echo ${FS} | cut -d '.' -f 1`"
+ ENC="ON"
+ check_for_enc_pass "${line}"
+ if [ "${VAL}" != "" ] ; then
+ # We have a user supplied password, save it for later
+ ENCPASS="${VAL}"
+ fi
+ else
+ ENC="OFF"
+ fi
+
+ # Check if the user tried to setup / as an encrypted partition
+ check_for_mount "${MNT}" "/"
+ if [ "${?}" = "0" -a "${ENC}" = "ON" ]
+ then
+ USINGENCROOT="0" ; export USINGENCROOT
+ fi
+
+ # Now check that these values are sane
+ case $FS in
+ UFS|UFS+S|UFS+J|ZFS|SWAP) ;;
+ *) exit_err "ERROR: Invalid file system specified on $line" ;;
+ esac
+
+ # Check that we have a valid size number
+ expr $SIZE + 1 >/dev/null 2>/dev/null
+ if [ "$?" != "0" ]; then
+ exit_err "ERROR: The size specified on $line is invalid"
+ fi
+
+ # Check that the mount-point starts with /
+ echo "$MNT" | grep -e "^/" -e "^none" >/dev/null 2>/dev/null
+ if [ "$?" != "0" ]; then
+ exit_err "ERROR: The mount-point specified on $line is invalid"
+ fi
+
+ if [ "$SIZE" = "0" ]
+ then
+ SOUT="*"
+ else
+ SOUT="${SIZE}M"
+ fi
+
+ # OK, we passed all tests, now lets put these values into a config
+ # If the part
+ if [ "${PARTLETTER}" = "a" ]
+ then
+ if [ "$FS" = "SWAP" ]
+ then
+ echo "a: ${SOUT} * swap 0 0" >>${BSDLABEL}
+ else
+ echo "a: ${SOUT} 0 4.2BSD 0 0" >>${BSDLABEL}
+ fi
+
+ # Check if we found a valid root partition
+ check_for_mount "${MNT}" "/"
+ if [ "$?" = "0" ] ; then
+ FOUNDROOT="0" ; export FOUNDROOT
+ fi
+
+ # Check if we have a "/boot" instead
+ check_for_mount "${MNT}" "/boot"
+ if [ "${?}" = "0" ] ; then
+ USINGBOOTPART="0" ; export USINGBOOTPART
+ if [ "${FS}" != "UFS" -a "${FS}" != "UFS+S" -a "${FS}" != "UFS+J" ]
+ then
+ exit_err "/boot partition must be formatted with UFS"
+ fi
+ fi
+
+ else
+ # Done with the a: partitions
+
+ # Check if we found a valid root partition not on a:
+ check_for_mount "${MNT}" "/"
+ if [ "${?}" = "0" ] ; then
+ FOUNDROOT="1" ; export FOUNDROOT
+ fi
+
+ # Check if we have a /boot partition, and fail since its not first
+ check_for_mount "${MNT}" "/boot"
+ if [ "${?}" = "0" ] ; then
+ exit_err "/boot partition must be first partition"
+ fi
+
+
+ if [ "$FS" = "SWAP" ]
+ then
+ echo "${PARTLETTER}: ${SOUT} * swap" >>${BSDLABEL}
+ else
+ echo "${PARTLETTER}: ${SOUT} * 4.2BSD" >>${BSDLABEL}
+ fi
+ fi
+
+ # Generate a unique label name for this mount
+ gen_glabel_name "${MNT}" "${FS}"
+ PLABEL="${VAL}"
+
+ # Get any extra options for this fs / line
+ get_fs_line_xvars "${WRKSLICE}${PARTLETTER}" "${STRING}"
+ XTRAOPTS="${VAR}"
+
+ # Check if using zfs mirror
+ echo ${XTRAOPTS} | grep "mirror" >/dev/null 2>/dev/null
+ if [ "$?" = "0" ] ; then
+ XTRAOPTS=$(setup_zfs_mirror_parts "$XTRAOPTS" "${WRKSLICE}${PARTLETTER}")
+ fi
+
+ # Save this data to our partition config dir
+ echo "${FS}:${MNT}:${ENC}:${PLABEL}:MBR:${XTRAOPTS}" >${PARTDIR}/${WRKSLICE}${PARTLETTER}
+
+ # If we have a enc password, save it as well
+ if [ ! -z "${ENCPASS}" ] ; then
+ echo "${ENCPASS}" >${PARTDIR}-enc/${WRKSLICE}${PARTLETTER}-encpass
+ fi
+
+ # This partition letter is used, get the next one
+ case ${PARTLETTER} in
+ a) PARTLETTER="b" ;;
+ b) # When we hit b, add the special c: setup for bsdlabel
+ echo "c: * * unused" >>${BSDLABEL}
+ PARTLETTER="d" ;;
+ d) PARTLETTER="e" ;;
+ e) PARTLETTER="f" ;;
+ f) PARTLETTER="g" ;;
+ g) PARTLETTER="h" ;;
+ h) PARTLETTER="ERR" ;;
+ *) exit_err "ERROR: bsdlabel only supports up to letter h for partitions." ;;
+ esac
+
+ fi # End of subsection locating a slice in config
+
+ echo $line | grep "^commitDiskLabel" >/dev/null 2>/dev/null
+ if [ "$?" = "0" -a "${FOUNDPARTS}" = "0" ]
+ then
+ # Found our flag to commit this label setup, check that we found at least 1 partition and do it
+ if [ "${PARTLETTER}" != "a" ]
+ then
+ # Check if we only had 1 partition, and make sure we add "c:" section to label
+ if [ "${PARTLETTER}" = "b" ]
+ then
+ echo "c: * * unused" >>${BSDLABEL}
+ fi
+
+ echo "bsdlabel -R -B /dev/${WRKSLICE} ${BSDLABEL}"
+ bsdlabel -R -B ${WRKSLICE} ${BSDLABEL}
+
+ break
+ else
+ exit_err "ERROR: commitDiskLabel was called without any partition entries for it!"
+ fi
+ fi
+ done <${CFGF}
+};
+
+# Function to setup partitions using gpt
+setup_gpt_partitions()
+{
+ DISKTAG="$1"
+ DISK="$2"
+ FOUNDPARTS="1"
+
+ # Lets read in the config file now and setup our GPT partitions
+ CURPART="2"
+ while read line
+ do
+ # Check for data on this slice
+ echo $line | grep "^${DISKTAG}-part=" >/dev/null 2>/dev/null
+ if [ "$?" = "0" ]
+ then
+ FOUNDPARTS="0"
+ # Found a slice- entry, lets get the slice info
+ get_value_from_string "${line}"
+ STRING="$VAL"
+
+ # We need to split up the string now, and pick out the variables
+ FS=`echo $STRING | tr -s '\t' ' ' | cut -d ' ' -f 1`
+ SIZE=`echo $STRING | tr -s '\t' ' ' | cut -d ' ' -f 2`
+ MNT=`echo $STRING | tr -s '\t' ' ' | cut -d ' ' -f 3`
+
+ # Check if we have a .eli extension on this FS
+ echo ${FS} | grep ".eli" >/dev/null 2>/dev/null
+ if [ "$?" = "0" ]
+ then
+ FS="`echo ${FS} | cut -d '.' -f 1`"
+ ENC="ON"
+ check_for_enc_pass "${line}"
+ if [ "${VAL}" != "" ] ; then
+ # We have a user supplied password, save it for later
+ ENCPASS="${VAL}"
+ fi
+ else
+ ENC="OFF"
+ fi
+
+ # Check if the user tried to setup / as an encrypted partition
+ check_for_mount "${MNT}" "/"
+ if [ "${?}" = "0" -a "${ENC}" = "ON" ]
+ then
+ USINGENCROOT="0" ; export USINGENCROOT
+ fi
+
+ # Now check that these values are sane
+ case $FS in
+ UFS|UFS+S|UFS+J|ZFS|SWAP) ;;
+ *) exit_err "ERROR: Invalid file system specified on $line" ;;
+ esac
+
+ # Check that we have a valid size number
+ expr $SIZE + 1 >/dev/null 2>/dev/null
+ if [ "$?" != "0" ]; then
+ exit_err "ERROR: The size specified on $line is invalid"
+ fi
+
+ # Check that the mount-point starts with /
+ echo "$MNT" | grep -e "^/" -e "^none" >/dev/null 2>/dev/null
+ if [ "$?" != "0" ]; then
+ exit_err "ERROR: The mount-point specified on $line is invalid"
+ fi
+
+ if [ "$SIZE" = "0" ]
+ then
+ SOUT=""
+ else
+ SOUT="-s ${SIZE}M"
+ fi
+
+ # Check if we found a valid root partition
+ check_for_mount "${MNT}" "/"
+ if [ "${?}" = "0" ] ; then
+ if [ "${CURPART}" = "2" ] ; then
+ FOUNDROOT="0" ; export FOUNDROOT
+ else
+ FOUNDROOT="1" ; export FOUNDROOT
+ fi
+ fi
+
+ check_for_mount "${MNT}" "/boot"
+ if [ "${?}" = "0" ] ; then
+ if [ "${CURPART}" = "2" ] ; then
+ USINGBOOTPART="0" ; export USINGBOOTPART
+ if [ "${FS}" != "UFS" -a "${FS}" != "UFS+S" -a "${FS}" != "UFS+J" ]
+ then
+ exit_err "/boot partition must be formatted with UFS"
+ fi
+ else
+ exit_err "/boot partition must be first partition"
+ fi
+ fi
+
+ # Generate a unique label name for this mount
+ gen_glabel_name "${MNT}" "${FS}"
+ PLABEL="${VAL}"
+
+ # Get any extra options for this fs / line
+ get_fs_line_xvars "${DISK}p${CURPART}" "${STRING}"
+ XTRAOPTS="${VAR}"
+
+ # Check if using zfs mirror
+ echo ${XTRAOPTS} | grep "mirror" >/dev/null 2>/dev/null
+ if [ "$?" = "0" ] ; then
+ XTRAOPTS=$(setup_zfs_mirror_parts "$XTRAOPTS" "${DISK}p${CURPART}")
+ fi
+
+ # Figure out the gpart type to use
+ case ${FS} in
+ ZFS) PARTYPE="freebsd-zfs" ;;
+ SWAP) PARTYPE="freebsd-swap" ;;
+ *) PARTYPE="freebsd-ufs" ;;
+ esac
+
+ # Create the partition
+ rc_halt "gpart add ${SOUT} -t ${PARTYPE} ${DISK}"
+
+ # Check if this is a root / boot partition, and stamp the right loader
+ for TESTMNT in `echo ${MNT} | sed 's|,| |g'`
+ do
+ if [ "${TESTMNT}" = "/" -a -z "${BOOTTYPE}" ] ; then
+ BOOTTYPE="${PARTYPE}"
+ fi
+ if [ "${TESTMNT}" = "/boot" ] ; then
+ BOOTTYPE="${PARTYPE}"
+ fi
+ done
+
+ # Save this data to our partition config dir
+ echo "${FS}:${MNT}:${ENC}:${PLABEL}:GPT:${XTRAOPTS}" >${PARTDIR}/${DISK}p${CURPART}
+
+ # Clear out any headers
+ sleep 2
+ dd if=/dev/zero of=${DISK}p${CURPART} count=2048 >/dev/null 2>/dev/null
+
+ # If we have a enc password, save it as well
+ if [ ! -z "${ENCPASS}" ] ; then
+ echo "${ENCPASS}" >${PARTDIR}-enc/${DISK}p${CURPART}-encpass
+ fi
+
+ # Increment our parts counter
+ CURPART="`expr ${CURPART} + 1`"
+
+ fi # End of subsection locating a slice in config
+
+ echo $line | grep "^commitDiskLabel" >/dev/null 2>/dev/null
+ if [ "$?" = "0" -a "${FOUNDPARTS}" = "0" ]
+ then
+
+ # If this is the boot disk, stamp the right gptboot
+ if [ ! -z "${BOOTTYPE}" ] ; then
+ case ${BOOTTYPE} in
+ freebsd-ufs) rc_halt "gpart bootcode -p /boot/gptboot -i 1 ${DISK}" ;;
+ freebsd-zfs) rc_halt "gpart bootcode -p /boot/gptzfsboot -i 1 ${DISK}" ;;
+ esac
+ fi
+
+
+ # Found our flag to commit this label setup, check that we found at least 1 partition
+ if [ "${CURPART}" = "2" ] ; then
+ exit_err "ERROR: commitDiskLabel was called without any partition entries for it!"
+ fi
+
+ break
+ fi
+ done <${CFGF}
+};
+
+# Reads through the config and sets up a BSDLabel for the given slice
+populate_disk_label()
+{
+ if [ -z "${1}" ]
+ then
+ exit_err "ERROR: populate_disk_label() called without argument!"
+ fi
+
+ # Set some vars from the given working slice
+ disk="`echo $1 | cut -d '-' -f 1`"
+ slicenum="`echo $1 | cut -d '-' -f 2`"
+ type="`echo $1 | cut -d '-' -f 3`"
+
+ # Set WRKSLICE based upon format we are using
+ if [ "$type" = "mbr" ] ; then
+ wrkslice="${disk}s${slicenum}"
+ fi
+ if [ "$type" = "gpt" ] ; then
+ wrkslice="${disk}p${slicenum}"
+ fi
+
+ if [ -e "${SLICECFGDIR}/${wrkslice}" ]
+ then
+ disktag="`cat ${SLICECFGDIR}/${wrkslice}`"
+ else
+ exit_err "ERROR: Missing SLICETAG data. This shouldn't happen - please let the developers know"
+ fi
+
+ # Using Traditional MBR for dual-booting
+ if [ "$type" = "mbr" ] ; then
+ setup_mbr_partitions "${disktag}" "${wrkslice}"
+ fi
+
+ # Using entire disk mode, use GPT for this
+ if [ "$type" = "gpt" ] ; then
+ setup_gpt_partitions "${disktag}" "${disk}"
+ fi
+
+};
+
+# Function which reads in the disk slice config, and performs it
+setup_disk_label()
+{
+ # We are ready to start setting up the label, lets read the config and do the actions
+
+ # First confirm that we have a valid WORKINGSLICES
+ if [ -z "${WORKINGSLICES}" ]; then
+ exit_err "ERROR: No slices were setup! Please report this to the maintainers"
+ fi
+
+ # Check that the slices we have did indeed get setup and gpart worked
+ for i in $WORKINGSLICES
+ do
+ disk="`echo $i | cut -d '-' -f 1`"
+ pnum="`echo $i | cut -d '-' -f 2`"
+ type="`echo $i | cut -d '-' -f 3`"
+ if [ "$type" = "mbr" -a ! -e "/dev/${disk}s${pnum}" ] ; then
+ exit_err "ERROR: The partition ${i} doesn't exist! gpart failure!"
+ fi
+ if [ "$type" = "gpt" -a ! -e "/dev/${disk}p${pnum}" ] ; then
+ exit_err "ERROR: The partition ${i} doesn't exist! gpart failure!"
+ fi
+ done
+
+ # Setup some files which we'll be referring to
+ LABELLIST="${TMPDIR}/workingLabels"
+ export LABELLIST
+ rm $LABELLIST >/dev/null 2>/dev/null
+
+ # Set our flag to determine if we've got a valid root partition in this setup
+ FOUNDROOT="-1"
+ export FOUNDROOT
+
+ # Check if we are using a /boot partition
+ USINGBOOTPART="1"
+ export USINGBOOTPART
+
+ # Set encryption on root check
+ USINGENCROOT="1" ; export USINGENCROOT
+
+ # Make the tmp directory where we'll store FS info & mount-points
+ rm -rf ${PARTDIR} >/dev/null 2>/dev/null
+ mkdir -p ${PARTDIR} >/dev/null 2>/dev/null
+ rm -rf ${PARTDIR}-enc >/dev/null 2>/dev/null
+ mkdir -p ${PARTDIR}-enc >/dev/null 2>/dev/null
+
+ for i in $WORKINGSLICES
+ do
+ populate_disk_label "${i}"
+ done
+
+ # Check if we made a root partition
+ if [ "$FOUNDROOT" = "-1" ]
+ then
+ exit_err "ERROR: No root (/) partition specified!!"
+ fi
+
+ # Check if we made a root partition
+ if [ "$FOUNDROOT" = "1" -a "${USINGBOOTPART}" != "0" ]
+ then
+ exit_err "ERROR: (/) partition isn't first partition on disk!"
+ fi
+
+ if [ "${USINGENCROOT}" = "0" -a "${USINGBOOTPART}" != "0" ]
+ then
+ exit_err "ERROR: Can't encrypt (/) with no (/boot) partition!"
+ fi
+};
+
diff --git a/usr/sbin/pc-sysinstall/backend/functions-cleanup.sh b/usr/sbin/pc-sysinstall/backend/functions-cleanup.sh
new file mode 100644
index 0000000..b45c741
--- /dev/null
+++ b/usr/sbin/pc-sysinstall/backend/functions-cleanup.sh
@@ -0,0 +1,420 @@
+#!/bin/sh
+#-
+# Copyright (c) 2010 iXsystems, Inc. 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: src/usr.sbin/pc-sysinstall/backend/functions-cleanup.sh,v 1.3 2010/07/31 19:25:51 imp Exp $
+
+# Functions which perform the final cleanup after an install
+
+# Finishes up with ZFS setup before unmounting
+zfs_cleanup_unmount()
+{
+ # Loop through our FS and see if we have any ZFS partitions to cleanup
+ for PART in `ls ${PARTDIR}`
+ do
+ PARTFS="`cat ${PARTDIR}/${PART} | cut -d ':' -f 1`"
+ PARTMNT="`cat ${PARTDIR}/${PART} | cut -d ':' -f 2`"
+ ZPOOLNAME=$(get_zpool_name "${PART}")
+
+ if [ "$PARTFS" = "ZFS" ]
+ then
+ # Check if we have multiple zfs mounts specified
+ for ZMNT in `echo ${PARTMNT} | sed 's|,| |g'`
+ do
+ if [ "${ZMNT}" = "/" ]
+ then
+ # Make sure we haven't already added the zfs boot line when
+ # Creating a dedicated "/boot" partition
+ cat ${FSMNT}/boot/loader.conf 2>/dev/null | grep "vfs.root.mountfrom=" >/dev/null 2>/dev/null
+ if [ "$?" != "0" ] ; then
+ echo "vfs.root.mountfrom=\"zfs:${ZPOOLNAME}\"" >> ${FSMNT}/boot/loader.conf
+ fi
+ FOUNDZFSROOT="${ZPOOLNAME}" ; export FOUNDZFSROOT
+ fi
+ done
+ FOUNDZFS="1"
+ fi
+ done
+
+ if [ ! -z "${FOUNDZFS}" ]
+ then
+ # Check if we need to add our ZFS flags to rc.conf, src.conf and loader.conf
+ cat ${FSMNT}/boot/loader.conf 2>/dev/null | grep 'zfs_load="YES"' >/dev/null 2>/dev/null
+ if [ "$?" != "0" ]
+ then
+ echo 'zfs_load="YES"' >>${FSMNT}/boot/loader.conf
+ fi
+ cat ${FSMNT}/etc/rc.conf 2>/dev/null | grep 'zfs_enable="YES"' >/dev/null 2>/dev/null
+ if [ "$?" != "0" ]
+ then
+ echo 'zfs_enable="YES"' >>${FSMNT}/etc/rc.conf
+ fi
+
+ sleep 2
+ # Copy over any ZFS cache data
+ cp /boot/zfs/* ${FSMNT}/boot/zfs/
+
+ # Copy the hostid so that our zfs cache works
+ cp /etc/hostid ${FSMNT}/etc/hostid
+ fi
+
+ # Loop through our FS and see if we have any ZFS partitions to cleanup
+ for PART in `ls ${PARTDIR}`
+ do
+ PARTFS="`cat ${PARTDIR}/${PART} | cut -d ':' -f 1`"
+ PARTMNT="`cat ${PARTDIR}/${PART} | cut -d ':' -f 2`"
+ PARTENC="`cat ${PARTDIR}/${PART} | cut -d ':' -f 3`"
+ ZPOOLNAME=$(get_zpool_name "${PART}")
+
+ if [ "$PARTFS" = "ZFS" ]
+ then
+ # Check if we have multiple zfs mounts specified
+ for ZMNT in `echo ${PARTMNT} | sed 's|,| |g'`
+ do
+ PARTMNTREV="${ZMNT} ${PARTMNTREV}"
+ done
+
+ for ZMNT in ${PARTMNTREV}
+ do
+ if [ "${ZMNT}" != "/" ]
+ then
+ rc_halt "zfs set mountpoint=${ZMNT} ${ZPOOLNAME}${ZMNT}"
+ rc_halt "zfs unmount ${ZPOOLNAME}${ZMNT}"
+ sleep 2
+ fi
+ done
+ fi
+ done
+
+};
+
+# Function which performs the specific setup for using a /boot partition
+setup_dedicated_boot_part()
+{
+ ROOTFS="${1}"
+ ROOTFSTYPE="${2}"
+ BOOTFS="${3}"
+ BOOTMNT="${4}"
+
+ # Set the root mount in loader.conf
+ echo "vfs.root.mountfrom=\"${ROOTFSTYPE}:${ROOTFS}\"" >> ${FSMNT}/boot/loader.conf
+ rc_halt "mkdir -p ${FSMNT}/${BOOTMNT}/boot"
+ rc_halt "mv ${FSMNT}/boot/* ${FSMNT}${BOOTMNT}/boot/"
+ rc_halt "mv ${FSMNT}${BOOTMNT}/boot ${FSMNT}/boot/"
+ rc_halt "umount /dev/${BOOTFS}"
+ rc_halt "mount /dev/${BOOTFS} ${FSMNT}${BOOTMNT}"
+ rc_halt "rmdir ${FSMNT}/boot"
+
+ # Strip the '/' from BOOTMNT before making symlink
+ BOOTMNTNS="`echo ${BOOTMNT} | sed 's|/||g'`"
+ rc_halt "chroot ${FSMNT} ln -s ${BOOTMNTNS}/boot /boot"
+
+};
+
+# Function which creates the /etc/fstab for the installed system
+setup_fstab()
+{
+ FSTAB="${FSMNT}/etc/fstab"
+ rm ${FSTAB} >/dev/null 2>/dev/null
+
+ # Create the header
+ echo "# Device Mountpoint FStype Options Dump Pass" >> ${FSTAB}
+
+ # Loop through the partitions, and start creating /etc/fstab
+ for PART in `ls ${PARTDIR}`
+ do
+ PARTFS="`cat ${PARTDIR}/${PART} | cut -d ':' -f 1`"
+ PARTMNT="`cat ${PARTDIR}/${PART} | cut -d ':' -f 2`"
+ PARTENC="`cat ${PARTDIR}/${PART} | cut -d ':' -f 3`"
+ PARTLABEL="`cat ${PARTDIR}/${PART} | cut -d ':' -f 4`"
+
+ DRIVE="`echo ${PART} | rev | cut -b 4- | rev`"
+ # Check if this device is being mirrored
+ if [ -e "${MIRRORCFGDIR}/${DRIVE}" ]
+ then
+ # This device is apart of a gmirror, lets reset PART to correct value
+ MDRIVE="mirror/`cat ${MIRRORCFGDIR}/${DRIVE} | cut -d ':' -f 3`"
+ TMP="`echo ${PART} | rev | cut -b -3 | rev`"
+ PART="${MDRIVE}${TMP}"
+ PARTLABEL=""
+ fi
+
+ # Unset EXT
+ EXT=""
+
+ # Set mount options for file-systems
+ case $PARTFS in
+ UFS+J) MNTOPTS="rw,noatime,async" ;;
+ SWAP) MNTOPTS="sw" ;;
+ *) MNTOPTS="rw,noatime" ;;
+ esac
+
+
+ # Figure out if we are using a glabel, or the raw name for this entry
+ if [ ! -z "${PARTLABEL}" ]
+ then
+ DEVICE="label/${PARTLABEL}"
+ else
+ # Check if using encryption
+ if [ "${PARTENC}" = "ON" ] ; then
+ EXT=".eli"
+ fi
+
+ if [ "${PARTFS}" = "UFS+J" ] ; then
+ EXT="${EXT}.journal"
+ fi
+ DEVICE="${PART}${EXT}"
+ fi
+
+
+ # Set our ROOTFSTYPE for loader.conf if necessary
+ check_for_mount "${PARTMNT}" "/"
+ if [ "$?" = "0" ] ; then
+ if [ "${PARTFS}" = "ZFS" ] ; then
+ ROOTFSTYPE="zfs"
+ XPOOLNAME=$(get_zpool_name "${PART}")
+ ROOTFS="${ZPOOLNAME}"
+ else
+ ROOTFS="${DEVICE}"
+ ROOTFSTYPE="ufs"
+ fi
+ fi
+
+ # Only create non-zfs partitions
+ if [ "${PARTFS}" != "ZFS" ]
+ then
+
+ # Make sure geom_journal is loaded
+ if [ "${PARTFS}" = "UFS+J" ] ; then
+ setup_gjournal
+ fi
+
+ # Save the BOOTFS for call at the end
+ if [ "${PARTMNT}" = "/boot" ] ; then
+ BOOTFS="${PART}${EXT}"
+ BOOTMNT="${BOOT_PART_MOUNT}"
+ PARTMNT="${BOOTMNT}"
+ fi
+
+ # Echo out the fstab entry now
+ if [ "${PARTFS}" = "SWAP" ]
+ then
+ echo "/dev/${DEVICE} none swap ${MNTOPTS} 0 0" >> ${FSTAB}
+ else
+ echo "/dev/${DEVICE} ${PARTMNT} ufs ${MNTOPTS} 1 1" >> ${FSTAB}
+ fi
+
+ fi # End of ZFS Check
+ done
+
+ # Setup some specific PC-BSD fstab options
+ if [ "$INSTALLTYPE" != "FreeBSD" ]
+ then
+ echo "procfs /proc procfs rw 0 0" >> ${FSTAB}
+ echo "linprocfs /compat/linux/proc linprocfs rw 0 0" >> ${FSTAB}
+ echo "tmpfs /tmp tmpfs rw,mode=1777 0 0" >> ${FSTAB}
+ fi
+
+ # If we have a dedicated /boot, run the post-install setup of it now
+ if [ ! -z "${BOOTMNT}" ] ; then
+ setup_dedicated_boot_part "${ROOTFS}" "${ROOTFSTYPE}" "${BOOTFS}" "${BOOTMNT}"
+ fi
+
+};
+
+# Setup our disk mirroring with gmirror
+setup_gmirror()
+{
+ NUM="0"
+
+ cd ${MIRRORCFGDIR}
+ for DISK in `ls *`
+ do
+ MIRRORDISK="`cat ${DISK} | cut -d ':' -f 1`"
+ MIRRORBAL="`cat ${DISK} | cut -d ':' -f 2`"
+
+ # Create this mirror device
+ gmirror label -vb $MIRRORBAL gm${NUM} /dev/${DISK}
+
+ sleep 3
+
+ # Save the gm<num> device in our config
+ echo "${MIRRORDISK}:${MIRRORBAL}:gm${NUM}" > ${DISK}
+
+ sleep 3
+
+ NUM="`expr ${NUM} + 1`"
+ done
+
+
+ cat ${FSMNT}/boot/loader.conf 2>/dev/null | grep 'geom_mirror_load="YES"' >/dev/null 2>/dev/null
+ if [ "$?" != "0" ]
+ then
+ echo 'geom_mirror_load="YES"' >>${FSMNT}/boot/loader.conf
+ fi
+
+};
+
+# Function which saves geli keys and sets up loading of them at boot
+setup_geli_loading()
+{
+
+ # Make our keys dir
+ mkdir -p ${FSMNT}/boot/keys >/dev/null 2>/dev/null
+
+ cd ${GELIKEYDIR}
+ for KEYFILE in `ls *`
+ do
+ # Figure out the partition name based on keyfile name removing .key
+ PART="`echo ${KEYFILE} | cut -d '.' -f 1`"
+
+ # Add the entries to loader.conf to start this geli provider at boot
+ echo "geli_${PART}_keyfile0_load=\"YES\"" >> ${FSMNT}/boot/loader.conf
+ echo "geli_${PART}_keyfile0_type=\"${PART}:geli_keyfile0\"" >> ${FSMNT}/boot/loader.conf
+ echo "geli_${PART}_keyfile0_name=\"/boot/keys/${KEYFILE}\"" >> ${FSMNT}/boot/loader.conf
+
+ # If we have a passphrase, set it up now
+ if [ -e "${PARTDIR}-enc/${PART}-encpass" ] ; then
+ cat ${PARTDIR}-enc/${PART}-encpass | geli setkey -S -n 0 -p -k ${KEYFILE} -K ${KEYFILE} ${PART}
+ geli configure -b ${PART}
+ fi
+
+ # Copy the key to the disk
+ cp ${KEYFILE} ${FSMNT}/boot/keys/${KEYFILE}
+ done
+
+ # Make sure we have geom_eli set to load at boot
+ cat ${FSMNT}/boot/loader.conf 2>/dev/null | grep 'geom_eli_load="YES"' >/dev/null 2>/dev/null
+ if [ "$?" != "0" ]
+ then
+ echo 'geom_eli_load="YES"' >>${FSMNT}/boot/loader.conf
+ fi
+
+};
+
+
+# Function to generate a random hostname if none was specified
+gen_hostname()
+{
+ RAND="`jot -r 1 1 9000`"
+
+ if [ "$INSTALLTYPE" = "FreeBSD" ]
+ then
+ VAL="freebsd-${RAND}"
+ else
+ VAL="pcbsd-${RAND}"
+ fi
+
+ export VAL
+
+};
+
+# Function which sets up the hostname for the system
+setup_hostname()
+{
+
+ get_value_from_cfg hostname
+ HOSTNAME="${VAL}"
+
+ # If we don't have a hostname, make one up
+ if [ -z "${HOSTNAME}" ]
+ then
+ gen_hostname
+ HOSTNAME="${VAL}"
+ fi
+
+ # Clean up any saved hostname
+ cat ${FSMNT}/etc/rc.conf | grep -v "hostname=" >${FSMNT}/etc/rc.conf.new
+ mv ${FSMNT}/etc/rc.conf.new ${FSMNT}/etc/rc.conf
+
+ # Set the hostname now
+ echo_log "Setting hostname: ${HOSTNAME}"
+ echo "hostname=\"${HOSTNAME}\"" >> ${FSMNT}/etc/rc.conf
+ sed -i -e "s|my.domain|${HOSTNAME} ${HOSTNAME}|g" ${FSMNT}/etc/hosts
+
+};
+
+
+# Check and make sure geom_journal is enabled on the system
+setup_gjournal()
+{
+
+ # Make sure we have geom_journal set to load at boot
+ cat ${FSMNT}/boot/loader.conf 2>/dev/null | grep 'geom_journal_load="YES"' >/dev/null 2>/dev/null
+ if [ "$?" != "0" ]
+ then
+ echo 'geom_journal_load="YES"' >>${FSMNT}/boot/loader.conf
+ fi
+
+};
+
+# Function which sets the root password from the install config
+set_root_pw()
+{
+ get_value_from_cfg_with_spaces rootPass
+ PW="${VAL}"
+
+ # If we don't have a root pass, return
+ if [ -z "${PW}" ]
+ then
+ return 0
+ fi
+
+ echo_log "Setting root password"
+ echo "${PW}" > ${FSMNT}/.rootpw
+ run_chroot_cmd "cat /.rootpw | pw usermod root -h 0"
+ rc_halt "rm ${FSMNT}/.rootpw"
+
+};
+
+
+run_final_cleanup()
+{
+
+ # Check if we need to run any gmirror setup
+ ls ${MIRRORCFGDIR}/* >/dev/null 2>/dev/null
+ if [ "$?" = "0" ]
+ then
+ # Lets setup gmirror now
+ setup_gmirror
+ fi
+
+ # Check if we need to save any geli keys
+ ls ${GELIKEYDIR}/* >/dev/null 2>/dev/null
+ if [ "$?" = "0" ]
+ then
+ # Lets setup geli loading
+ setup_geli_loading
+ fi
+
+ # Set a hostname on the install system
+ setup_hostname
+
+ # Set the root_pw if it is specified
+ set_root_pw
+
+ # Generate the fstab for the installed system
+ setup_fstab
+
+};
diff --git a/usr/sbin/pc-sysinstall/backend/functions-disk.sh b/usr/sbin/pc-sysinstall/backend/functions-disk.sh
new file mode 100644
index 0000000..3ab86dd
--- /dev/null
+++ b/usr/sbin/pc-sysinstall/backend/functions-disk.sh
@@ -0,0 +1,672 @@
+#!/bin/sh
+#-
+# Copyright (c) 2010 iXsystems, Inc. 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: src/usr.sbin/pc-sysinstall/backend/functions-disk.sh,v 1.2 2010/06/27 16:46:11 imp Exp $
+
+# Functions related to disk operations using gpart
+
+# See if device is a full disk or partition/slice
+is_disk() {
+ for _dsk in `sysctl -n kern.disks`
+ do
+ if [ "$_dsk" = "${1}" ] ; then return 0 ; fi
+ done
+
+ return 1
+}
+
+# Get a MBR partitions sysid
+get_partition_sysid_mbr()
+{
+ INPART="0"
+ DISK="$1"
+ PARTNUM=`echo ${2} | sed "s|${DISK}s||g"`
+ fdisk ${DISK} >${TMPDIR}/disk-${DISK} 2>/dev/null
+ while read i
+ do
+ echo "$i" | grep "The data for partition" >/dev/null 2>/dev/null
+ if [ "$?" = "0" ] ; then
+ INPART="0"
+ PART="`echo ${i} | cut -d ' ' -f 5`"
+ if [ "$PART" = "$PARTNUM" ] ; then
+ INPART="1"
+ fi
+ fi
+
+ # In the partition section
+ if [ "$INPART" = "1" ] ; then
+ echo "$i" | grep "^sysid" >/dev/null 2>/dev/null
+ if [ "$?" = "0" ] ; then
+ SYSID="`echo ${i} | tr -s '\t' ' ' | cut -d ' ' -f 2`"
+ break
+ fi
+
+ fi
+
+ done < ${TMPDIR}/disk-${DISK}
+ rm ${TMPDIR}/disk-${DISK}
+
+ VAL="${SYSID}"
+ export VAL
+};
+
+# Get the partitions MBR label
+get_partition_label_mbr()
+{
+ INPART="0"
+ DISK="$1"
+ PARTNUM=`echo ${2} | sed "s|${DISK}s||g"`
+ fdisk ${DISK} >${TMPDIR}/disk-${DISK} 2>/dev/null
+ while read i
+ do
+ echo "$i" | grep "The data for partition" >/dev/null 2>/dev/null
+ if [ "$?" = "0" ] ; then
+ INPART="0"
+ PART="`echo ${i} | cut -d ' ' -f 5`"
+ if [ "$PART" = "$PARTNUM" ] ; then
+ INPART="1"
+ fi
+ fi
+
+ # In the partition section
+ if [ "$INPART" = "1" ] ; then
+ echo "$i" | grep "^sysid" >/dev/null 2>/dev/null
+ if [ "$?" = "0" ] ; then
+ LABEL="`echo ${i} | tr -s '\t' ' ' | cut -d ',' -f 2-10`"
+ break
+ fi
+
+ fi
+
+ done < ${TMPDIR}/disk-${DISK}
+ rm ${TMPDIR}/disk-${DISK}
+
+ VAL="${LABEL}"
+ export VAL
+};
+
+# Get a GPT partitions label
+get_partition_label_gpt()
+{
+ DISK="${1}"
+ PARTNUM=`echo ${2} | sed "s|${DISK}p||g"`
+
+ gpart show ${DISK} >${TMPDIR}/disk-${DISK}
+ while read i
+ do
+ SLICE="`echo ${i} | grep -v ${DISK} | grep -v ' free ' |tr -s '\t' ' ' | cut -d ' ' -f 3`"
+ if [ "${SLICE}" = "${PARTNUM}" ] ; then
+ LABEL="`echo ${i} | grep -v ${DISK} | grep -v ' free ' |tr -s '\t' ' ' | cut -d ' ' -f 4`"
+ break
+ fi
+ done <${TMPDIR}/disk-${DISK}
+ rm ${TMPDIR}/disk-${DISK}
+
+ VAL="${LABEL}"
+ export VAL
+};
+
+# Get a partitions startblock
+get_partition_startblock()
+{
+ DISK="${1}"
+ PARTNUM=`echo ${2} | sed "s|${DISK}p||g" | sed "s|${DISK}s||g"`
+
+ gpart show ${DISK} >${TMPDIR}/disk-${DISK}
+ while read i
+ do
+ SLICE="`echo ${i} | grep -v ${DISK} | grep -v ' free ' |tr -s '\t' ' ' | cut -d ' ' -f 3`"
+ if [ "$SLICE" = "${PARTNUM}" ] ; then
+ SB="`echo ${i} | grep -v ${DISK} | grep -v ' free ' |tr -s '\t' ' ' | cut -d ' ' -f 1`"
+ break
+ fi
+ done <${TMPDIR}/disk-${DISK}
+ rm ${TMPDIR}/disk-${DISK}
+
+ VAL="${SB}"
+ export VAL
+};
+
+# Get a partitions blocksize
+get_partition_blocksize()
+{
+ DISK="${1}"
+ PARTNUM=`echo ${2} | sed "s|${DISK}p||g" | sed "s|${DISK}s||g"`
+
+ gpart show ${DISK} >${TMPDIR}/disk-${DISK}
+ while read i
+ do
+ SLICE="`echo ${i} | grep -v ${DISK} | grep -v ' free ' |tr -s '\t' ' ' | cut -d ' ' -f 3`"
+ if [ "$SLICE" = "${PARTNUM}" ] ; then
+ BS="`echo ${i} | grep -v ${DISK} | grep -v ' free ' |tr -s '\t' ' ' | cut -d ' ' -f 2`"
+ break
+ fi
+ done <${TMPDIR}/disk-${DISK}
+ rm ${TMPDIR}/disk-${DISK}
+
+ VAL="${BS}"
+ export VAL
+};
+
+# Function which returns the partitions on a target disk
+get_disk_partitions()
+{
+ gpart show ${1} >/dev/null 2>/dev/null
+ if [ "$?" != "0" ] ; then
+ VAL="" ; export VAL
+ return
+ fi
+
+ gpart show ${1} | grep "MBR" >/dev/null 2>/dev/null
+ if [ "$?" = "0" ] ; then
+ type="MBR"
+ else
+ type="GPT"
+ fi
+
+ SLICES="`gpart show ${1} | grep -v ${1} | grep -v ' free ' |tr -s '\t' ' ' | cut -d ' ' -f 4 | sed '/^$/d'`"
+ for i in ${SLICES}
+ do
+ case $type in
+ MBR) name="${1}s${i}" ;;
+ GPT) name="${1}p${i}";;
+ *) name="${1}s${i}";;
+ esac
+ if [ -z "${RSLICES}" ]
+ then
+ RSLICES="${name}"
+ else
+ RSLICES="${RSLICES} ${name}"
+ fi
+ done
+
+ VAL="${RSLICES}" ; export VAL
+};
+
+# Function which returns a target disks cylinders
+get_disk_cyl()
+{
+ cyl=`diskinfo -v ${1} | grep "# Cylinders" | tr -s ' ' | cut -f 2`
+ VAL="${cyl}" ; export VAL
+};
+
+# Function which returns a target disks sectors
+get_disk_sectors()
+{
+ sec=`diskinfo -v ${1} | grep "# Sectors" | tr -s ' ' | cut -f 2`
+ VAL="${sec}" ; export VAL
+};
+
+# Function which returns a target disks heads
+get_disk_heads()
+{
+ head=`diskinfo -v ${1} | grep "# Heads" | tr -s ' ' | cut -f 2`
+ VAL="${head}" ; export VAL
+};
+
+# Function which exports all zpools, making them safe to overwrite potentially
+export_all_zpools() {
+ # Export any zpools
+ for i in `zpool list -H -o name`
+ do
+ zpool export -f ${i}
+ done
+};
+
+# Function to delete all gparts before starting an install
+delete_all_gpart()
+{
+ echo_log "Deleting all gparts"
+ DISK="$1"
+
+ # Check for any swaps to stop
+ for i in `gpart show ${DISK} 2>/dev/null | grep 'freebsd-swap' | tr -s ' ' | cut -d ' ' -f 4`
+ do
+ swapoff /dev/${DISK}s${i}b >/dev/null 2>/dev/null
+ swapoff /dev/${DISK}p${i} >/dev/null 2>/dev/null
+ done
+
+ # Delete the gparts now
+ for i in `gpart show ${DISK} 2>/dev/null | tr -s ' ' | cut -d ' ' -f 4`
+ do
+ if [ "${i}" != "${DISK}" -a "${i}" != "-" ] ; then
+ rc_nohalt "gpart delete -i ${i} ${DISK}"
+ fi
+ done
+
+ rc_nohalt "dd if=/dev/zero of=/dev/${DISK} count=3000"
+
+};
+
+# Function to export all zpools before starting an install
+stop_all_zfs()
+{
+ # Export all zpools again, so that we can overwrite these partitions potentially
+ for i in `zpool list -H -o name`
+ do
+ zpool export -f ${i}
+ done
+};
+
+# Function which stops all gmirrors before doing any disk manipulation
+stop_all_gmirror()
+{
+ DISK="${1}"
+ GPROV="`gmirror list | grep ". Name: mirror/" | cut -d '/' -f 2`"
+ for gprov in $GPROV
+ do
+ gmirror list | grep "Name: ${DISK}" >/dev/null 2>/dev/null
+ if [ "$?" = "0" ]
+ then
+ echo_log "Stopping mirror $gprov $DISK"
+ rc_nohalt "gmirror remove $gprov $DISK"
+ rc_nohalt "dd if=/dev/zero of=/dev/${DISK} count=4096"
+ fi
+ done
+};
+
+# Make sure we don't have any geli providers active on this disk
+stop_all_geli()
+{
+ _geld="${1}"
+ cd /dev
+
+ for i in `ls ${_geld}*`
+ do
+ echo $i | grep '.eli' >/dev/null 2>/dev/null
+ if [ "$?" = "0" ]
+ then
+ echo_log "Detaching GELI on ${i}"
+ rc_halt "geli detach ${i}"
+ fi
+ done
+
+};
+
+# Function which reads in the disk slice config, and performs it
+setup_disk_slice()
+{
+
+ # Cleanup any slice / mirror dirs
+ rm -rf ${SLICECFGDIR} >/dev/null 2>/dev/null
+ mkdir ${SLICECFGDIR}
+ rm -rf ${MIRRORCFGDIR} >/dev/null 2>/dev/null
+ mkdir ${MIRRORCFGDIR}
+
+ # Start with disk0
+ disknum="0"
+
+ # Make sure all zpools are exported
+ export_all_zpools
+
+ # We are ready to start setting up the disks, lets read the config and do the actions
+ while read line
+ do
+ echo $line | grep "^disk${disknum}=" >/dev/null 2>/dev/null
+ if [ "$?" = "0" ]
+ then
+
+ # Found a disk= entry, lets get the disk we are working on
+ get_value_from_string "${line}"
+ strip_white_space "$VAL"
+ DISK="$VAL"
+
+ # Before we go further, lets confirm this disk really exists
+ if [ ! -e "/dev/${DISK}" ]
+ then
+ exit_err "ERROR: The disk ${DISK} does not exist!"
+ fi
+
+ # Make sure we stop any gmirrors on this disk
+ stop_all_gmirror ${DISK}
+
+ # Make sure we stop any geli stuff on this disk
+ stop_all_geli ${DISK}
+
+ # Make sure we don't have any zpools loaded
+ stop_all_zfs
+
+ fi
+
+ # Lets look if this device will be mirrored on another disk
+ echo $line | grep "^mirror=" >/dev/null 2>/dev/null
+ if [ "$?" = "0" ]
+ then
+
+ # Found a disk= entry, lets get the disk we are working on
+ get_value_from_string "${line}"
+ strip_white_space "$VAL"
+ MIRRORDISK="$VAL"
+
+ # Before we go further, lets confirm this disk really exists
+ if [ ! -e "/dev/${MIRRORDISK}" ]
+ then
+ exit_err "ERROR: The mirror disk ${MIRRORDISK} does not exist!"
+ fi
+ fi
+
+ # Lets see if we have been given a mirror balance choice
+ echo $line | grep "^mirrorbal=" >/dev/null 2>/dev/null
+ if [ "$?" = "0" ]
+ then
+
+ # Found a disk= entry, lets get the disk we are working on
+ get_value_from_string "${line}"
+ strip_white_space "$VAL"
+ MIRRORBAL="$VAL"
+ fi
+
+ echo $line | grep "^partition=" >/dev/null 2>/dev/null
+ if [ "$?" = "0" ]
+ then
+ # Found a partition= entry, lets read / set it
+ get_value_from_string "${line}"
+ strip_white_space "$VAL"
+ PTYPE="$VAL"
+
+ # We are using free space, figure out the slice number
+ if [ "${PTYPE}" = "free" -o "${PTYPE}" = "FREE" ]
+ then
+ # Lets figure out what number this slice will be
+ LASTSLICE="`gpart show ${DISK} | grep -v ${DISK} | grep -v ' free' |tr -s '\t' ' ' | cut -d ' ' -f 4 | sed '/^$/d' | tail -n 1`"
+ if [ -z "${LASTSLICE}" ]
+ then
+ LASTSLICE="1"
+ else
+ LASTSLICE="`expr $LASTSLICE + 1`"
+ fi
+
+ if [ $LASTSLICE -gt 4 ]
+ then
+ exit_err "ERROR: BSD only supports primary partitions, and there are none availble on $DISK"
+ fi
+
+ fi
+ fi
+
+ echo $line | grep "^bootManager=" >/dev/null 2>/dev/null
+ if [ "$?" = "0" ]
+ then
+ # Found a bootManager= entry, lets read /set it
+ get_value_from_string "${line}"
+ strip_white_space "$VAL"
+ BMANAGER="$VAL"
+ fi
+
+ echo $line | grep "^commitDiskPart" >/dev/null 2>/dev/null
+ if [ "$?" = "0" ]
+ then
+ # Found our flag to commit this disk setup / lets do sanity check and do it
+ if [ ! -z "${DISK}" -a ! -z "${PTYPE}" ]
+ then
+ case ${PTYPE} in
+ all|ALL) tmpSLICE="${DISK}p1"
+ run_gpart_full "${DISK}" "${BMANAGER}" ;;
+ s1|s2|s3|s4) tmpSLICE="${DISK}${PTYPE}"
+ # Get the number of the slice we are working on
+ s="`echo ${PTYPE} | awk '{print substr($0,length,1)}'`"
+ run_gpart_slice "${DISK}" "${BMANAGER}" "${s}" ;;
+ free|FREE) tmpSLICE="${DISK}s${LASTSLICE}"
+ run_gpart_free "${DISK}" "${LASTSLICE}" "${BMANAGER}" ;;
+ *) exit_err "ERROR: Unknown PTYPE: $PTYPE" ;;
+ esac
+
+ # Now save which disk<num> this is, so we can parse it later during slice partition setup
+ echo "disk${disknum}" >${SLICECFGDIR}/$tmpSLICE
+
+ # Save any mirror config
+ if [ ! -z "$MIRRORDISK" ]
+ then
+ # Default to round-robin if the user didn't specify
+ if [ -z "$MIRRORBAL" ]
+ then
+ MIRRORBAL="round-robin"
+ fi
+ echo "$MIRRORDISK:$MIRRORBAL" >${MIRRORCFGDIR}/$DISK
+ fi
+
+
+ # Increment our disk counter to look for next disk and unset
+ unset BMANAGER PTYPE DISK MIRRORDISK MIRRORBAL
+ disknum="`expr $disknum + 1`"
+ else
+ exit_err "ERROR: commitDiskPart was called without procceding disk<num>= and partition= entries!!!"
+ fi
+ fi
+
+ done <${CFGF}
+
+};
+
+# Stop all gjournals on disk / slice
+stop_gjournal() {
+ _gdsk="$1"
+ # Check if we need to shutdown any journals on this drive
+ ls /dev/${_gdsk}*.journal >/dev/null 2>/dev/null
+ if [ "$?" = "0" ]
+ then
+ cd /dev
+ for i in `ls ${_gdsk}*.journal`
+ do
+ rawjournal="`echo ${i} | cut -d '.' -f 1`"
+ gjournal stop -f ${rawjournal} >>${LOGOUT} 2>>${LOGOUT}
+ gjournal clear ${rawjournal} >>${LOGOUT} 2>>${LOGOUT}
+ done
+ fi
+} ;
+
+# Function which runs gpart and creates a single large slice
+init_gpt_full_disk()
+{
+ _intDISK=$1
+
+ # Set our sysctl so we can overwrite any geom using drives
+ sysctl kern.geom.debugflags=16 >>${LOGOUT} 2>>${LOGOUT}
+
+ # Stop any journaling
+ stop_gjournal "${_intDISK}"
+
+ # Remove any existing partitions
+ delete_all_gpart "${_intDISK}"
+
+ #Erase any existing bootloader
+ echo_log "Cleaning up ${_intDISK}"
+ rc_halt "dd if=/dev/zero of=/dev/${_intDISK} count=2048"
+
+ sleep 2
+
+ echo_log "Running gpart on ${_intDISK}"
+ rc_halt "gpart create -s GPT ${_intDISK}"
+ rc_halt "gpart add -b 34 -s 128 -t freebsd-boot ${_intDISK}"
+
+ echo_log "Stamping boot sector on ${_intDISK}"
+ rc_halt "gpart bootcode -b /boot/pmbr ${_intDISK}"
+
+}
+
+# Function which runs gpart and creates a single large slice
+run_gpart_full()
+{
+ DISK=$1
+
+ init_gpt_full_disk "$DISK"
+
+ slice="${DISK}-1-gpt"
+
+ # Lets save our slice, so we know what to look for in the config file later on
+ if [ -z "$WORKINGSLICES" ]
+ then
+ WORKINGSLICES="${slice}"
+ export WORKINGSLICES
+ else
+ WORKINGSLICES="${WORKINGSLICES} ${slice}"
+ export WORKINGSLICES
+ fi
+};
+
+# Function which runs gpart on a specified s1-4 slice
+run_gpart_slice()
+{
+ DISK=$1
+ if [ ! -z "$2" ]
+ then
+ BMANAGER="$2"
+ fi
+
+ # Set the slice we will use later
+ slice="${1}s${3}"
+
+ # Set our sysctl so we can overwrite any geom using drives
+ sysctl kern.geom.debugflags=16 >>${LOGOUT} 2>>${LOGOUT}
+
+ # Get the number of the slice we are working on
+ slicenum="$3"
+
+ # Stop any journaling
+ stop_gjournal "${slice}"
+
+ # Make sure we have disabled swap on this drive
+ if [ -e "${slice}b" ]
+ then
+ swapoff ${slice}b >/dev/null 2>/dev/null
+ swapoff ${slice}b.eli >/dev/null 2>/dev/null
+ fi
+
+ # Modify partition type
+ echo_log "Running gpart modify on ${DISK}"
+ rc_halt "gpart modify -t freebsd -i ${slicenum} ${DISK}"
+ sleep 2
+
+ # Clean up old partition
+ echo_log "Cleaning up $slice"
+ rc_halt "dd if=/dev/zero of=/dev/${DISK}s${slicenum} count=1024"
+
+ sleep 1
+
+ if [ "${BMANAGER}" = "bsd" ]
+ then
+ echo_log "Stamping boot sector on ${DISK}"
+ rc_halt "gpart bootcode -b /boot/boot0 ${DISK}"
+ fi
+
+ # Set the slice to the format we'll be using for gpart later
+ slice="${1}-${3}-mbr"
+
+ # Lets save our slice, so we know what to look for in the config file later on
+ if [ -z "$WORKINGSLICES" ]
+ then
+ WORKINGSLICES="${slice}"
+ export WORKINGSLICES
+ else
+ WORKINGSLICES="${WORKINGSLICES} ${slice}"
+ export WORKINGSLICES
+ fi
+};
+
+# Function which runs gpart and creates a new slice from free disk space
+run_gpart_free()
+{
+ DISK=$1
+ SLICENUM=$2
+ if [ ! -z "$3" ]
+ then
+ BMANAGER="$3"
+ fi
+
+ # Set our sysctl so we can overwrite any geom using drives
+ sysctl kern.geom.debugflags=16 >>${LOGOUT} 2>>${LOGOUT}
+
+ slice="${DISK}s${SLICENUM}"
+ slicenum="${SLICENUM}"
+
+ # Working on the first slice, make sure we have MBR setup
+ gpart show ${DISK} >/dev/null 2>/dev/null
+ if [ "$?" != "0" -a "$SLICENUM" = "1" ] ; then
+ echo_log "Initializing disk, no existing MBR setup"
+ rc_halt "gpart create -s mbr ${DISK}"
+ fi
+
+ # Lets get the starting block first
+ if [ "${slicenum}" = "1" ]
+ then
+ startblock="63"
+ else
+ # Lets figure out where the prior slice ends
+ checkslice="`expr ${slicenum} - 1`"
+
+ # Get starting block of this slice
+ sblk=`gpart show ${DISK} | grep -v ${DISK} | tr -s '\t' ' ' | sed '/^$/d' | grep " ${checkslice} " | cut -d ' ' -f 2`
+ blksize=`gpart show ${DISK} | grep -v ${DISK} | tr -s '\t' ' ' | sed '/^$/d' | grep " ${checkslice} " | cut -d ' ' -f 3`
+ startblock="`expr ${sblk} + ${blksize}`"
+ fi
+
+ # No slice after the new slice, lets figure out the free space remaining and use it
+ # Get the cyl of this disk
+ get_disk_cyl "${DISK}"
+ cyl="${VAL}"
+
+ # Get the heads of this disk
+ get_disk_heads "${DISK}"
+ head="${VAL}"
+
+ # Get the tracks/sectors of this disk
+ get_disk_sectors "${DISK}"
+ sec="${VAL}"
+
+ # Multiply them all together to get our total blocks
+ totalblocks="`expr ${cyl} \* ${head}`"
+ totalblocks="`expr ${totalblocks} \* ${sec}`"
+
+
+ # Now set the ending block to the total disk block size
+ sizeblock="`expr ${totalblocks} - ${startblock}`"
+
+ # Install new partition setup
+ echo_log "Running gpart on ${DISK}"
+ rc_halt "gpart add -b ${startblock} -s ${sizeblock} -t freebsd -i ${slicenum} ${DISK}"
+ sleep 2
+
+ echo_log "Cleaning up $slice"
+ rc_halt "dd if=/dev/zero of=/dev/${slice} count=1024"
+
+ sleep 1
+
+ if [ "${BMANAGER}" = "bsd" ]
+ then
+ echo_log "Stamping boot sector on ${DISK}"
+ rc_halt "gpart bootcode -b /boot/boot0 ${DISK}"
+ fi
+
+ slice="${DISK}-${SLICENUM}-mbr"
+ # Lets save our slice, so we know what to look for in the config file later on
+ if [ -z "$WORKINGSLICES" ]
+ then
+ WORKINGSLICES="${slice}"
+ export WORKINGSLICES
+ else
+ WORKINGSLICES="${WORKINGSLICES} ${slice}"
+ export WORKINGSLICES
+ fi
+};
diff --git a/usr/sbin/pc-sysinstall/backend/functions-extractimage.sh b/usr/sbin/pc-sysinstall/backend/functions-extractimage.sh
new file mode 100644
index 0000000..1853e26
--- /dev/null
+++ b/usr/sbin/pc-sysinstall/backend/functions-extractimage.sh
@@ -0,0 +1,337 @@
+#!/bin/sh
+#-
+# Copyright (c) 2010 iXsystems, Inc. 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: src/usr.sbin/pc-sysinstall/backend/functions-extractimage.sh,v 1.2 2010/06/27 16:46:11 imp Exp $
+
+# Functions which perform the extraction / installation of system to disk
+
+. ${BACKEND}/functions-mountoptical.sh
+
+# Performs the extraction of data to disk from a uzip or tar archive
+start_extract_uzip_tar()
+{
+ if [ -z "$INSFILE" ]
+ then
+ exit_err "ERROR: Called extraction with no install file set!"
+ fi
+
+ # Check if we have a .count file, and echo it out for a front-end to use in progress bars
+ if [ -e "${INSFILE}.count" ]
+ then
+ echo "INSTALLCOUNT: `cat ${INSFILE}.count`"
+ fi
+
+ # Check if we are doing an upgrade, and if so use our exclude list
+ if [ "${INSTALLMODE}" = "upgrade" ]
+ then
+ TAROPTS="-X ${PROGDIR}/conf/exclude-from-upgrade"
+ else
+ TAROPTS=""
+ fi
+
+ echo_log "pc-sysinstall: Starting Extraction"
+
+ case ${PACKAGETYPE} in
+ uzip) # Start by mounting the uzip image
+ MDDEVICE=`mdconfig -a -t vnode -o readonly -f ${INSFILE}`
+ mkdir -p ${FSMNT}.uzip
+ mount -r /dev/${MDDEVICE}.uzip ${FSMNT}.uzip
+ if [ "$?" != "0" ]
+ then
+ exit_err "ERROR: Failed mounting the ${INSFILE}"
+ fi
+ cd ${FSMNT}.uzip
+
+ # Copy over all the files now!
+ tar cvf - . 2>/dev/null | tar -xpv -C ${FSMNT} ${TAROPTS} -f - 2>&1 | tee -a ${FSMNT}/.tar-extract.log
+ if [ "$?" != "0" ]
+ then
+ cd /
+ echo "TAR failure occured:" >>${LOGOUT}
+ cat ${FSMNT}/.tar-extract.log | grep "tar:" >>${LOGOUT}
+ umount ${FSMNT}.uzip
+ mdconfig -d -u ${MDDEVICE}
+ exit_err "ERROR: Failed extracting the tar image"
+ fi
+
+ # All finished, now lets umount and cleanup
+ cd /
+ umount ${FSMNT}.uzip
+ mdconfig -d -u ${MDDEVICE}
+ ;;
+ tar) tar -xpv -C ${FSMNT} -f ${INSFILE} ${TAROPTS} >&1 2>&1
+ if [ "$?" != "0" ]
+ then
+ exit_err "ERROR: Failed extracting the tar image"
+ fi
+ ;;
+ esac
+
+ # Check if this was a FTP download and clean it up now
+ if [ "${INSTALLMEDIUM}" = "ftp" ]
+ then
+ echo_log "Cleaning up downloaded archive"
+ rm ${INSFILE}
+ rm ${INSFILE}.count >/dev/null 2>/dev/null
+ rm ${INSFILE}.md5 >/dev/null 2>/dev/null
+ fi
+
+ echo_log "pc-sysinstall: Extraction Finished"
+
+};
+
+# Performs the extraction of data to disk from a directory with split files
+start_extract_split()
+{
+ if [ -z "${INSDIR}" ]
+ then
+ exit_err "ERROR: Called extraction with no install directory set!"
+ fi
+
+ echo_log "pc-sysinstall: Starting Extraction"
+
+ # Used by install.sh
+ DESTDIR="${FSMNT}"
+ export DESTDIR
+
+ HERE=`pwd`
+ DIRS=`ls -d ${INSDIR}/*|grep -Ev '(uzip|kernels|src)'`
+ for dir in ${DIRS}
+ do
+ cd "${dir}"
+ if [ -f "install.sh" ]
+ then
+ echo "Extracting" `basename ${dir}`
+ echo "y" | sh install.sh >/dev/null
+ if [ "$?" != "0" ]
+ then
+ exit_err "ERROR: Failed extracting ${dir}"
+ fi
+ else
+ exit_err "ERROR: ${dir}/install.sh does not exist"
+ fi
+ done
+ cd "${HERE}"
+
+ KERNELS=`ls -d ${INSDIR}/*|grep kernels`
+ cd "${KERNELS}"
+ if [ -f "install.sh" ]
+ then
+ echo "Extracting" `basename ${KERNELS}`
+ echo "y" | sh install.sh generic >/dev/null
+ if [ "$?" != "0" ]
+ then
+ exit_err "ERROR: Failed extracting ${KERNELS}"
+ fi
+ echo 'kernel="GENERIC"' > "${FSMNT}/boot/loader.conf"
+ else
+ exit_err "ERROR: ${KERNELS}/install.sh does not exist"
+ fi
+ cd "${HERE}"
+
+ SOURCE=`ls -d ${INSDIR}/*|grep src`
+ cd "${SOURCE}"
+ if [ -f "install.sh" ]
+ then
+ echo "Extracting" `basename ${SOURCE}`
+ echo "y" | sh install.sh all >/dev/null
+ if [ "$?" != "0" ]
+ then
+ exit_err "ERROR: Failed extracting ${SOURCE}"
+ fi
+ else
+ exit_err "ERROR: ${SOURCE}/install.sh does not exist"
+ fi
+ cd "${HERE}"
+
+ echo_log "pc-sysinstall: Extraction Finished"
+};
+
+# Function which will attempt to fetch the install file before we start
+# the install
+fetch_install_file()
+{
+ get_value_from_cfg ftpPath
+ if [ -z "$VAL" ]
+ then
+ exit_err "ERROR: Install medium was set to ftp, but no ftpPath was provided!"
+ fi
+
+ FTPPATH="${VAL}"
+
+ # Check if we have a /usr partition to save the download
+ if [ -d "${FSMNT}/usr" ]
+ then
+ OUTFILE="${FSMNT}/usr/.fetch-${INSFILE}"
+ else
+ OUTFILE="${FSMNT}/.fetch-${INSFILE}"
+ fi
+
+ # Do the fetch of the archive now
+ fetch_file "${FTPPATH}/${INSFILE}" "${OUTFILE}" "1"
+
+ # Check to see if there is a .count file for this install
+ fetch_file "${FTPPATH}/${INSFILE}.count" "${OUTFILE}.count" "0"
+
+ # Check to see if there is a .md5 file for this install
+ fetch_file "${FTPPATH}/${INSFILE}.md5" "${OUTFILE}.md5" "0"
+
+ # Done fetching, now reset the INSFILE to our downloaded archived
+ INSFILE="${OUTFILE}" ; export INSFILE
+
+};
+
+# Function which does the rsync download from the server specifed in cfg
+start_rsync_copy()
+{
+ # Load our rsync config values
+ get_value_from_cfg rsyncPath
+ if [ -z "${VAL}" ]; then
+ exit_err "ERROR: rsyncPath is unset! Please check your config and try again."
+ fi
+ RSYNCPATH="${VAL}" ; export RSYNCPATH
+
+ get_value_from_cfg rsyncHost
+ if [ -z "${VAL}" ]; then
+ exit_err "ERROR: rsyncHost is unset! Please check your config and try again."
+ fi
+ RSYNCHOST="${VAL}" ; export RSYNCHOST
+
+ get_value_from_cfg rsyncUser
+ if [ -z "${VAL}" ]; then
+ exit_err "ERROR: rsyncUser is unset! Please check your config and try again."
+ fi
+ RSYNCUSER="${VAL}" ; export RSYNCUSER
+
+ get_value_from_cfg rsyncPort
+ if [ -z "${VAL}" ]; then
+ exit_err "ERROR: rsyncPort is unset! Please check your config and try again."
+ fi
+ RSYNCPORT="${VAL}" ; export RSYNCPORT
+
+ COUNT="1"
+ while
+ z=1
+ do
+ if [ ${COUNT} -gt ${RSYNCTRIES} ]
+ then
+ exit_err "ERROR: Failed rsync command!"
+ break
+ fi
+
+ rsync -avvzHsR \
+ --rsync-path="rsync --fake-super" \
+ -e "ssh -p ${RSYNCPORT}" \
+ ${RSYNCUSER}@${RSYNCHOST}:${RSYNCPATH}/./ ${FSMNT}
+ if [ "$?" != "0" ]
+ then
+ echo "Rsync failed! Tries: ${COUNT}"
+ else
+ break
+ fi
+
+ COUNT="`expr ${COUNT} + 1`"
+ done
+
+};
+
+
+# Entrance function, which starts the installation process
+init_extraction()
+{
+ # Figure out what file we are using to install from via the config
+ get_value_from_cfg installFile
+
+ if [ ! -z "${VAL}" ]
+ then
+ INSFILE="${VAL}" ; export INSFILE
+ else
+ # If no installFile specified, try our defaults
+ if [ "$INSTALLTYPE" = "FreeBSD" ]
+ then
+ case $PACKAGETYPE in
+ uzip) INSFILE="${FBSD_UZIP_FILE}" ;;
+ tar) INSFILE="${FBSD_TAR_FILE}" ;;
+ split)
+ INSDIR="${FBSD_BRANCH_DIR}"
+
+ # This is to trick opt_mount into not failing
+ INSFILE="${INSDIR}"
+ ;;
+ esac
+ else
+ case $PACKAGETYPE in
+ uzip) INSFILE="${UZIP_FILE}" ;;
+ tar) INSFILE="${TAR_FILE}" ;;
+ esac
+ fi
+ export INSFILE
+ fi
+
+ # Lets start by figuring out what medium we are using
+ case ${INSTALLMEDIUM} in
+ LiveCD)
+ get_value_from_cfg cpdupPaths
+ if [ ! -z "${VAL}" ]
+ then
+ INSFILE="${VAL}" ; export INSFILE
+ fi
+ oIFS=$IFS
+ IFS=","
+ for FILE in $INSFILE; do
+ echo_log "pc-sysinstall: Running cpdup -vvv -I -o /${FILE} /mnt/${FILE}"
+ /usr/local/bin/cpdup -vvv -I -o /${FILE} /mnt/${FILE} >&1 2>&1
+ if [ "$?" != "0" ]
+ then
+ echo "CPDUP failure occured:" >>${LOGOUT}
+ exit_err "ERROR: Error occurred during cpdup"
+ fi
+ done
+ oIFS=$IFS
+ IFS="
+"
+ return
+ ;;
+ dvd|usb) # Lets start by mounting the disk
+ opt_mount
+ if [ ! -z "${INSDIR}" ]
+ then
+ INSDIR="${CDMNT}/${INSDIR}" ; export INSDIR
+ start_extract_split
+
+ else
+ INSFILE="${CDMNT}/${INSFILE}" ; export INSFILE
+ start_extract_uzip_tar
+ fi
+ ;;
+ ftp) fetch_install_file
+ start_extract_uzip_tar
+ ;;
+ rsync) start_rsync_copy
+ ;;
+ *) exit_err "ERROR: Unknown install medium" ;;
+ esac
+
+};
diff --git a/usr/sbin/pc-sysinstall/backend/functions-ftp.sh b/usr/sbin/pc-sysinstall/backend/functions-ftp.sh
new file mode 100644
index 0000000..93d9eae
--- /dev/null
+++ b/usr/sbin/pc-sysinstall/backend/functions-ftp.sh
@@ -0,0 +1,374 @@
+#!/bin/sh
+#-
+# Copyright (c) 2010 iXsystems, Inc. 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: src/usr.sbin/pc-sysinstall/backend/functions-ftp.sh,v 1.2 2010/07/13 23:47:12 imp Exp $
+
+# Functions which runs commands on the system
+
+. ${BACKEND}/functions.sh
+. ${BACKEND}/functions-parse.sh
+
+MAIN_FTP_SERVERS="\
+Main Site: ftp.freebsd.org"
+
+IPV6_FTP_SERVERS="\
+IPv6 Main Site: ftp.freebsd.org|\
+IPv6 Ireland: ftp3.ie.freebsd.org|\
+IPv6 Israel: ftp.il.freebsd.org|\
+IPv6 Japan: ftp2.jp.freebsd.org|\
+IPv6 USA: ftp4.us.freebsd.org|\
+IPv6 Turkey: ftp2.tr.freebsd.org"
+
+PRIMARY_FTP_SERVERS="\
+Primary: ftp1.freebsd.org|\
+Primary #2: ftp2.freebsd.org|\
+Primary #3: ftp3.freebsd.org|\
+Primary #4: ftp4.freebsd.org|\
+Primary #5: ftp5.freebsd.org|\
+Primary #6: ftp6.freebsd.org|\
+Primary #7: ftp7.freebsd.org|\
+Primary #8: ftp8.freebsd.org|\
+Primary #9: ftp9.freebsd.org|\
+Primary #10: ftp10.freebsd.org|\
+Primary #11: ftp11.freebsd.org|\
+Primary #12: ftp12.freebsd.org|\
+Primary #13: ftp13.freebsd.org|\
+Primary #14: ftp14.freebsd.org"
+
+ARGENTINA_FTP_SERVERS="\
+Argentina: ftp.ar.freebsd.org"
+
+AUSTRALIA_FTP_SERVERS="\
+Australia: ftp.au.freebsd.org|\
+Australia #2: ftp2.au.freebsd.org|\
+Australia #3: ftp3.au.freebsd.org"
+
+AUSTRIA_FTP_SERVERS="\
+Austria: ftp.at.freebsd.org|\
+Austria #2: ftp2.at.freebsd.org"
+
+BRAZIL_FTP_SERVERS="\
+Brazil: ftp.br.freebsd.org|\
+Brazil #2: ftp2.br.freebsd.org|\
+Brazil #3: ftp3.br.freebsd.org|\
+Brazil #4: ftp4.br.freebsd.org|\
+Brazil #5: ftp5.br.freebsd.org|\
+Brazil #6: ftp6.br.freebsd.org|\
+Brazil #7: ftp7.br.freebsd.org"
+
+CANADA_FTP_SERVERS="\
+Canada: ftp.ca.freebsd.org"
+
+CHINA_FTP_SERVERS="\
+China: ftp.cn.freebsd.org|\
+China #2: ftp2.cn.freebsd.org"
+
+CROATIA_FTP_SERVERS="\
+Croatia: ftp.hr.freebsd.org"
+
+CZECH_REPUBLIC_FTP_SERVERS="\
+Czech Republic: ftp.cz.freebsd.org"
+
+DENMARK_FTP_SERVERS="\
+Denmark: ftp.dk.freebsd.org|\
+Denmark #2: ftp2.dk.freebsd.org"
+
+ESTONIA_FTP_SERVERS="\
+Estonia: ftp.ee.freebsd.org"
+
+FINLAND_FTP_SERVERS="\
+Finland: ftp.fi.freebsd.org"
+
+FRANCE_FTP_SERVERS="\
+France: ftp.fr.freebsd.org|\
+France #2: ftp2.fr.freebsd.org|\
+France #3: ftp3.fr.freebsd.org|\
+France #5: ftp5.fr.freebsd.org|\
+France #6: ftp6.fr.freebsd.org|\
+France #8: ftp8.fr.freebsd.org"
+
+GERMANY_FTP_SERVERS="\
+Germany: ftp.de.freebsd.org|\
+Germany #2: ftp2.de.freebsd.org|\
+Germany #3: ftp3.de.freebsd.org|\
+Germany #4: ftp4.de.freebsd.org|\
+Germany #5: ftp5.de.freebsd.org|\
+Germany #6: ftp6.de.freebsd.org|\
+Germany #7: ftp7.de.freebsd.org|\
+Germany #8: ftp8.de.freebsd.org"
+
+GREECE_FTP_SERVERS="\
+Greece: ftp.gr.freebsd.org|\
+Greece #2: ftp2.gr.freebsd.org"
+
+HUNGARY_FTP_SERVERS="\
+Hungary: ftp.hu.freebsd.org"
+
+ICELAND_FTP_SERVERS="\
+Iceland: ftp.is.freebsd.org"
+
+IRELAND_FTP_SERVERS="\
+Ireland: ftp.ie.freebsd.org|\
+Ireland #2: ftp2.ie.freebsd.org|\
+Ireland #3: ftp3.ie.freebsd.org"
+
+ISRAEL_FTP_SERVERS="\
+Israel: ftp.il.freebsd.org"
+
+ITALY_FTP_SERVERS="\
+Italy: ftp.it.freebsd.org"
+
+JAPAN_FTP_SERVERS="\
+Japan: ftp.jp.freebsd.org|\
+Japan #2: ftp2.jp.freebsd.org|\
+Japan #3: ftp3.jp.freebsd.org|\
+Japan #4: ftp4.jp.freebsd.org|\
+Japan #5: ftp5.jp.freebsd.org|\
+Japan #6: ftp6.jp.freebsd.org|\
+Japan #7: ftp7.jp.freebsd.org|\
+Japan #8: ftp8.jp.freebsd.org|\
+Japan #9: ftp9.jp.freebsd.org"
+
+KOREA_FTP_SERVERS="\
+Korea: ftp.kr.freebsd.org|\
+Korea #2: ftp2.kr.freebsd.org"
+
+LITHUANIA_FTP_SERVERS="\
+Lithuania: ftp.lt.freebsd.org"
+
+NETHERLANDS_FTP_SERVERS="\
+Netherlands: ftp.nl.freebsd.org|\
+Netherlands #2: ftp2.nl.freebsd.org"
+
+NORWAY_FTP_SERVERS="\
+Norway: ftp.no.freebsd.org|\
+Norway #3: ftp3.no.freebsd.org"
+
+POLAND_FTP_SERVERS="\
+Poland: ftp.pl.freebsd.org|\
+Poland #2: ftp2.pl.freebsd.org|\
+Poland #5: ftp5.pl.freebsd.org"
+
+PORTUGAL_FTP_SERVERS="\
+Portugal: ftp.pt.freebsd.org|\
+Portugal #2: ftp2.pt.freebsd.org|\
+Portugal #4: ftp4.pt.freebsd.org"
+
+ROMANIA_FTP_SERVERS="\
+Romania: ftp.ro.freebsd.org"
+
+RUSSIA_FTP_SERVERS="\
+Russia: ftp.ru.freebsd.org|\
+Russia #2: ftp2.ru.freebsd.org|\
+Russia #3: ftp3.ru.freebsd.org|\
+Russia #4: ftp4.ru.freebsd.org"
+
+SINGAPORE_FTP_SERVERS="\
+Singapore: ftp.sg.freebsd.org"
+
+SLOVAK_REPUBLIC_FTP_SERVERS="\
+Slovak Republic: ftp.sk.freebsd.org"
+
+SLOVENIA_FTP_SERVERS="\
+Slovenia: ftp.si.freebsd.org|\
+Slovenia #2: ftp2.si.freebsd.org"
+
+SOUTH_AFRICA_FTP_SERVERS="\
+South Africa: ftp.za.freebsd.org|\
+South Africa #2: ftp2.za.freebsd.org|\
+South Africa #3: ftp3.za.freebsd.org|\
+South Africa #4: ftp4.za.freebsd.org"
+
+SPAIN_FTP_SERVERS="\
+Spain: ftp.es.freebsd.org|\
+Spain #2: ftp2.es.freebsd.org|\
+Spain #3: ftp3.es.freebsd.org"
+
+SWEDEN_FTP_SERVERS="\
+Sweden: ftp.se.freebsd.org|\
+Sweden #2: ftp2.se.freebsd.org|\
+Sweden #3: ftp3.se.freebsd.org|\
+Sweden #5: ftp5.se.freebsd.org"
+
+SWITZERLAND_FTP_SERVERS="\
+Switzerland: ftp.ch.freebsd.org|\
+Switzerland #2: ftp2.ch.freebsd.org"
+
+TAIWAN_FTP_SERVERS="\
+Taiwan: ftp.tw.freebsd.org|\
+Taiwan #2: ftp2.tw.freebsd.org|\
+Taiwan #3: ftp3.tw.freebsd.org|\
+Taiwan #4: ftp4.tw.freebsd.org|\
+Taiwan #6: ftp6.tw.freebsd.org|\
+Taiwan #11: ftp11.tw.freebsd.org"
+
+TURKEY_FTP_SERVERS="\
+Turkey: ftp.tr.freebsd.org|\
+Turkey #2: ftp2.tr.freebsd.org"
+
+UK_FTP_SERVERS="\
+UK: ftp.uk.freebsd.org|\
+UK #2: ftp2.uk.freebsd.org|\
+UK #3: ftp3.uk.freebsd.org|\
+UK #4: ftp4.uk.freebsd.org|\
+UK #5: ftp5.uk.freebsd.org|\
+UK #6: ftp6.uk.freebsd.org"
+
+UKRAINE_FTP_SERVERS="\
+Ukraine: ftp.ua.freebsd.org|\
+Ukraine #2: ftp2.ua.freebsd.org|\
+Ukraine #5: ftp5.ua.freebsd.org|\
+Ukraine #6: ftp6.ua.freebsd.org|\
+Ukraine #7: ftp7.ua.freebsd.org|\
+Ukraine #8: ftp8.ua.freebsd.org"
+
+USA_FTP_SERVERS="\
+USA #1: ftp1.us.freebsd.org|\
+USA #2: ftp2.us.freebsd.org|\
+USA #3: ftp3.us.freebsd.org|\
+USA #4: ftp4.us.freebsd.org|\
+USA #5: ftp5.us.freebsd.org|\
+USA #6: ftp6.us.freebsd.org|\
+USA #7: ftp7.us.freebsd.org|\
+USA #8: ftp8.us.freebsd.org|\
+USA #9: ftp9.us.freebsd.org|\
+USA #10: ftp10.us.freebsd.org|\
+USA #11: ftp11.us.freebsd.org|\
+USA #12: ftp12.us.freebsd.org|\
+USA #13: ftp13.us.freebsd.org|\
+USA #14: ftp14.us.freebsd.org|\
+USA #15: ftp15.us.freebsd.org"
+
+show_mirrors()
+{
+ MIRRORS="${1}"
+ if [ -n "${MIRRORS}" ]
+ then
+ SAVE_IFS="${IFS}"
+ IFS="|"
+ for m in ${MIRRORS}
+ do
+ echo "$m"
+ done
+ IFS="${SAVE_IFS}"
+ fi
+}
+
+get_ftp_mirrors()
+{
+ COUNTRY="${1}"
+ if [ -n "$COUNTRY" ]
+ then
+ COUNTRY=`echo $COUNTRY|tr A-Z a-z`
+ case "${COUNTRY}" in
+ argentina*) VAL="${ARGENTINA_FTP_SERVERS}" ;;
+ australia*) VAL="${AUSTRALIA_FTP_SERVERS}" ;;
+ austria*) VAL="${AUSTRIA_FTP_SERVERS}" ;;
+ brazil*) VAL="${BRAZIL_FTP_SERVERS}" ;;
+ canada*) VAL="${CANADA_FTP_SERVERS}" ;;
+ china*) VAL="${CHINA_FTP_SERVERS}" ;;
+ croatia*) VAL="${CROATIA_FTP_SERVERS}" ;;
+ czech*) VAL="${CZECH_REPUBLIC_FTP_SERVERS}" ;;
+ denmark*) VAL="${DENMARK_FTP_SERVERS}" ;;
+ estonia*) VAL="${ESTONIA_FTP_SERVERS}" ;;
+ finland*) VAL="${FINLAND_FTP_SERVERS}" ;;
+ france*) VAL="${FRANCE_FTP_SERVERS}" ;;
+ germany*) VAL="${GERMANY_FTP_SERVERS}" ;;
+ greece*) VAL="${GREECE_FTP_SERVERS}" ;;
+ hungary*) VAL="${HUNGARY_FTP_SERVERS}" ;;
+ iceland*) VAL="${ICELAND_FTP_SERVERS}" ;;
+ ireland*) VAL="${IRELAND_FTP_SERVERS}" ;;
+ israel*) VAL="${ISRAEL_FTP_SERVERS}" ;;
+ italy*) VAL="${ITALY_FTP_SERVERS}" ;;
+ japan*) VAL="${JAPAN_FTP_SERVERS}" ;;
+ korea*) VAL="${KOREA_FTP_SERVERS}" ;;
+ lithuania*) VAL="${LITHUANIA_FTP_SERVERS}" ;;
+ netherlands*) VAL="${NETHERLANDS_FTP_SERVERS}" ;;
+ norway*) VAL="${NORWAY_FTP_SERVERS}" ;;
+ poland*) VAL="${POLAND_FTP_SERVERS}" ;;
+ portugal*) VAL="${PORTUGAL_FTP_SERVERS}" ;;
+ romania*) VAL="${ROMAINIA_FTP_SERVERS}" ;;
+ russia*) VAL="${RUSSIA_FTP_SERVERS}" ;;
+ singapore*) VAL="${SINGAPORE_FTP_SERVERS}" ;;
+ slovak*) VAL="${SLOVAK_REPUBLIC_FTP_SERVERS}" ;;
+ slovenia*) VAL="${SLOVENIA_FTP_SERVERS}" ;;
+ *africa*) VAL="${SOUTH_AFRICA_FTP_SERVERS}" ;;
+ spain*) VAL="${SPAIN_FTP_SERVERS}" ;;
+ sweden*) VAL="${SWEDEN_FTP_SERVERS}" ;;
+ switzerland*) VAL="${SWITZERLAND_FTP_SERVERS}" ;;
+ taiwan*) VAL="${TAIWAN_FTP_SERVERS}" ;;
+ turkey*) VAL="${TURKEY_FTP_SERVERS}" ;;
+ ukraine*) VAL="${UKRAINE_FTP_SERVERS}" ;;
+ uk*) VAL="${UK_FTP_SERVERS}" ;;
+ usa*) VAL="${USA_FTP_SERVERS}" ;;
+ esac
+ else
+ VAL="${MAIN_FTP_SERVERS}"
+ VAL="${VAL}|${IPV6_FTP_SERVERS}"
+ VAL="${VAL}|${PRIMARY_FTP_SERVERS}"
+ VAL="${VAL}|${ARGENTINA_FTP_SERVERS}"
+ VAL="${VAL}|${AUSTRALIA_FTP_SERVERS}"
+ VAL="${VAL}|${AUSTRIA_FTP_SERVERS}"
+ VAL="${VAL}|${BRAZIL_FTP_SERVERS}"
+ VAL="${VAL}|${CANADA_FTP_SERVERS}"
+ VAL="${VAL}|${CHINA_FTP_SERVERS}"
+ VAL="${VAL}|${CROATIA_FTP_SERVERS}"
+ VAL="${VAL}|${CZECH_REPUBLIC_FTP_SERVERS}"
+ VAL="${VAL}|${DENMARK_FTP_SERVERS}"
+ VAL="${VAL}|${ESTONIA_FTP_SERVERS}"
+ VAL="${VAL}|${FINLAND_FTP_SERVERS}"
+ VAL="${VAL}|${FRANCE_FTP_SERVERS}"
+ VAL="${VAL}|${GERMANY_FTP_SERVERS}"
+ VAL="${VAL}|${GREECE_FTP_SERVERS}"
+ VAL="${VAL}|${HUNGARY_FTP_SERVERS}"
+ VAL="${VAL}|${ICELAND_FTP_SERVERS}"
+ VAL="${VAL}|${IRELAND_FTP_SERVERS}"
+ VAL="${VAL}|${ISRAEL_FTP_SERVERS}"
+ VAL="${VAL}|${ITALY_FTP_SERVERS}"
+ VAL="${VAL}|${JAPAN_FTP_SERVERS}"
+ VAL="${VAL}|${KOREA_FTP_SERVERS}"
+ VAL="${VAL}|${LITHUANIA_FTP_SERVERS}"
+ VAL="${VAL}|${NETHERLANDS_FTP_SERVERS}"
+ VAL="${VAL}|${NORWAY_FTP_SERVERS}"
+ VAL="${VAL}|${POLAND_FTP_SERVERS}"
+ VAL="${VAL}|${PORTUGAL_FTP_SERVERS}"
+ VAL="${VAL}|${ROMANIA_FTP_SERVERS}"
+ VAL="${VAL}|${RUSSIA_FTP_SERVERS}"
+ VAL="${VAL}|${SINGAPORE_FTP_SERVERS}"
+ VAL="${VAL}|${SLOVAK_REPUBLIC_FTP_SERVERS}"
+ VAL="${VAL}|${SLOVENIA_FTP_SERVERS}"
+ VAL="${VAL}|${SOUTH_AFRICA_FTP_SERVERS}"
+ VAL="${VAL}|${SPAIN_FTP_SERVERS}"
+ VAL="${VAL}|${SWEDEN_FTP_SERVERS}"
+ VAL="${VAL}|${SWITZERLAND_FTP_SERVERS}"
+ VAL="${VAL}|${TAIWAN_FTP_SERVERS}"
+ VAL="${VAL}|${TURKEY_FTP_SERVERS}"
+ VAL="${VAL}|${UKRAINE_FTP_SERVERS}"
+ VAL="${VAL}|${UK_FTP_SERVERS}"
+ VAL="${VAL}|${USA_FTP_SERVERS}"
+ fi
+
+ export VAL
+}
diff --git a/usr/sbin/pc-sysinstall/backend/functions-installcomponents.sh b/usr/sbin/pc-sysinstall/backend/functions-installcomponents.sh
new file mode 100644
index 0000000..4744765
--- /dev/null
+++ b/usr/sbin/pc-sysinstall/backend/functions-installcomponents.sh
@@ -0,0 +1,166 @@
+#!/bin/sh
+#-
+# Copyright (c) 2010 iXsystems, Inc. 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: src/usr.sbin/pc-sysinstall/backend/functions-installcomponents.sh,v 1.2 2010/06/27 16:46:11 imp Exp $
+
+# Functions which check and load any optional modules specified in the config
+
+. ${BACKEND}/functions.sh
+. ${BACKEND}/functions-parse.sh
+
+copy_component()
+{
+ COMPONENT="$1"
+ FAILED="0"
+ CFILES=""
+
+ # Check the type, and set the components subdir properly
+ TYPE="`grep 'type:' ${COMPDIR}/${COMPONENT}/component.cfg | cut -d ' ' -f 2`"
+ if [ "${TYPE}" = "PBI" ]
+ then
+ SUBDIR="PBI"
+ else
+ SUBDIR="components"
+ fi
+
+ # Lets start by downloading / copying the files this component needs
+ while read line
+ do
+ CFILE="`echo $line | cut -d ':' -f 1`"
+ CFILEMD5="`echo $line | cut -d ':' -f 2`"
+ CFILE2MD5="`echo $line | cut -d ':' -f 3`"
+
+
+ case ${INSTALLMEDIUM} in
+ dvd|usb) # On both dvd / usb, we can just copy the file
+ cp ${CDMNT}/${COMPFILEDIR}/${SUBDIR}/${CFILE} \
+ ${FSMNT}/${COMPTMPDIR} >>${LOGOUT} 2>>${LOGOUT}
+ RESULT="$?"
+ ;;
+ ftp) get_value_from_cfg ftpPath
+ if [ -z "$VAL" ]
+ then
+ exit_err "ERROR: Install medium was set to ftp, but no ftpPath was provided!"
+ fi
+ FTPPATH="${VAL}"
+
+ fetch_file "${FTPPATH}/${COMPFILEDIR}/${SUBDIR}/${CFILE}" "${FSMNT}/${COMPTMPDIR}/${CFILE}" "0"
+ RESULT="$?"
+ ;;
+ esac
+
+ if [ "${RESULT}" != "0" ]
+ then
+ echo_log "WARNING: Failed to copy ${CFILE}"
+ FAILED="1"
+ else
+ # Now lets check the MD5 to confirm the file is valid
+ CHECKMD5=`md5 -q ${FSMNT}/${COMPTMPDIR}/${CFILE}`
+ if [ "${CHECKMD5}" != "${CFILEMD5}" -a "${CHECKMD5}" != "${CFILE2MD5}" ]
+ then
+ echo_log "WARNING: ${CFILE} failed md5 checksum"
+ FAILED="1"
+ else
+ if [ -z "${CFILES}" ]
+ then
+ CFILES="${CFILE}"
+ else
+ CFILES="${CFILES},${CFILE}"
+ fi
+ fi
+ fi
+
+
+ done < ${COMPDIR}/${COMPONENT}/distfiles
+
+ if [ "${FAILED}" = "0" ]
+ then
+ # Now install the component
+ run_component_install ${COMPONENT} ${CFILES}
+ fi
+
+};
+
+run_component_install()
+{
+ COMPONENT="$1"
+ CFILES="$1"
+
+ # Lets install this component now
+ # Start by making a wrapper script which sets the variables
+ # for the component to use
+ echo "#!/bin/sh
+COMPTMPDIR=\"${COMPTMPDIR}\"
+export COMPTMPDIR
+CFILE=\"${CFILE}\"
+export CFILE
+
+sh ${COMPTMPDIR}/install.sh
+
+" >${FSMNT}/.componentwrapper.sh
+ chmod 755 ${FSMNT}/.componentwrapper.sh
+
+ # Copy over the install script for this component
+ cp ${COMPDIR}/${COMPONENT}/install.sh ${FSMNT}/${COMPTMPDIR}/
+
+ echo_log "INSTALL COMPONENT: ${i}"
+ chroot ${FSMNT} /.componentwrapper.sh >>${LOGOUT} 2>>${LOGOUT}
+ rm ${FSMNT}/.componentwrapper.sh
+
+
+};
+
+# Check for any modules specified, and begin loading them
+install_components()
+{
+ # First, lets check and see if we even have any optional modules
+ get_value_from_cfg installComponents
+ if [ ! -z "${VAL}" ]
+ then
+ # Lets start by cleaning up the string and getting it ready to parse
+ strip_white_space ${VAL}
+ COMPONENTS=`echo ${VAL} | sed -e "s|,| |g"`
+ for i in $COMPONENTS
+ do
+ if [ ! -e "${COMPDIR}/${i}/install.sh" -o ! -e "${COMPDIR}/${i}/distfiles" ]
+ then
+ echo_log "WARNING: Component ${i} doesn't seem to exist"
+ else
+
+ # Make the tmpdir on the disk
+ mkdir -p ${FSMNT}/${COMPTMPDIR} >>${LOGOUT} 2>>${LOGOUT}
+
+ # Start by grabbing the component files
+ copy_component ${i}
+
+ # Remove the tmpdir now
+ rm -rf ${FSMNT}/${COMPTMPDIR} >>${LOGOUT} 2>>${LOGOUT}
+
+ fi
+ done
+
+ fi
+
+};
diff --git a/usr/sbin/pc-sysinstall/backend/functions-localize.sh b/usr/sbin/pc-sysinstall/backend/functions-localize.sh
new file mode 100644
index 0000000..107a6ae
--- /dev/null
+++ b/usr/sbin/pc-sysinstall/backend/functions-localize.sh
@@ -0,0 +1,474 @@
+#!/bin/sh
+#-
+# Copyright (c) 2010 iXsystems, Inc. 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: src/usr.sbin/pc-sysinstall/backend/functions-localize.sh,v 1.2 2010/06/27 16:46:11 imp Exp $
+
+# Functions which runs commands on the system
+
+. ${BACKEND}/functions.sh
+. ${BACKEND}/functions-parse.sh
+
+
+# Function which localizes a FreeBSD install
+localize_freebsd()
+{
+ sed -i.bak "s/lang=en_US/lang=${LOCALE}/g" ${FSMNT}/etc/login.conf
+ rm ${FSMNT}/etc/login.conf.bak
+};
+
+
+# Function which localizes a PC-BSD install
+localize_pcbsd()
+{
+ #Change the skel files
+ ##########################################################################
+ sed -i.bak "s/Country=us/Country=${COUNTRY}/g" ${FSMNT}/usr/share/skel/.kde4/share/config/kdeglobals
+ sed -i.bak "s/Country=us/Country=${COUNTRY}/g" ${FSMNT}/root/.kde4/share/config/kdeglobals
+ sed -i.bak "s/Language=en_US/Language=${SETLANG}:${LOCALE}/g" ${FSMNT}/usr/share/skel/.kde4/share/config/kdeglobals
+ sed -i.bak "s/Language=en_US/Language=${SETLANG}:${LOCALE}/g" ${FSMNT}/root/.kde4/share/config/kdeglobals
+
+ #Change KDM Langs
+ ##########################################################################
+ sed -i.bak "s/Language=en_US/Language=${LOCALE}.UTF-8/g" ${FSMNT}/usr/local/kde4/share/config/kdm/kdmrc
+
+ # Check if we have a localized splash screen and copy it
+ if [ -e "${FSMNT}/usr/PCBSD/splash-screens/loading-screen-${SETLANG}.pcx" ]
+ then
+ cp ${FSMNT}/usr/PCBSD/splash-screens/loading-screen-${SETLANG}.pcx ${FSMNT}/boot/loading-screen.pcx
+ fi
+
+};
+
+localize_x_keyboard()
+{
+ KEYMOD="$1"
+ KEYLAY="$2"
+ KEYVAR="$3"
+ COUNTRY="$4"
+ OPTION="grp:alt_shift_toggle"
+ SETXKBMAP=""
+
+ if [ "${COUNTRY}" = "NONE" -o "${COUNTRY}" = "us" -o "${COUNTRY}" = "C" ] ; then
+ #In this case we don't need any additional language
+ COUNTRY=""
+ OPTION=""
+ else
+ COUNTRY=",${COUNTRY}"
+ fi
+
+ if [ "${KEYMOD}" != "NONE" ]
+ then
+ SETXKBMAP="-model ${KEYMOD}"
+ KXMODEL="${KEYMOD}"
+ else
+ KXMODEL="pc104"
+ fi
+
+ if [ "${KEYLAY}" != "NONE" ]
+ then
+ localize_key_layout "$KEYLAY"
+ SETXKBMAP="${SETXKBMAP} -layout ${KEYLAY}"
+ KXLAYOUT="${KEYLAY}"
+ else
+ KXLAYOUT="us"
+ fi
+
+ if [ "${KEYVAR}" != "NONE" ]
+ then
+ SETXKBMAP="${SETXKBMAP} -variant ${KEYVAR}"
+ KXVAR="(${KEYVAR})"
+ else
+ KXVAR=""
+ fi
+
+ # Setup .xprofile with our setxkbmap call now
+ if [ ! -z "${SETXKBMAP}" ]
+ then
+ if [ ! -e "${FSMNT}/usr/share/skel/.xprofile" ]
+ then
+ echo "#!/bin/sh" >${FSMNT}/usr/share/skel/.xprofile
+ fi
+
+ # Save the keyboard layout for user / root X logins
+ echo "setxkbmap ${SETXKBMAP}" >>${FSMNT}/usr/share/skel/.xprofile
+ chmod 755 ${FSMNT}/usr/share/skel/.xprofile
+ cp ${FSMNT}/usr/share/skel/.xprofile ${FSMNT}/root/.xprofile
+
+ # Save it for KDM
+ echo "setxkbmap ${SETXKBMAP}" >>${FSMNT}/usr/local/kde4/share/config/kdm/Xsetup
+ fi
+
+
+ # Create the kxkbrc configuration using these options
+ echo "[Layout]
+DisplayNames=${KXLAYOUT}${COUNTRY}
+IndicatorOnly=false
+LayoutList=${KXLAYOUT}${KXVAR}${COUNTRY}
+Model=${KXMODEL}
+Options=${OPTION}
+ResetOldOptions=true
+ShowFlag=true
+ShowSingle=false
+SwitchMode=WinClass
+Use=true " >${FSMNT}/usr/share/skel/.kde4/share/config/kxkbrc
+
+};
+
+localize_key_layout()
+{
+
+ KEYLAYOUT="$1"
+
+ # Set the keylayout in rc.conf
+ case ${KEYLAYOUT} in
+ am) KEYLAYOUT_CONSOLE="hy.armscii-8" ;;
+ ch) KEYLAYOUT_CONSOLE="swissgerman.iso" ;;
+ cz) KEYLAYOUT_CONSOLE="cz.iso2" ;;
+ de) KEYLAYOUT_CONSOLE="german.iso" ;;
+ dk) KEYLAYOUT_CONSOLE="danish.iso" ;;
+ ee) KEYLAYOUT_CONSOLE="estonian.iso" ;;
+ es) KEYLAYOUT_CONSOLE="spanish.iso" ;;
+ fi) KEYLAYOUT_CONSOLE="finnish.iso" ;;
+ is) KEYLAYOUT_CONSOLE="icelandic.iso" ;;
+ jp) KEYLAYOUT_CONSOLE="jp.106" ;;
+ nl) KEYLAYOUT_CONSOLE="dutch.iso.acc" ;;
+ no) KEYLAYOUT_CONSOLE="norwegian.iso" ;;
+ pl) KEYLAYOUT_CONSOLE="pl_PL.ISO8859-2" ;;
+ ru) KEYLAYOUT_CONSOLE="ru.koi8-r" ;;
+ sk) KEYLAYOUT_CONSOLE="sk.iso2" ;;
+ se) KEYLAYOUT_CONSOLE="swedish.iso" ;;
+ tr) KEYLAYOUT_CONSOLE="tr.iso9.q" ;;
+ gb) KEYLAYOUT_CONSOLE="uk.iso" ;;
+ *) if [ ! -z "${KEYLAYOUT}" ]
+ then
+ KEYLAYOUT_CONSOLE="${KEYLAYOUT}.iso"
+ fi
+ ;;
+ esac
+
+ if [ ! -z "${KEYLAYOUT_CONSOLE}" ]
+ then
+ echo "keymap=\"${KEYLAYOUT_CONSOLE}\"" >>${FSMNT}/etc/rc.conf
+ fi
+
+};
+
+# Function which prunes other l10n files from the KDE install
+localize_prune_langs()
+{
+ get_value_from_cfg localizeLang
+ KEEPLANG="$VAL"
+ if [ -z "$KEEPLANG" ] ; then
+ KEEPLANG="en"
+ fi
+ export KEEPLANG
+
+ echo_log "Pruning other l10n files, keeping ${KEEPLANG}"
+
+ # Create the script to do uninstalls
+ echo '#!/bin/sh
+
+ for i in `pkg_info | grep "kde-l10n" | cut -d " " -f 1`
+ do
+ echo "$i" | grep "${KEEPLANG}-kde"
+ if [ "$?" != "0" ] ; then
+ pkg_delete ${i}
+ fi
+ done
+ ' > ${FSMNT}/.pruneLangs.sh
+
+ chmod 755 ${FSMNT}/.pruneLangs.sh
+ chroot ${FSMNT} /.pruneLangs.sh >/dev/null 2>/dev/null
+ rm ${FSMNT}/.pruneLangs.sh
+
+};
+
+# Function which sets COUNTRY SETLANG and LOCALE based upon $1
+localize_get_codes()
+{
+ TARGETLANG="${1}"
+ # Setup the presets for the specific lang
+ case $TARGETLANG in
+ af) COUNTRY="C"
+ SETLANG="af"
+ LOCALE="af_ZA"
+ ;;
+ ar) COUNTRY="C"
+ SETLANG="ar"
+ LOCALE="en_US"
+ ;;
+ az) COUNTRY="C"
+ SETLANG="az"
+ LOCALE="en_US"
+ ;;
+ ca) COUNTRY="es"
+ SETLANG="es:ca"
+ LOCALE="ca_ES"
+ ;;
+ be) COUNTRY="be"
+ SETLANG="be"
+ LOCALE="be_BY"
+ ;;
+ bn) COUNTRY="bn"
+ SETLANG="bn"
+ LOCALE="en_US"
+ ;;
+ bg) COUNTRY="bg"
+ SETLANG="bg"
+ LOCALE="bg_BG"
+ ;;
+ cs) COUNTRY="cz"
+ SETLANG="cs"
+ LOCALE="cs_CZ"
+ ;;
+ da) COUNTRY="dk"
+ SETLANG="da"
+ LOCALE="da_DK"
+ ;;
+ de) COUNTRY="de"
+ SETLANG="de"
+ LOCALE="de_DE"
+ ;;
+ en_GB) COUNTRY="gb"
+ SETLANG="en_GB:cy"
+ LOCALE="en_GB"
+ ;;
+ el) COUNTRY="gr"
+ SETLANG="el:gr"
+ LOCALE="el_GR"
+ ;;
+ es) COUNTRY="es"
+ SETLANG="es"
+ LOCALE="es_ES"
+ ;;
+ es_LA) COUNTRY="us"
+ SETLANG="es:en_US"
+ LOCALE="es_ES"
+ ;;
+ et) COUNTRY="ee"
+ SETLANG="et"
+ LOCALE="et_EE"
+ ;;
+ fr) COUNTRY="fr"
+ SETLANG="fr"
+ LOCALE="fr_FR"
+ ;;
+ he) COUNTRY="il"
+ SETLANG="he:ar"
+ LOCALE="he_IL"
+ ;;
+ hr) COUNTRY="hr"
+ SETLANG="hr"
+ LOCALE="hr_HR"
+ ;;
+ hu) COUNTRY="hu"
+ SETLANG="hu"
+ LOCALE="hu_HU"
+ ;;
+ it) COUNTRY="it"
+ SETLANG="it"
+ LOCALE="it_IT"
+ ;;
+ ja) COUNTRY="jp"
+ SETLANG="ja"
+ LOCALE="ja_JP"
+ ;;
+ ko) COUNTRY="kr"
+ SETLANG="ko"
+ LOCALE="ko_KR"
+ ;;
+ nl) COUNTRY="nl"
+ SETLANG="nl"
+ LOCALE="nl_NL"
+ ;;
+ nn) COUNTRY="no"
+ SETLANG="nn"
+ LOCALE="en_US"
+ ;;
+ pa) COUNTRY="pa"
+ SETLANG="pa"
+ LOCALE="en_US"
+ ;;
+ pl) COUNTRY="pl"
+ SETLANG="pl"
+ LOCALE="pl_PL"
+ ;;
+ pt) COUNTRY="pt"
+ SETLANG="pt"
+ LOCALE="pt_PT"
+ ;;
+ pt_BR) COUNTRY="br"
+ SETLANG="pt_BR"
+ LOCALE="pt_BR"
+ ;;
+ ru) COUNTRY="ru"
+ SETLANG="ru"
+ LOCALE="ru_RU"
+ ;;
+ sl) COUNTRY="si"
+ SETLANG="sl"
+ LOCALE="sl_SI"
+ ;;
+ sk) COUNTRY="sk"
+ SETLANG="sk"
+ LOCALE="sk_SK"
+ ;;
+ sv) COUNTRY="se"
+ SETLANG="sv"
+ LOCALE="sv_SE"
+ ;;
+ uk) COUNTRY="ua"
+ SETLANG="uk"
+ LOCALE="uk_UA"
+ ;;
+ vi) COUNTRY="vn"
+ SETLANG="vi"
+ LOCALE="en_US"
+ ;;
+ zh_CN) COUNTRY="cn"
+ SETLANG="zh_CN"
+ LOCALE="zh_CN"
+ ;;
+ zh_TW) COUNTRY="tw"
+ SETLANG="zh_TW"
+ LOCALE="zh_TW"
+ ;;
+ *) COUNTRY="C"
+ SETLANG="${TARGETLANG}"
+ LOCALE="en_US"
+ ;;
+ esac
+
+ export COUNTRY SETLANG LOCALE
+
+};
+
+# Function which sets the timezone on the system
+set_timezone()
+{
+ TZONE="$1"
+ cp ${FSMNT}/usr/share/zoneinfo/${TZONE} ${FSMNT}/etc/localtime
+};
+
+# Function which enables / disables NTP
+set_ntp()
+{
+ ENABLED="$1"
+ if [ "$ENABLED" = "yes" -o "${ENABLED}" = "YES" ]
+ then
+ cat ${FSMNT}/etc/rc.conf 2>/dev/null | grep 'ntpd_enable="YES"' >/dev/null 2>/dev/null
+ if [ "$?" != "0" ]
+ then
+ echo 'ntpd_enable="YES"' >>${FSMNT}/etc/rc.conf
+ echo 'ntpd_sync_on_start="YES"' >>${FSMNT}/etc/rc.conf
+ fi
+ else
+ cat ${FSMNT}/etc/rc.conf 2>/dev/null | grep 'ntpd_enable="YES"' >/dev/null 2>/dev/null
+ if [ "$?" != "0" ]
+ then
+ sed -i.bak 's|ntpd_enable="YES"||g' ${FSMNT}/etc/rc.conf
+ fi
+ fi
+};
+
+# Starts checking for localization directives
+run_localize()
+{
+ KEYLAYOUT="NONE"
+ KEYMOD="NONE"
+ KEYVAR="NONE"
+
+ while read line
+ do
+ # Check if we need to do any localization
+ echo $line | grep "^localizeLang=" >/dev/null 2>/dev/null
+ if [ "$?" = "0" ]
+ then
+
+ # Set our country / lang / locale variables
+ get_value_from_string "$line"
+ localize_get_codes ${VAL}
+
+ get_value_from_string "$line"
+ # If we are doing PC-BSD install, localize it as well as FreeBSD base
+ if [ "${INSTALLTYPE}" != "FreeBSD" ]
+ then
+ localize_pcbsd "$VAL"
+ fi
+ localize_freebsd "$VAL"
+ fi
+
+ # Check if we need to do any keylayouts
+ echo $line | grep "^localizeKeyLayout=" >/dev/null 2>/dev/null
+ if [ "$?" = "0" ] ; then
+ get_value_from_string "$line"
+ KEYLAYOUT="$VAL"
+ fi
+
+ # Check if we need to do any key models
+ echo $line | grep "^localizeKeyModel=" >/dev/null 2>/dev/null
+ if [ "$?" = "0" ] ; then
+ get_value_from_string "$line"
+ KEYMOD="$VAL"
+ fi
+
+ # Check if we need to do any key variant
+ echo $line | grep "^localizeKeyVariant=" >/dev/null 2>/dev/null
+ if [ "$?" = "0" ] ; then
+ get_value_from_string "$line"
+ KEYVAR="$VAL"
+ fi
+
+
+ # Check if we need to set a timezone
+ echo $line | grep "^timeZone=" >/dev/null 2>/dev/null
+ if [ "$?" = "0" ] ; then
+ get_value_from_string "$line"
+ set_timezone "$VAL"
+ fi
+
+ # Check if we need to set a timezone
+ echo $line | grep "^enableNTP=" >/dev/null 2>/dev/null
+ if [ "$?" = "0" ] ; then
+ get_value_from_string "$line"
+ set_ntp "$VAL"
+ fi
+ done <${CFGF}
+
+ if [ "${INSTALLTYPE}" != "FreeBSD" ] ; then
+ # Do our X keyboard localization
+ localize_x_keyboard "${KEYMOD}" "${KEYLAYOUT}" "${KEYVAR}" "${COUNTRY}"
+ fi
+
+ # Check if we want to prunt any other KDE lang files to save some disk space
+ get_value_from_cfg localizePrune
+ if [ "${VAL}" = "yes" -o "${VAL}" = "YES" ] ; then
+ localize_prune_langs
+ fi
+
+ # Update the login.conf db, even if we didn't localize, its a good idea to make sure its up2date
+ run_chroot_cmd "/usr/bin/cap_mkdb /etc/login.conf" >/dev/null 2>/dev/null
+
+};
diff --git a/usr/sbin/pc-sysinstall/backend/functions-mountdisk.sh b/usr/sbin/pc-sysinstall/backend/functions-mountdisk.sh
new file mode 100644
index 0000000..e4f94af
--- /dev/null
+++ b/usr/sbin/pc-sysinstall/backend/functions-mountdisk.sh
@@ -0,0 +1,190 @@
+#!/bin/sh
+#-
+# Copyright (c) 2010 iXsystems, Inc. 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: src/usr.sbin/pc-sysinstall/backend/functions-mountdisk.sh,v 1.2 2010/06/27 16:46:11 imp Exp $
+
+# Functions related mounting the newly formatted disk partitions
+
+# Mounts all the specified partition to the mount-point
+mount_partition()
+{
+ if [ -z "${1}" -o -z "${2}" -o -z "${3}" ]
+ then
+ exit_err "ERROR: Missing arguments for mount_partition"
+ fi
+
+ PART="${1}"
+ PARTFS="${2}"
+ MNTPOINT="${3}"
+ MNTFLAGS="${4}"
+
+ # Setup the MNTOPTS
+ if [ -z "${MNTOPTS}" ]
+ then
+ MNTFLAGS="-o rw"
+ else
+ MNTFLAGS="-o rw,${MNTFLAGS}"
+ fi
+
+
+ #We are on ZFS, lets setup this mount-point
+ if [ "${PARTFS}" = "ZFS" ]
+ then
+ ZPOOLNAME=$(get_zpool_name "${PART}")
+
+ # Check if we have multiple zfs mounts specified
+ for ZMNT in `echo ${MNTPOINT} | sed 's|,| |g'`
+ do
+ # First make sure we create the mount point
+ if [ ! -d "${FSMNT}${ZMNT}" ] ; then
+ mkdir -p ${FSMNT}${ZMNT} >>${LOGOUT} 2>>${LOGOUT}
+ fi
+
+ if [ "${ZMNT}" = "/" ] ; then
+ ZNAME=""
+ else
+ ZNAME="${ZMNT}"
+ echo_log "zfs create -p ${ZPOOLNAME}${ZNAME}"
+ rc_halt "zfs create -p ${ZPOOLNAME}${ZNAME}"
+ fi
+ sleep 2
+ rc_halt "zfs set mountpoint=${FSMNT}${ZNAME} ${ZPOOLNAME}${ZNAME}"
+
+ # Disable atime for this zfs partition, speed increase
+ rc_nohalt "zfs set atime=off ${ZPOOLNAME}${ZNAME}"
+ done
+
+ else
+ # If we are not on ZFS, lets do the mount now
+ # First make sure we create the mount point
+ if [ ! -d "${FSMNT}${MNTPOINT}" ]
+ then
+ mkdir -p ${FSMNT}${MNTPOINT} >>${LOGOUT} 2>>${LOGOUT}
+ fi
+
+ echo_log "mount ${MNTFLAGS} /dev/${PART} -> ${FSMNT}${MNTPOINT}"
+ sleep 2
+ rc_halt "mount ${MNTFLAGS} /dev/${PART} ${FSMNT}${MNTPOINT}"
+ fi
+
+};
+
+# Mounts all the new file systems to prepare for installation
+mount_all_filesystems()
+{
+ # Make sure our mount point exists
+ mkdir -p ${FSMNT} >/dev/null 2>/dev/null
+
+ # First lets find and mount the / partition
+ #########################################################
+ for PART in `ls ${PARTDIR}`
+ do
+ if [ ! -e "/dev/${PART}" ]
+ then
+ exit_err "ERROR: The partition ${PART} does not exist. Failure in bsdlabel?"
+ fi
+
+ PARTFS="`cat ${PARTDIR}/${PART} | cut -d ':' -f 1`"
+ PARTMNT="`cat ${PARTDIR}/${PART} | cut -d ':' -f 2`"
+ PARTENC="`cat ${PARTDIR}/${PART} | cut -d ':' -f 3`"
+
+ if [ "${PARTENC}" = "ON" ]
+ then
+ EXT=".eli"
+ else
+ EXT=""
+ fi
+
+ # Check for root partition for mounting, including ZFS "/,/usr" type
+ echo "$PARTMNT" | grep "/," >/dev/null
+ if [ "$?" = "0" -o "$PARTMNT" = "/" ]
+ then
+ case ${PARTFS} in
+ UFS) mount_partition ${PART}${EXT} ${PARTFS} ${PARTMNT} "noatime"
+ ;;
+ UFS+S) mount_partition ${PART}${EXT} ${PARTFS} ${PARTMNT} "noatime"
+ ;;
+ UFS+J) mount_partition ${PART}${EXT}.journal ${PARTFS} ${PARTMNT} "async,noatime"
+ ;;
+ ZFS) mount_partition ${PART} ${PARTFS} ${PARTMNT}
+ ;;
+ *) exit_err "ERROR: Got unknown file-system type $PARTFS" ;;
+ esac
+
+ fi
+
+ done
+
+ # Now that we've mounted "/" lets do any other remaining mount-points
+ ##################################################################
+ for PART in `ls ${PARTDIR}`
+ do
+ if [ ! -e "/dev/${PART}" ]
+ then
+ exit_err "ERROR: The partition ${PART} does not exist. Failure in bsdlabel?"
+ fi
+
+ PARTFS="`cat ${PARTDIR}/${PART} | cut -d ':' -f 1`"
+ PARTMNT="`cat ${PARTDIR}/${PART} | cut -d ':' -f 2`"
+ PARTENC="`cat ${PARTDIR}/${PART} | cut -d ':' -f 3`"
+
+ if [ "${PARTENC}" = "ON" ]
+ then
+ EXT=".eli"
+ else
+ EXT=""
+ fi
+
+ # Check if we've found "/" again, don't need to mount it twice
+ echo "$PARTMNT" | grep "/," >/dev/null
+ if [ "$?" != "0" -a "$PARTMNT" != "/" ]
+ then
+ case ${PARTFS} in
+ UFS) mount_partition ${PART}${EXT} ${PARTFS} ${PARTMNT} "noatime"
+ ;;
+ UFS+S) mount_partition ${PART}${EXT} ${PARTFS} ${PARTMNT} "noatime"
+ ;;
+ UFS+J) mount_partition ${PART}${EXT}.journal ${PARTFS} ${PARTMNT} "async,noatime"
+ ;;
+ ZFS) mount_partition ${PART} ${PARTFS} ${PARTMNT}
+ ;;
+ SWAP) # Lets enable this swap now
+ if [ "$PARTENC" = "ON" ]
+ then
+ echo_log "Enabling encrypted swap on /dev/${PART}"
+ rc_halt "geli onetime -d -e 3des ${PART}"
+ sleep 5
+ rc_halt "swapon /dev/${PART}.eli"
+ else
+ echo_log "swapon ${PART}"
+ sleep 5
+ rc_halt "swapon /dev/${PART}"
+ fi
+ ;;
+ *) exit_err "ERROR: Got unknown file-system type $PARTFS" ;;
+ esac
+ fi
+ done
+};
diff --git a/usr/sbin/pc-sysinstall/backend/functions-mountoptical.sh b/usr/sbin/pc-sysinstall/backend/functions-mountoptical.sh
new file mode 100644
index 0000000..e9147ca
--- /dev/null
+++ b/usr/sbin/pc-sysinstall/backend/functions-mountoptical.sh
@@ -0,0 +1,153 @@
+#!/bin/sh
+#-
+# Copyright (c) 2010 iXsystems, Inc. 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: src/usr.sbin/pc-sysinstall/backend/functions-mountoptical.sh,v 1.2 2010/06/27 16:46:11 imp Exp $
+
+# Functions which perform mounting / unmounting and switching of
+# optical / usb media
+
+. ${BACKEND}/functions.sh
+. ${BACKEND}/functions-parse.sh
+
+# Displays an optical failure message
+opt_fail()
+{
+ # If we got here, we must not have a DVD/USB we can find :(
+ get_value_from_cfg installInteractive
+ if [ "${VAL}" = "yes" ]
+ then
+ # We are running interactive, and didn't find a DVD, prompt user again
+ echo_log "DISK ERROR: Unable to find installation disk!"
+ echo_log "Please insert the installation disk and press enter."
+ read tmp
+ else
+ exit_err "ERROR: Unable to locate installation DVD/USB"
+ fi
+};
+
+# Performs the extraction of data to disk
+opt_mount()
+{
+ FOUND="0"
+
+ # Ensure we have a directory where its supposed to be
+ if [ ! -d "${CDMNT}" ]
+ then
+ mkdir -p ${CDMNT}
+ fi
+
+
+ # Start by checking if we already have a cd mounted at CDMNT
+ mount | grep "${CDMNT} " >/dev/null 2>/dev/null
+ if [ "$?" = "0" ]
+ then
+ if [ -e "${CDMNT}/${INSFILE}" ]
+ then
+ echo "MOUNTED" >${TMPDIR}/cdmnt
+ echo_log "FOUND DVD: MOUNTED"
+ FOUND="1"
+ return
+ fi
+
+ # failed to find optical disk
+ opt_fail
+ return
+ fi
+
+# Setup our loop to search for installation media
+ while
+ z=1
+ do
+
+ # Loop though and look for an installation disk
+ for i in `ls -1 /dev/acd* /dev/cd* /dev/scd* /dev/rscd* 2>/dev/null`
+ do
+ # Find the CD Device
+ /sbin/mount_cd9660 $i ${CDMNT}
+
+ # Check the package type to see if we have our install data
+ if [ -e "${CDMNT}/${INSFILE}" ]
+ then
+ echo "${i}" >${TMPDIR}/cdmnt
+ echo_log "FOUND DVD: ${i}"
+ FOUND="1"
+ break
+ fi
+ /sbin/umount ${CDMNT} >/dev/null 2>/dev/null
+ done
+
+ # If no DVD found, try USB
+ if [ "$FOUND" != "1" ]
+ then
+ # Loop though and look for an installation disk
+ for i in `ls -1 /dev/da* 2>/dev/null`
+ do
+ # Check if we can mount this device UFS
+ /sbin/mount -r $i ${CDMNT}
+
+ # Check the package type to see if we have our install data
+ if [ -e "${CDMNT}/${INSFILE}" ]
+ then
+ echo "${i}" >${TMPDIR}/cdmnt
+ echo_log "FOUND USB: ${i}"
+ FOUND="1"
+ break
+ fi
+ /sbin/umount ${CDMNT} >/dev/null 2>/dev/null
+
+ # Also check if it is a FAT mount
+ /sbin/mount -r -t msdosfs $i ${CDMNT}
+
+ # Check the package type to see if we have our install data
+ if [ -e "${CDMNT}/${INSFILE}" ]
+ then
+ echo "${i}" >${TMPDIR}/cdmnt
+ echo_log "FOUND USB: ${i}"
+ FOUND="1"
+ break
+ fi
+ /sbin/umount ${CDMNT} >/dev/null 2>/dev/null
+ done
+ fi # End of USB Check
+
+
+ if [ "$FOUND" = "1" ]
+ then
+ break
+ fi
+
+ # Failed to find a disk, take action now
+ opt_fail
+
+ done
+
+};
+
+# Function to unmount optical media
+opt_umount()
+{
+ /sbin/umount ${CDMNT} >/dev/null 2>/dev/null
+};
+
diff --git a/usr/sbin/pc-sysinstall/backend/functions-networking.sh b/usr/sbin/pc-sysinstall/backend/functions-networking.sh
new file mode 100644
index 0000000..95eeaad
--- /dev/null
+++ b/usr/sbin/pc-sysinstall/backend/functions-networking.sh
@@ -0,0 +1,356 @@
+#!/bin/sh
+#-
+# Copyright (c) 2010 iXsystems, Inc. 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: src/usr.sbin/pc-sysinstall/backend/functions-networking.sh,v 1.2 2010/06/27 16:46:11 imp Exp $
+
+# Functions which perform our networking setup
+
+# Function which creates a kde4 .desktop file for the PC-BSD net tray
+create_desktop_nettray()
+{
+ NIC="${1}"
+ echo "#!/usr/bin/env xdg-open
+[Desktop Entry]
+Exec=/usr/local/kde4/bin/pc-nettray ${NIC}
+Icon=network
+StartupNotify=false
+Type=Application" > ${FSMNT}/usr/share/skel/.kde4/Autostart/tray-${NIC}.desktop
+ chmod 744 ${FSMNT}/usr/share/skel/.kde4/Autostart/tray-${NIC}.desktop
+
+};
+
+# Function which checks is a nic is wifi or not
+check_is_wifi()
+{
+ NIC="$1"
+ ifconfig ${NIC} | grep "802.11" >/dev/null 2>/dev/null
+ if [ "$?" = "0" ]
+ then
+ return 0
+ else
+ return 1
+ fi
+};
+
+# Function to get the first available wired nic, used for lagg0 setup
+get_first_wired_nic()
+{
+ rm ${TMPDIR}/.niclist >/dev/null 2>/dev/null
+ # start by getting a list of nics on this system
+ ${QUERYDIR}/detect-nics.sh > ${TMPDIR}/.niclist
+ if [ -e "${TMPDIR}/.niclist" ]
+ then
+ while read line
+ do
+ NIC="`echo $line | cut -d ':' -f 1`"
+ check_is_wifi ${NIC}
+ if [ "$?" != "0" ]
+ then
+ VAL="${NIC}" ; export VAL
+ return
+ fi
+ done < ${TMPDIR}/.niclist
+ fi
+
+ VAL="" ; export VAL
+ return
+};
+
+# Function which simply enables plain dhcp on all detected nics, not fancy lagg interface
+enable_plain_dhcp_all()
+{
+ rm ${TMPDIR}/.niclist >/dev/null 2>/dev/null
+ # start by getting a list of nics on this system
+ ${QUERYDIR}/detect-nics.sh > ${TMPDIR}/.niclist
+ if [ -e "${TMPDIR}/.niclist" ]
+ then
+ echo "# Auto-Enabled NICs from pc-sysinstall" >>${FSMNT}/etc/rc.conf
+ WLANCOUNT="0"
+ while read line
+ do
+ NIC="`echo $line | cut -d ':' -f 1`"
+ DESC="`echo $line | cut -d ':' -f 2`"
+ echo_log "Setting $NIC to DHCP on the system."
+ check_is_wifi ${NIC}
+ if [ "$?" = "0" ]
+ then
+ # We have a wifi device, setup a wlan* entry for it
+ WLAN="wlan${WLANCOUNT}"
+ echo "wlans_${NIC}=\"${WLAN}\"" >>${FSMNT}/etc/rc.conf
+ echo "ifconfig_${WLAN}=\"DHCP\"" >>${FSMNT}/etc/rc.conf
+ CNIC="${WLAN}"
+ WLANCOUNT="`expr ${WLANCOUNT} + 1`"
+ else
+ echo "ifconfig_${NIC}=\"DHCP\"" >>${FSMNT}/etc/rc.conf
+ CNIC="${NIC}"
+ fi
+
+ done < ${TMPDIR}/.niclist
+ fi
+};
+
+# Function which enables fancy lagg dhcp on specified wifi
+enable_lagg_dhcp()
+{
+ WIFINIC="$1"
+
+ # Get the first wired nic
+ get_first_wired_nic
+ WIRENIC=$VAL
+ LAGGPORT="laggport ${WIFINIC}"
+
+ echo "# Auto-Enabled NICs from pc-sysinstall" >>${FSMNT}/etc/rc.conf
+ if [ ! -z "$WIRENIC" ]
+ then
+ echo "ifconfig_${WIRENIC}=\"up\"" >> ${FSMNT}/etc/rc.conf
+ echo "ifconfig_${WIFINIC}=\"\`ifconfig ${WIRENIC} ether\`\"" >> ${FSMNT}/etc/rc.conf
+ echo "ifconfig_${WIFINIC}=\"ether \${ifconfig_${WIFINIC}##*ether }\"" >> ${FSMNT}/etc/rc.conf
+ LAGGPORT="laggport ${WIRENIC} ${LAGGPORT}"
+ fi
+
+ echo "wlans_${WIFINIC}=\"wlan0\"" >> ${FSMNT}/etc/rc.conf
+ echo "cloned_interfaces=\"lagg0\"" >> ${FSMNT}/etc/rc.conf
+ echo "ifconfig_lagg0=\"laggproto failover ${LAGGPORT} DHCP\"" >> ${FSMNT}/etc/rc.conf
+
+};
+
+# Function which detects available nics, and runs them to DHCP on the
+save_auto_dhcp()
+{
+ rm ${TMPDIR}/.niclist >/dev/null 2>/dev/null
+ # start by getting a list of nics on this system
+ ${QUERYDIR}/detect-nics.sh > ${TMPDIR}/.niclist
+ if [ -e "${TMPDIR}/.niclist" ]
+ then
+ while read line
+ do
+ NIC="`echo $line | cut -d ':' -f 1`"
+ DESC="`echo $line | cut -d ':' -f 2`"
+ check_is_wifi "${NIC}"
+ if [ "$?" = "0" ]
+ then
+ # We have a wifi device, lets do fancy lagg interface
+ enable_lagg_dhcp "${NIC}"
+ return
+ fi
+
+ done < ${TMPDIR}/.niclist
+ fi
+
+ # Got here, looks like no wifi, so lets simply enable plain-ole-dhcp
+ enable_plain_dhcp_all
+
+};
+
+
+# Function which saves a manual nic setup to the installed system
+save_manual_nic()
+{
+ # Get the target nic
+ NIC="$1"
+
+ get_value_from_cfg netSaveIP
+ NETIP="${VAL}"
+
+ if [ "$NETIP" = "DHCP" ]
+ then
+ echo_log "Setting $NIC to DHCP on the system."
+ echo "ifconfig_${NIC}=\"DHCP\"" >>${FSMNT}/etc/rc.conf
+ return 0
+ fi
+
+ # If we get here, we have a manual setup, lets do so now
+
+ # Set the manual IP
+ IFARGS="inet ${NETIP}"
+
+ # Check if we have a netmask to set
+ get_value_from_cfg netSaveMask
+ NETMASK="${VAL}"
+ if [ ! -z "${NETMASK}" ]
+ then
+ IFARGS="${IFARGS} netmask ${NETMASK}"
+ fi
+
+
+ echo "# Auto-Enabled NICs from pc-sysinstall" >>${FSMNT}/etc/rc.conf
+ echo "ifconfig_${NIC}=\"${IFARGS}\"" >>${FSMNT}/etc/rc.conf
+
+ # Check if we have a default router to set
+ get_value_from_cfg netSaveDefaultRouter
+ NETROUTE="${VAL}"
+ if [ ! -z "${NETROUTE}" ]
+ then
+ echo "defaultrouter=\"${NETROUTE}\"" >>${FSMNT}/etc/rc.conf
+ fi
+
+ # Check if we have a nameserver to enable
+ get_value_from_cfg netSaveNameServer
+ NAMESERVER="${VAL}"
+ if [ ! -z "${NAMESERVER}" ]
+ then
+ echo "nameserver ${NAMESERVER}" >${FSMNT}/etc/resolv.conf
+ fi
+
+};
+
+# Function which determines if a nic is active / up
+is_nic_active()
+{
+ ifconfig ${1} | grep "status: active" >/dev/null 2>/dev/null
+ if [ "$?" = "0" ] ; then
+ return 0
+ else
+ return 1
+ fi
+};
+
+
+# Function which detects available nics, and runs DHCP on them until
+# a success is found
+enable_auto_dhcp()
+{
+ # start by getting a list of nics on this system
+ ${QUERYDIR}/detect-nics.sh > ${TMPDIR}/.niclist
+ while read line
+ do
+ NIC="`echo $line | cut -d ':' -f 1`"
+ DESC="`echo $line | cut -d ':' -f 2`"
+
+ is_nic_active "${NIC}"
+ if [ "$?" = "0" ] ; then
+ echo_log "Trying DHCP on $NIC $DESC"
+ dhclient ${NIC} >/dev/null 2>/dev/null
+ if [ "$?" = "0" ] ; then
+ # Got a valid DHCP IP, we can return now
+ WRKNIC="$NIC" ; export WRKNIC
+ return 0
+ fi
+ fi
+ done < ${TMPDIR}/.niclist
+
+};
+
+# Get the mac address of a target NIC
+get_nic_mac() {
+ FOUNDMAC="`ifconfig ${1} | grep 'ether' | tr -d '\t' | cut -d ' ' -f 2`"
+ export FOUNDMAC
+}
+
+# Function which performs the manual setup of a target nic in the cfg
+enable_manual_nic()
+{
+ # Get the target nic
+ NIC="$1"
+
+ # Check that this NIC exists
+ rc_halt "ifconfig ${NIC}"
+
+ get_value_from_cfg netIP
+ NETIP="${VAL}"
+
+ if [ "$NETIP" = "DHCP" ]
+ then
+ echo_log "Enabling DHCP on $NIC"
+ rc_halt "dhclient ${NIC}"
+ return 0
+ fi
+
+ # If we get here, we have a manual setup, lets do so now
+
+ # Set the manual IP
+ rc_halt "ifconfig ${NIC} ${NETIP}"
+
+ # Check if we have a netmask to set
+ get_value_from_cfg netMask
+ NETMASK="${VAL}"
+ if [ ! -z "${NETMASK}" ]
+ then
+ rc_halt "ifconfig ${NIC} netmask ${NETMASK}"
+ fi
+
+ # Check if we have a default router to set
+ get_value_from_cfg netDefaultRouter
+ NETROUTE="${VAL}"
+ if [ ! -z "${NETROUTE}" ]
+ then
+ rc_halt "route add default ${NETROUTE}"
+ fi
+
+ # Check if we have a nameserver to enable
+ get_value_from_cfg netNameServer
+ NAMESERVER="${VAL}"
+ if [ ! -z "${NAMESERVER}" ]
+ then
+ echo "nameserver ${NAMESERVER}" >/etc/resolv.conf
+ fi
+
+
+};
+
+
+# Function which parses the cfg and enables networking per specified
+start_networking()
+{
+ # Check if we have any networking requested
+ get_value_from_cfg netDev
+ if [ -z "${VAL}" ]
+ then
+ return 0
+ fi
+
+ NETDEV="${VAL}"
+ if [ "$NETDEV" = "AUTO-DHCP" ]
+ then
+ enable_auto_dhcp
+ else
+ enable_manual_nic ${NETDEV}
+ fi
+
+};
+
+
+# Function which checks the cfg and enables the specified networking on
+# the installed system
+save_networking_install()
+{
+
+ # Check if we have any networking requested to save
+ get_value_from_cfg netSaveDev
+ if [ -z "${VAL}" ]
+ then
+ return 0
+ fi
+
+ NETDEV="${VAL}"
+ if [ "$NETDEV" = "AUTO-DHCP" ]
+ then
+ save_auto_dhcp
+ else
+ save_manual_nic ${NETDEV}
+ fi
+
+};
+
diff --git a/usr/sbin/pc-sysinstall/backend/functions-newfs.sh b/usr/sbin/pc-sysinstall/backend/functions-newfs.sh
new file mode 100644
index 0000000..ec333f9
--- /dev/null
+++ b/usr/sbin/pc-sysinstall/backend/functions-newfs.sh
@@ -0,0 +1,182 @@
+#!/bin/sh
+#-
+# Copyright (c) 2010 iXsystems, Inc. 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: src/usr.sbin/pc-sysinstall/backend/functions-newfs.sh,v 1.3 2010/07/31 19:27:43 imp Exp $
+
+# Functions related to disk operations using newfs
+
+
+# Function which performs the ZFS magic
+setup_zfs_filesystem()
+{
+ PART="$1"
+ PARTFS="$2"
+ PARTMNT="$3"
+ EXT="$4"
+ PARTGEOM="$5"
+ ZPOOLOPTS="$6"
+ ROOTSLICE="`echo ${PART} | rev | cut -b 2- | rev`"
+ ZPOOLNAME=$(get_zpool_name "${PART}")
+
+ # Sleep a few moments, let the disk catch its breath
+ sleep 5
+ sync
+
+ # Check if we have some custom zpool arguments and use them if so
+ if [ ! -z "${ZPOOLOPTS}" ] ; then
+ rc_halt "zpool create -m none -f ${ZPOOLNAME} ${ZPOOLOPTS}"
+ else
+ # No zpool options, create pool on single device
+ rc_halt "zpool create -m none -f ${ZPOOLNAME} ${PART}${EXT}"
+ fi
+
+ # Disable atime for this zfs partition, speed increase
+ rc_nohalt "zfs set atime=off ${ZPOOLNAME}"
+
+ # Check if we have multiple zfs mounts specified
+ for i in `echo ${PARTMNT} | sed 's|,| |g'`
+ do
+ # Check if we ended up with needing a zfs bootable partition
+ if [ "${i}" = "/" -o "${i}" = "/boot" ]
+ then
+ if [ "$HAVEBOOT" = "YES" ] ; then continue ; fi
+ if [ "${PARTGEOM}" = "MBR" ]
+ then
+ # Lets stamp the proper ZFS boot loader
+ echo_log "Setting up ZFS boot loader support"
+ rc_halt "zpool set bootfs=${ZPOOLNAME} ${ZPOOLNAME}"
+ rc_halt "zpool export ${ZPOOLNAME}"
+ rc_halt "dd if=/boot/zfsboot of=/dev/${ROOTSLICE} count=1"
+ rc_halt "dd if=/boot/zfsboot of=/dev/${PART}${EXT} skip=1 seek=1024"
+ rc_halt "zpool import ${ZPOOLNAME}"
+ fi
+ fi
+ done
+
+};
+
+# Runs newfs on all the partiions which we've setup with bsdlabel
+setup_filesystems()
+{
+
+ # Create the keydir
+ rm -rf ${GELIKEYDIR} >/dev/null 2>/dev/null
+ mkdir ${GELIKEYDIR}
+
+ # Lets go ahead and read through the saved partitions we created, and determine if we need to run
+ # newfs on any of them
+ for PART in `ls ${PARTDIR}`
+ do
+ if [ ! -e "/dev/${PART}" ]
+ then
+ exit_err "ERROR: The partition ${PART} does not exist. Failure in bsdlabel?"
+ fi
+
+ PARTFS="`cat ${PARTDIR}/${PART} | cut -d ':' -f 1`"
+ PARTMNT="`cat ${PARTDIR}/${PART} | cut -d ':' -f 2`"
+ PARTENC="`cat ${PARTDIR}/${PART} | cut -d ':' -f 3`"
+ PARTLABEL="`cat ${PARTDIR}/${PART} | cut -d ':' -f 4`"
+ PARTGEOM="`cat ${PARTDIR}/${PART} | cut -d ':' -f 5`"
+ PARTXTRAOPTS="`cat ${PARTDIR}/${PART} | cut -d ':' -f 6`"
+
+ # Make sure journaling isn't enabled on this device
+ if [ -e "/dev/${PART}.journal" ]
+ then
+ rc_nohalt "gjournal stop -f ${PART}.journal"
+ rc_nohalt "gjournal clear ${PART}"
+ fi
+
+ # Setup encryption if necessary
+ if [ "${PARTENC}" = "ON" -a "${PARTFS}" != "SWAP" ]
+ then
+ echo_log "Creating geli provider for ${PART}"
+ rc_halt "dd if=/dev/random of=${GELIKEYDIR}/${PART}.key bs=64 count=1"
+ rc_halt "geli init -b -s 4096 -P -K ${GELIKEYDIR}/${PART}.key /dev/${PART}"
+ rc_halt "geli attach -p -k ${GELIKEYDIR}/${PART}.key /dev/${PART}"
+
+ EXT=".eli"
+ else
+ # No Encryption
+ EXT=""
+ fi
+
+ case ${PARTFS} in
+ UFS) echo_log "NEWFS: /dev/${PART} - ${PARTFS}"
+ sleep 2
+ rc_halt "newfs /dev/${PART}${EXT}"
+ sleep 2
+ rc_halt "sync"
+ rc_halt "glabel label ${PARTLABEL} /dev/${PART}${EXT}"
+ rc_halt "sync"
+
+ # Set flag that we've found a boot partition
+ if [ "$PARTMNT" = "/boot" -o "${PARTMNT}" = "/" ] ; then
+ HAVEBOOT="YES"
+ fi
+ sleep 2
+ ;;
+ UFS+S) echo_log "NEWFS: /dev/${PART} - ${PARTFS}"
+ sleep 2
+ rc_halt "newfs -U /dev/${PART}${EXT}"
+ sleep 2
+ rc_halt "sync"
+ rc_halt "glabel label ${PARTLABEL} /dev/${PART}${EXT}"
+ rc_halt "sync"
+ # Set flag that we've found a boot partition
+ if [ "$PARTMNT" = "/boot" -o "${PARTMNT}" = "/" ] ; then
+ HAVEBOOT="YES"
+ fi
+ sleep 2
+ ;;
+ UFS+J) echo_log "NEWFS: /dev/${PART} - ${PARTFS}"
+ sleep 2
+ rc_halt "newfs /dev/${PART}${EXT}"
+ sleep 2
+ rc_halt "gjournal label -f /dev/${PART}${EXT}"
+ sleep 2
+ rc_halt "newfs -O 2 -J /dev/${PART}${EXT}.journal"
+ sleep 2
+ rc_halt "sync"
+ rc_halt "glabel label ${PARTLABEL} /dev/${PART}${EXT}.journal"
+ rc_halt "sync"
+ # Set flag that we've found a boot partition
+ if [ "$PARTMNT" = "/boot" -o "${PARTMNT}" = "/" ] ; then
+ HAVEBOOT="YES"
+ fi
+ sleep 2
+ ;;
+ ZFS) echo_log "NEWFS: /dev/${PART} - ${PARTFS}"
+ setup_zfs_filesystem "${PART}" "${PARTFS}" "${PARTMNT}" "${EXT}" "${PARTGEOM}" "${PARTXTRAOPTS}"
+ ;;
+ SWAP) rc_halt "sync"
+ rc_halt "glabel label ${PARTLABEL} /dev/${PART}${EXT}"
+ rc_halt "sync"
+ sleep 2
+ ;;
+ *) exit_err "ERROR: Got unknown file-system type $PARTFS" ;;
+ esac
+
+ done
+};
diff --git a/usr/sbin/pc-sysinstall/backend/functions-packages.sh b/usr/sbin/pc-sysinstall/backend/functions-packages.sh
new file mode 100644
index 0000000..4166f9e
--- /dev/null
+++ b/usr/sbin/pc-sysinstall/backend/functions-packages.sh
@@ -0,0 +1,148 @@
+#!/bin/sh
+#-
+# Copyright (c) 2010 iXsystems, Inc. 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: src/usr.sbin/pc-sysinstall/backend/functions-packages.sh,v 1.1 2010/07/13 23:47:12 imp Exp $
+
+# Functions which runs commands on the system
+
+. ${BACKEND}/functions.sh
+. ${BACKEND}/functions-parse.sh
+. ${BACKEND}/functions-ftp.sh
+
+
+get_package_index()
+{
+ FTP_SERVER="${1}"
+ FTP_DIR="ftp://${FTP_SERVER}/pub/FreeBSD/releases/${FBSD_ARCH}/${FBSD_BRANCH}/packages"
+ INDEX_FILE="INDEX"
+ USE_BZIP2=0
+
+ if [ -f "/usr/bin/bzip2" ]
+ then
+ INDEX_FILE="${INDEX_FILE}.bz2"
+ USE_BZIP2=1
+ fi
+
+ ftp "${FTP_DIR}/${INDEX_FILE}"
+ if [ -f "${INDEX_FILE}" ]
+ then
+ if [ "${USE_BZIP2}" -eq "1" ]
+ then
+ bzip2 -d "${INDEX_FILE}"
+ INDEX_FILE="${INDEX_FILE%.bz2}"
+ fi
+
+ mv "${INDEX_FILE}" "${PKGDIR}"
+ fi
+}
+
+parse_package_index()
+{
+ INDEX_FILE="${PKGDIR}/INDEX"
+
+ exec 3<&0
+ exec 0<"${INDEX_FILE}"
+
+ while read -r line
+ do
+ CATEGORY=""
+ PACKAGE=""
+ DESC=""
+ i=0
+
+ SAVE_IFS="${IFS}"
+ IFS="|"
+
+ for part in ${line}
+ do
+ if [ "${i}" -eq "1" ]
+ then
+ PACKAGE=`basename "${part}"`
+
+ elif [ "${i}" -eq "3" ]
+ then
+ DESC="${part}"
+
+ elif [ "${i}" -eq "6" ]
+ then
+ CATEGORY=`echo "${part}" | cut -f1 -d' '`
+ fi
+
+ i=$((i+1))
+ done
+
+ echo "${CATEGORY}|${PACKAGE}|${DESC}" >> "${INDEX_FILE}.parsed"
+ IFS="${SAVE_IFS}"
+ done
+
+ exec 0<&3
+}
+
+show_package_file()
+{
+ PKGFILE="${1}"
+
+ exec 3<&0
+ exec 0<"${PKGFILE}"
+
+ while read -r line
+ do
+ CATEGORY=`echo "${line}" | cut -f1 -d'|'`
+ PACKAGE=`echo "${line}" | cut -f2 -d'|'`
+ DESC=`echo "${line}" | cut -f3 -d'|'`
+
+ echo "${CATEGORY}/${PACKAGE}:${DESC}"
+ done
+
+ exec 0<&3
+}
+
+show_packages_by_category()
+{
+ CATEGORY="${1}"
+ INDEX_FILE="${PKGDIR}/INDEX.parsed"
+ TMPFILE="/tmp/.pkg.cat"
+
+ grep "^${CATEGORY}|" "${INDEX_FILE}" > "${TMPFILE}"
+ show_package_file "${TMPFILE}"
+ rm "${TMPFILE}"
+}
+
+show_package_by_name()
+{
+ CATEGORY="${1}"
+ PACKAGE="${2}"
+ INDEX_FILE="${PKGDIR}/INDEX.parsed"
+ TMPFILE="/tmp/.pkg.cat.pak"
+
+ grep "^${CATEGORY}|${PACKAGE}" "${INDEX_FILE}" > "${TMPFILE}"
+ show_package_file "${TMPFILE}"
+ rm "${TMPFILE}"
+}
+
+show_packages()
+{
+ show_package_file "${PKGDIR}/INDEX.parsed"
+}
diff --git a/usr/sbin/pc-sysinstall/backend/functions-parse.sh b/usr/sbin/pc-sysinstall/backend/functions-parse.sh
new file mode 100644
index 0000000..a9453cc
--- /dev/null
+++ b/usr/sbin/pc-sysinstall/backend/functions-parse.sh
@@ -0,0 +1,231 @@
+#!/bin/sh
+#-
+# Copyright (c) 2010 iXsystems, Inc. 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: src/usr.sbin/pc-sysinstall/backend/functions-parse.sh,v 1.2 2010/06/27 16:46:11 imp Exp $
+
+# functions.sh
+# Library of functions which pc-sysinstall may call upon for parsing the config
+
+# which gets the value of a setting in the provided line
+get_value_from_string()
+{
+ if [ ! -z "${1}" ]
+ then
+ VAL="`echo ${1} | cut -d '=' -f 2`"
+ export VAL
+ else
+ echo "Error: Did we forgot to supply a string to parse?"
+ exit 1
+ fi
+};
+
+# Get the value from the cfg file including spaces
+get_value_from_cfg_with_spaces()
+{
+ if [ ! -z "${1}" ]
+ then
+ VAL=`grep "^${1}=" ${CFGF} | head -n 1 | cut -d '=' -f 2`
+ export VAL
+ else
+ exit_err "Error: Did we forgot to supply a setting to grab?"
+ fi
+};
+
+
+# Get the value from the cfg file
+get_value_from_cfg()
+{
+ if [ ! -z "${1}" ]
+ then
+ VAL=`grep "^${1}=" ${CFGF} | head -n 1 | cut -d '=' -f 2 | tr -d ' '`
+ export VAL
+ else
+ exit_err "Error: Did we forgot to supply a setting to grab?"
+ fi
+};
+
+# Checks the value of a setting in the provided line with supplied possibilities
+# 1 = setting we are checking, 2 = list of valid values
+if_check_value_exists()
+{
+ if [ ! -z "${1}" -a ! -z "${2}" ]
+ then
+ # Get the first occurance of the setting from the config, strip out whitespace
+
+ VAL=`grep "^${1}" ${CFGF} | head -n 1 | cut -d '=' -f 2 | tr -d ' '`
+ if [ -z "${VAL}" ]
+ then
+ # This value doesn't exist, lets return
+ return 0
+ fi
+
+
+ VALID="1"
+ for i in ${2}
+ do
+ if [ "$VAL" = "${i}" ]
+ then
+ VALID="0"
+ fi
+ done
+ if [ "$VALID" = "1" ]
+ then
+ exit_err "Error: ${1} is set to unknown value $VAL"
+ fi
+ else
+ exit_err "Error: Did we forgot to supply a string to parse and setting to grab?"
+ fi
+};
+
+# Checks the value of a setting in the provided line with supplied possibilities
+# 1 = setting we are checking, 2 = list of valid values
+check_value()
+{
+ if [ ! -z "${1}" -a ! -z "${2}" ]
+ then
+ # Get the first occurance of the setting from the config, strip out whitespace
+ VAL=`grep "^${1}" ${CFGF} | head -n 1 | cut -d '=' -f 2 | tr -d ' '`
+ VALID="1"
+ for i in ${2}
+ do
+ if [ "$VAL" = "${i}" ]
+ then
+ VALID="0"
+ fi
+ done
+ if [ "$VALID" = "1" ]
+ then
+ exit_err "Error: ${1} is set to unknown value $VAL"
+ fi
+ else
+ exit_err "Error: Did we forgot to supply a string to parse and setting to grab?"
+ fi
+};
+
+# Checks for the presense of the supplied arguements in the config file
+# 1 = values to confirm exist
+file_sanity_check()
+{
+ if [ ! -z "$CFGF" -a ! -z "$1" ]
+ then
+ for i in $1
+ do
+ grep "^${i}=" $CFGF >/dev/null 2>/dev/null
+ if [ "$?" = "0" ]
+ then
+ LN=`grep "^${i}=" ${CFGF} | head -n 1 | cut -d '=' -f 2 | tr -d ' '`
+ if [ -z "${LN}" ]
+ then
+ echo "Error: Config fails sanity test! ${i}= is empty"
+ exit 1
+ fi
+ else
+ echo "Error: Config fails sanity test! Missing ${i}="
+ exit 1
+ fi
+ done
+ else
+ echo "Error: Missing config file, and / or values to sanity check for!"
+ exit 1
+ fi
+};
+
+
+# Function which merges the contents of a new config into the specified old one
+# Only works with <val>= type configurations
+merge_config()
+{
+ OLDCFG="${1}"
+ NEWCFG="${2}"
+ FINALCFG="${3}"
+
+ # Copy our oldcfg to the new one, which will be used as basis
+ cp ${OLDCFG} ${FINALCFG}
+
+ # Remove blank lines from new file
+ cat ${NEWCFG} | sed '/^$/d' > ${FINALCFG}.tmp
+
+ # Set our marker if we've found any
+ FOUNDMERGE="NO"
+
+ while read newline
+ do
+ echo ${newline} | grep "^#" >/dev/null 2>/dev/null
+ if [ "$?" != "0" ] ; then
+ VAL="`echo ${newline} | cut -d '=' -f 1`"
+ cat ${OLDCFG} | grep ${VAL} >/dev/null 2>/dev/null
+ if [ "$?" != "0" ] ; then
+ if [ "${FOUNDMERGE}" = "NO" ] ; then
+ echo "" >> ${FINALCFG}
+ echo "# Auto-merged values from newer ${NEWCFG}" >> ${FINALCFG}
+ FOUNDMERGE="YES"
+ fi
+ echo "${newline}" >> ${FINALCFG}
+ fi
+ fi
+ done < ${FINALCFG}.tmp
+ rm ${FINALCFG}.tmp
+
+};
+
+# Loop to check for a specified mount-point in a list
+check_for_mount()
+{
+ MNTS="${1}"
+ FINDMNT="${2}"
+
+ # Check if we found a valid root partition
+ for CHECKMNT in `echo ${MNTS} | sed 's|,| |g'`
+ do
+ if [ "${CHECKMNT}" = "${FINDMNT}" ] ; then
+ return 0
+ fi
+ done
+
+ return 1
+};
+
+# Function which returns the next line in the specified config file
+get_next_cfg_line()
+{
+ CURFILE="$1"
+ CURLINE="$2"
+
+ FOUND="1"
+
+ while read line
+ do
+ if [ "$FOUND" = "0" ] ; then
+ VAL="$line" ; export VAL
+ return
+ fi
+ if [ "$line" = "${CURLINE}" ] ; then
+ FOUND="0"
+ fi
+ done <${CURFILE}
+
+ # Got here, couldn't find this line or at end of file, set VAL to ""
+ VAL="" ; export VAL
+};
diff --git a/usr/sbin/pc-sysinstall/backend/functions-runcommands.sh b/usr/sbin/pc-sysinstall/backend/functions-runcommands.sh
new file mode 100644
index 0000000..daa8e6d
--- /dev/null
+++ b/usr/sbin/pc-sysinstall/backend/functions-runcommands.sh
@@ -0,0 +1,102 @@
+#!/bin/sh
+#-
+# Copyright (c) 2010 iXsystems, Inc. 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: src/usr.sbin/pc-sysinstall/backend/functions-runcommands.sh,v 1.2 2010/06/27 16:46:11 imp Exp $
+
+# Functions which runs commands on the system
+
+. ${BACKEND}/functions.sh
+. ${BACKEND}/functions-parse.sh
+
+run_chroot_cmd()
+{
+ CMD="$@"
+ echo_log "Running chroot command: ${CMD}"
+ echo "$CMD" >${FSMNT}/.runcmd.sh
+ chmod 755 ${FSMNT}/.runcmd.sh
+ chroot ${FSMNT} sh /.runcmd.sh
+ rm ${FSMNT}/.runcmd.sh
+};
+
+run_chroot_script()
+{
+ SCRIPT="$@"
+ SBASE=`basename $SCRIPT`
+
+ cp ${SCRIPT} ${FSMNT}/.$SBASE
+ chmod 755 ${FSMNT}/.${SBASE}
+
+ echo_log "Running chroot script: ${SCRIPT}"
+ chroot ${FSMNT} /.${SBASE}
+
+ rm ${FSMNT}/.${SBASE}
+};
+
+
+run_ext_cmd()
+{
+ CMD="$@"
+ # Make sure to export FSMNT, in case cmd needs it
+ export FSMNT
+ echo_log "Running external command: ${CMD}"
+ echo "${CMD}"> ${TMPDIR}/.runcmd.sh
+ chmod 755 ${TMPDIR}/.runcmd.sh
+ sh ${TMPDIR}/.runcmd.sh
+ rm ${TMPDIR}/.runcmd.sh
+};
+
+
+# Starts the user setup
+run_commands()
+{
+ while read line
+ do
+ # Check if we need to run any chroot command
+ echo $line | grep ^runCommand= >/dev/null 2>/dev/null
+ if [ "$?" = "0" ]
+ then
+ get_value_from_string "$line"
+ run_chroot_cmd "$VAL"
+ fi
+
+ # Check if we need to run any chroot script
+ echo $line | grep ^runScript= >/dev/null 2>/dev/null
+ if [ "$?" = "0" ]
+ then
+ get_value_from_string "$line"
+ run_chroot_script "$VAL"
+ fi
+
+ # Check if we need to run any chroot command
+ echo $line | grep ^runExtCommand= >/dev/null 2>/dev/null
+ if [ "$?" = "0" ]
+ then
+ get_value_from_string "$line"
+ run_ext_cmd "$VAL"
+ fi
+
+ done <${CFGF}
+
+};
diff --git a/usr/sbin/pc-sysinstall/backend/functions-unmount.sh b/usr/sbin/pc-sysinstall/backend/functions-unmount.sh
new file mode 100644
index 0000000..dda328f
--- /dev/null
+++ b/usr/sbin/pc-sysinstall/backend/functions-unmount.sh
@@ -0,0 +1,206 @@
+#!/bin/sh
+#-
+# Copyright (c) 2010 iXsystems, Inc. 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: src/usr.sbin/pc-sysinstall/backend/functions-unmount.sh,v 1.2 2010/06/27 16:46:11 imp Exp $
+
+# Functions which unmount all mounted disk filesystems
+
+# Unmount all mounted partitions under specified dir
+umount_all_dir() {
+ _udir="$1"
+ _umntdirs=`mount | sort -r | grep "on $_udir" | cut -d ' ' -f 3`
+ for _ud in $_umntdirs
+ do
+ umount -f ${_ud}
+ done
+}
+
+# Script that adds our gmirror devices for syncing
+start_gmirror_sync()
+{
+
+ cd ${MIRRORCFGDIR}
+ for DISK in `ls *`
+ do
+ MIRRORDISK="`cat ${DISK} | cut -d ':' -f 1`"
+ MIRRORBAL="`cat ${DISK} | cut -d ':' -f 2`"
+ MIRRORNAME="`cat ${DISK} | cut -d ':' -f 3`"
+
+ # Start the mirroring service
+ rc_halt "gmirror insert ${MIRRORNAME} /dev/${MIRRORDISK}"
+
+ done
+
+};
+
+# Unmounts all our mounted file-systems
+unmount_all_filesystems()
+{
+ # Copy the logfile to disk before we unmount
+ cp ${LOGOUT} ${FSMNT}/root/pc-sysinstall.log
+ cd /
+
+ # Start by unmounting any ZFS partitions
+ zfs_cleanup_unmount
+
+ # Lets read our partition list, and unmount each
+ ##################################################################
+ for PART in `ls ${PARTDIR}`
+ do
+
+ PARTFS="`cat ${PARTDIR}/${PART} | cut -d ':' -f 1`"
+ PARTMNT="`cat ${PARTDIR}/${PART} | cut -d ':' -f 2`"
+ PARTENC="`cat ${PARTDIR}/${PART} | cut -d ':' -f 3`"
+ PARTLABEL="`cat ${PARTDIR}/${PART} | cut -d ':' -f 4`"
+
+ if [ "${PARTENC}" = "ON" ]
+ then
+ EXT=".eli"
+ else
+ EXT=""
+ fi
+
+ #if [ "${PARTFS}" = "SWAP" ]
+ #then
+ # rc_nohalt "swapoff /dev/${PART}${EXT}"
+ #fi
+
+ # Check if we've found "/", and unmount that last
+ if [ "$PARTMNT" != "/" -a "${PARTMNT}" != "none" -a "${PARTFS}" != "ZFS" ]
+ then
+ #rc_halt "umount -f /dev/${PART}${EXT}"
+
+ # Re-check if we are missing a label for this device and create it again if so
+ if [ ! -e "/dev/label/${PARTLABEL}" ]
+ then
+ case ${PARTFS} in
+ UFS) glabel label ${PARTLABEL} /dev/${PART}${EXT} ;;
+ UFS+S) glabel label ${PARTLABEL} /dev/${PART}${EXT} ;;
+ UFS+J) glabel label ${PARTLABEL} /dev/${PART}${EXT}.journal ;;
+ *) ;;
+ esac
+ fi
+ fi
+
+ # Check if we've found "/" and make sure the label exists
+ if [ "$PARTMNT" = "/" -a "${PARTFS}" != "ZFS" ]
+ then
+ if [ ! -e "/dev/label/${PARTLABEL}" ]
+ then
+ case ${PARTFS} in
+ UFS) ROOTRELABEL="glabel label ${PARTLABEL} /dev/${PART}${EXT}" ;;
+ UFS+S) ROOTRELABEL="glabel label ${PARTLABEL} /dev/${PART}${EXT}" ;;
+ UFS+J) ROOTRELABEL="glabel label ${PARTLABEL} /dev/${PART}${EXT}.journal" ;;
+ *) ;;
+ esac
+ fi
+ fi
+ done
+
+ # Last lets the /mnt partition
+ #########################################################
+ #rc_nohalt "umount -f ${FSMNT}"
+
+ # If are using a ZFS on "/" set it to legacy
+ if [ ! -z "${FOUNDZFSROOT}" ]
+ then
+ rc_halt "zfs set mountpoint=legacy ${FOUNDZFSROOT}"
+ fi
+
+ # If we need to relabel "/" do it now
+ if [ ! -z "${ROOTRELABEL}" ]
+ then
+ ${ROOTRELABEL}
+ fi
+
+ # Unmount our CDMNT
+ #rc_nohalt "umount -f ${CDMNT}" >/dev/null 2>/dev/null
+
+ # Check if we need to run any gmirror syncing
+ ls ${MIRRORCFGDIR}/* >/dev/null 2>/dev/null
+ if [ "$?" = "0" ]
+ then
+ # Lets start syncing now
+ start_gmirror_sync
+ fi
+
+};
+
+# Unmounts any filesystems after a failure
+unmount_all_filesystems_failure()
+{
+ cd /
+
+ # if we did a fresh install, start unmounting
+ if [ "${INSTALLMODE}" = "fresh" ]
+ then
+
+ # Lets read our partition list, and unmount each
+ ##################################################################
+ if [ -d "${PARTDIR}" ]
+ then
+ for PART in `ls ${PARTDIR}`
+ do
+
+ PARTFS="`cat ${PARTDIR}/${PART} | cut -d ':' -f 1`"
+ PARTMNT="`cat ${PARTDIR}/${PART} | cut -d ':' -f 2`"
+ PARTENC="`cat ${PARTDIR}/${PART} | cut -d ':' -f 3`"
+
+ #if [ "${PARTFS}" = "SWAP" ]
+ #then
+ # if [ "${PARTENC}" = "ON" ]
+ # then
+ # rc_nohalt "swapoff /dev/${PART}.eli"
+ # else
+ # rc_nohalt "swapoff /dev/${PART}"
+ # fi
+ #fi
+
+ # Check if we've found "/" again, don't need to mount it twice
+ if [ "$PARTMNT" != "/" -a "${PARTMNT}" != "none" -a "${PARTFS}" != "ZFS" ]
+ then
+ #rc_nohalt "umount -f /dev/${PART}"
+ #rc_nohalt "umount -f ${FSMNT}${PARTMNT}"
+ fi
+ done
+
+ # Last lets the /mnt partition
+ #########################################################
+ #rc_nohalt "umount -f ${FSMNT}"
+
+ fi
+ else
+ # We are doing a upgrade, try unmounting any of these filesystems
+ chroot ${FSMNT} /sbin/umount -a >>${LOGOUT} >>${LOGOUT}
+ umount -f ${FSMNT}/usr >>${LOGOUT} 2>>${LOGOUT}
+ umount -f ${FSMNT}/dev >>${LOGOUT} 2>>${LOGOUT}
+ umount -f ${FSMNT} >>${LOGOUT} 2>>${LOGOUT}
+ rc_nohalt "sh ${TMPDIR}/.upgrade-unmount"
+ fi
+
+ # Unmount our CDMNT
+ #rc_nohalt "umount ${CDMNT}"
+
+};
diff --git a/usr/sbin/pc-sysinstall/backend/functions-upgrade.sh b/usr/sbin/pc-sysinstall/backend/functions-upgrade.sh
new file mode 100644
index 0000000..bf9e704
--- /dev/null
+++ b/usr/sbin/pc-sysinstall/backend/functions-upgrade.sh
@@ -0,0 +1,247 @@
+#!/bin/sh
+#-
+# Copyright (c) 2010 iXsystems, Inc. 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: src/usr.sbin/pc-sysinstall/backend/functions-upgrade.sh,v 1.2 2010/06/27 16:46:11 imp Exp $
+
+# Functions which perform the mounting / unmount for upgrades
+
+. ${PROGDIR}/backend/functions-unmount.sh
+
+mount_target_slice()
+{
+ MPART="${1}"
+
+ # Import any zpools
+ zpool import -o altroot=${FSMNT} -a
+ umount_all_dir "${FSMNT}"
+
+ # Set a variable of files we want to make backups of before doing upgrade
+ BKFILES="/etc/rc.conf /boot/loader.conf"
+
+ if [ -e "/dev/${MPART}" ] ; then
+ rc_nohalt "mount /dev/${MPART} ${FSMNT}"
+ if [ "$?" != "0" ] ; then
+ # Check if we have ZFS tank name
+ rc_halt "mount -t zfs ${MPART} ${FSMNT}"
+ fi
+ else
+ # Check if we have ZFS tank name
+ rc_halt "mount -t zfs ${MPART} ${FSMNT}"
+ fi
+
+ # Mount devfs in chroot
+ mount -t devfs devfs ${FSMNT}/dev
+
+ # Check if we have any ZFS partitions to mount
+ zfs mount -a
+
+ # Mount all the fstab goodies on disk
+ chroot ${FSMNT} /sbin/mount -a >>${LOGOUT} 2>>${LOGOUT}
+ chroot ${FSMNT} umount /proc >/dev/null 2>/dev/null
+ chroot ${FSMNT} umount /compat/linux/proc >/dev/null 2>/dev/null
+
+ # Now before we start the upgrade, make sure we set our noschg flags
+ echo_log "Cleaning up old filesystem... Please wait..."
+ rc_halt "chflags -R noschg ${FSMNT}"
+
+ # Make backup copies of some files
+ for i in ${BKFILES}
+ do
+ cp ${FSMNT}${i} ${FSMNT}${i}.preUpgrade >/dev/null 2>/dev/null
+ done
+
+ # Remove some old dirs
+ rm -rf ${FSMNT}/etc/rc.d >/dev/null 2>/dev/null
+
+ # If we are doing PC-BSD install, lets cleanup old pkgs on disk
+ if [ "$INSTALLTYPE" != "FreeBSD" ]
+ then
+ echo_log "Removing old packages, this may take a while... Please wait..."
+ echo '#/bin/sh
+for i in `pkg_info -E \*`
+do
+ echo "Uninstalling package: ${i}"
+ pkg_delete -f ${i} >/dev/null 2>/dev/null
+done
+' >${FSMNT}/.cleanPkgs.sh
+ chmod 755 ${FSMNT}/.cleanPkgs.sh
+ chroot ${FSMNT} /.cleanPkgs.sh
+ rm ${FSMNT}/.cleanPkgs.sh
+ run_chroot_cmd "pkg_delete -f \*" >/dev/null 2>/dev/null
+ run_chroot_cmd "rm -rf /usr/PCBSD" >/dev/null 2>/dev/null
+ run_chroot_cmd "rm -rf /PCBSD" >/dev/null 2>/dev/null
+ run_chroot_cmd "rm -rf /var/db/pkgs" >/dev/null 2>/dev/null
+ run_chroot_cmd "rm -rf /usr/local32" >/dev/null 2>/dev/null
+ run_chroot_cmd "rm -rf /usr/sbin" >/dev/null 2>/dev/null
+ run_chroot_cmd "rm -rf /usr/lib" >/dev/null 2>/dev/null
+ run_chroot_cmd "rm -rf /usr/bin" >/dev/null 2>/dev/null
+ run_chroot_cmd "rm -rf /boot/kernel" >/dev/null 2>/dev/null
+ run_chroot_cmd "rm -rf /sbin" >/dev/null 2>/dev/null
+ run_chroot_cmd "rm -rf /bin" >/dev/null 2>/dev/null
+ run_chroot_cmd "rm -rf /lib" >/dev/null 2>/dev/null
+ run_chroot_cmd "rm -rf /libexec" >/dev/null 2>/dev/null
+ fi
+
+}
+
+# Mount the target upgrade partitions
+mount_upgrade()
+{
+
+ # Make sure we remove the old upgrade-mount script
+ rm -rf ${TMPDIR}/.upgrade-unmount >/dev/null 2>/dev/null
+
+ # We are ready to start mounting, lets read the config and do it
+ while read line
+ do
+ echo $line | grep "^disk0=" >/dev/null 2>/dev/null
+ if [ "$?" = "0" ]
+ then
+
+ # Found a disk= entry, lets get the disk we are working on
+ get_value_from_string "${line}"
+ strip_white_space "$VAL"
+ DISK="$VAL"
+ fi
+
+ echo $line | grep "^commitDiskPart" >/dev/null 2>/dev/null
+ if [ "$?" = "0" ]
+ then
+ # Found our flag to commit this disk setup / lets do sanity check and do it
+ if [ ! -z "${DISK}" ]
+ then
+
+ # Start mounting this slice
+ mount_target_slice "${DISK}"
+
+ # Increment our disk counter to look for next disk and unset
+ unset DISK
+ break
+ else
+ exit_err "ERROR: commitDiskPart was called without procceding disk<num>= and partition= entries!!!"
+ fi
+ fi
+
+ done <${CFGF}
+
+};
+
+copy_skel_files_upgrade()
+{
+
+ # Now make sure we fix any user profile scripts, which cause problems from 7.x->8.x
+ echo '#!/bin/sh
+
+cd /home
+for i in `ls`
+do
+
+ # Backup the old profile dirs
+ if [ -d "${i}" ]
+ then
+ mv /home/${i}/.kde4 /home/${i}/.kde4.preUpgrade >/dev/null 2>/dev/null
+ mv /home/${i}/.kde /home/${i}/.kde.preUpgrade >/dev/null 2>/dev/null
+ mv /home/${i}/.fluxbox /home/${i}/.fluxbox.preUpgrade >/dev/null 2>/dev/null
+
+ # Copy over the skel directories
+ tar cv --exclude "./dot.*" -f - -C /usr/share/skel . 2>/dev/null | tar xvf - -C /home/${i} 2>/dev/null
+
+ for j in `ls /usr/share/skel/dot*`
+ do
+ dname=`echo ${j} | sed s/dot//`
+ cp /usr/share/skel/${j} /home/${i}/${dname}
+ done
+
+ chown -R ${i}:${i} /home/${i}
+ fi
+
+done
+' >${FSMNT}/.fixUserProfile.sh
+ chmod 755 ${FSMNT}/.fixUserProfile.sh
+ chroot ${FSMNT} /.fixUserProfile.sh >/dev/null 2>/dev/null
+ rm ${FSMNT}/.fixUserProfile.sh
+
+
+
+ # if the user wants to keep their original .kde4 profile
+ ###########################################################################
+ get_value_from_cfg "upgradeKeepDesktopProfile"
+ if [ "$VAL" = "YES" -o "$VAL" = "yes" ] ; then
+ echo '#!/bin/sh
+ cd /home
+for i in `ls`
+do
+ # Import the old config again
+ if [ -d "${i}/.kde4.preUpgrade" ]
+ then
+ # Copy over the skel directories
+ tar cv -f - -C /home/${i}/.kde4.preUpgrade . 2>/dev/null | tar xvf - -C /home/${i}/.kde4 2>/dev/null
+ chown -R ${i}:${i} /home/${i}/.kde4
+ fi
+done
+' >${FSMNT}/.fixUserProfile.sh
+ chmod 755 ${FSMNT}/.fixUserProfile.sh
+ chroot ${FSMNT} /.fixUserProfile.sh >/dev/null 2>/dev/null
+ rm ${FSMNT}/.fixUserProfile.sh
+
+ fi
+
+};
+
+# Function which merges some configuration files with the new defaults
+merge_old_configs()
+{
+
+ # Merge the loader.conf with old
+ cp ${FSMNT}/boot/loader.conf ${FSMNT}/boot/loader.conf.new
+ merge_config "${FSMNT}/boot/loader.conf.preUpgrade" "${FSMNT}/boot/loader.conf.new" "${FSMNT}/boot/loader.conf"
+ rm ${FSMNT}/boot/loader.conf.new
+
+ # Merge the rc.conf with old
+ cp ${FSMNT}/etc/rc.conf ${FSMNT}/etc/rc.conf.new
+ merge_config "${FSMNT}/etc/rc.conf.preUpgrade" "${FSMNT}/etc/rc.conf.new" "${FSMNT}/etc/rc.conf"
+ rm ${FSMNT}/etc/rc.conf.new
+
+};
+
+# Function which unmounts all the mounted file-systems
+unmount_upgrade()
+{
+
+ # If on PC-BSD, make sure we copy any fixed skel files
+ if [ "$INSTALLTYPE" != "FreeBSD" ] ; then
+ copy_skel_files_upgrade
+ fi
+
+ cd /
+
+ # Unmount FS
+ umount_all_dir "${FSMNT}"
+
+ # Run our saved unmount script for these file-systems
+ rc_nohalt "umount -f ${FSMNT}"
+
+ umount ${CDMNT}
+};
diff --git a/usr/sbin/pc-sysinstall/backend/functions-users.sh b/usr/sbin/pc-sysinstall/backend/functions-users.sh
new file mode 100644
index 0000000..0c66279
--- /dev/null
+++ b/usr/sbin/pc-sysinstall/backend/functions-users.sh
@@ -0,0 +1,175 @@
+#!/bin/sh
+#-
+# Copyright (c) 2010 iXsystems, Inc. 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: src/usr.sbin/pc-sysinstall/backend/functions-users.sh,v 1.2 2010/06/27 16:46:11 imp Exp $
+
+# Functions which runs commands on the system
+
+. ${BACKEND}/functions.sh
+. ${BACKEND}/functions-parse.sh
+
+
+# Function which checks and sets up auto-login for a user if specified
+check_autologin()
+{
+ get_value_from_cfg autoLoginUser
+ if [ ! -z "${VAL}" -a "${INSTALLTYPE}" = "PCBSD" ]
+ then
+ AUTOU="${VAL}"
+ # Add the auto-login user line
+ sed -i.bak "s/AutoLoginUser=/AutoLoginUser=${AUTOU}/g" ${FSMNT}/usr/local/kde4/share/config/kdm/kdmrc
+
+ # Add the auto-login user line
+ sed -i.bak "s/AutoLoginEnable=false/AutoLoginEnable=true/g" ${FSMNT}/usr/local/kde4/share/config/kdm/kdmrc
+
+ fi
+};
+
+# Function which actually runs the adduser command on the filesystem
+add_user()
+{
+ ARGS="${1}"
+
+ if [ -e "${FSMNT}/.tmpPass" ]
+ then
+ # Add a user with a supplied password
+ run_chroot_cmd "cat /.tmpPass | pw useradd ${ARGS}"
+ rc_halt "rm ${FSMNT}/.tmpPass"
+ else
+ # Add a user with no password
+ run_chroot_cmd "cat /.tmpPass | pw useradd ${ARGS}"
+ fi
+
+};
+
+# Function which reads in the config, and adds any users specified
+setup_users()
+{
+
+ # We are ready to start setting up the users, lets read the config
+ while read line
+ do
+
+ echo $line | grep "^userName=" >/dev/null 2>/dev/null
+ if [ "$?" = "0" ]
+ then
+ get_value_from_string "${line}"
+ USERNAME="$VAL"
+ fi
+
+ echo $line | grep "^userComment=" >/dev/null 2>/dev/null
+ if [ "$?" = "0" ]
+ then
+ get_value_from_string "${line}"
+ USERCOMMENT="$VAL"
+ fi
+
+ echo $line | grep "^userPass=" >/dev/null 2>/dev/null
+ if [ "$?" = "0" ]
+ then
+ get_value_from_string "${line}"
+ USERPASS="$VAL"
+ fi
+
+ echo $line | grep "^userShell=" >/dev/null 2>/dev/null
+ if [ "$?" = "0" ]
+ then
+ get_value_from_string "${line}"
+ strip_white_space "$VAL"
+ USERSHELL="$VAL"
+ fi
+
+ echo $line | grep "^userHome=" >/dev/null 2>/dev/null
+ if [ "$?" = "0" ]
+ then
+ get_value_from_string "${line}"
+ USERHOME="$VAL"
+ fi
+
+ echo $line | grep "^userGroups=" >/dev/null 2>/dev/null
+ if [ "$?" = "0" ]
+ then
+ get_value_from_string "${line}"
+ USERGROUPS="$VAL"
+ fi
+
+
+ echo $line | grep "^commitUser" >/dev/null 2>/dev/null
+ if [ "$?" = "0" ]
+ then
+ # Found our flag to commit this user, lets check and do it
+ if [ ! -z "${USERNAME}" ]
+ then
+
+ # Now add this user to the system, by building our args list
+ ARGS="-n ${USERNAME}"
+
+ if [ ! -z "${USERCOMMENT}" ]
+ then
+ ARGS="${ARGS} -c \"${USERCOMMENT}\""
+ fi
+
+ if [ ! -z "${USERPASS}" ]
+ then
+ ARGS="${ARGS} -h 0"
+ echo "${USERPASS}" >${FSMNT}/.tmpPass
+ else
+ ARGS="${ARGS} -h -"
+ rm ${FSMNT}/.tmpPass 2>/dev/null 2>/dev/null
+ fi
+
+ if [ ! -z "${USERSHELL}" ]
+ then
+ ARGS="${ARGS} -s \"${USERSHELL}\""
+ else
+ ARGS="${ARGS} -s \"/nonexistant\""
+ fi
+
+ if [ ! -z "${USERHOME}" ]
+ then
+ ARGS="${ARGS} -m -d \"${USERHOME}\""
+ fi
+
+ if [ ! -z "${USERGROUPS}" ]
+ then
+ ARGS="${ARGS} -G \"${USERGROUPS}\""
+ fi
+
+ add_user "${ARGS}"
+
+ # Unset our vars before looking for any more users
+ unset USERNAME USERCOMMENT USERPASS USERSHELL USERHOME USERGROUPS
+ else
+ exit_err "ERROR: commitUser was called without any userName= entry!!!"
+ fi
+ fi
+
+ done <${CFGF}
+
+
+ # Check if we need to enable a user to auto-login to the desktop
+ check_autologin
+
+};
diff --git a/usr/sbin/pc-sysinstall/backend/functions.sh b/usr/sbin/pc-sysinstall/backend/functions.sh
new file mode 100644
index 0000000..6221087
--- /dev/null
+++ b/usr/sbin/pc-sysinstall/backend/functions.sh
@@ -0,0 +1,284 @@
+#!/bin/sh
+#-
+# Copyright (c) 2010 iXsystems, Inc. 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: src/usr.sbin/pc-sysinstall/backend/functions.sh,v 1.2 2010/06/27 16:46:11 imp Exp $
+
+# functions.sh
+# Library of functions which pc-sysinstall may call upon
+
+# Function which displays the help-index file
+display_help()
+{
+ if [ -e "${PROGDIR}/doc/help-index" ]
+ then
+ cat ${PROGDIR}/doc/help-index
+ else
+ echo "Error: ${PROGDIR}/doc/help-index not found"
+ exit 1
+ fi
+};
+
+# Function which displays the help for a specified command
+display_command_help()
+{
+ if [ -z "$1" ]
+ then
+ echo "Error: No command specified to display help for"
+ exit 1
+ fi
+
+ if [ -e "${PROGDIR}/doc/help-${1}" ]
+ then
+ cat ${PROGDIR}/doc/help-${1}
+ else
+ echo "Error: ${PROGDIR}/doc/help-${1} not found"
+ exit 1
+ fi
+};
+
+# Function to convert bytes to megabytes
+convert_byte_to_megabyte()
+{
+ if [ -z "${1}" ]
+ then
+ echo "Error: No bytes specified!"
+ exit 1
+ fi
+
+ expr -e ${1} / 1048576
+};
+
+# Function to convert blocks to megabytes
+convert_blocks_to_megabyte()
+{
+ if [ -z "${1}" ] ; then
+ echo "Error: No blocks specified!"
+ exit 1
+ fi
+
+ expr -e ${1} / 2048
+};
+
+# Takes $1 and strips the whitespace out of it, returns VAL
+strip_white_space()
+{
+ if [ -z "${1}" ]
+ then
+ echo "Error: No value setup to strip whitespace from!"
+
+ exit 1
+ fi
+
+ VAL=`echo "$1" | tr -d ' '`
+ export VAL
+};
+
+# Displays an error message and exits with error 1
+exit_err()
+{
+ # Echo the message for the users benefit
+ echo "$1"
+
+ # Save this error to the log file
+ echo "${1}" >>$LOGOUT
+
+ # Check if we need to unmount any file-systems after this failure
+ unmount_all_filesystems_failure
+
+ echo "For more details see log file: $LOGOUT"
+
+ exit 1
+};
+
+# Run-command, don't halt if command exits with non-0
+rc_nohalt()
+{
+ CMD="$1"
+
+ if [ -z "${CMD}" ]
+ then
+ exit_err "Error: missing argument in rc_nohalt()"
+ fi
+
+ echo "Running: ${CMD}" >>${LOGOUT}
+ ${CMD} >>${LOGOUT} 2>>${LOGOUT}
+
+};
+
+# Run-command, halt if command exits with non-0
+rc_halt()
+{
+ CMD="$1"
+
+ if [ -z "${CMD}" ]
+ then
+ exit_err "Error: missing argument in rc_halt()"
+ fi
+
+ echo "Running: ${CMD}" >>${LOGOUT}
+ ${CMD} >>${LOGOUT} 2>>${LOGOUT}
+ STATUS="$?"
+ if [ "${STATUS}" != "0" ]
+ then
+ exit_err "Error ${STATUS}: ${CMD}"
+ fi
+};
+
+# Run-command w/echo to screen, halt if command exits with non-0
+rc_halt_echo()
+{
+ CMD="$1"
+
+ if [ -z "${CMD}" ]
+ then
+ exit_err "Error: missing argument in rc_halt_echo()"
+ fi
+
+ echo "Running: ${CMD}" >>${LOGOUT}
+ ${CMD} 2>&1 | tee -a ${LOGOUT}
+ STATUS="$?"
+ if [ "$STATUS" != "0" ]
+ then
+ exit_err "Error ${STATUS}: $CMD"
+ fi
+
+};
+
+# Run-command w/echo, don't halt if command exits with non-0
+rc_nohalt_echo()
+{
+ CMD="$1"
+
+ if [ -z "${CMD}" ]
+ then
+ exit_err "Error: missing argument in rc_nohalt_echo()"
+ fi
+
+ echo "Running: ${CMD}" >>${LOGOUT}
+ ${CMD} 2>&1 | tee -a ${LOGOUT}
+
+};
+
+# Echo to the screen and to the log
+echo_log()
+{
+ STR="$1"
+
+ if [ -z "${STR}" ]
+ then
+ exit_err "Error: missing argument in echo_log()"
+ fi
+
+ echo "${STR}" | tee -a ${LOGOUT}
+};
+
+# Make sure we have a numeric
+is_num() {
+ expr $1 + 1 2>/dev/null
+ return $?
+}
+
+# Function which uses "fetch" to download a file, and display a progress report
+fetch_file()
+{
+
+FETCHFILE="$1"
+FETCHOUTFILE="$2"
+EXITFAILED="$3"
+
+SIZEFILE="${TMPDIR}/.fetchSize"
+EXITFILE="${TMPDIR}/.fetchExit"
+
+rm ${SIZEFILE} 2>/dev/null >/dev/null
+rm ${FETCHOUTFILE} 2>/dev/null >/dev/null
+
+fetch -s "${FETCHFILE}" >${SIZEFILE}
+SIZE="`cat ${SIZEFILE}`"
+SIZE="`expr ${SIZE} / 1024`"
+echo "FETCH: ${FETCHFILE}"
+echo "FETCH: ${FETCHOUTFILE}" >>${LOGOUT}
+
+( fetch -o ${FETCHOUTFILE} "${FETCHFILE}" >/dev/null 2>/dev/null ; echo "$?" > ${EXITFILE} ) &
+PID="$!"
+while
+z=1
+do
+
+ if [ -e "${FETCHOUTFILE}" ]
+ then
+ DSIZE=`du -k ${FETCHOUTFILE} | tr -d '\t' | cut -d '/' -f 1`
+ if [ $(is_num "$DSIZE") ] ; then
+ if [ $SIZE -lt $DSIZE ] ; then DSIZE="$SIZE"; fi
+ echo "SIZE: ${SIZE} DOWNLOADED: ${DSIZE}"
+ echo "SIZE: ${SIZE} DOWNLOADED: ${DSIZE}" >>${LOGOUT}
+ fi
+ fi
+
+ # Check if the download is finished
+ ps -p ${PID} >/dev/null 2>/dev/null
+ if [ "$?" != "0" ]
+ then
+ break;
+ fi
+
+ sleep 2
+done
+
+echo "FETCHDONE"
+
+EXIT="`cat ${EXITFILE}`"
+if [ "${EXIT}" != "0" -a "$EXITFAILED" = "1" ]
+then
+ exit_err "Error: Failed to download ${FETCHFILE}"
+fi
+
+return $EXIT
+
+};
+
+# Function to return a the zpool name for this device
+get_zpool_name()
+{
+ DEVICE="$1"
+
+ # Set the base name we use for zpools
+ BASENAME="tank"
+
+ if [ ! -d "${TMPDIR}/.zpools" ] ; then
+ mkdir -p ${TMPDIR}/.zpools
+ fi
+
+ if [ -e "${TMPDIR}/.zpools/${DEVICE}" ] ; then
+ cat ${TMPDIR}/.zpools/${DEVICE}
+ return 0
+ else
+ # Need to generate a zpool name for this device
+ NUM=`ls ${TMPDIR}/.zpools/ | wc -l | sed 's| ||g'`
+ NEWNAME="${BASENAME}${NUM}"
+ echo "$NEWNAME" >${TMPDIR}/.zpools/${DEVICE}
+ echo "${NEWNAME}"
+ return
+ fi
+};
diff --git a/usr/sbin/pc-sysinstall/backend/parseconfig.sh b/usr/sbin/pc-sysinstall/backend/parseconfig.sh
new file mode 100644
index 0000000..7d4a800
--- /dev/null
+++ b/usr/sbin/pc-sysinstall/backend/parseconfig.sh
@@ -0,0 +1,167 @@
+#!/bin/sh
+#-
+# Copyright (c) 2010 iXsystems, Inc. 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: src/usr.sbin/pc-sysinstall/backend/parseconfig.sh,v 1.2 2010/06/27 16:46:11 imp Exp $
+
+# Main install configuration parsing script
+#
+
+# Source our functions scripts
+. ${BACKEND}/functions.sh
+. ${BACKEND}/functions-bsdlabel.sh
+. ${BACKEND}/functions-cleanup.sh
+. ${BACKEND}/functions-disk.sh
+. ${BACKEND}/functions-extractimage.sh
+. ${BACKEND}/functions-installcomponents.sh
+. ${BACKEND}/functions-localize.sh
+. ${BACKEND}/functions-mountdisk.sh
+. ${BACKEND}/functions-networking.sh
+. ${BACKEND}/functions-newfs.sh
+. ${BACKEND}/functions-parse.sh
+. ${BACKEND}/functions-runcommands.sh
+. ${BACKEND}/functions-unmount.sh
+. ${BACKEND}/functions-upgrade.sh
+. ${BACKEND}/functions-users.sh
+
+# Check that the config file exists
+if [ ! -e "${1}" ]
+then
+ echo "ERROR: Install configuration $1 does not exist!"
+ exit 1
+fi
+
+# Set our config file variable
+CFGF="$1"
+
+# Check the dirname of the provided CFGF and make sure its a full path
+DIR="`dirname ${CFGF}`"
+if [ "${DIR}" = "." ]
+then
+ CFGF="`pwd`/${CFGF}"
+fi
+export CFGF
+
+# Start by doing a sanity check, which will catch any obvious mistakes in the config
+file_sanity_check "installMode disk0 installType installMedium packageType"
+
+# We passed the Sanity check, lets grab some of the universal config settings and store them
+check_value installMode "fresh upgrade"
+check_value bootManager "bsd none"
+check_value installType "PCBSD FreeBSD"
+check_value installMedium "dvd usb ftp rsync LiveCD"
+check_value packageType "uzip tar rsync split cpdup"
+if_check_value_exists partition "all ALL s1 s2 s3 s4 free FREE"
+if_check_value_exists mirrorbal "load prefer round-robin split"
+
+# We passed all sanity checks! Yay, lets start the install
+echo "File Sanity Check -> OK"
+
+# Lets load the various universal settings now
+get_value_from_cfg installMode
+INSTALLMODE="${VAL}" ; export INSTALLMODE
+
+get_value_from_cfg installType
+INSTALLTYPE="${VAL}" ; export INSTALLTYPE
+
+get_value_from_cfg installMedium
+INSTALLMEDIUM="${VAL}" ; export INSTALLMEDIUM
+
+get_value_from_cfg packageType
+PACKAGETYPE="${VAL}" ; export PACKAGETYPE
+
+# Check if we are doing any networking setup
+start_networking
+
+# If we are not doing an upgrade, lets go ahead and setup the disk
+if [ "${INSTALLMODE}" = "fresh" ]
+then
+
+ # Lets start setting up the disk slices now
+ setup_disk_slice
+
+ # Disk setup complete, now lets parse WORKINGSLICES and setup the bsdlabels
+ setup_disk_label
+
+ # Now we've setup the bsdlabels, lets go ahead and run newfs / zfs
+ # to setup the filesystems
+ setup_filesystems
+
+ # Lets mount the partitions now
+ mount_all_filesystems
+
+ # We are ready to begin extraction, lets start now
+ init_extraction
+
+ # Check if we have any optional modules to load
+ install_components
+
+ # Do any localization in configuration
+ run_localize
+
+ # Save any networking config on the installed system
+ save_networking_install
+
+ # Now add any users
+ setup_users
+
+ # Now run any commands specified
+ run_commands
+
+ # Do any last cleanup / setup before unmounting
+ run_final_cleanup
+
+ # Unmount and finish up
+ unmount_all_filesystems
+
+ echo_log "Installation finished!"
+ exit 0
+
+else
+ # We're going to do an upgrade, skip all the disk setup
+ # and start by mounting the target drive/slices
+ mount_upgrade
+
+ # Start the extraction process
+ init_extraction
+
+ # Do any localization in configuration
+ run_localize
+
+ # Now run any commands specified
+ run_commands
+
+ # Merge any old configuration files
+ merge_old_configs
+
+ # Check if we have any optional modules to load
+ install_components
+
+ # All finished, unmount the file-systems
+ unmount_upgrade
+
+ echo_log "Upgrade finished!"
+ exit 0
+fi
+
diff --git a/usr/sbin/pc-sysinstall/backend/startautoinstall.sh b/usr/sbin/pc-sysinstall/backend/startautoinstall.sh
new file mode 100644
index 0000000..153d449
--- /dev/null
+++ b/usr/sbin/pc-sysinstall/backend/startautoinstall.sh
@@ -0,0 +1,136 @@
+#!/bin/sh
+#-
+# Copyright (c) 2010 iXsystems, Inc. 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.
+#
+# Script which reads the pc-autoinstall.conf directive, and begins the install
+#
+# $FreeBSD: src/usr.sbin/pc-sysinstall/backend/startautoinstall.sh,v 1.2 2010/06/27 16:46:11 imp Exp $
+
+# Source our functions scripts
+. ${BACKEND}/functions.sh
+. ${BACKEND}/functions-networking.sh
+. ${BACKEND}/functions-parse.sh
+
+# Check that the config file exists
+if [ ! -e "${1}" ]
+then
+ echo "ERROR: Install configuration $1 does not exist!"
+ exit 1
+fi
+
+# Set our config file variable
+CONF=${1}
+INSTALL_CFG="/tmp/pc-sysinstall.cfg"
+
+# Check if the config file is on disk as well
+PCCFG=`grep "pc_config:" ${CONF} | grep -v "^#" | sed "s|pc_config: ||g" | sed "s|pc_config:||g"`
+SHUTDOWN_CMD=`grep "shutdown_cmd:" ${CONF} | grep -v "^#" | sed "s|shutdown_cmd: ||g" | sed "s|shutdown_cmd:||g"`
+CONFIRM_INS=`grep "confirm_install:" ${CONF} | grep -v "^#" | sed "s|confirm_install: ||g" | sed "s|confirm_install:||g"`
+
+# Check that this isn't a http / ftp file we need to fetch later
+echo "${PCCFG}" | grep -e "^http" -e "^ftp" > /dev/null 2>/dev/null
+if [ "$?" != "0" ]
+then
+ # Copy over the install cfg file, if not done already
+ if [ ! -e "${INSTALL_CFG}" ]
+ then
+ cp ${PCCFG} ${INSTALL_CFG}
+ fi
+ # Make sure we have the file which was copied into /tmp previously
+ if [ ! -e "${INSTALL_CFG}" ]
+ then
+ echo "Error: ${INSTALL_CFG} is missing! Exiting in 10 seconds..."
+ sleep 10
+ exit 150
+ fi
+else
+ # We need to fetch a remote file, check and set any nic options before doing so
+ NICCFG=`grep "nic_config:" ${CONF} | grep -v "^#" | sed "s|nic_config: ||g" | sed "s|nic_config:||g"`
+ if [ "${NICCFG}" = "dhcp-all" -o "${NICCFG}" = "DHCP-ALL" ]
+ then
+ # Try to auto-enable dhcp on any nics we find
+ enable_auto_dhcp
+ else
+ echo "Running command \"ifconfig ${NICCFG}\""
+ ifconfig ${NICCFG}
+ WRKNIC="`echo ${NICCFG} | cut -d ' ' -f 1`"
+ NICDNS=`grep "nic_dns:" ${CONF} | grep -v "^#" | sed "s|nic_dns: ||g" | sed "s|nic_dns:||g"`
+ NICGATE=`grep "nic_gateway:" ${CONF} | grep -v "^#" | sed "s|nic_gateway: ||g" | sed "s|nic_gateway:||g"`
+
+ echo "nameserver ${NICDNS}" >/etc/resolv.conf
+
+ echo "Running command \"route add default ${NICGATE}\""
+ route add default ${NICGATE}
+ fi
+
+ get_nic_mac "$WRKNIC"
+ nic_mac="${FOUNDMAC}"
+
+ PCCFG=`echo ${PCCFG} | sed "s|%%NIC_MAC%%|${nic_mac}|g"`
+
+ # Now try to fetch the remove file
+ echo "Fetching cfg with: \"fetch -o ${INSTALL_CFG} ${PCCFG}\""
+ fetch -o "${INSTALL_CFG}" "${PCCFG}"
+ if [ "$?" != "0" ]
+ then
+ echo "ERROR: Failed to fetch ${PCCFG}, install aborted"
+ exit 150
+ fi
+
+fi
+
+# If we end up with a valid config, lets proccede
+if [ -e "${INSTALL_CFG}" ]
+then
+
+ if [ "${CONFIRM_INS}" != "no" -a "${CONFIRM_INS}" != "NO" ]
+ then
+ echo "Type in 'install' to begin automated installation. Warning: Data on target disks may be destroyed!"
+ read tmp
+ case $tmp in
+ install|INSTALL) ;;
+ *) echo "Install canceled!" ; exit 150 ;;
+ esac
+ fi
+
+ ${PROGDIR}/pc-sysinstall -c ${INSTALL_CFG}
+ if [ "$?" = "0" ]
+ then
+ if [ ! -z "$SHUTDOWN_CMD" ]
+ then
+ ${SHUTDOWN_CMD}
+ else
+ echo "SUCCESS: Installation finished! Press ENTER to reboot."
+ read tmp
+ shutdown -r now
+ fi
+ else
+ echo "ERROR: Installation failed, press ENTER to drop to shell."
+ read tmp
+ /bin/csh
+ fi
+else
+ echo "ERROR: Failed to get /tmp/pc-sysinstall.cfg for automated install..."
+ exit 150
+fi
OpenPOWER on IntegriCloud