diff options
author | imp <imp@FreeBSD.org> | 2010-06-24 22:21:47 +0000 |
---|---|---|
committer | imp <imp@FreeBSD.org> | 2010-06-24 22:21:47 +0000 |
commit | 25b9228f868d08663a89872cbdb8785c8c4a0283 (patch) | |
tree | c3089cf79d584cec44ba428bf01ed64dab215317 /usr.sbin | |
parent | 866d360f3fad296b08b7b176b2a5e1fa2c0e16e2 (diff) | |
download | FreeBSD-src-25b9228f868d08663a89872cbdb8785c8c4a0283.zip FreeBSD-src-25b9228f868d08663a89872cbdb8785c8c4a0283.tar.gz |
Bring in Kris Moore's pc-sysinstall shell script from PC-BSD. This
shell script is the back end logic necessary for an installer. It
contains both query routines to allow a front-end installer to present
reasonable choices to the user and also action routines which allow
the front end installer to put a FreeBSD distribution onto a disk. It
supports installing onto the usual suspects, as well as advanced
features like Mirroring, ZFS, Encryprion and GPT labels.
While this is only the back-end of the installer, it can do unattended
scripted installations. In PC-BSD's world view, all installations are
scripted and all the front-end does is write the script. As such, it
is useful in its own right.
This has been extensively tested over the past several releases of
PC-BSD. However, differences between that environment and FreeBSD
suggest there will be a period of shake-out while those differences
are discovered and corrected.
A text-based front-end is in the works. For the GUI-based front-end,
you can use the PC-BSD distribution.
Kris' BSDcan paper on pc-sysinstall is linked off his talk on the
BSDcan site:
http://www.bsdcan.org/2010/schedule/events/173.en.html
The man page is written by Josh Paetzel, and I wrote the Makefiles for
the FreeBSD integration. Kris wrote the rest.
This represents version r7010 in the PC-BSD repo.
http://svn.pcbsd.org/pcbsd/current/pc-sysinstall
Submitted by: kris@
Sponsored by: iX Systems
Diffstat (limited to 'usr.sbin')
70 files changed, 8185 insertions, 0 deletions
diff --git a/usr.sbin/Makefile b/usr.sbin/Makefile index 4d492c5..ee23a40 100644 --- a/usr.sbin/Makefile +++ b/usr.sbin/Makefile @@ -125,6 +125,7 @@ SUBDIR= ${_ac} \ ${_ntp} \ ${_nvram} \ ${_ofwdump} \ + pc-sysinstall \ pciconf \ periodic \ ${_pkg_install} \ diff --git a/usr.sbin/pc-sysinstall/Makefile b/usr.sbin/pc-sysinstall/Makefile new file mode 100644 index 0000000..aba8db7 --- /dev/null +++ b/usr.sbin/pc-sysinstall/Makefile @@ -0,0 +1,5 @@ +# $FreeBSD$ +SUBDIR=backend backend-partmanager backend-query conf doc examples +SUBDIR+=pc-sysinstall + +.include <bsd.subdir.mk> diff --git a/usr.sbin/pc-sysinstall/backend-partmanager/Makefile b/usr.sbin/pc-sysinstall/backend-partmanager/Makefile new file mode 100644 index 0000000..61c407a --- /dev/null +++ b/usr.sbin/pc-sysinstall/backend-partmanager/Makefile @@ -0,0 +1,8 @@ +# $FreeBSD$ + +FILES= create-part.sh delete-part.sh + +FILESDIR=${SHAREDIR}/pc-sysinstall/backend-partmanager +NO_OBJ= + +.include <bsd.prog.mk> diff --git a/usr.sbin/pc-sysinstall/backend-partmanager/create-part.sh b/usr.sbin/pc-sysinstall/backend-partmanager/create-part.sh new file mode 100755 index 0000000..8cb3761 --- /dev/null +++ b/usr.sbin/pc-sysinstall/backend-partmanager/create-part.sh @@ -0,0 +1,92 @@ +#!/bin/sh +#- +# Copyright (c) 2010 iX Systems, 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$ + +# Query a disk for partitions and display them +############################# + +. ${PROGDIR}/backend/functions.sh + +if [ -z "${1}" ] ; then + echo "Error: No disk specified!" + exit 1 +fi + +if [ -z "${2}" ] ; then + echo "Error: No size specified!" + exit 1 +fi + +if [ ! -e "/dev/${1}" ] ; then + echo "Error: Disk /dev/${1} does not exist!" + exit 1 +fi + +DISK="${1}" +MB="${2}" + +TOTALBLOCKS="`expr $MB \* 2048`" + + +# Lets figure out what number this slice will be +LASTSLICE="`fdisk -s /dev/${DISK} 2>/dev/null | grep -v ${DISK} | grep ':' | tail -n 1 | cut -d ':' -f 1 | tr -s '\t' ' ' | tr -d ' '`" +if [ -z "${LASTSLICE}" ] ; then + LASTSLICE="1" +else + LASTSLICE="`expr $LASTSLICE + 1`" +fi + +if [ ${LASTSLICE} -gt "4" ] ; then + echo "Error: FreeBSD MBR setups can only have a max of 4 slices" + exit 1 +fi + + +SLICENUM="${LASTSLICE}" + +# Lets get the starting block +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 + fdisk -s /dev/${DISK} | grep -v "${DISK}:" | grep "${checkslice}:" | tr -s " " >${TMPDIR}/pfdisk + pstartblock="`cat ${TMPDIR}/pfdisk | cut -d ' ' -f 3`" + psize="`cat ${TMPDIR}/pfdisk | cut -d ' ' -f 4`" + STARTBLOCK="`expr ${pstartblock} + ${psize}`" +fi + + +# If this is an empty disk, see if we need to create a new MBR scheme for it +gpart show ${DISK} >/dev/null 2>/dev/null +if [ "$?" != "0" -a "${SLICENUM}" = "1" ] ; then + gpart create -s mbr ${DISK} +fi + +gpart add -b ${STARTBLOCK} -s ${TOTALBLOCKS} -t freebsd -i ${SLICENUM} ${DISK} +exit "$?" diff --git a/usr.sbin/pc-sysinstall/backend-partmanager/delete-part.sh b/usr.sbin/pc-sysinstall/backend-partmanager/delete-part.sh new file mode 100755 index 0000000..f524a83 --- /dev/null +++ b/usr.sbin/pc-sysinstall/backend-partmanager/delete-part.sh @@ -0,0 +1,89 @@ +#!/bin/sh +#- +# Copyright (c) 2010 iX Systems, 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$ + +# Delete a specified partition, takes effect immediately +######################################################## + +. ${PROGDIR}/backend/functions.sh +. ${PROGDIR}/backend/functions-disk.sh + +if [ -z "${1}" ] +then + echo "Error: No partition specified!" + exit 1 +fi + +if [ ! -e "/dev/${1}" ] +then + echo "Error: Partition /dev/${1} does not exist!" + exit 1 +fi + +PARTITION="${1}" + +# First lets figure out the partition number for the given device +################################################################## + +# Get the number of characters in this dev +CHARS="`echo $PARTITION | wc -c`" + +PARTINDEX="" + +# Lets read through backwards until we get the part number +while +z=1 +do + CHARS=`expr $CHARS - 1` + LAST_CHAR=`echo "${PARTITION}" | cut -c $CHARS` + echo "${LAST_CHAR}" | grep "^[0-9]$" >/dev/null 2>/dev/null + if [ "$?" = "0" ] ; then + PARTINDEX="${LAST_CHAR}${PARTINDEX}" + else + break + fi +done + +# Now get current disk we are working on +CHARS=`expr $CHARS - 1` +DISK="`echo $PARTITION | cut -c 1-${CHARS}`" + +# Make sure we have a valid disk name still +if [ ! -e "/dev/${DISK}" ] ; then + echo "Error: Disk: ${DISK} doesnt exist!" + exit 1 +fi + +echo "Running: gpart delete -i ${PARTINDEX} ${DISK}" +gpart delete -i ${PARTINDEX} ${DISK} >/dev/null 2>/dev/null + +# Check if this was the last partition and destroy the disk geom if so +get_disk_partitions "${DISK}" +if [ -z "${VAL}" ] ; then + gpart destroy ${DISK} +fi + +exit "$?" diff --git a/usr.sbin/pc-sysinstall/backend-query/Makefile b/usr.sbin/pc-sysinstall/backend-query/Makefile new file mode 100644 index 0000000..ff0fb8a --- /dev/null +++ b/usr.sbin/pc-sysinstall/backend-query/Makefile @@ -0,0 +1,13 @@ +# $FreeBSD$ + +FILES= detect-laptop.sh detect-nics.sh detect-vmware.sh disk-info.sh \ + disk-list.sh disk-part.sh enable-net.sh list-components.sh \ + list-rsync-backups.sh list-tzones.sh query-langs.sh send-logs.sh \ + setup-ssh-keys.sh sys-mem.sh test-live.sh test-netup.sh \ + update-part-list.sh xkeyboard-layouts.sh xkeyboard-models.sh \ + xkeyboard-variants.sh + +FILESDIR=${SHAREDIR}/pc-sysinstall/backend-query +NO_OBJ= + +.include <bsd.prog.mk> diff --git a/usr.sbin/pc-sysinstall/backend-query/detect-laptop.sh b/usr.sbin/pc-sysinstall/backend-query/detect-laptop.sh new file mode 100755 index 0000000..a518d61 --- /dev/null +++ b/usr.sbin/pc-sysinstall/backend-query/detect-laptop.sh @@ -0,0 +1,33 @@ +#!/bin/sh +#- +# Copyright (c) 2010 iX Systems, 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$ + +dmesgLine=`dmesg | grep "acpi_acad0"` +if test "${dmesgLine}" = ""; then + echo "laptop: NO" +else + echo "laptop: YES" +fi diff --git a/usr.sbin/pc-sysinstall/backend-query/detect-nics.sh b/usr.sbin/pc-sysinstall/backend-query/detect-nics.sh new file mode 100755 index 0000000..ae8ce2ac --- /dev/null +++ b/usr.sbin/pc-sysinstall/backend-query/detect-nics.sh @@ -0,0 +1,41 @@ +#!/bin/sh +#- +# Copyright (c) 2010 iX Systems, 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$ + +rm /tmp/netCards 2>/dev/null +touch /tmp/netCards + +config="`ifconfig -l`" + +for i in $config +do + echo "${i}" | grep -e "lo0" -e "^fwe" -e "^fwip" -e "lo1" -e "^plip" -e "^pfsync" -e "^pflog" -e "^tun" >/dev/null 2>/dev/null + if [ "$?" != "0" ] + then + IDENT="<`dmesg | grep ^${i} | grep -v "miibus" | grep '<' | cut -d '<' -f 2 | cut -d '>' -f 1 | head -1`>" + echo "${i}: $IDENT" + fi +done diff --git a/usr.sbin/pc-sysinstall/backend-query/detect-vmware.sh b/usr.sbin/pc-sysinstall/backend-query/detect-vmware.sh new file mode 100755 index 0000000..de25894 --- /dev/null +++ b/usr.sbin/pc-sysinstall/backend-query/detect-vmware.sh @@ -0,0 +1,36 @@ +#!/bin/sh +#- +# Copyright (c) 2010 iX Systems, 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$ + +pciconf -lv | grep -i vmware >/dev/null 2>/dev/null +if [ "$?" = "0" ] +then + echo "vmware: YES" + exit 0 +else + echo "vmware: NO" + exit 1 +fi diff --git a/usr.sbin/pc-sysinstall/backend-query/disk-info.sh b/usr.sbin/pc-sysinstall/backend-query/disk-info.sh new file mode 100755 index 0000000..980cf8c --- /dev/null +++ b/usr.sbin/pc-sysinstall/backend-query/disk-info.sh @@ -0,0 +1,68 @@ +#!/bin/sh +#- +# Copyright (c) 2010 iX Systems, 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$ + +# Query a disk for partitions and display them +############################# + +. ${PROGDIR}/backend/functions.sh +. ${PROGDIR}/backend/functions-disk.sh + +if [ -z "${1}" ] +then + echo "Error: No disk specified!" + exit 1 +fi + +if [ ! -e "/dev/${1}" ] +then + echo "Error: Disk /dev/${1} does not exist!" + exit 1 +fi + +DISK="${1}" + +get_disk_cyl "${DISK}" +CYLS="${VAL}" + +get_disk_heads "${DISK}" +HEADS="${VAL}" + +get_disk_sectors "${DISK}" +SECS="${VAL}" + +echo "cylinders=${CYLS}" +echo "heads=${HEADS}" +echo "sectors=${SECS}" + +# Now get the disks size in MB +KB="`diskinfo -v ${1} | grep 'bytes' | cut -d '#' -f 1 | tr -s '\t' ' ' | tr -d ' '`" +MB=$(convert_byte_to_megabyte ${KB}) +echo "size=$MB" + +# Now get the Controller Type +CTYPE="`dmesg | grep "^${1}:" | grep "B <" | cut -d '>' -f 2 | cut -d ' ' -f 3-10`" +echo "type=$CTYPE" diff --git a/usr.sbin/pc-sysinstall/backend-query/disk-list.sh b/usr.sbin/pc-sysinstall/backend-query/disk-list.sh new file mode 100755 index 0000000..e64b920 --- /dev/null +++ b/usr.sbin/pc-sysinstall/backend-query/disk-list.sh @@ -0,0 +1,60 @@ +#!/bin/sh +#- +# Copyright (c) 2010 iX Systems, 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$ + +# Create our device listing +SYSDISK=$(sysctl -n kern.disks) + +# Now loop through these devices, and list the disk drives +for i in ${SYSDISK} +do + + # Get the current device + DEV="${i}" + + # Make sure we don't find any cd devices + case "${DEV}" in + acd[0-9]*|cd[0-9]*|scd[0-9]*) continue ;; + esac + + # Check the dmesg output for some more info about this device + NEWLINE=$(dmesg | sed -n "s/^$DEV: .*<\(.*\)>.*$/ <\1>/p" | head -n 1) + if [ -z "$NEWLINE" ]; then + NEWLINE=" <Unknown Device>" + fi + + # Save the disk list + if [ ! -z "$DLIST" ] + then + DLIST="\n${DLIST}" + fi + + DLIST="${DEV}:${NEWLINE}${DLIST}" + +done + +# Echo out the found line +echo -e "$DLIST" | sort diff --git a/usr.sbin/pc-sysinstall/backend-query/disk-part.sh b/usr.sbin/pc-sysinstall/backend-query/disk-part.sh new file mode 100755 index 0000000..c72ba1a --- /dev/null +++ b/usr.sbin/pc-sysinstall/backend-query/disk-part.sh @@ -0,0 +1,119 @@ +#!/bin/sh +#- +# Copyright (c) 2010 iX Systems, 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$ + +# Query a disk for partitions and display them +############################# + +. ${PROGDIR}/backend/functions.sh +. ${PROGDIR}/backend/functions-disk.sh + +if [ -z "${1}" ] +then + echo "Error: No disk specified!" + exit 1 +fi + +if [ ! -e "/dev/${1}" ] +then + echo "Error: Disk /dev/${1} does not exist!" + exit 1 +fi + +DISK="${1}" + +# Now get the disks size in MB +KB="`diskinfo -v ${1} | grep 'bytes' | cut -d '#' -f 1 | tr -s '\t' ' ' | tr -d ' '`" +MB=$(convert_byte_to_megabyte ${KB}) +TOTALSIZE="$MB" +TOTALB="`diskinfo -v ${1} | grep 'in sectors' | tr -s '\t' ' ' | cut -d ' ' -f 2`" + + + +gpart show ${1} >/dev/null 2>/dev/null +if [ "$?" != "0" ] ; then + # No partitions on this disk, display entire disk size and exit + echo "${1}-freemb: ${TOTALSIZE}" + echo "${1}-freeblocks: ${TOTALB}" + exit +fi + +# Display if this is GPT or MBR formatted +gpart show ${1} | grep "GPT" >/dev/null 2>/dev/null +if [ "$?" = "0" ] ; then + echo "${1}-format: GPT" + TYPE="GPT" +else + echo "${1}-format: MBR" + TYPE="MBR" +fi + +# Set some search flags +PART="0" +EXTENDED="0" +START="0" +SIZEB="0" + +# Get a listing of partitions on this disk +get_disk_partitions "${DISK}" +PARTS="${VAL}" +for curpart in $PARTS +do + + # First get the sysid / label for this partition + if [ "$TYPE" = "MBR" ] ; then + get_partition_sysid_mbr "${DISK}" "${curpart}" + echo "${curpart}-sysid: ${VAL}" + get_partition_label_mbr "${DISK}" "${curpart}" + echo "${curpart}-label: ${VAL}" + else + get_partition_label_gpt "${DISK}" "${curpart}" + echo "${curpart}-sysid: ${VAL}" + echo "${curpart}-label: ${VAL}" + fi + + # Now get the startblock, blocksize and MB size of this partition + + get_partition_startblock "${DISK}" "${curpart}" + START="${VAL}" + echo "${curpart}-blockstart: ${START}" + + get_partition_blocksize "${DISK}" "${curpart}" + SIZEB="${VAL}" + echo "${curpart}-blocksize: ${SIZEB}" + + SIZEMB=$(convert_blocks_to_megabyte ${SIZEB}) + echo "${curpart}-sizemb: ${SIZEMB}" + +done + + +# Now calculate any free space +LASTB="`expr $SIZEB + $START`" +FREEB="`expr $TOTALB - $LASTB`" +FREEMB="`expr ${FREEB} / 2048`" +echo "${1}-freemb: $FREEMB" +echo "${1}-freeblocks: $FREEB" diff --git a/usr.sbin/pc-sysinstall/backend-query/enable-net.sh b/usr.sbin/pc-sysinstall/backend-query/enable-net.sh new file mode 100755 index 0000000..afcec63 --- /dev/null +++ b/usr.sbin/pc-sysinstall/backend-query/enable-net.sh @@ -0,0 +1,65 @@ +#!/bin/sh +#- +# Copyright (c) 2010 iX Systems, 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$ + +# Script which enables networking with specified options +########################################################################### + +. ${PROGDIR}/backend/functions.sh +. ${PROGDIR}/conf/pc-sysinstall.conf +. ${BACKEND}/functions-networking.sh +. ${BACKEND}/functions-parse.sh + + +NIC="$1" +IP="$2" +NETMASK="$3" +DNS="$4" +GATEWAY="$5" +MIRRORFETCH="$6" + +if [ -z "${NIC}" ] +then + echo "ERROR: Usage enable-net <nic> <ip> <netmask> <dns> <gateway>" + exit 150 +fi + +if [ "$NIC" = "AUTO-DHCP" ] +then + enable_auto_dhcp +else + echo "Enabling NIC: $NIC" + ifconfig ${NIC} ${IP} ${NETMASK} + + echo "nameserver ${DNS}" >/etc/resolv.conf + + route add default ${GATE} +fi + +case ${MIRRORFETCH} in + ON|on|yes|YES) fetch -o /tmp/mirrors-list.txt ${MIRRORLIST} >/dev/null 2>/dev/null;; + *) ;; +esac diff --git a/usr.sbin/pc-sysinstall/backend-query/list-components.sh b/usr.sbin/pc-sysinstall/backend-query/list-components.sh new file mode 100755 index 0000000..190b972 --- /dev/null +++ b/usr.sbin/pc-sysinstall/backend-query/list-components.sh @@ -0,0 +1,54 @@ +#!/bin/sh +#- +# Copyright (c) 2010 iX Systems, 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$ + +# Script which lists the available components for this release +########################################################################### + +. ${PROGDIR}/backend/functions.sh + +echo "Available Components:" + +cd ${COMPDIR} +for i in `ls -d *` +do + if [ -e "${i}/component.cfg" -a -e "${i}/install.sh" -a -e "${i}/distfiles" ] + then + NAME="`grep 'name:' ${i}/component.cfg | cut -d ':' -f 2`" + DESC="`grep 'description:' ${i}/component.cfg | cut -d ':' -f 2`" + TYPE="`grep 'type:' ${i}/component.cfg | cut -d ':' -f 2`" + echo " " + echo "name: ${i}" + echo "desc:${DESC}" + echo "type:${TYPE}" + if [ -e "${i}/component.png" ] + then + echo "icon: ${COMPDIR}/${i}/component.png" + fi + fi + +done + diff --git a/usr.sbin/pc-sysinstall/backend-query/list-rsync-backups.sh b/usr.sbin/pc-sysinstall/backend-query/list-rsync-backups.sh new file mode 100755 index 0000000..3ccf3e4 --- /dev/null +++ b/usr.sbin/pc-sysinstall/backend-query/list-rsync-backups.sh @@ -0,0 +1,70 @@ +#!/bin/sh +#- +# Copyright (c) 2010 iX Systems, 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$ + +# Script which lists the backups present on a server +########################################################################### + +. ${PROGDIR}/backend/functions.sh + +SSHUSER=$1 +SSHHOST=$2 +SSHPORT=$3 + +if [ -z "${SSHHOST}" -o -z "${SSHPORT}" ] +then + echo "ERROR: Usage list-rsync-backups.sh <user> <host> <port>" + exit 150 +fi + +# Look for full-system backups, needs at minimum a kernel to be bootable +FINDCMD="find . -type d -maxdepth 6 -name 'kernel' | grep '/boot/kernel'" + +# Get a listing of the number of full backups saved +OLDBACKUPS=`ssh -o 'BatchMode=yes' -p ${SSHPORT} ${SSHUSER}@${SSHHOST} "${FINDCMD}"` +if [ "$?" = "0" ] +then + for i in ${OLDBACKUPS} + do + BACKPATH="`echo ${i} | sed 's|/boot/.*||g' | sed 's|^./||g'`" + if [ -z "${BACKLIST}" ] + then + BACKLIST="${BACKPATH}" + else + BACKLIST="${BACKLIST}:${BACKPATH}" + fi + done + + if [ -z "${BACKLIST}" ] + then + echo "NONE" + else + echo "$BACKLIST" + fi + +else + echo "FAILED" +fi diff --git a/usr.sbin/pc-sysinstall/backend-query/list-tzones.sh b/usr.sbin/pc-sysinstall/backend-query/list-tzones.sh new file mode 100755 index 0000000..cece093 --- /dev/null +++ b/usr.sbin/pc-sysinstall/backend-query/list-tzones.sh @@ -0,0 +1,43 @@ +#!/bin/sh +#- +# Copyright (c) 2010 iX Systems, 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$ + +rm ${TMPDIR}/.tzonetmp >/dev/null 2>/dev/null + +# Backend script which lists all the available timezones for front-ends to display +while read line +do + echo "$line" | grep "^#" >/dev/null 2>/dev/null + if [ "$?" != "0" ] + then + echo "$line" | tr -s "\t" ":" | cut -d ":" -f 3-4 >>${TMPDIR}/.tzonetmp + fi +done < /usr/share/zoneinfo/zone.tab + +sort ${TMPDIR}/.tzonetmp +rm -f ${TMPDIR}/.tzonetmp >/dev/null 2>/dev/null + +exit 0 diff --git a/usr.sbin/pc-sysinstall/backend-query/query-langs.sh b/usr.sbin/pc-sysinstall/backend-query/query-langs.sh new file mode 100755 index 0000000..30b1829 --- /dev/null +++ b/usr.sbin/pc-sysinstall/backend-query/query-langs.sh @@ -0,0 +1,32 @@ +#!/bin/sh +#- +# Copyright (c) 2010 iX Systems, 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$ + +FOUND="0" + +cat ${PROGDIR}/conf/avail-langs + +exit 0 diff --git a/usr.sbin/pc-sysinstall/backend-query/send-logs.sh b/usr.sbin/pc-sysinstall/backend-query/send-logs.sh new file mode 100755 index 0000000..dea9e40 --- /dev/null +++ b/usr.sbin/pc-sysinstall/backend-query/send-logs.sh @@ -0,0 +1,83 @@ +#!/bin/sh +#- +# Copyright (c) 2010 iX Systems, 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$ + +# Script which creates a gzipped log and optionally mails it to the specified address +############################################################################ + +. ${PROGDIR}/backend/functions.sh +. ${PROGDIR}/conf/pc-sysinstall.conf +. ${BACKEND}/functions-networking.sh +. ${BACKEND}/functions-parse.sh + +# Bring up all NICS under DHCP +enable_auto_dhcp + +MAILTO="$1" +MAILRESULT="0" + +# Set the location of our compressed log +TMPLOG="/tmp/pc-sysinstall.log" + +echo "# PC-SYSINSTALL LOG" >${TMPLOG} +cat ${LOGOUT} >> ${TMPLOG} + +# Check if we have a GUI generated install cfg +if [ -e "/tmp/sys-install.cfg" ] +then + echo "" >>${TMPLOG} + echo "# PC-SYSINSTALL CFG " >>${TMPLOG} + cat /tmp/sys-install.cfg >> ${TMPLOG} +fi + +# Save dmesg output +echo "" >>${TMPLOG} +echo "# DMESG OUTPUT " >>${TMPLOG} +dmesg >> ${TMPLOG} + +# Get gpart info on all disks +for i in `${PROGDIR}/pc-sysinstall disk-list | cut -d ':' -f 1` +do + echo "" >>${TMPLOG} + echo "# DISK INFO $i " >>${TMPLOG} + ls /dev/${i}* >>${TMPLOG} + gpart show ${i} >> ${TMPLOG} +done + +# Show Mounted volumes +echo "" >>${TMPLOG} +echo "# MOUNT OUTPUT " >>${TMPLOG} +mount >> ${TMPLOG} + +echo "Log file saved to ${TMPLOG}" +echo "Warning: This file will be lost once the system is rebooted." + +echo "Do you wish to view this logfile now? (Y/N)" +read tmp +if [ "$tmp" = "Y" -o "$tmp" = "y" ] +then + more ${TMPLOG} +fi diff --git a/usr.sbin/pc-sysinstall/backend-query/setup-ssh-keys.sh b/usr.sbin/pc-sysinstall/backend-query/setup-ssh-keys.sh new file mode 100755 index 0000000..dcb47aa --- /dev/null +++ b/usr.sbin/pc-sysinstall/backend-query/setup-ssh-keys.sh @@ -0,0 +1,64 @@ +#!/bin/sh +#- +# Copyright (c) 2010 iX Systems, 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$ + +# Script which sets up password-less logins for ssh host +########################################################################### + +. ${PROGDIR}/backend/functions.sh + +SSHUSER=$1 +SSHHOST=$2 +SSHPORT=$3 + +if [ -z "${SSHUSER}" -o -z "${SSHHOST}" -o -z "${SSHPORT}" ] +then + echo "ERROR: Usage setup-ssh-keys <user> <host> <port>" + exit 150 +fi + +cd ~ + +echo "Preparing to setup SSH key authorization..." +echo "When prompted, enter your password for ${SSHUSER}@${SSHHOST}" + +if [ ! -e ".ssh/id_rsa.pub" ] +then + mkdir .ssh >/dev/null 2>/dev/null + ssh-keygen -q -t rsa -N '' -f .ssh/id_rsa + sleep 1 +fi + +if [ ! -e ".ssh/id_rsa.pub" ] +then + echo "ERROR: Failed creating .ssh/id_rsa.pub" + exit 150 +fi + +# Get the .pub key +PUBKEY="`cat .ssh/id_rsa.pub`" + +ssh -p ${SSHPORT} ${SSHUSER}@${SSHHOST} "mkdir .ssh ; echo $PUBKEY >> .ssh/authorized_keys; chmod 600 .ssh/authorized_keys ; echo $PUBKEY >> .ssh/authorized_keys2; chmod 600 .ssh/authorized_keys2" diff --git a/usr.sbin/pc-sysinstall/backend-query/sys-mem.sh b/usr.sbin/pc-sysinstall/backend-query/sys-mem.sh new file mode 100755 index 0000000..38c80de --- /dev/null +++ b/usr.sbin/pc-sysinstall/backend-query/sys-mem.sh @@ -0,0 +1,31 @@ +#!/bin/sh +#- +# Copyright (c) 2010 iX Systems, 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$ + +MEM=`sysctl hw.realmem | sed "s|hw.realmem: ||g"` +MEM=`expr $MEM / 1024` +MEM=`expr $MEM / 1024` +echo $MEM diff --git a/usr.sbin/pc-sysinstall/backend-query/test-live.sh b/usr.sbin/pc-sysinstall/backend-query/test-live.sh new file mode 100755 index 0000000..a0b83f6 --- /dev/null +++ b/usr.sbin/pc-sysinstall/backend-query/test-live.sh @@ -0,0 +1,40 @@ +#!/bin/sh +#- +# Copyright (c) 2010 iX Systems, 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$ + +# Script which checks if we are running from install media, or real system +############################################################################# + +dmesg | grep "md0: Preloaded image" >/dev/null 2>/dev/null +if [ "$?" = "0" ] +then + echo "INSTALL-MEDIA" + exit 0 +else + echo "REAL-DISK" + exit 1 +fi + diff --git a/usr.sbin/pc-sysinstall/backend-query/test-netup.sh b/usr.sbin/pc-sysinstall/backend-query/test-netup.sh new file mode 100755 index 0000000..f11e5f0 --- /dev/null +++ b/usr.sbin/pc-sysinstall/backend-query/test-netup.sh @@ -0,0 +1,50 @@ +#!/bin/sh +#- +# Copyright (c) 2010 iX Systems, 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$ + + +# Script which tests "fetch" when using a network connection, and saves +# if we are using direct connect, or need FTP passive mode +############################################################################# + +rm ${TMPDIR}/.testftp >/dev/null 2>/dev/null + +ping -c 2 www.pcbsd.org >/dev/null 2>/dev/null +if [ "$?" = "0" ] +then + echo "ftp: Up" + exit 0 +fi + +ping -c 2 www.freebsd.org >/dev/null 2>/dev/null +if [ "$?" = "0" ] +then + echo "ftp: Up" + exit 0 +fi + +echo "ftp: Down" +exit 1 diff --git a/usr.sbin/pc-sysinstall/backend-query/update-part-list.sh b/usr.sbin/pc-sysinstall/backend-query/update-part-list.sh new file mode 100755 index 0000000..ac36ddd --- /dev/null +++ b/usr.sbin/pc-sysinstall/backend-query/update-part-list.sh @@ -0,0 +1,109 @@ +#!/bin/sh +#- +# Copyright (c) 2010 iX Systems, 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$ + +# Need access to a some unmount functions +. ${PROGDIR}/backend/functions-unmount.sh + +echo "Running: find-update-parts" >> ${LOGOUT} + +rm ${TMPDIR}/AvailUpgrades >/dev/null 2>/dev/null + +FSMNT="/mnt" + +# Get the freebsd version on this partition +get_fbsd_ver() { + + VER="`file ${FSMNT}/bin/sh | grep 'for FreeBSD' | sed 's|for FreeBSD |;|g' | cut -d ';' -f 2 | cut -d ',' -f 1`" + if [ "$?" = "0" ] ; then + file ${FSMNT}/bin/sh | grep '32-bit' >/dev/null 2>/dev/null + if [ "${?}" = "0" ] ; then + echo "${1}: FreeBSD ${VER} (32bit)" + else + echo "${1}: FreeBSD ${VER} (64bit)" + fi + fi + +} + +# Create our device listing +SYSDISK="`sysctl kern.disks | cut -d ':' -f 2 | sed 's/^[ \t]*//'`" +DEVS="" + +# Now loop through these devices, and list the disk drives +for i in ${SYSDISK} +do + + # Get the current device + DEV="${i}" + # Make sure we don't find any cd devices + echo "${DEV}" | grep -e "^acd[0-9]" -e "^cd[0-9]" -e "^scd[0-9]" >/dev/null 2>/dev/null + if [ "$?" != "0" ] ; then + DEVS="${DEVS} `ls /dev/${i}*`" + fi + +done + +# Search for regular UFS / Geom Partitions to upgrade +for i in $DEVS +do + if [ ! -e "${i}a.journal" -a ! -e "${i}a" -a ! -e "${i}p2" -a ! -e "${i}p2.journal" ] ; then + continue + fi + + if [ -e "${i}a.journal" ] ; then + _dsk="${i}a.journal" + elif [ -e "${i}a" ] ; then + _dsk="${i}a" + elif [ -e "${i}p2" ] ; then + _dsk="${i}p2" + elif [ -e "${i}p2.journal" ] ; then + _dsk="${i}p2.journal" + fi + + mount -o ro ${_dsk} ${FSMNT} >>${LOGOUT} 2>>${LOGOUT} + if [ "${?}" = "0" -a -e "${FSMNT}/bin/sh" ] ; then + get_fbsd_ver "`echo ${_dsk} | sed 's|/dev/||g'`" + umount -f ${FSMNT} >/dev/null 2>/dev/null + fi +done + +# Now search for any ZFS root partitions +zpool import -o altroot=${FSMNT} -a + +# Unmount any auto-mounted stuff +umount_all_dir "${FSMNT}" + +# Get pools +_zps="`zpool list | grep -v 'NAME' | cut -d ' ' -f 1`" +for _zpools in ${_zps} +do + mount -o ro -t zfs ${_zpools} ${FSMNT} >>${LOGOUT} 2>>${LOGOUT} + if [ "${?}" = "0" -a -e "${FSMNT}/bin/sh" ] ; then + get_fbsd_ver "${_zpools}" + umount -f ${FSMNT} >/dev/null 2>/dev/null + fi +done diff --git a/usr.sbin/pc-sysinstall/backend-query/xkeyboard-layouts.sh b/usr.sbin/pc-sysinstall/backend-query/xkeyboard-layouts.sh new file mode 100755 index 0000000..287d61d --- /dev/null +++ b/usr.sbin/pc-sysinstall/backend-query/xkeyboard-layouts.sh @@ -0,0 +1,56 @@ +#!/bin/sh +#- +# Copyright (c) 2010 iX Systems, 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$ + +FOUND="0" + +# Lets parse the xorg.list file, and see what layouts are supported +while read line +do + + if [ "$FOUND" = "1" -a ! -z "$line" ] + then + echo $line | grep '! ' >/dev/null 2>/dev/null + if [ "$?" = "0" ] + then + exit 0 + else + echo "$line" + fi + fi + + if [ "${FOUND}" = "0" ] + then + echo $line | grep '! layout' >/dev/null 2>/dev/null + if [ "$?" = "0" ] + then + FOUND="1" + fi + fi + +done < /usr/local/share/X11/xkb/rules/xorg.lst + +exit 0 diff --git a/usr.sbin/pc-sysinstall/backend-query/xkeyboard-models.sh b/usr.sbin/pc-sysinstall/backend-query/xkeyboard-models.sh new file mode 100755 index 0000000..0ce0e57 --- /dev/null +++ b/usr.sbin/pc-sysinstall/backend-query/xkeyboard-models.sh @@ -0,0 +1,58 @@ +#!/bin/sh +#- +# Copyright (c) 2010 iX Systems, 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$ + +FOUND="0" + +# Lets parse the xorg.list file, and see what models are supported +while read line +do + + if [ "$FOUND" = "1" -a ! -z "$line" ] + then + echo $line | grep '! ' >/dev/null 2>/dev/null + if [ "$?" = "0" ] + then + exit 0 + else + model="`echo $line | sed 's|(|[|g'`" + model="`echo $model | sed 's|)|]|g'`" + echo "$model" + fi + fi + + if [ "${FOUND}" = "0" ] + then + echo $line | grep '! model' >/dev/null 2>/dev/null + if [ "$?" = "0" ] + then + FOUND="1" + fi + fi + +done < /usr/local/share/X11/xkb/rules/xorg.lst + +exit 0 diff --git a/usr.sbin/pc-sysinstall/backend-query/xkeyboard-variants.sh b/usr.sbin/pc-sysinstall/backend-query/xkeyboard-variants.sh new file mode 100755 index 0000000..a2870a4 --- /dev/null +++ b/usr.sbin/pc-sysinstall/backend-query/xkeyboard-variants.sh @@ -0,0 +1,56 @@ +#!/bin/sh +#- +# Copyright (c) 2010 iX Systems, 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$ + +FOUND="0" + +# Lets parse the xorg.list file, and see what varients are supported +while read line +do + + if [ "$FOUND" = "1" -a ! -z "$line" ] + then + echo $line | grep '! ' >/dev/null 2>/dev/null + if [ "$?" = "0" ] + then + exit 0 + else + echo "$line" + fi + fi + + if [ "${FOUND}" = "0" ] + then + echo $line | grep '! variant' >/dev/null 2>/dev/null + if [ "$?" = "0" ] + then + FOUND="1" + fi + fi + +done < /usr/local/share/X11/xkb/rules/xorg.lst + +exit 0 diff --git a/usr.sbin/pc-sysinstall/backend/Makefile b/usr.sbin/pc-sysinstall/backend/Makefile new file mode 100644 index 0000000..c594e9e --- /dev/null +++ b/usr.sbin/pc-sysinstall/backend/Makefile @@ -0,0 +1,14 @@ +# $FreeBSD$ + +FILES= functions-bsdlabel.sh functions-cleanup.sh functions-disk.sh \ + functions-extractimage.sh functions-installcomponents.sh \ + functions-localize.sh functions-mountdisk.sh \ + functions-mountoptical.sh functions-networking.sh \ + functions-newfs.sh functions-parse.sh functions-runcommands.sh \ + functions-unmount.sh functions-upgrade.sh functions-users.sh \ + functions.sh parseconfig.sh startautoinstall.sh + +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 100755 index 0000000..acf56ba --- /dev/null +++ b/usr.sbin/pc-sysinstall/backend/functions-bsdlabel.sh @@ -0,0 +1,641 @@ +#!/bin/sh +#- +# Copyright (c) 2010 iX Systems, 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$ + +# 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 100755 index 0000000..db03038 --- /dev/null +++ b/usr.sbin/pc-sysinstall/backend/functions-cleanup.sh @@ -0,0 +1,412 @@ +#!/bin/sh +#- +# Copyright (c) 2010 iX Systems, 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$ + +# 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="" + + # 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 sw 0 0" >> ${FSTAB} + else + echo "/dev/${DEVICE} ${PARTMNT} ufs rw,noatime 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 100755 index 0000000..826ad53 --- /dev/null +++ b/usr.sbin/pc-sysinstall/backend/functions-disk.sh @@ -0,0 +1,672 @@ +#!/bin/sh +#- +# Copyright (c) 2010 iX Systems, 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$ + +# 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 100755 index 0000000..f602770 --- /dev/null +++ b/usr.sbin/pc-sysinstall/backend/functions-extractimage.sh @@ -0,0 +1,315 @@ +#!/bin/sh +#- +# Copyright (c) 2010 iX Systems, 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$ + +# 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 + 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-installcomponents.sh b/usr.sbin/pc-sysinstall/backend/functions-installcomponents.sh new file mode 100755 index 0000000..e67c422 --- /dev/null +++ b/usr.sbin/pc-sysinstall/backend/functions-installcomponents.sh @@ -0,0 +1,166 @@ +#!/bin/sh +#- +# Copyright (c) 2010 iX Systems, 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$ + +# 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 100755 index 0000000..3a76684 --- /dev/null +++ b/usr.sbin/pc-sysinstall/backend/functions-localize.sh @@ -0,0 +1,474 @@ +#!/bin/sh +#- +# Copyright (c) 2010 iX Systems, 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$ + +# 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 100755 index 0000000..6a71b24 --- /dev/null +++ b/usr.sbin/pc-sysinstall/backend/functions-mountdisk.sh @@ -0,0 +1,190 @@ +#!/bin/sh +#- +# Copyright (c) 2010 iX Systems, 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$ + +# 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 100755 index 0000000..2b54cbc --- /dev/null +++ b/usr.sbin/pc-sysinstall/backend/functions-mountoptical.sh @@ -0,0 +1,153 @@ +#!/bin/sh +#- +# Copyright (c) 2010 iX Systems, 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$ + +# 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 100755 index 0000000..173de9c --- /dev/null +++ b/usr.sbin/pc-sysinstall/backend/functions-networking.sh @@ -0,0 +1,356 @@ +#!/bin/sh +#- +# Copyright (c) 2010 iX Systems, 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$ + +# 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 100755 index 0000000..4e2ae09 --- /dev/null +++ b/usr.sbin/pc-sysinstall/backend/functions-newfs.sh @@ -0,0 +1,168 @@ +#!/bin/sh +#- +# Copyright (c) 2010 iX Systems, 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$ + +# 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 [ "${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" + 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" + 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" + 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-parse.sh b/usr.sbin/pc-sysinstall/backend/functions-parse.sh new file mode 100755 index 0000000..74c7d5f --- /dev/null +++ b/usr.sbin/pc-sysinstall/backend/functions-parse.sh @@ -0,0 +1,231 @@ +#!/bin/sh +#- +# Copyright (c) 2010 iX Systems, 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$ + +# 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 100755 index 0000000..3302c85 --- /dev/null +++ b/usr.sbin/pc-sysinstall/backend/functions-runcommands.sh @@ -0,0 +1,102 @@ +#!/bin/sh +#- +# Copyright (c) 2010 iX Systems, 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$ + +# 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 100755 index 0000000..0481270 --- /dev/null +++ b/usr.sbin/pc-sysinstall/backend/functions-unmount.sh @@ -0,0 +1,206 @@ +#!/bin/sh +#- +# Copyright (c) 2010 iX Systems, 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$ + +# 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 100755 index 0000000..da44e50 --- /dev/null +++ b/usr.sbin/pc-sysinstall/backend/functions-upgrade.sh @@ -0,0 +1,247 @@ +#!/bin/sh +#- +# Copyright (c) 2010 iX Systems, 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$ + +# 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 100755 index 0000000..3df4623 --- /dev/null +++ b/usr.sbin/pc-sysinstall/backend/functions-users.sh @@ -0,0 +1,175 @@ +#!/bin/sh +#- +# Copyright (c) 2010 iX Systems, 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$ + +# 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 100755 index 0000000..9d86ab1 --- /dev/null +++ b/usr.sbin/pc-sysinstall/backend/functions.sh @@ -0,0 +1,284 @@ +#!/bin/sh +#- +# Copyright (c) 2010 iX Systems, 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$ + +# 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 100755 index 0000000..6acef02 --- /dev/null +++ b/usr.sbin/pc-sysinstall/backend/parseconfig.sh @@ -0,0 +1,167 @@ +#!/bin/sh +#- +# Copyright (c) 2010 iX Systems, 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$ + +# 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" +check_value packageType "uzip tar rsync split" +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 100755 index 0000000..cce9a07 --- /dev/null +++ b/usr.sbin/pc-sysinstall/backend/startautoinstall.sh @@ -0,0 +1,136 @@ +#!/bin/sh +#- +# Copyright (c) 2010 iX Systems, 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$ + +# 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 diff --git a/usr.sbin/pc-sysinstall/conf/Makefile b/usr.sbin/pc-sysinstall/conf/Makefile new file mode 100644 index 0000000..604d9758 --- /dev/null +++ b/usr.sbin/pc-sysinstall/conf/Makefile @@ -0,0 +1,12 @@ +# $FreeBSD$ + +NO_OBJ= + +FILESGROUPS= CONF LICENSE +CONF= exclude-from-upgrade pc-sysinstall.conf avail-langs +CONFDIR= ${SHAREDIR}/pc-sysinstall/conf +LICENSE= licenses/bsd-uk.txt licenses/bsd-en.txt licenses/intel-en.txt \ + licenses/bsd-be.txt licenses/bsd-ru.txt licenses/nvidia-en.txt +LICENSEDIR= ${SHAREDIR}/pc-sysinstall/conf/license + +.include <bsd.prog.mk> diff --git a/usr.sbin/pc-sysinstall/conf/avail-langs b/usr.sbin/pc-sysinstall/conf/avail-langs new file mode 100644 index 0000000..d78e14a --- /dev/null +++ b/usr.sbin/pc-sysinstall/conf/avail-langs @@ -0,0 +1,20 @@ +en English +bg Bulgarian +ca Catalan +zh_TW Chinese_(Taiwan) +cs Czech +nl Dutch +fr French +de German +en_GB English_(UK) +en_ZA English_(South Africa) +it Italian +ja Japanese +pt_BR Portuguese_(Brazil) +pl Polish +pa Punjabi +ru Russian +sk Slovak +sl Slovenian +es Spanish +uk Ukrainian diff --git a/usr.sbin/pc-sysinstall/conf/exclude-from-upgrade b/usr.sbin/pc-sysinstall/conf/exclude-from-upgrade new file mode 100644 index 0000000..b0529d4 --- /dev/null +++ b/usr.sbin/pc-sysinstall/conf/exclude-from-upgrade @@ -0,0 +1,15 @@ +etc/fstab +dev +etc/passwd +etc/pwd.db +etc/group +etc/master.passwd +etc/spwd.db +etc/hosts +etc/resolv.conf +etc/localtime +etc/hosts +etc/X11 +etc/nsmb.conf +usr/Programs/.config/ProgList +Programs/.config/ProgList diff --git a/usr.sbin/pc-sysinstall/conf/licenses/bsd-en.txt b/usr.sbin/pc-sysinstall/conf/licenses/bsd-en.txt new file mode 100644 index 0000000..a30b67e --- /dev/null +++ b/usr.sbin/pc-sysinstall/conf/licenses/bsd-en.txt @@ -0,0 +1,24 @@ +SECTION 1: BSD LICENSE +-------------------------------------------------------------------------------- +Copyright (c) 1998, Regents of the University of California +All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 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. + Neither the name of the University of California, Berkeley nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY EXPR +ESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO E +VENT SHALL THE REGENTS AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCI +DENTAL, 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 AN 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. diff --git a/usr.sbin/pc-sysinstall/conf/licenses/intel-en.txt b/usr.sbin/pc-sysinstall/conf/licenses/intel-en.txt new file mode 100644 index 0000000..0858ff7 --- /dev/null +++ b/usr.sbin/pc-sysinstall/conf/licenses/intel-en.txt @@ -0,0 +1,207 @@ +Section 2: Intel Firmware license +-------------------------------------------------------------------------------- + TERMS AND CONDITIONS + IMPORTANT - PLEASE READ BEFORE INSTALLING OR USING THIS INTEL(C) SOFTWARE + +Do not use or load this firmware (the "Software") until you have carefully read +the following terms and conditions. By loading or using the Software, you agree +to the terms of this Agreement. If you do not wish to so agree, do not install +or use the Software. + +LICENSEES: + +Please note: + +* If you are an End-User, only Exhibit A, the SOFTWARE LICENSE AGREEMENT, + applies. +* If you are an Original Equipment Manufacturer (OEM), Independent Hardware + Vendor (IHV), or Independent Software Vendor (ISV), this complete Agreement + applies + +-------------------------------------------------------------------------------- + +For OEMs, IHVs, and ISVs: + +LICENSE. This Software is licensed for use only in conjunction with Intel +component products. Use of the Software in conjunction with non-Intel component +products is not licensed hereunder. Subject to the terms of this Agreement, +Intel grants to you a nonexclusive, nontransferable, worldwide, fully paid-up +license under Intel's copyrights to: (i) copy the Software internally for your +own development and maintenance purposes; (ii) copy and distribute the Software +to your end-users, but only under a license agreement with terms at least as +restrictive as those contained in Intel's Final, Single User License Agreement, +attached as Exhibit A; and (iii) modify, copy and distribute the end-user +documentation which may accompany the Software, but only in association with +the Software. + +If you are not the final manufacturer or vendor of a computer system or software +program incorporating the Software, then you may transfer a copy of the +Software, including any related documentation (modified or unmodified) to your +recipient for use in accordance with the terms of this Agreement, provided such +recipient agrees to be fully bound by the terms hereof. You shall not otherwise +assign, sublicense, lease, or in any other way transfer or disclose Software to +any third party. You may not, nor may you assist any other person or entity to +modify, translate, convert to another programming language, decompile, reverse +engineer, or disassemble any portion of the Software or otherwise attempt to +derive source code from any object code modules of the Software or any internal +data files generated by the Software. Your rights to redistribute the Software +shall be contingent upon your installation of this Agreement in its entirety in +the same directory as the Software. + +CONTRACTORS. For the purpose of this Agreement, and notwithstanding anything +to the contrary hereunder, solely with respect to the requirements for +compliance with the terms hereunder, any contractors or consultants that You +use to perform the work or otherwise assist You in the development or products +using this Software shall be deemed to be End Users and accordingly, upon +receipt of the Software, shall be bound by the terms of Exhibit A, Software +License Agreement. No additional agreement between You and such consultants or +contractors is required under this Agreement to detail such compliance. + +TRADEMARKS. Except as expressly provided herein, you shall not use Intel's +name in any publications, advertisements, or other announcements without +Intel's prior written consent. You do not have any rights to use any Intel +trademarks or logos. + +OWNERSHIP OF SOFTWARE AND COPYRIGHTS. Software and accompanying materials, if +any, are owned by Intel or its suppliers and licensors and may be protected by +copyright, trademark, patent and trade secret law and international treaties. +Any rights, express or implied, in the intellectual property embodied in the +foregoing, other than those specified in this Agreement, are reserved by Intel +and its suppliers and licensors or otherwise as set forth in any applicable +open source license agreement. You will keep the Software free of liens, +attachments, and other encumbrances. You agree not to remove any proprietary +notices and/or any labels from the Software and accompanying materials without +prior written approval by Intel + +LIMITATION OF LIABILITY. IN NO EVENT SHALL INTEL OR ITS SUPPLIERS AND LICENSORS +BE LIABLE FOR ANY DAMAGES WHATSOEVER FROM ANY CAUSE OF ACTION OF ANY KIND +(INCLUDING, WITHOUT LIMITATION, LOST PROFITS, BUSINESS INTERRUPTION, OR LOST +INFORMATION) ARISING OUT OF THE USE, MODIFICATION, OR INABILITY TO USE THE +INTEL SOFTWARE, OR OTHERWISE, NOR FOR PUNITIVE, INCIDENTAL, CONSEQUENTIAL, OR +SPECIAL DAMAGES OF ANY KIND, EVEN IF INTEL OR ITS SUPPLIERS AND LICENSORS HAS +BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. SOME JURISDICTIONS PROHIBIT +EXCLUSION OR LIMITATION OF LIABILITY FOR IMPLIED WARRANTIES, CONSEQUENTIAL OR +INCIDENTAL DAMAGES, SO CERTAIN LIMITATIONS MAY NOT APPLY. YOU MAY ALSO HAVE +OTHER LEGAL RIGHTS THAT VARY BETWEEN JURISDICTIONS. + +EXCLUSION OF WARRANTIES. THE SOFTWARE IS PROVIDED "AS IS" AND POSSIBLY WITH +FAULTS. UNLESS EXPRESSLY AGREED OTHERWISE, INTEL AND ITS SUPPLIERS AND +LICENSORS DISCLAIM ANY AND ALL WARRANTIES AND GUARANTEES, EXPRESS, IMPLIED OR +OTHERWISE, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +NONINFRINGEMENT, OR FITNESS FOR A PARTICULAR PURPOSE. Intel does not warrant +or assume responsibility for the accuracy or completeness of any information, +text, graphics, links or other items contained within the Software. You assume +all liability, financial or otherwise, associated with Your use or disposition +of the Software. + +APPLICABLE LAW. Claims arising under this Agreement shall be governed by the +laws of State of California], excluding its principles of conflict of laws and +the United Nations Convention on Contracts for the Sale of Goods. + +WAIVER AND AMENDMENT. No modification, amendment or waiver of any provision of +this Agreement shall be effective unless in writing and signed by an officer of +Intel. No failure or delay in exercising any right, power, or remedy under +this Agreement shall operate as a waiver of any such right, power or remedy. +Without limiting the foregoing, terms and conditions on any purchase orders or +similar materials submitted by you to Intel, and any terms contained in IntelÂ’s +standard acknowledgment form that are in conflict with these terms, shall be of +no force or effect. + +SEVERABILITY. If any provision of this Agreement is held by a court of +competent jurisdiction to be contrary to law, such provision shall be changed +and interpreted so as to best accomplish the objectives of the original +provision to the fullest extent allowed by law and the remaining provisions of +this Agreement shall remain in full force and effect. + +EXPORT RESTRICTIONS. Each party acknowledges that the Software is subject to +applicable import and export regulations of the United States and of the +countries in which each party transacts business, specifically including U.S. +Export Administration Act and Export Administration Regulations. Each party +shall comply with such laws and regulations, as well as all other laws and +regulations applicable to the Software. Without limiting the generality of the +foregoing, each party agrees that it will not export, re-export, transfer or +divert any of the Software or the direct programs thereof to any restricted +place or party in accordance with U.S. export regulations. Note that Software +containing encryption may be subject to additional restrictions. + +GOVERNMENT RESTRICTED RIGHTS. The Software is provided with "RESTRICTED RIGHTS." +Use, duplication, or disclosure by the Government is subject to restrictions as +set forth in FAR52.227-14 and DFAR252.227-7013 et seq. or their successors. Use +of the Software by the Government constitutes acknowledgment of Intel's +proprietary rights therein. Contractor or Manufacturer is Intel Corporation, +2200 Mission College Blvd., Santa Clara, CA 95052. + +TERMINATION OF THE AGREEMENT. Intel may terminate this Agreement if you violate +its terms. Upon termination, you will immediately destroy the Software or +return all copies of the Software to Intel. + +-------------------------------------------------------------------------------- + +EXHIBIT "A" + +SOFTWARE LICENSE AGREEMENT (Final, Single User) + +IMPORTANT - READ BEFORE COPYING, INSTALLING OR USING. + +Do not use or load this firmware image (the "Software") until you have carefully +read the following terms and conditions. By loading or using the Software, you +agree to the terms of this Agreement. If you do not wish to so agree, do not +install or use the Software. + +LICENSE. You may copy and use the Software, subject to these conditions: +1. This Software is licensed for use only in conjunction with Intel component + products. Use of the Software in conjunction with non-Intel component + products is not licensed hereunder. +2. You may not copy, modify, rent, sell, distribute or transfer any part of the + Software except as provided in this Agreement, and you agree to prevent + unauthorized copying of the Software. +3. You may not reverse engineer, decompile, or disassemble the Software. +4. You may not sublicense the Software. +5. The Software may contain the software or other property of third party + suppliers. + +OWNERSHIP OF SOFTWARE AND COPYRIGHTS. Title to all copies of the Software +remains with Intel or its suppliers. The Software is copyrighted and protected +by the laws of the United States and other countries, and international treaty +provisions. You may not remove any copyright notices from the Software. Intel +may make changes to the Software, or items referenced therein, at any time +without notice, but is not obligated to support or update the Software. Except +as otherwise expressly provided, Intel grants no express or implied right under +Intel patents, copyrights, trademarks, or other intellectual property rights. +You may transfer the Software only if a copy of this license accompanies the +Software and the recipient agrees to be fully bound by these terms. + +EXCLUSION OF OTHER WARRANTIES EXCEPT AS PROVIDED ABOVE, THE SOFTWARE IS PROVIDED +"AS IS" WITHOUT ANY EXPRESS OR IMPLIED WARRANTY OF ANY KIND INCLUDING +WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT, OR FITNESS FOR A PARTICULAR +PURPOSE. Intel does not warrant or assume responsibility for the accuracy or +completeness of any information, text, graphics, links or other items contained +within the Software. + +LIMITATION OF LIABILITY. IN NO EVENT SHALL INTEL OR ITS SUPPLIERS BE LIABLE FOR +ANY DAMAGES WHATSOEVER (INCLUDING, WITHOUT LIMITATION, LOST PROFITS, BUSINESS +INTERRUPTION, OR LOST INFORMATION) ARISING OUT OF THE USE OF OR INABILITY TO +USE THE SOFTWARE, EVEN IF INTEL HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. SOME JURISDICTIONS PROHIBIT EXCLUSION OR LIMITATION OF LIABILITY FOR +IMPLIED WARRANTIES OR CONSEQUENTIAL OR INCIDENTAL DAMAGES, SO THE ABOVE +LIMITATION MAY NOT APPLY TO YOU. YOU MAY ALSO HAVE OTHER LEGAL RIGHTS THAT VARY +BETWEEN JURISDICTIONS. + +TERMINATION OF THIS AGREEMENT. Intel may terminate this Agreement at any time if +you violate its terms. Upon termination, you will immediately destroy the +Software. + +APPLICABLE LAWS. Claims arising under this Agreement shall be governed by the +laws of California, excluding its principles of conflict of laws and the United +Nations Convention on Contracts for the Sale of Goods. You may not export the +Software in violation of applicable export laws and regulations. Intel is not +obligated under any other agreements unless they are in writing and signed by +an authorized representative +of Intel. + +GOVERNMENT RESTRICTED RIGHTS. The Software is provided with "RESTRICTED RIGHTS." +Use, duplication, or disclosure by the Government is subject to restrictions as +set forth in FAR52.227-14 and DFAR252.227-7013 et seq. or their successors. Use +of the Software by the Government constitutes acknowledgment of Intel's +proprietary rights therein. Contractor or Manufacturer is Intel Corporation, +2200 Mission College Blvd., Santa Clara, CA 95052. diff --git a/usr.sbin/pc-sysinstall/conf/licenses/nvidia-en.txt b/usr.sbin/pc-sysinstall/conf/licenses/nvidia-en.txt new file mode 100644 index 0000000..22c7906 --- /dev/null +++ b/usr.sbin/pc-sysinstall/conf/licenses/nvidia-en.txt @@ -0,0 +1,53 @@ +Section 3: NVIDIA driver license agreement +-------------------------------------------------------------------------------- +License For Customer Use of NVIDIA Software + +IMPORTANT NOTICE -- READ CAREFULLY: This License For Customer Use of NVIDIA Software ("LICENSE") is the agreement which governs use of the software of NVIDIA Corporation and its subsidiaries ("NVIDIA") downloadable herefrom, including computer software and associated printed materials ("SOFTWARE"). By downloading, installing, copying, or otherwise using the SOFTWARE, you agree to be bound by the terms of this LICENSE. If you do not agree to the terms of this LICENSE, do not download the SOFTWARE. + +RECITALS + +Use of NVIDIA's products requires three elements: the SOFTWARE, the hardware on a graphics controller board, and a personal computer. The SOFTWARE is protected by copyright laws and international copyright treaties, as well as other intellectual property laws and treaties. The SOFTWARE is not sold, and instead is only licensed for use, strictly in accordance with this document. The hardware is protected by various patents, and is sold, but this LICENSE does not cover that sale, since it may not necessarily be sold as a package with the SOFTWARE. This LICENSE sets forth the terms and conditions of the SOFTWARE LICENSE only. + +1. DEFINITIONS + +1.1 Customer. Customer means the entity or individual that downloads the SOFTWARE. + +2. GRANT OF LICENSE + +2.1 Rights and Limitations of Grant. NVIDIA hereby grants Customer the following non-exclusive, non-transferable right to use the SOFTWARE, with the following limitations: + +2.1.1 Rights. Customer may install and use one copy of the SOFTWARE on a single computer, and except for making one back-up copy of the Software, may not otherwise copy the SOFTWARE. This LICENSE of SOFTWARE may not be shared or used concurrently on different computers. + +2.1.2 Linux/FreeBSD Exception. Notwithstanding the foregoing terms of Section 2.1.1, SOFTWARE designed exclusively for use on the Linux or FreeBSD operating systems, or other operating systems derived from the source code to these operating systems, may be copied and redistributed, provided that the binary files thereof are not modified in any way (except for unzipping of compressed files). + +2.1.3 Limitations. + +No Reverse Engineering. Customer may not reverse engineer, decompile, or disassemble the SOFTWARE, nor attempt in any other manner to obtain the source code. + +No Separation of Components. The SOFTWARE is licensed as a single product. Its component parts may not be separated for use on more than one computer, nor otherwise used separately from the other parts. + +No Rental. Customer may not rent or lease the SOFTWARE to someone else. + +3. TERMINATION + +This LICENSE will automatically terminate if Customer fails to comply with any of the terms and conditions hereof. In such event, Customer must destroy all copies of the SOFTWARE and all of its component parts. + +Defensive Suspension. If Customer commences or participates in any legal proceeding against NVIDIA, then NVIDIA may, in its sole discretion, suspend or terminate all license grants and any other rights provided under this LICENSE during the pendency of such legal proceedings. + +4. COPYRIGHT + +All title and copyrights in and to the SOFTWARE (including but not limited to all images, photographs, animations, video, audio, music, text, and other information incorporated into the SOFTWARE), the accompanying printed materials, and any copies of the SOFTWARE, are owned by NVIDIA, or its suppliers. The SOFTWARE is protected by copyright laws and international treaty provisions. Accordingly, Customer is required to treat the SOFTWARE like any other copyrighted material, except as otherwise allowed pursuant to this LICENSE and that it may make one copy of the SOFTWARE solely for backup or archive purposes. + +5. APPLICABLE LAW + +This LICENSE shall be deemed to have been made in, and shall be construed pursuant to, the laws of the State of California. The United Nations Convention on Contracts for the International Sale of Goods is specifically disclaimed. + +6. DISCLAIMER OF WARRANTIES AND LIMITATION ON LIABILITY + +6.1 No Warranties. TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, THE SOFTWARE IS PROVIDED "AS IS" AND NVIDIA AND ITS SUPPLIERS DISCLAIM ALL WARRANTIES, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + +6.2 No Liability for Consequential Damages. TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, IN NO EVENT SHALL NVIDIA OR ITS SUPPLIERS BE LIABLE FOR ANY SPECIAL, INCIDENTAL, INDIRECT, OR CONSEQUENTIAL DAMAGES WHATSOEVER (INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR ANY OTHER PECUNIARY LOSS) ARISING OUT OF THE USE OF OR INABILITY TO USE THE SOFTWARE, EVEN IF NVIDIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +7. MISCELLANEOUS + +If any provision of this LICENSE is inconsistent with, or cannot be fully enforced under, the law, such provision will be construed as limited to the extent necessary to be consistent with and fully enforceable under the law. This LICENSE is the final, complete and exclusive agreement between the parties relating to the subject matter hereof, and supersedes all prior or contemporaneous understandings and agreements relating to such subject matter, whether oral or written. This LICENSE may only be modified in writing signed by an authorized officer of NVIDIA. Customer agrees that it will not ship, transfer or export the SOFTWARE into any country, or use the SOFTWARE in any manner, prohibited by the United States Bureau of Export Administration or any export laws, restrictions or regulations. diff --git a/usr.sbin/pc-sysinstall/conf/pc-sysinstall.conf b/usr.sbin/pc-sysinstall/conf/pc-sysinstall.conf new file mode 100644 index 0000000..317054d --- /dev/null +++ b/usr.sbin/pc-sysinstall/conf/pc-sysinstall.conf @@ -0,0 +1,76 @@ +#!/bin/sh +# $FreeBSD$ +# Configuration options for pc-sysinstall + +TMPDIR="/tmp/.pc-sysinstall" +export TMPDIR + +if [ ! -d "${TMPDIR}" ] +then + mkdir -p ${TMPDIR} + chmod 777 ${TMPDIR} +fi + +# Set our temp directory for storing partition information +PARTDIR="${TMPDIR}/part-info" +export PARTDIR + +# Set the SLICECFGDIR +SLICECFGDIR="${TMPDIR}/.slice-cfg" +export SLICECFGDIR + +# Set the MIRRORCFGDIR +MIRRORCFGDIR="${TMPDIR}/.mirror-cfg" +export MIRRORCFGDIR + +# Set the GELIKEYDIR +GELIKEYDIR="${TMPDIR}/.geli-keys" +export GELIKEYDIR + +# Set our log file +LOGOUT="${TMPDIR}/pc-sysinstall.log" +export LOGOUT + +# Set the number of rsync tries +RSYNCTRIES="3" +export RSYNCTRIES + +# Set our mount-points +CDMNT="/cdmnt-install" +FSMNT="/mnt" +UZIP_DIR="/usr" +BOOT_PART_MOUNT="/boot-mount" +export FSMNT CDMNT UZIP_DIR BOOT_PART_MOUNT + +# Set the location of component files on DVD / usb / ftp +# Relative to CDMNT or the FTP root +COMPFILEDIR="extras/" +export COMPFILEDIR + +# Set the component temp directory, which is relative to FSMNT +COMPTMPDIR="/usr/.componenttmp" +export COMPTMPDIR + +# Variables to set the location of installation data +UZIP_FILE="PCBSD.ufs.uzip" +TAR_FILE="PCBSD.tbz" +export UZIP_FILE TAR_FILE + +# Locations of FreeBSD only install files +FBSD_UZIP_FILE="fbsd-release.ufs.uzip" +FBSD_TAR_FILE="fbsd-release.tbz" +FBSD_BRANCH_DIR="8.0-CURRENT" +export FBSD_UZIP_FILE FBSD_TAR_FILE FBSD_BRANCH_DIR + +# Our internet mirror listing file location +NETSERVER="http://updates.pcbsd.org" +ARCH="`uname -m`" + +# Check if we are running on a PC-BSD Disk +if [ -e "/PCBSDVERSION" ] ; then + VERSION="`cat /PCBSDVERSION`" +else + VERSION="UNKNOWN" +fi + +MIRRORLIST="${NETSERVER}/mirrors-netinstall.php?ver=${VERSION}&arch=${ARCH}" diff --git a/usr.sbin/pc-sysinstall/doc/Makefile b/usr.sbin/pc-sysinstall/doc/Makefile new file mode 100644 index 0000000..0a4bf83 --- /dev/null +++ b/usr.sbin/pc-sysinstall/doc/Makefile @@ -0,0 +1,8 @@ +# $FreeBSD$ + +FILES= help-disk-list help-disk-size help-index help-start-autoinstall + +FILESDIR=${SHAREDIR}/pc-sysinstall/doc +NO_OBJ= + +.include <bsd.prog.mk> diff --git a/usr.sbin/pc-sysinstall/doc/help-disk-list b/usr.sbin/pc-sysinstall/doc/help-disk-list new file mode 100644 index 0000000..0d4bff9 --- /dev/null +++ b/usr.sbin/pc-sysinstall/doc/help-disk-list @@ -0,0 +1 @@ +Holder diff --git a/usr.sbin/pc-sysinstall/doc/help-disk-size b/usr.sbin/pc-sysinstall/doc/help-disk-size new file mode 100644 index 0000000..0d4bff9 --- /dev/null +++ b/usr.sbin/pc-sysinstall/doc/help-disk-size @@ -0,0 +1 @@ +Holder diff --git a/usr.sbin/pc-sysinstall/doc/help-index b/usr.sbin/pc-sysinstall/doc/help-index new file mode 100644 index 0000000..248dcfa --- /dev/null +++ b/usr.sbin/pc-sysinstall/doc/help-index @@ -0,0 +1,83 @@ +pc-sysinstall Help Index +----------------------------------------------- +Help Commands + + help + Display this index file + + help <command> + Display the help data for the specified command + +System Query Commands + + disk-list + Provides a listing of the disk drives detected on this system + + disk-part <disk> + Queries the specified disk and returns information about its partitions + + disk-info <disk> + Returns information about the disks size, cyls, heads, and sectors + + detect-laptop + Tests to see if this system is a laptop or desktop + + detect-vmware + Tests to see if this system is actually a vmware session + + detect-nics + Returns a listing of the detected network cards on this system + + list-components + Returns a listing of the available components which can be installed + + list-rsync-backups <user> <host> <port> + Returns a listing of available rsync-backups on the target server in the life-preserver/ dir + + list-tzones + Returns a listing of available timezones + + query-langs + Return a list of languages that the installer supports + + sys-mem + Return the size of installed system RAM in MegaBytes + + test-netup + Test if an internet connection is available + + update-part-list + Return a list of PC-BSD & FreeBSD installs on this system for updates + + xkeyboard-layouts + Return a list of keyboard layouts that xorg supports + + xkeyboard-models + Return a list of keyboard models that xorg supports + + xkeyboard-variants + Return a list of keyboard variants that xorg supports + +Partition Management Commands + + create-part <disk> <size> + Create a new MBR primary slice on the target <disk> using <size> MB + + delete-part <partition> + Deletes the disk partition specified. If this is the last partition, + the disk partition layout will also be scrubbed, leaving a clean disk + ready for MBR or GPT file system layouts. + + +Installation Commands + + -c <cfg> + Begin a install / upgrade with the specified cfg file + + start-autoinstall <conf> + Start an automated installation with the specified conf file + Normally only used by automated install scripts + + setup-ssh-keys <user> <host> <port> + Setup SSH without a password for the target host and user and port + Use to prompt the user to log into a server before doing a rsync + ssh restore diff --git a/usr.sbin/pc-sysinstall/doc/help-start-autoinstall b/usr.sbin/pc-sysinstall/doc/help-start-autoinstall new file mode 100644 index 0000000..1cb1e6a --- /dev/null +++ b/usr.sbin/pc-sysinstall/doc/help-start-autoinstall @@ -0,0 +1,39 @@ +start-autoinstall - HELP +----------------------------------------------- + +About: + start-autoinstall is used when performing automated installationsr. It is able + to configure networking with provided settings, and fetch an installation script from + http / ftp server. This allows media to be created which fetches dynamic configuration + options from a server-side supplier. + +Usage: + pc-sysinstall start-autoinstall <config> + +Config Syntax: + + The configuration file for start-autoinstall can contain the following options: + + pc_config: <value> + - Location of the pc-sysinstall installation configuration file, can be local + or start with http:// or ftp:// to fetch from a remote system. + + shutdown_cmd: <value> + - Command to execute post-installation, such as "shutdown -p now" or other. + + confirm_install: (YES/NO) + - Prompt on the console to begin installation. Defaults to YES. + Warning: Setting this to NO will start an installation as soon as start-autoinstall + is run. (I.E. after booting some install media) It may be dangerous if a disk is left + in a drive and the system is turned on! + + nic_config: (DHCP-ALL / <cfg>) + - When set to DHCP-ALL, the software will attempt to get a network address from DHCP on + any / all detected NICS. If set to some other command, it will be used as an argument + to "ifconfig" to enable networking. + + nic_dns: <value> + - Use the following DNS server for networking + + nic_gateway: <gateway> + - Use the following default route / gateway for networking diff --git a/usr.sbin/pc-sysinstall/examples/Makefile b/usr.sbin/pc-sysinstall/examples/Makefile new file mode 100644 index 0000000..d24e5af --- /dev/null +++ b/usr.sbin/pc-sysinstall/examples/Makefile @@ -0,0 +1,11 @@ +# $FreeBSD$ + +FILES= README pc-autoinstall.conf pcinstall.cfg.fbsd-netinstall \ + pcinstall.cfg.geli pcinstall.cfg.gmirror pcinstall.cfg.netinstall \ + pcinstall.cfg.restore pcinstall.cfg.rsync pcinstall.cfg.upgrade \ + pcinstall.cfg.zfs + +FILESDIR=${SHAREDIR}/examples/pc-sysinstall +NO_OBJ= + +.include <bsd.prog.mk> diff --git a/usr.sbin/pc-sysinstall/examples/README b/usr.sbin/pc-sysinstall/examples/README new file mode 100644 index 0000000..55d78e4 --- /dev/null +++ b/usr.sbin/pc-sysinstall/examples/README @@ -0,0 +1,355 @@ +pc-sysinstall README + +This file documents many of the variables used in pc-sysinstall +config scripts +################################################################# + +# hostname= + +Using hostname= will set the specified hostname on the +installed system + +When hostname= is not present, pc-sysinstall will auto-generate +a hostname such as freebsd-XXXX or pcbsd-XXXX + +# installMode=(fresh or upgrade) + +Set the type of install we are doing, fresh or upgrade. + +Fresh installs will format and mount the target disks before +extracting the install images to the system. Using this mode +it is also possible to do a system restore, by specifying a +full system backup as the install source. + +Upgrades will mount the target disk, and extract the system +archive to the disk, overwriting files on the disk. +The conf/exclude-from-upgrade file can be used to specify +additional files to exclude from overwriting during the +install process. + +# installInteractive=(yes or no) + +Set if the installer is running in interactive mode, and +is able to prompt for input from the user, defaults to no + + +######################################################################## +# NETWORK SETTINGS +######################################################################## + +# netDev=(AUTO-DHCP or <nic>) + +netDev specifies what type of networking to enable for the installer +Can be set to AUTO-DHCP or to a network interface, such as et0 + +When set to AUTO-DHCP, pc-sysinstall will probe for all network devices +and attempt to set DHCP mode on each, until a working network connection +is established + +If netDev= is set to a network interface such as et0, the following options +will need to be set in order to enable the interface + +# netIP=(IP address such as 192.168.0.100) + + Set netIP to an address that you wish to have the interface specified in + netDev set to + Only used when netDev is not set to AUTO-DHCP + +# netMask=(Netmask such as 255.255.255.0) + +Set netMask to the address you with to have the interface specified in +netDev set to +Only used when netDev is not set to AUTO-DHCP + + +# netNameServer=(DNS Server such as 192.168.0.1) + +Set netNameServer to the DNS address you want to use during the install +Only used when netDev is not set to AUTO-DHCP + + +# netDefaultRouter=(192.168.0.1) + +Set netDefaultRouter to the gateway you wish to have the installer use +Only used when netDev is not set to AUTO-DHCP + + + +# netSaveDev=(AUTO-DHCP or network interface) + +netSaveDev specifies what networking to enable on the installed system + +When set to AUTO-DHCP, pc-sysinstall will probe all network interfaces, and +set them all to DHCP in the systems /etc/rc.conf file. Wireless devices will also +have the corresponding wlan[0-9] device created. + +When set to a network interface, pc-sysinstall will set the target device with +the settings specified by the variables below. + +# netSaveIP=192.168.0.49 +# netSaveMask=255.255.255.0 +# netSaveNameServer=208.67.222.222 +# netSaveDefaultRouter=192.168.0.1 + + + + +######################################################################## +# DISK SLICE SETTINGS +######################################################################## + +The following section specifies the target disk(s) to be used in the +install or upgrade. + +# disk0=(disk device, such as ad0) + +The diskX= variable should be set to the target device for this drive, such +as ad0, da0 +The first should begin with disk0=, and additional drives to disk1=, disk2 +if additional disks are to be setup. + +When doing an upgrade, the disk0= line should be set to the root device or +root zpool of the target system to update. I.E: + # disk0=tank0 + # disk0=ada0s1a + + +# partition=(all, free, s1, s1, s3, s4) + +After setting disk[0-9], the partition= variable is used to specify which target +partition we will be working with for this device. + +Setting this to "all" will setup the disk with a single FreeBSD slice as "s1" + +Setting this to "free" will allow pc-sysinstall to search for the first available +primary slice with free space, and create the slice. + +Setting this to "s1, s2, s3 or s4" will use the specified MBR slice + +(This tag is unused for upgrades) + + +# mirror=(disk device such as ad1) + +Setting the mirror= variable will setup the target device as a gmirror +of the diskX= device. The mirror device must be the same size or larger +than the drive being mirrored. + + +# mirrorbal=(load, prefer, round-robin, split) + +Allows the setting of the mirror balance method to be used, if not +specified this defaults to "round-robin" + +# bootManager=(none, bsd) + +Setting this option will instruct pc-sysinstall to install the BSD boot Manager, +or leave it empty + +# commitDiskPart + +This command must be placed at the end of the diskX= section, before starting +the listing of any additional diskX= directives. + + +######################################################################## +# DISK PARTITION / MOUNT SETTINGS +######################################################################## + +The following settings specify the partitioning / mount points to setup +on the target partition + +# disk0-part=UFS+S 500 / +# disk0-part=SWAP 2000 none +# disk0-part=UFS.eli 500 /usr +# encpass=mypass +# disk0-part=UFS+J 500 /tmp +# disk0-part=ZFS 0 /data,/storage (mirror: ad1) +# commitDiskLabel + +The above values instructs pc-sysinstall which partitions / mounts +to create on the target drive / slice, specified by "disk0". +(disk0 will resolve to the drive / slice specified in the previous section) + +The notation is as follows: +<File System Type> <Size> <Mountpoint> + +Available FileSystems: + UFS - Standard UFS2 FileSystem +UFS+S - UFS2 + Softupdates enabled +UFS+J - UFS2 + Journaling through gjournal + ZFS - Z File System, pools / mounts created automatically + SWAP - BSD Swap space partition, mountpoint should be set to "none" + +Adding the ".eli" extension to any of the above file systems +will enable disk encryption via geli +(UFS.eli, UFS+S.eli, UFS+J.eli, ZFS.eli, SWAP.eli) + +If you with to use a passphrase with this encrypted partition, on the next line +the flag "encpass=" should be entered: +encpass=mypass + +All sizes are expressed in MegaBytes +Specifying a size 0 instructs pc-sysinstall to use the rest of the +available slice size, and should only be used for the last partition / mount + +When using "ZFS" specifically, it is possible to specify additional disks / partitions +to include in the zpool. By using the syntax: (mirror: ad1,ad2) or (raidz: ad1,ad2), it is possible +to include the disk "ad1" into the zpool for this partition, using the raidz / mirror methods. +If you with to just include the disk into the pool in "basic" mode, then use (ad1,ad2) with no flags + +######################################################################## +# INSTALL OPTIONS / SOURCES +######################################################################## + +The following settings specify the type, locations and sources +for this installation + +# installMedium=(dvd, usb, ftp, rsync) + +Set installMedium= to the source type we will be using for this install. + +Available Types: + dvd - Search for and mount the DVD which contains the install archive + usb - Search for and mount the USB drive which contains the install archive + ftp - The install archive will be fetched from a FTP / HTTP server before install +rsync - Pull the system data from a ssh + rsync server, specified with variables below + +# installType=(PCBSD, FreeBSD) + +Set the type of system we are installing, PCBSD or FreeBSD + +# installFile=fbsd-release.tbz + +The installer archive, if not using the defaults specified in conf/pc-sysinstall.conf + +# packageType=(tar, uzip, split) + +The archive type we are extracting from when using dvd, usb or ftp + +# ftpPath=ftp://ftp.pcbsd.org/pub/8.0/netinstall + +Location of the installer archive when using a installMedium=ftp + +# rsyncPath=life-preserver/back-2009-11-12T14_53_14 + +The location of the rsync data on the remote server when using installMedium=rsync + +# rsyncUser=rsyncuser + +The username to use for the ssh server running rsync + +# rsyncHost=192.168.0.50 + +The rsync / ssh server we wish to connect to + +# rsyncPort=22 + +The port to use when connecting to a ssh + rsync server + +# installComponents=amarok,firefox,ports + +The specified components to install, view available with "./pc-sysinstall list-components" + + +######################################################################## +# UPGRADE OPTIONS +######################################################################## + +Options specific to performing an upgrade + +# upgradeKeepDesktopProfile=(yes/no) + +This option allows you to specify if you wish to keep your existing users desktop +profile data. The default is NO, and your existing profile will be moved to +.kde4.preUpgrade automatically. + +######################################################################## +# USER OPTIONS +######################################################################## + +Options for setting up usernames and passwords on the installed system + +# rootPass=root + +Set the root password of the installed system to the specified string + +The below variables are used to setup a user on the installed system +Be sure to call commitUser after after adding these values, and before +starting another user block + +# userName=kris +# userComment=Kris Moore +# userPass=mypass +# userShell=/bin/csh +# userHome=/home/kris +# userGroups=wheel,operator +# commitUser + +######################################################################## +# RUN COMMANDS +######################################################################## + +The following variables can be set to run commands post-installation, +allowing the user to further tweak / modify the system + +# runCommand= + +Run the specified command within chroot of the installed system + +# runScript= + +runScript will copy the specified script into FSMNT, and run it in chroot of the system +Usefull when you have a 3rd party script on the DVD / USB, and you want to copy it into +the installed system and run + +# runExtCommand= + +runExtCommand is used when you wish to run a command outside the chroot +The variable $FSMNT is set to the mount-point of your installed system + + +######################################################################## +# PC-BSD SPECIFC OPTIONS +######################################################################## + +Options for time-zones and NTP on the installed system + +# timeZone= + +timeZone can be set to the zone file in /usr/share/zoneinfo/ that is to be used +example: America/New_York + +# enableNTP= (yes / no) + +set enableNTP to yes or no to enable or disable the NTP service on the system + + +######################################################################## +# PC-BSD SPECIFC OPTIONS +######################################################################## + +Options specific to installing PC-BSD, such as localization, and KDE settings + +# localizeLang=en + +localizeLang will set the system console and Desktop to the target language + +# localizeKeyLayout=en + +localizeKeyLayout updates the system's xorg config to set the keyboard layout + +# localizeKeyModel=pc104 + +localizeKeyModel updates the system's xorg config to set the keyboard model + +# localizeKeyVariant=intl + +localizeKeyVariant is used to update the xorg config to set the keyboard variant + +# autoLoginUser=kris + +Setting autoLoginUser will enable the specified user to log into the desktop +automatically without entering a password + +$FreeBSD$ diff --git a/usr.sbin/pc-sysinstall/examples/pc-autoinstall.conf b/usr.sbin/pc-sysinstall/examples/pc-autoinstall.conf new file mode 100644 index 0000000..899d3b9 --- /dev/null +++ b/usr.sbin/pc-sysinstall/examples/pc-autoinstall.conf @@ -0,0 +1,52 @@ +# pc-autoinstall.conf example +# $FreeBSD$ +# +# Usage: Modify these variables, and copy the file to +# /boot/pc-autoinstall.conf on your PC-BSD installation medium +# +# The conf will then be read at bootup, and your automated +# install will take place +################################################################## + +# Where the pc-sysinstall main config is located +# Can be either a file on the booted CD / DVD / USB media, +# or a remote file on http / ftp +# +# The value %%NIC_MAC%% is special, and will be substituted with +# the macaddress of the enabled NIC from DHCP or manually set +# with 'nic_config:' +################################################################## + +# Examples: +# pc_config: ftp://192.168.0.2/cust-install.cfg +# pc_config: http://192.168.0.2/cust-install.cfg +# pc_config: http://192.168.0.2/%%NIC_MAC%%.cfg +# pc_config: /boot/cust-install.cfg + +# Set this to yes if we should confirm before doing an install +# This should normally be set to yes, otherwise booting the wrong +# disk will result in a system wipe +# confirm_install: no +confirm_install: yes + +# Set the command to run post-install, usually best to run shutdown +# but this can be replaced with any other command / script you wish +# to execute post-install +# shutdown_cmd: shutdown -p now + +# Options for the network setup, should the cfg need to be fetched +# from a remote location, only necessary when using ftp or http +################################################################## + +# Special option, will attempt dhcp on all found NICs +# until the file can be fetched, or we run out of interfaces +# nic_config: dhcp-all + +# Line to be passed to the "ifconfig" command to bring up an interface +# nic_config: em0 192.168.0.101 255.255.255.0 + +# DNS server to use +# nic_dns: 192.168.0.1 + +# Default router / gateway +# nic_gateway: 192.168.0.1 diff --git a/usr.sbin/pc-sysinstall/examples/pcinstall.cfg.fbsd-netinstall b/usr.sbin/pc-sysinstall/examples/pcinstall.cfg.fbsd-netinstall new file mode 100644 index 0000000..e57bad8 --- /dev/null +++ b/usr.sbin/pc-sysinstall/examples/pcinstall.cfg.fbsd-netinstall @@ -0,0 +1,71 @@ +# Sample configuration file for an installation using pc-sysinstall +#$FreeBSD$ + +installMode=fresh +installInteractive=yes +hostname=pcbsd8 + +# Set the disk parameters +disk0=ad0 +partition=all +bootManager=none +commitDiskPart + +# Setup the disk label +# All sizes are expressed in MB +# Avail FS Types, UFS, UFS+S, UFS+J, ZFS, SWAP +disk0-part=UFS 1000 / +disk0-part=SWAP 2000 none +disk0-part=UFS 0 /usr +# Size 0 means use the rest of the slice size +# Do it now! +commitDiskLabel + +netDev=AUTO-DHCP +#netDev=nfe0 +#netIP=192.168.0.49 +#netMask=255.255.255.0 +#netNameServer=208.67.222.222 +#netDefaultRouter=192.168.0.1 + +netSaveDev=AUTO-DHCP +#netSaveDev=nfe0 +#netSaveIP=192.168.0.49 +#netSaveMask=255.255.255.0 +#netSaveNameServer=208.67.222.222 +#netSaveDefaultRouter=192.168.0.1 + +# Set if we are installing via optical, USB, or FTP +#installType=PCBSD +installType=FreeBSD +#installMedium=dvd +installMedium=ftp + +ftpPath=ftp://192.168.0.2/netinstall + +#packageType=uzip +packageType=tar + +# List our components to install +installComponents=ports,src + +# Setup user "kris" to log into the desktop automatically +autoLoginUser=kris + +# Set the root pass +rootPass=root + +# Setup our users +userName=kris +userComment=Kris Moore +userPass=kris +userShell=/bin/csh +userHome=/home/kris +userGroups=wheel,operator +commitUser + +# Options for localizing an install +localizeLang="ru" +localizeKeyLayout="ru" +localizeKeyModel="pc104" +localizeKeyVariant="intl" diff --git a/usr.sbin/pc-sysinstall/examples/pcinstall.cfg.geli b/usr.sbin/pc-sysinstall/examples/pcinstall.cfg.geli new file mode 100644 index 0000000..983dff7 --- /dev/null +++ b/usr.sbin/pc-sysinstall/examples/pcinstall.cfg.geli @@ -0,0 +1,50 @@ +# Auto-Generated pc-sysinstall configuration +#$FreeBSD$ + +installInteractive=no +installMode=fresh +installType=FreeBSD +packageType=tar +installMedium=dvd +netSaveDev=AUTO-DHCP + +# Timezone +timeZone=America/New_York +enableNTP=yes + +# Keyboard Layout Options +localizeKeyModel=pc104 +localizeKeyLayout=us + +# Disk Setup for ad0 +disk0=ad0 +partition=ALL +bootManager=none +commitDiskPart + +# Partition Setup for ad0(ALL) +# All sizes are expressed in MB +# Avail FS Types, UFS, UFS+S, UFS+J, ZFS, SWAP +# UFS.eli, UFS+S.eli, UFS+J.eli, ZFS.eli, SWAP.eli +disk0-part=UFS 500 /boot +disk0-part=UFS.eli 500 / +disk0-part=UFS.eli 500 /usr +encpass=mypass +commitDiskLabel + +# Optional Components +installComponents= + +# Root Password +rootPass=mypass + +# Users +userName=kris +userComment=Kris Moore +userPass=mypass +userShell=/bin/csh +userHome=/home/kris +userGroups=wheel,operator +autoLoginUser=kris +commitUser + diff --git a/usr.sbin/pc-sysinstall/examples/pcinstall.cfg.gmirror b/usr.sbin/pc-sysinstall/examples/pcinstall.cfg.gmirror new file mode 100644 index 0000000..eec2831 --- /dev/null +++ b/usr.sbin/pc-sysinstall/examples/pcinstall.cfg.gmirror @@ -0,0 +1,45 @@ +# Sample configuration file for an installation using pc-sysinstall +#$FreeBSD$ + +installMode=fresh +installInteractive=yes +hostname=pcbsd8 + +# Set the disk parameters +disk0=ad0 +mirror=ad1 +mirrorbal=split +partition=all +bootManager=bsd +commitDiskPart + +# Setup the disk label +# All sizes are expressed in MB +# Avail FS Types, UFS, UFS+S, UFS+J, ZFS, SWAP +disk0-part=UFS+S 500 / +disk0-part=SWAP 2000 none +disk0-part=UFS+S 0 /usr +# Size 0 means use the rest of the slice size +# Do it now! +commitDiskLabel + +# Set if we are installing via optical, USB, or FTP +installType=FreeBSD +installMedium=dvd + +#packageType=uzip +packageType=tar +#installComponents=ports,src + +# Run any commands post-install +runCommand=echo 'root' | pw usermod root -h 0 +#runScript=/root/test.sh +#runExtCommand=echo 'hey there'; touch $FSMNT/touched + +#autoLoginUser=kris + +# Options for localizing an install +localizeLang="ru" +localizeKeyLayout="ru" +localizeKeyModel="pc104" +localizeKeyVariant="intl" diff --git a/usr.sbin/pc-sysinstall/examples/pcinstall.cfg.netinstall b/usr.sbin/pc-sysinstall/examples/pcinstall.cfg.netinstall new file mode 100644 index 0000000..44a0c50 --- /dev/null +++ b/usr.sbin/pc-sysinstall/examples/pcinstall.cfg.netinstall @@ -0,0 +1,68 @@ +# Sample configuration file for an installation using pc-sysinstall +#$FreeBSD$ + +installMode=fresh +installInteractive=yes +hostname=pcbsd8 + +# Set the disk parameters +disk0=ad0 +partition=all +bootManager=none +commitDiskPart + +# Setup the disk label +# All sizes are expressed in MB +# Avail FS Types, UFS, UFS+S, UFS+J, ZFS, SWAP +disk0-part=UFS 1000 / +disk0-part=SWAP 2000 none +disk0-part=UFS 0 /usr +# Size 0 means use the rest of the slice size +# Do it now! +commitDiskLabel + +netDev=AUTO-DHCP +#netDev=nfe0 +#netIP=192.168.0.49 +#netMask=255.255.255.0 +#netNameServer=208.67.222.222 +#netDefaultRouter=192.168.0.1 + +netSaveDev=AUTO-DHCP +#netSaveDev=nfe0 +#netSaveIP=192.168.0.49 +#netSaveMask=255.255.255.0 +#netSaveNameServer=208.67.222.222 +#netSaveDefaultRouter=192.168.0.1 + +# Set if we are installing via optical, USB, or FTP +#installType=PCBSD +installType=FreeBSD +#installMedium=dvd +installMedium=ftp + +ftpPath=ftp://192.168.0.2/netinstall + +#packageType=uzip +packageType=tar +#installComponents=ports,src + +#autoLoginUser=kris + +# Set the root pass +rootPass=root + +# Setup our users +userName=kris +userComment=Kris Moore +userPass=kris +userShell=/bin/csh +userHome=/home/kris +userGroups=wheel,operator +commitUser + +# Options for localizing an install +localizeLang="ru" +localizeKeyLayout="ru" +localizeKeyModel="pc104" +localizeKeyVariant="intl" diff --git a/usr.sbin/pc-sysinstall/examples/pcinstall.cfg.restore b/usr.sbin/pc-sysinstall/examples/pcinstall.cfg.restore new file mode 100644 index 0000000..8dcc486 --- /dev/null +++ b/usr.sbin/pc-sysinstall/examples/pcinstall.cfg.restore @@ -0,0 +1,57 @@ +# Sample configuration file for an installation using pc-sysinstall +#$FreeBSD$ + +installMode=fresh +installInteractive=no +hostname=freebsd8 + +# Set the disk parameters +disk0=ad1 +partition=all +bootManager=none +commitDiskPart + +# Setup the disk label +# All sizes are expressed in MB +# Avail FS Types, UFS, UFS+S, UFS+J, ZFS, SWAP +# UFS.eli, UFS+S.eli, UFS+J.eli, ZFS.eli, SWAP.eli +disk0-part=UFS+S 500 / +disk0-part=SWAP.eli 2000 none +disk0-part=UFS+S 0 /usr +# Size 0 means use the rest of the slice size +# Do it now! +commitDiskLabel + +# Set if we are installing via optical, USB, or FTP +installType=FreeBSD +installMedium=dvd +installFile=freebsd-release.tbz + +#packageType=uzip +packageType=tar +#installComponents=ports,src + +# Run any commands post-install +#runCommand=echo 'root' | pw usermod root -h 0 +#runScript=/root/test.sh +#runExtCommand=echo 'hey there'; touch $FSMNT/touched + +# Set the root pass +rootPass=root + +# Setup our users +userName=kris +userComment=Kris Moore +userPass=kris +userShell=/bin/csh +userHome=/home/kris +userGroups=wheel,operator +commitUser + +#autoLoginUser=kris + +# Options for localizing an install +localizeLang="ru" +localizeKeyLayout="ru" +localizeKeyModel="pc104" +localizeKeyVariant="intl" diff --git a/usr.sbin/pc-sysinstall/examples/pcinstall.cfg.rsync b/usr.sbin/pc-sysinstall/examples/pcinstall.cfg.rsync new file mode 100644 index 0000000..d520d09 --- /dev/null +++ b/usr.sbin/pc-sysinstall/examples/pcinstall.cfg.rsync @@ -0,0 +1,45 @@ +# Sample configuration file for an installation using pc-sysinstall +#$FreeBSD$ + +installMode=fresh +installInteractive=yes +hostname=pcbsd8 + +# Set the disk parameters +disk0=ad0 +partition=all +bootManager=none +commitDiskPart + +# Setup the disk label +# All sizes are expressed in MB +# Avail FS Types, UFS, UFS+S, UFS+J, ZFS, SWAP +disk0-part=UFS 2000 / +disk0-part=SWAP 2000 none +disk0-part=UFS 0 /usr +# Size 0 means use the rest of the slice size +# Do it now! +commitDiskLabel + +netDev=AUTO-DHCP +#netDev=nfe0 +#netIP=192.168.0.49 +#netMask=255.255.255.0 +#netNameServer=208.67.222.222 +#netDefaultRouter=192.168.0.1 + +# Set if we are installing via optical, USB, or FTP +#installType=PCBSD +installType=FreeBSD +#installMedium=dvd +installMedium=rsync + +rsyncPath=life-preserver/back-2009-11-12T14_53_14 +rsyncUser=lifep +rsyncHost=192.168.0.50 +rsyncPort=22 + +#packageType=uzip +packageType=tar +#installComponents=ports,src + diff --git a/usr.sbin/pc-sysinstall/examples/pcinstall.cfg.upgrade b/usr.sbin/pc-sysinstall/examples/pcinstall.cfg.upgrade new file mode 100644 index 0000000..f181d61 --- /dev/null +++ b/usr.sbin/pc-sysinstall/examples/pcinstall.cfg.upgrade @@ -0,0 +1,24 @@ +# Sample configuration file for an installation using pc-sysinstall +#$FreeBSD$ + +installMode=upgrade +installInteractive=no +hostname=freebsd8 + +# Set the disk parameters +disk0=ada0s1a +bootManager=none +commitDiskPart + +# Set if we are installing via optical, USB, or FTP +installType=PCBSD +installMedium=dvd + +packageType=uzip +#installComponents=ports,src + +# Options for localizing an install +localizeLang="ru" +localizeKeyLayout="ru" +localizeKeyModel="pc104" +localizeKeyVariant="intl" diff --git a/usr.sbin/pc-sysinstall/examples/pcinstall.cfg.zfs b/usr.sbin/pc-sysinstall/examples/pcinstall.cfg.zfs new file mode 100644 index 0000000..2deb498 --- /dev/null +++ b/usr.sbin/pc-sysinstall/examples/pcinstall.cfg.zfs @@ -0,0 +1,59 @@ +# Auto-Generated pc-sysinstall configuration +#$FreeBSD$ +installInteractive=no +installMode=fresh +installType=FreeBSD +packageType=tar +installMedium=dvd +netSaveDev=AUTO-DHCP + +# Timezone +timeZone=America/New_York +enableNTP=yes + +# Keyboard Layout Options +localizeKeyModel=pc104 +localizeKeyLayout=us + +# Disk Setup for ad0 +disk0=ad0 +partition=ALL +bootManager=none +commitDiskPart + +# Partition Setup for ad0(ALL) +# All sizes are expressed in MB +# Avail FS Types, UFS, UFS+S, UFS+J, ZFS, SWAP +# UFS.eli, UFS+S.eli, UFS+J.eli, ZFS.eli, SWAP.eli +disk0-part=ZFS 0 /,/usr,/var,/data (mirror: ad1) +commitDiskLabel + +# Disk Setup for ad3 +disk1=ad3 +partition=ALL +bootManager=none +commitDiskPart + +# Partition Setup for ad3(ALL) +# All sizes are expressed in MB +# Avail FS Types, UFS, UFS+S, UFS+J, ZFS, SWAP +# UFS.eli, UFS+S.eli, UFS+J.eli, ZFS.eli, SWAP.eli +disk1-part=SWAP 0 none +commitDiskLabel + +# Optional Components +installComponents= + +# Root Password +rootPass=mypass + +# Users +userName=kris +userComment=Kris Moore +userPass=mypass +userShell=/bin/csh +userHome=/home/kris +userGroups=wheel,operator +autoLoginUser=kris +commitUser + diff --git a/usr.sbin/pc-sysinstall/pc-sysinstall/pc-sysinstall.8 b/usr.sbin/pc-sysinstall/pc-sysinstall/pc-sysinstall.8 new file mode 100644 index 0000000..b6ea698 --- /dev/null +++ b/usr.sbin/pc-sysinstall/pc-sysinstall/pc-sysinstall.8 @@ -0,0 +1,120 @@ +.\" 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 Jordan Hubbard 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$ +.\" +.Dd June 24, 2010 +.Dt PC-SYSINSTALL 8 +.Os +.Sh NAME +.Nm pc-sysinstall +.Nd System installer backend +.Sh SYNOPSIS +.Nm +.Op Fl c Ar file +.Op Ar command +.Sh DESCRIPTION +The +.Nm +utility is a hybrid backend for installing FreeBSD. When run in install mode +it takes a configuration file and performs an installation according to the +parameters specified in the configuration file. When called with one of +the system query commands it provides information about the system to aid a +front end in building an appropriate configuration file. +.Pp +The following options are available: +.Bl -tag -width indent +.It Fl c Ar file +Perform an installation as directed by +.Ar file. +.El +.Sh COMMANDS +The +.Cm command +can be any one of the following: +.Pp +.Bl -tag -width indent +.It help +Display a list of all commands. +.It help Ar command +Dispay the help data for the specified command. +.It disk-list +Provide a listing of the storage devices detected on this system. +.It disk-part Ar disk +Queries the specified storage device and returns information about its +partitions. +.It disk-info Ar disk +Returns information about a storage device's size, cylinders, heads, and +sectors. +.It detect-laptop +Tests to see if this system is a laptop or desktop. +.It detect-vmware +Tests to see if this system is a vmware session. +.It detect-nics +Returns a listing of the detected network cards on this system. +.It list-components +Returns a listing of the available components which can be installed. +.It list-rsync-backups Ar user Ar host Ar port +Returns a listing of available rsync-backups on the target server in the +life-preserver/ directory. +.It list-tzones +Returns a listing of available timezones. +.It query-langs +Returns a list of languages that the installer supports. +.It sys-mem +Returns the size of installed system RAM in MegaBytes. +.It test-netup +test if an internet connection is available. +.It update-part-list +Returns a list of PC-BSD and FreeBSD installs on this system for updates. +.It xkeyboard-layouts +Returns a list of keyboard layouts that xorg supports. +.It xkeyboard-models +Returns a list of keyboard models that xorg supports. +.It xkeyboard-variants +Returns a list of keyboard variants that xorg supports. +.It create-part Ar disk Ar size +Create a new MBR primary slice on the target disk using size MB. +.It delete-part Ar partition +Delete the disk partition specified. If this is the last partition, the +disk partition layout will also be scrubbed, leaving a clean disk ready +for MBR or GPT file system layouts. +.It start-autoinstall Ar file +Start an automated installation with the specified file. Normally only +used by automated install scripts. +.It setup-ssh-keys Ar user Ar host Ar port +Setup SSH without a password for the target host, user, and port. Used to +prompt the user to log into a server before doing a rsync + ssh restore. +.Sh HISTORY +This version of +.Nm +first appeared in +.Fx 9.0 . +.Sh AUTHORS +.An Kris Moore Aq kmoore@FreeBSD.org +.Sh BUGS +This utility was written to install PC-BSD and has seen limited use as an +installer for FreeBSD. It's likely that usage to install FreeBSD will expose +edge cases that PC-BSD doesn't, as well as generate feature requests based +on unforseen needs. diff --git a/usr.sbin/pc-sysinstall/pc-sysinstall/pc-sysinstall.sh b/usr.sbin/pc-sysinstall/pc-sysinstall/pc-sysinstall.sh new file mode 100755 index 0000000..98abc2a --- /dev/null +++ b/usr.sbin/pc-sysinstall/pc-sysinstall/pc-sysinstall.sh @@ -0,0 +1,204 @@ +#!/bin/sh +##################################################################### +# Author: Kris Moore +# License: BSD +# Description: pc-sysinstall provides a backend for performing +# system installations, as well as calls which a front-end can use +# to retrive information about the system +##################################################################### +# Copyright 2010 iX Systems +# All rights reserved +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted providing 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 ``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 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$ +##################################################################### + +# User-editable configuration variables + +# Set this to the program location +PROGDIR="/PCBSD/pc-sysinstall" +export PROGDIR + +# Set this to the components location +COMPDIR="${PROGDIR}/components" +export COMPDIR + +# End of user-editable configuration +##################################################################### + +# Set our QUERYDIR +QUERYDIR="${PROGDIR}/backend-query" +export QUERYDIR + +# Set our BACKEND +BACKEND="${PROGDIR}/backend" +export BACKEND + +PARTMANAGERDIR="${PROGDIR}/backend-partmanager" +export PARTMANAGERDIR + +# Start by sourcing our conf file +if [ -e "${PROGDIR}/conf/pc-sysinstall.conf" ] +then + . ${PROGDIR}/conf/pc-sysinstall.conf +else + echo "ERROR: Could not find ${PROGDIR}/conf/pc-sysinstall.conf" + exit 1 +fi + +# Now source our functions.sh +if [ -e "${PROGDIR}/backend/functions.sh" ] +then + . ${PROGDIR}/backend/functions.sh +else + echo "ERROR: Could not find ${PROGDIR}/backend/functions.sh" + exit 1 +fi + + +# Check if we are called without any flags and display help +if [ -z "${1}" ] +then + # Display the help index + display_help + exit 0 +fi + +case $1 in + # The -c flag has been given, time to parse the script + -c) if [ -z "${2}" ] + then + display_help + else + ${BACKEND}/parseconfig.sh ${2} + exit $? + fi + ;; + + # The user requsted help + help) if [ -z "${2}" ] + then + display_help + else + display_command_help ${2} + fi + ;; + + # Parse an auto-install directive, and begin the installation + start-autoinstall) ${BACKEND}/startautoinstall.sh ${2} + ;; + + # The user is wanting to create a new partition + create-part) ${PARTMANAGERDIR}/create-part.sh "${2}" "${3}" + ;; + + # The user is wanting to delete an existing partition + delete-part) ${PARTMANAGERDIR}/delete-part.sh "${2}" + ;; + + # The user is wanting to check if we are on a laptop or desktop + detect-laptop) ${QUERYDIR}/detect-laptop.sh + ;; + + # The user is wanting to see what nics are available on the system + detect-nics) ${QUERYDIR}/detect-nics.sh + ;; + + # The user is wanting to check if we are in vmware + detect-vmware) ${QUERYDIR}/detect-vmware.sh + ;; + + # The user is wanting to query a disk's information + disk-info) ${QUERYDIR}/disk-info.sh ${2} + ;; + + # The user is wanting to query which disks are available + disk-list) ${QUERYDIR}/disk-list.sh + ;; + + # The user is wanting to query a disk's partitions + disk-part) ${QUERYDIR}/disk-part.sh ${2} + ;; + + # Function allows the setting of networking by a calling front-end + enable-net) ${QUERYDIR}/enable-net.sh "${2}" "${3}" "${4}" "${5}" "${6}" "${7}" + ;; + + # Function which lists components available + list-components) ${QUERYDIR}/list-components.sh + ;; + + # Function which lists available backups on a rsync/ssh server + list-rsync-backups) ${QUERYDIR}/list-rsync-backups.sh "${2}" "${3}" "${4}" + ;; + + # Function which lists timezones available + list-tzones) ${QUERYDIR}/list-tzones.sh + ;; + + # Requested a list of languages this install will support + query-langs) ${QUERYDIR}/query-langs.sh + ;; + + # Function which creates a error report, and mails it to the specified address + send-logs) ${QUERYDIR}/send-logs.sh ${2} + ;; + + # Function which allows setting up of SSH keys + setup-ssh-keys) ${QUERYDIR}/setup-ssh-keys.sh "${2}" "${3}" "${4}" + ;; + + # Function which lists the real memory of the system in MB + sys-mem) ${QUERYDIR}/sys-mem.sh + ;; + + # Run script which determines if we are booted from install media, or on disk + test-live) ${QUERYDIR}/test-live.sh + ;; + + # The user is wanting to test if the network is up and working + test-netup) ${QUERYDIR}/test-netup.sh + ;; + + # The user is wanting to get a list of partitions available to be updated / repaired + update-part-list) ${QUERYDIR}/update-part-list.sh + ;; + + # Requested a list of keyboard layouts that xorg supports + xkeyboard-layouts) ${QUERYDIR}/xkeyboard-layouts.sh + ;; + + # Requested a list of keyboard models that xorg supports + xkeyboard-models) ${QUERYDIR}/xkeyboard-models.sh + ;; + + # Requested a list of keyboard variants that xorg supports + xkeyboard-variants) ${QUERYDIR}/xkeyboard-variants.sh + ;; + + *) echo "Unknown Command: ${1}" + exit 1 ;; +esac + +# Exit with success if we made it to the end +exit 0 |