#!/bin/bash
#
# Builds custom BootCD ISO and USB images in the current
-# directory. For backward compatibility, if an old-style static
-# configuration is specified, that configuration file will be parsed
-# instead of the current PLC configuration in
-# /etc/planetlab/plc_config.
+# directory.
#
# Aaron Klingaman <alk@absarokasoft.com>
# Mark Huang <mlhuang@cs.princeton.edu>
FREE_SPACE=4096
CUSTOM_DIR=
OUTPUT_BASE=
-DEFAULT_CONSOLE="graphic"
-CONSOLE_INFO=$DEFAULT_CONSOLE
-DEFAULT_SERIAL_CONSOLE="ttyS0:115200"
+GRAPHIC_CONSOLE="graphic"
+SERIAL_CONSOLE="ttyS0:115200:n:8"
+CONSOLE_INFO=$GRAPHIC_CONSOLE
MKISOFS_OPTS="-R -J -r -f -b isolinux.bin -c boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table"
ALL_TYPES=""
esac
done; done; done
+# 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: build.sh [OPTION]..."
- echo " -c name (Deprecated) Static configuration to use (default: $CONFIGURATION)"
echo " -f plnode.txt Node to customize CD for (default: none)"
echo " -t 'types' Build the specified images (default: $DEFAULT_TYPES)"
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 " defaults to $DEFAULT_SERIAL_CONSOLE"
+ echo " console-info: tty:baud-rate:parity:bits"
+ echo " or 'default' shortcut for $SERIAL_CONSOLE"
+ echo " Using this is recommended, rather than mentioning 'serial' in a type"
echo " -O output-base The prefix of the generated files (default: PLC_NAME-BootCD-VERSION)"
- echo " -C custom-dir Custom directory"
+ 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 " -n Dry run - mostly for debug/test purposes"
echo " -h This message"
echo "All known types: $ALL_TYPES"
# init
TYPES=""
# Get options
-while getopts "c:f:t:as:O:C:nh" opt ; do
+while getopts "f:t:as:O:o:C:nh" opt ; do
case $opt in
- c)
- CONFIGURATION=$OPTARG ;;
f)
NODE_CONFIGURATION_FILE=$OPTARG ;;
t)
a)
TYPES="$ALL_TYPES" ;;
s)
- CONSOLE_INFO="$OPTARG" ;;
+ CONSOLE_INFO="$OPTARG"
+ [ "$CONSOLE_INFO" == "default" ] && CONSOLE_INFO=$SERIAL_CONSOLE
+ ;;
O)
OUTPUT_BASE="$OPTARG" ;;
+ o)
+ OUTPUT_NAME="$OPTARG" ;;
C)
CUSTOM_DIR="$OPTARG" ;;
n)
. /etc/planetlab/plc_config
fi
-### This support for backwards compatibility can be taken out in the
-### future. RC1 based MyPLCs set $PLC_BOOT_SSL_CRT in the plc_config
-### file, but >=RC2 based bootcd assumes that $PLC_BOOT_CA_SSL_CRT is
-### set.
-if [ -z "$PLC_BOOT_CA_SSL_CRT" -a ! -z "$PLC_BOOT_SSL_CRT" ] ; then
- PLC_BOOT_CA_SSL_CRT=$PLC_BOOT_SSL_CRT
-fi
-
-# If PLC configuration is not valid, try a static configuration
-if [ -z "$PLC_BOOT_CA_SSL_CRT" -a -d configurations/$CONFIGURATION ] ; then
- # (Deprecated) Source static configuration
- . configurations/$CONFIGURATION/configuration
- PLC_NAME="PlanetLab"
- PLC_MAIL_SUPPORT_ADDRESS="support@planet-lab.org"
- PLC_WWW_HOST="www.planet-lab.org"
- PLC_WWW_PORT=80
- if [ -n "$EXTRA_VERSION" ] ; then
- BOOTCD_VERSION="$BOOTCD_VERSION $EXTRA_VERSION"
- fi
- PLC_BOOT_HOST=$PRIMARY_SERVER
- PLC_BOOT_SSL_PORT=$PRIMARY_SERVER_PORT
- PLC_BOOT_CA_SSL_CRT=configurations/$CONFIGURATION/$PRIMARY_SERVER_CERT
- PLC_ROOT_GPG_KEY_PUB=configurations/$CONFIGURATION/$PRIMARY_SERVER_GPG
-fi
-
-FULL_VERSION_STRING="$PLC_NAME BootCD $BOOTCD_VERSION"
+FULL_VERSION_STRING="${PLC_NAME} BootCD ${BOOTCD_VERSION}"
echo "* Building images for $FULL_VERSION_STRING"
echo "/boot/" >$dir/boot_server_path
done
-# (Deprecated) Install old-style boot server configuration files
+# 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
local custom="$1"
local serial=
- if [ "$console" != "$DEFAULT_CONSOLE" ] ; then
+ if [ "$console" != "$GRAPHIC_CONSOLE" ] ; then
serial=1
console_dev=$(extract_console_dev $console)
console_baud=$(extract_console_baud $console)
DISPLAY pl_version
PROMPT 0
TIMEOUT 40
+EOF
+
+ # write kargs.txt with additional args that should be executed by kexec to production mode
+ cat >$isofs/kargs.txt <<EOF
+${serial:+console=${console_dev},${console_baud}${console_parity}${console_bits}}
EOF
# Create ISO image
local custom="$1"
local serial=
- if [ "$console" != "$DEFAULT_CONSOLE" ] ; then
+ if [ "$console" != "$GRAPHIC_CONSOLE" ] ; then
serial=1
console_dev=$(extract_console_dev $console)
console_baud=$(extract_console_baud $console)
local custom="$1"
local serial=
- if [ "$console" != "$DEFAULT_CONSOLE" ] ; then
+ if [ "$console" != "$GRAPHIC_CONSOLE" ] ; then
serial=1
console_dev=$(extract_console_dev $console)
console_baud=$(extract_console_baud $console)
mkfs.vfat -C "$usb" $(($(du -Lsk $isofs | awk '{ print $1; }') + $FREE_SPACE))
+ # write kargs.txt with additional args that should be executed by kexec to production mode
+ tmp="${BUILDTMP}/kargs.txt"
+ cat >$tmp <<EOF
+${serial:+console=${console_dev},${console_baud}${console_parity}${console_bits}}
+EOF
+ mcopy -i "$usb" "$tmp" ::/kargs.txt
+ rm -f "$tmp"
+
# Populate it
echo -n " populating USB image... "
mcopy -bsQ -i "$usb" "$isofs"/* ::/
local console=$1; shift
local custom=$1;
local serial=
- if [ "$console" != "$DEFAULT_CONSOLE" ] ; then
+ if [ "$console" != "$GRAPHIC_CONSOLE" ] ; then
serial=1
console_dev=$(extract_console_dev $console)
console_baud=$(extract_console_baud $console)
local custom="$1"
local serial=
- if [ "$console" != "$DEFAULT_CONSOLE" ] ; then
+ if [ "$console" != "$GRAPHIC_CONSOLE" ] ; then
serial=1
console_dev=$(extract_console_dev $console)
console_baud=$(extract_console_baud $console)
DISPLAY pl_version
PROMPT 0
TIMEOUT 40
+EOF
+
+ # write kargs.txt with additional args that should be executed by kexec to production mode
+ cat >$tmp/kargs.txt <<EOF
+${serial:+console=${console_dev},${console_baud}${console_parity}${console_bits}}
EOF
cp ${BUILDTMP}/cramfs.img $tmp
local custom="$1"
local serial=
- if [ "$console" != "$DEFAULT_CONSOLE" ] ; then
+ if [ "$console" != "$GRAPHIC_CONSOLE" ] ; then
serial=1
console_dev=$(extract_console_dev $console)
console_baud=$(extract_console_baud $console)
# Make VFAT filesystem for USB
mkfs.vfat -C "$usb" $vfat_size
+ # write kargs.txt with additional args that should be executed by kexec to production mode
+ tmp="${BUILDTMP}/kargs.txt"
+ cat >$tmp <<EOF
+${serial:+console=${console_dev},${console_baud}${console_parity}${console_bits}}
+EOF
+ mcopy -i "$usb" "$tmp" ::/kargs.txt
+ rm -f "$tmp"
+
# Populate it
echo "* Populating USB with overlay images and cramfs"
mcopy -bsQ -i "$usb" $isofs/kernel $isofs/pl_version ::/
PROMPT 0
TIMEOUT 40
EOF
+
mcopy -bsQ -i "$usb" "$tmp" ::/syslinux.cfg
rm -f "$tmp"
echo $1 | sed '
s/usb$/.usb/;
s/usb_partition$/-partition.usb/;
- s/usb_serial$/-serial.usb/;
s/iso$/.iso/;
- s/iso_serial$/-serial.iso/;
s/usb_cramfs$/-cramfs.usb/;
- s/usb_cramfs_serial$/-cramfs-serial.usb/;
s/iso_cramfs$/-cramfs.iso/;
- s/iso_cramfs_serial$/-cramfs-serial.iso/;
'
}
for t in $TYPES; do
arg=$t
- CONSOLE=$CONSOLE_INFO
- tname=`type_to_name $t`
- if [[ "$t" == *_serial ]]; then
- if [ "$CONSOLE_INFO" == "$DEFAULT_CONSOLE" ] ; then
- CONSOLE="$DEFAULT_SERIAL_CONSOLE"
+ console=$CONSOLE_INFO
+
+ # figure if this is a serial image (can be specified in the type or with -s)
+ if [[ "$t" == *serial* || "$console" != "$GRAPHIC_CONSOLE" ]]; then
+ # remove serial from type
+ t=`echo $t | sed 's/_serial//'`
+ # check console
+ [ "$console" == "$GRAPHIC_CONSOLE" ] && console="$SERIAL_CONSOLE"
+ # compute filename part
+ if [ "$console" == "$SERIAL_CONSOLE" ] ; then
+ serial="-serial"
+ else
+ serial="-serial-$(echo $console | sed -e 's,:,,g')"
fi
- t=`echo $t | sed 's/_serial$//'`
+ else
+ serial=""
fi
- OUTPUTNAME="${OUTPUT_BASE}${tname}"
- if [ "$CONSOLE" != "$DEFAULT_CONSOLE" ] ; then
- CONSOLE_NAME=$(echo $CONSOLE | sed 's,\:,,g')
- OUTPUTNAME="${OUTPUT_BASE}-serial-${CONSOLE_NAME}${tname}"
+ tname=`type_to_name $t`
+ # if -o is specified (as it has no default)
+ if [ -n "$OUTPUT_NAME" ] ; then
+ output=$OUTPUT_NAME
+ else
+ output="${OUTPUT_BASE}${serial}${tname}"
fi
+
echo "*** Dealing with type=$arg"
- echo "* " build_$t "$OUTPUTNAME" "$CONSOLE" "$CUSTOM_DIR"
+ echo '*' build_$t "$output" "$console" "$CUSTOM_DIR"
if [ ! -n "$DRY_RUN" ] ; then
- build_$t "$OUTPUTNAME" "$CONSOLE" "$CUSTOM_DIR" || true
+ build_$t "$output" "$console" "$CUSTOM_DIR"
fi
done