# Mark Huang <mlhuang@cs.princeton.edu>
# Copyright (C) 2006 The Trustees of Princeton University
#
-# $Id: build.sh,v 1.2 2006/03/27 18:08:06 mlhuang Exp $
+# $Id$
#
PATH=/sbin:/bin:/usr/sbin:/usr/bin
-# In a normal CVS environment, the requisite CVS modules (including
-# build/) are located at the same level we are. In a PlanetLab RPM
-# build environment (see the RPM spec file), they are checked out into
-# a subdirectory.
-if [ -d ./build ] ; then
- PATH=$PATH:./build
- srcdir=.
-elif [ -d ../build ] ; then
+# In both a normal CVS environment and a PlanetLab RPM
+# build environment, all of our dependencies are checked out into
+# directories at the same level as us.
+if [ -d ../build ] ; then
PATH=$PATH:../build
srcdir=..
else
- echo "Error: Could not find sources in either . or .."
+ echo "Error: Could not find $(cd .. && pwd -P)/build/"
exit 1
fi
config=plc_config.xml
# Release and architecture to install
-releasever=2
+releasever=4
basearch=i386
-# Data directory base
-usr_share=/usr/share
-
# Initial size of the image
size=1000000000
echo " -c file PLC configuration file (default: $config)"
echo " -r release Fedora release number (default: $releasever)"
echo " -a arch Fedora architecture (default: $basearch)"
- echo " -d datadir Data directory base (default: $usr_share)"
echo " -s size Approximate size of the installation (default: $size)"
echo " -h This message"
exit 1
}
# Get options
-while getopts "c:r:a:d:s:h" opt ; do
+while getopts "c:r:a:s:h" opt ; do
case $opt in
c)
config=$OPTARG
a)
basearch=$OPTARG
;;
- d)
- usr_share=$OPTARG
- ;;
s)
size=$OPTARG
;;
esac
done
-root=fc$releasever
-data=data$releasever
+# Do not tolerate errors
+set -e
+
+root=root
+data=data
if [ ! -f $root.img ] ; then
bs=4096
mkdir -p $root $data
mount -o loop $root.img $root
-trap "umount $root; exit 1" ERR
+trap "umount $root" ERR
#
# Build
done < <(./plc-config --packages $config)
# Install base system
-mkfedora -v -r $releasever -a $basearch $packages $root
+mkfedora -v -r $releasever -a $basearch -k $packages $root
+
+# Disable all services in reference image
+chroot $root sh -c "/sbin/chkconfig --list | awk '{ print \$1 }' | xargs -i /sbin/chkconfig {} off"
# FC2 minilogd starts up during shutdown and makes unmounting
# impossible. Just get rid of it.
#
# Install configuration scripts
+echo "* Installing configuration scripts"
install -D -m 755 plc_config.py $root/tmp/plc_config.py
chroot $root sh -c 'cd /tmp; python plc_config.py build; python plc_config.py install'
install -D -m 755 plc-config $root/usr/bin/plc-config
install -D -m 755 api-config $root/usr/bin/api-config
+install -D -m 755 db-config $root/usr/bin/db-config
+install -D -m 755 dns-config $root/usr/bin/dns-config
+
+# Install OpenSSL configuration
+install -D -m 644 openssl.cnf $root/etc/planetlab/ssl/openssl.cnf
-# Install init script
+# Install initscripts
+echo "* Installing initscripts"
+find plc.d | cpio -p -d -u $root/etc/
install -D -m 755 guest.init $root/etc/init.d/plc
chroot $root sh -c 'chkconfig --add plc; chkconfig plc on'
# Install DB schema and API code
+echo "* Installing DB schema and API code"
mkdir -p $root/usr/share
rsync -a $srcdir/pl_db $srcdir/plc_api $root/usr/share/
# Install web scripts
+echo "* Installing web scripts"
mkdir -p $root/usr/bin
install -m 755 \
$srcdir/plc/scripts/gen-sites-xml.py \
$root/usr/bin/
# Install web pages
+echo "* Installing web pages"
mkdir -p $root/var/www/html
-rsync -a $srcdir/plc_www/ $root/var/www/html/
-
-# Install node RPMs
-if [ -n "$RPM_BUILD_DIR" ] ; then
- RPM_RPMS_DIR=$(cd $(dirname $RPM_BUILD_DIR)/RPMS && pwd -P)
- mkdir -p $root/var/www/html/install-rpms/planetlab
- find $RPM_RPMS_DIR -type f -and -not -name '*-debuginfo-*' | \
- cpio -p -d -u $root/var/www/html/install-rpms/planetlab/
- yum-arch $root/var/www/html/install-rpms/planetlab || :
- createrepo $root/var/www/html/install-rpms/planetlab || :
-fi
-
-# XXX Build imprintable BootCD and BootManager images.
+# Exclude old cruft, unrelated GENI pages, and official documents
+rsync -a \
+ --exclude='*2002' --exclude='*2003' \
+ --exclude=geni --exclude=PDN --exclude=Talks \
+ $srcdir/plc_www/ $root/var/www/html/
# Install configuration file
-install -D -m 644 $config $data/etc/planetlab/plc_config.xml
+echo "* Installing configuration file"
+install -D -m 444 $config $data/etc/planetlab/default_config.xml
+install -D -m 444 plc_config.dtd $data/etc/planetlab/plc_config.dtd
# Move "data" directories out of the installation
datadirs=(
/var/www/html/xml
)
+echo "* Moving data directories out of the installation"
mkdir -p $root/data
for datadir in "${datadirs[@]}" ; do
mkdir -p ${data}$datadir
trap "losetup -d $dev_loop" ERR
# Resize the filesystem
- e2fsck -f $dev_loop
+ echo "* Checking filesystem"
+ e2fsck -a -f $dev_loop
+ echo "* Shrinking filesystem"
resize2fs $dev_loop ${kb}K
# Tear down loopback association
# Write sysconfig
cat >plc.sysconfig <<EOF
-PLC_ROOT=$usr_share/plc/$root
-PLC_DATA=$usr_share/plc/$data
+PLC_ROOT=/plc/$root
+PLC_DATA=/plc/$data
#PLC_OPTIONS="-v"
EOF
-# Bootstrap the system. Configure the web server to run on an
-# alternate port (in case the build machine is running a web server),
-# start everything up, then shut it back down again.
-./plc-config --save $data/etc/planetlab/plc_config.xml bootstrap.xml
+# Initialize node RPMs directory. The PlanetLab-Bootstrap.tar.bz2
+# tarball already contains all of the node RPMs pre-installed. Only
+# updates or optional packages should be placed in this directory.
+if [ -n "$RPM_BUILD_DIR" ] ; then
+ echo "* Initializing node RPMs directory"
+ RPM_RPMS_DIR=$(cd $(dirname $RPM_BUILD_DIR)/RPMS && pwd -P)
+ mkdir -p $data/var/www/html/install-rpms/planetlab
+ if [ -f $RPM_RPMS_DIR/yumgroups.xml ] ; then
+ install -D -m 644 $RPM_RPMS_DIR/yumgroups.xml \
+ $data/var/www/html/install-rpms/planetlab/yumgroups.xml
+ fi
+ # yum-2.0.x
+ if [ -x /usr/bin/yum-arch ] ; then
+ yum-arch $data/var/www/html/install-rpms/planetlab
+ fi
+ # yum-2.4.x
+ if [ -x /usr/bin/createrepo ] ; then
+ if [ -f $data/var/www/html/install-rpms/planetlab/yumgroups.xml ] ; then
+ groupfile="-g yumgroups.xml"
+ fi
+ createrepo $groupfile $data/var/www/html/install-rpms/planetlab
+ fi
+fi
+
+# Bootstrap the system for quicker startup (and to populate the
+# PlanetLabConf tables from PLC, which may not be accessible
+# later). The bootstrap.xml configuration overlay configures the web
+# server to run on an alternate port (in case the build machine itself
+# is running a web server on port 80). Start everything up to
+# bootstrap the database, then shut it back down again immediately.
+echo "* Bootstrapping installation"
+install -D -m 644 bootstrap.xml $data/etc/planetlab/configs/bootstrap.xml
+
+# Otherwise, host.init will try to read /etc/sysconfig/plc
export PLC_ROOT=$PWD/$root
export PLC_DATA=$PWD/$data
+#export PLC_OPTIONS="-v"
./host.init start
RETVAL=$?
-# Restore default configuration before shutting down
-install -D -m 644 $config $data/etc/planetlab/plc_config.xml
+# Remove ISO and USB images, which take up >100MB but only take a
+# couple of seconds to generate at first boot.
+rm -f $data/var/www/html/download/*.{iso,usb}
./host.init stop
+RETVAL=$(($RETVAL+$?))
+
+# Restore default configuration
+rm -f $data/etc/planetlab/configs/bootstrap.xml
+install -D -m 444 $config $data/etc/planetlab/plc_config.xml
exit $RETVAL