+ # use /var/tmp that should be large enough on both chroot- or vserver-based myplc
+ BUILDTMP=/var/tmp
+
+ FULL_VERSION_STRING="${PLC_NAME} BootCD ${BOOTCD_VERSION}"
+
+}
+
+# NOTE
+# the custom-dir feature is designed to let a myplc try/ship a patched bootcd
+# without the need for a full devel environment
+# for example, you would create /root/custom-bootcd/etc/rc.d/init.d/pl_hwinit
+# and run this script with -C /root/custom-bootcd
+# this creates a third .img image of the custom dir, that 'hides' the files from
+# bootcd.img in the resulting unionfs
+# it seems that this feature has not been used nor tested in a long time, use with care
+
+usage() {
+ echo "Usage: $COMMAND [OPTION]..."
+ echo " -f plnode.txt Node to customize CD for (default: none)"
+ echo " -t 'types' Build the specified images (default: $DEFAULT_TYPES)"
+ echo " NOTE: mentioning 'serial' as part of the type is not supported anymore"
+ echo " -a Build all known types as listed below"
+ echo " -s console-info Enable a serial line as console and also bring up getty on that line"
+ echo " console-info: tty:baud-rate:parity:bits"
+ echo " or 'default' shortcut for $SERIAL_CONSOLE"
+ echo " -S equivalent to -s default"
+ echo " -O output-base The prefix of the generated files (default: PLC_NAME-BootCD-VERSION)"
+ echo " useful when multiple types are provided"
+ echo " can be a full path"
+ echo " -o output-name The full name of the generated file"
+ echo " -C custom-dir Custom directory"
+ echo " -V variant Use a variant - see kvariant.sh"
+ echo " -n Dry run - mostly for debug/test purposes"
+ echo " -k Add additional parameters to the kargs.txt file"
+ echo " -h This message"
+ echo "All known types: $ALL_TYPES"
+ exit 1
+}
+
+####################
+function parse_command_line () {
+
+ # init
+ TYPES=""
+ # Get options
+ while getopts "f:t:as:SO:o:C:V:k:nh" opt ; do
+ case $opt in
+ f) NODE_CONFIGURATION_FILE=$OPTARG ;;
+ t) TYPES="$TYPES $OPTARG" ;;
+ a) TYPES="$ALL_TYPES" ;;
+ s) CONSOLE_INFO="$OPTARG" ;;
+ S) CONSOLE_INFO=$SERIAL_CONSOLE ;;
+ O) OUTPUT_BASE="$OPTARG" ;;
+ o) OUTPUT_NAME="$OPTARG" ;;
+ C) CUSTOM_DIR="$OPTARG" ;;
+ V) VARIANT="$OPTARG" ;;
+ k) KERNEL_ARGS="$KERNEL_ARGS $OPTARG" ;;
+ n) DRY_RUN=true ;;
+ h|*) usage ;;
+ esac
+ done
+
+ # use defaults if not set
+ [ -z "$TYPES" ] && TYPES="$DEFAULT_TYPES"
+ [ -z "$VARIANT" ] && VARIANT="build"
+ [ "$CONSOLE_INFO" == "default" ] && CONSOLE_INFO=$SERIAL_CONSOLE
+
+ if [ -n "$NODE_CONFIGURATION_FILE" ] ; then
+ # check existence of NODE_CONFIGURATION_FILE and normalize as we will change directory
+ if [ ! -f "$NODE_CONFIGURATION_FILE" ] ; then
+ echo "Node configuration file $NODE_CONFIGURATION_FILE not found - exiting"
+ exit 1
+ fi
+ cf_dir="$(dirname $NODE_CONFIGURATION_FILE)"
+ cf_dir="$(cd $cf_dir; pwd -P)"
+ cf_file="$(basename $NODE_CONFIGURATION_FILE)"
+ NODE_CONFIGURATION_FILE="$cf_dir"/"$cf_file"
+ fi
+
+ # check TYPES
+ local matcher="XXX$(echo $ALL_TYPES | sed -e 's,\W,XXX,g')XXX"
+ for t in $TYPES; do
+ echo Checking type $t
+ echo $matcher | grep XXX${t}XXX &> /dev/null
+ if [ "$?" != 0 ] ; then
+ echo Unknown type $t
+ usage
+ fi
+ done
+
+}
+
+####################
+function init_serial () {
+ local console=$1; shift
+ if [ "$console" == "$GRAPHIC_CONSOLE" ] ; then
+ IS_SERIAL=
+ console_spec=""
+ echo "Standard, graphic, non-serial mode"
+ else
+ IS_SERIAL=true
+ console_dev=$(echo "$console" | awk -F: ' {print $1}')
+ console_baud=$(echo "$console" | awk -F: ' {print $2}')
+ [ -z "$console_baud" ] && console_baud="115200"
+ local console_parity=$(echo "$console" | awk -F: ' {print $3}')
+ [ -z "$console_parity" ] && console_parity="n"
+ local console_bits=$(echo "$console" | awk -F: ' {print $4}')
+ [ -z "$console_bits" ] && console_bits="8"
+ console_spec="console=${console_dev},${console_baud}${console_parity}${console_bits}"
+ local tty_nb=$(echo $console_dev | sed -e 's,[a-zA-Z],,g')
+ console_serial_line="SERIAL ${tty_nb} ${console_baud}"
+ echo "Serial mode"
+ echo "console_serial_line=${console_serial_line}"
+ echo "console_spec=${console_spec}"
+ fi
+}
+
+#################### run once : build the overlay image
+function build_overlay () {
+
+ BUILDTMP=$(mktemp -d ${BUILDTMP}/bootcd.XXXXXX)
+ push_cleanup rm -fr "${BUILDTMP}"
+ mkdir "${BUILDTMP}/isofs"
+ for i in "$ISOREF"/isofs/{bootcd.img,kernel}; do
+ ln -s "$i" "${BUILDTMP}/isofs"
+ done
+ # the syslinux that comes with f12 has this file in a new location
+ cp "/usr/lib/syslinux/isolinux.bin" "${BUILDTMP}/isofs" \
+ || cp "/usr/share/syslinux/isolinux.bin" "${BUILDTMP}/isofs"
+ ISOFS="${BUILDTMP}/isofs"
+
+ # Root of the ISO and USB images
+ echo "* Populating root filesystem..."
+ OVERLAY="${BUILDTMP}/overlay"
+ install -d -m 755 $OVERLAY
+ push_cleanup rm -fr $OVERLAY
+
+ # Create version files
+ echo "* Creating version files"
+
+ # Boot Manager compares pl_version in both places to make sure that
+ # the right CD is mounted. We used to boot from an initrd and mount
+ # the CD on /usr. Now we just run everything out of the initrd.
+ for file in $OVERLAY/pl_version $OVERLAY/usr/isolinux/pl_version ; do
+ mkdir -p $(dirname $file)
+ echo "$FULL_VERSION_STRING" >$file
+ done
+
+ # Install boot server configuration files
+ echo "* Installing boot server configuration files"
+
+ # We always intended to bring up and support backup boot servers,
+ # but never got around to it. Just install the same parameters for
+ # both for now.
+ for dir in $OVERLAY/usr/boot $OVERLAY/usr/boot/backup ; do
+ install -D -m 644 $PLC_BOOT_CA_SSL_CRT $dir/cacert.pem
+ install -D -m 644 $PLC_ROOT_GPG_KEY_PUB $dir/pubring.gpg
+ echo "$PLC_BOOT_HOST" >$dir/boot_server
+ echo "$PLC_BOOT_SSL_PORT" >$dir/boot_server_port
+ echo "/boot/" >$dir/boot_server_path
+ done
+
+ # Install old-style boot server configuration files
+ # as opposed to what a former comment suggested,
+ # this is still required, somewhere in the bootmanager apparently
+ install -D -m 644 $PLC_BOOT_CA_SSL_CRT $OVERLAY/usr/bootme/cacert/$PLC_BOOT_HOST/cacert.pem
+ echo "$FULL_VERSION_STRING" >$OVERLAY/usr/bootme/ID
+ echo "$PLC_BOOT_HOST" >$OVERLAY/usr/bootme/BOOTSERVER
+ echo "$PLC_BOOT_HOST" >$OVERLAY/usr/bootme/BOOTSERVER_IP
+ echo "$PLC_BOOT_SSL_PORT" >$OVERLAY/usr/bootme/BOOTPORT
+
+ # Generate /etc/issue
+ echo "* Generating /etc/issue"
+
+ if [ "$PLC_WWW_PORT" = "443" ] ; then
+ PLC_WWW_URL="https://$PLC_WWW_HOST/"
+ elif [ "$PLC_WWW_PORT" != "80" ] ; then
+ PLC_WWW_URL="http://$PLC_WWW_HOST:$PLC_WWW_PORT/"
+ else
+ PLC_WWW_URL="http://$PLC_WWW_HOST/"
+ fi
+
+ mkdir -p $OVERLAY/etc
+ cat >$OVERLAY/etc/issue <<EOF
+$FULL_VERSION_STRING
+$PLC_NAME Node: \n
+Kernel \r on an \m
+$PLC_WWW_URL
+
+This machine is a node in the $PLC_NAME distributed network. It has
+not fully booted yet. If you have cancelled the boot process at the
+request of $PLC_NAME Support, please follow the instructions provided
+to you. Otherwise, please contact $PLC_MAIL_SUPPORT_ADDRESS.
+
+Console login at this point is restricted to root. Provide the root
+password of the default $PLC_NAME Central administrator account at the
+time that this CD was created.
+
+EOF