#!/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>
CONFIGURATION=default
NODE_CONFIGURATION_FILE=
-TYPES="usb iso"
-ALL_TYPES="usb iso usb_cramfs iso_cramfs"
+DEFAULT_TYPES="usb iso"
# Leave 4 MB of free space
FREE_SPACE=4096
CUSTOM_DIR=
OUTPUT_BASE=
-DEFAULT_CONSOLE="graphic"
-CONSOLE_INFO=$DEFAULT_CONSOLE
+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=""
+for x in iso usb usb_partition; do for s in "" "_serial" ; do for c in "" "_cramfs" ; do
+ t="${x}${c}${s}"
+ case $t in
+ usb_partition_cramfs|usb_partition_cramfs_serial)
+ # unsupported
+ ;;
+ *)
+ ALL_TYPES="$ALL_TYPES $t" ;;
+ 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 planet.cnf Node to customize CD for (default: none)"
- echo " -t 'types' Build the specified images (default: $TYPES)"
- echo " All known types: $ALL_TYPES"
+ 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 " console-info=devicename:baudrate"
- echo " -a Build all supported images"
+ 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 " 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 " -O output-base The basename of the generated files (default: PLC_NAME-BootCD-VERSION)"
+ echo " -n Dry run - mostly for debug/test purposes"
echo " -h This message"
+ echo "All known types: $ALL_TYPES"
exit 1
}
+# init
+TYPES=""
# Get options
-while getopts "O:c:f:s:t:C:ah" opt ; do
+while getopts "f:t:as:O:o:C:nh" opt ; do
case $opt in
- c)
- CONFIGURATION=$OPTARG
- ;;
f)
- NODE_CONFIGURATION_FILE=$OPTARG
- ;;
+ NODE_CONFIGURATION_FILE=$OPTARG ;;
t)
- TYPES="$OPTARG"
- ;;
- C)
- CUSTOM_DIR="$OPTARG"
- ;;
- O)
- OUTPUT_BASE="$OPTARG"
- ;;
+ TYPES="$TYPES $OPTARG" ;;
a)
- TYPES="$ALL_TYPES"
- ;;
+ 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)
+ DRY_RUN=true ;;
h|*)
- usage
- ;;
+ usage ;;
esac
done
+# use default if not set
+[ -z "$TYPES" ] && TYPES="$DEFAULT_TYPES"
+
# Do not tolerate errors
set -e
. /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 -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"
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)
# Write isolinux configuration
cat >$isofs/isolinux.cfg <<EOF
-${serial:+SERIAL 0 115200}
+${serial:+SERIAL 0 ${console_baud}}
DEFAULT kernel
APPEND ramdisk_size=$ramdisk_size initrd=bootcd.img,overlay.img${custom:+,custom.img} root=/dev/ram0 rw ${serial:+console=${console_dev},${console_baud}${console_parity}${console_bits}}
DISPLAY pl_version
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)
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)
sed -i 's,pl_sysinit,pl_rsysinit,' etc/inittab
# modify inittab to have a serial console
- if [ $serial -eq 1 ] ; then
+ if [ -n "$serial" ] ; then
echo "T0:23:respawn:/sbin/agetty -L $console_dev $console_baud vt100" >> etc/inittab
# and let root log in
echo "$console_dev" >> etc/securetty
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)
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/;
'
}
[ -z "$OUTPUT_BASE" ] && OUTPUT_BASE="$PLC_NAME-BootCD-$BOOTCD_VERSION"
for t in $TYPES; do
- CONSOLE=$CONSOLE_INFO
- tname=`type_to_name $t`
- if [[ "$t" == *_serial ]]; then
- if [ "$CONSOLE_INFO" == "$DEFAULT_CONSOLE" ] ; then
- CONSOLE="ttyS0:115200"
+ arg=$t
+ 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 "$output" "$console" "$CUSTOM_DIR"
+ if [ ! -n "$DRY_RUN" ] ; then
+ build_$t "$output" "$console" "$CUSTOM_DIR"
fi
- build_$t "$OUTPUTNAME" "$CONSOLE" "$CUSTOM_DIR"
done
exit 0