use the FQDN for PLC_WWW_HOST rather than localhost to get cron.php
[myplc.git] / build.sh
index d8e946f..dc00383 100755 (executable)
--- a/build.sh
+++ b/build.sh
@@ -1,7 +1,17 @@
 #!/bin/bash
 #
-# Builds a Fedora based PLC image. You should be able to run this
-# script multiple times without a problem.
+# Builds MyPLC in the current host environment
+# This is for the so-called chroot installation mode, meaning that
+# the resulting rpm will install a full chroot image in /plc/root
+# that can be run through chroot /plc/root
+# This chroot mode is to be opposed to the native mode (see build-native.sh)
+# that can be used in the host's root context or within a vserver
+#
+# root.img (loopback image)
+# root/ (mount point)
+# data/ (various data files)
+# data/etc/planetlab/ (configuration files)
+# data/root (root's homedir)
 #
 # Mark Huang <mlhuang@cs.princeton.edu>
 # Copyright (C) 2006 The Trustees of Princeton University
 # $Id$
 #
 
-PATH=/sbin:/bin:/usr/sbin:/usr/bin
-
-# 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 .."
-    exit 1
-fi
-
-export PATH
-
-# PLC configuration file
-config=plc_config.xml
-
-# Release and architecture to install
-releasever=2
-basearch=i386
-
-# Data directory base
-usr_share=/usr/share
-
-# Initial size of the image
-size=1000000000
-
-usage()
-{
-    echo "Usage: build.sh [OPTION]..."
-    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
-    case $opt in
-       c)
-           config=$OPTARG
-           ;;
-       r)
-           releasever=$OPTARG
-           ;;
-       a)
-           basearch=$OPTARG
-           ;;
-       d)
-           usr_share=$OPTARG
-           ;;
-       s)
-           size=$OPTARG
-           ;;
-       h|*)
-           usage
-           ;;
-    esac
-done
-
-# Do not tolerate errors
-set -e
-
-root=fc$releasever
-data=data$releasever
-
-if [ ! -f $root.img ] ; then
-    bs=4096
-    count=$(($size / 4096))
-    dd bs=$bs count=$count if=/dev/zero of=$root.img
-    mkfs.ext3 -j -F $root.img
-fi
-
-mkdir -p $root $data
-mount -o loop $root.img $root
-trap "umount $root" ERR
-
-#
-# Build
-#
-
-# Get package list
-while read package ; do
-    packages="$packages -p $package"
-done < <(./plc-config --packages $config)
-
-# Install base system
-mkfedora -v -r $releasever -a $basearch $packages $root
-
-# Disable all services in reference image
-chroot $vroot 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.
-rm -f $root/sbin/minilogd
-ln -nsf /bin/true $root/sbin/minilogd
-
-# Build schema
-make -C $srcdir/pl_db
-
-#
-# Install
-#
-
-# 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 init script
-echo "* Installing initscript"
-install -D -m 755 guest.init $root/etc/init.d/plc
-chroot $root sh -c 'chkconfig --add plc; chkconfig plc on'
+. build.functions
 
-# 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/
+# pldistro expected as $1 - defaults to planetlab
+pldistro=$1 ; shift
 
-# Install web scripts
-echo "* Installing web scripts"
-mkdir -p $root/usr/bin
-install -m 755 \
-    $srcdir/plc/scripts/gen-sites-xml.py \
-    $srcdir/plc/scripts/gen-slices-xml-05.py \
-    $srcdir/plc/scripts/gen-static-content.py \
-    $root/usr/bin/
-
-# Install web pages
-echo "* Installing web pages"
-mkdir -p $root/var/www/html
-# 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/
-
-# XXX Build imprintable BootCD and BootManager images.
-
-# Install configuration file
-echo "* Installing configuration file"
-install -D -m 644 $config $data/etc/planetlab/plc_config.xml
-
-# Move "data" directories out of the installation
+# These directories are allowed to grow to unspecified size, so they
+# are stored as symlinks to the /data partition. mkfedora and yum
+# expect some of them to be real directories, however.
 datadirs=(
 /etc/planetlab
+/root
 /var/lib/pgsql
 /var/www/html/alpina-logs
 /var/www/html/boot
 /var/www/html/download
+/var/www/html/download-planetlab-i386
+/var/www/html/files
+/var/www/html/sites
 /var/www/html/generated
 /var/www/html/install-rpms
 /var/www/html/xml
+/tmp
+/usr/tmp
+/var/tmp
+/var/log
 )
 
-echo "* Moving data directories out of the installation"
-mkdir -p $root/data
-for datadir in "${datadirs[@]}" ; do
-    mkdir -p ${data}$datadir
-    if [ -d $root/$datadir -a ! -h $root/$datadir ] ; then
-       (cd $root && find ./$datadir | cpio -p -d -u ../$data/)
-    fi
-    rm -rf $root/$datadir
-    mkdir -p $(dirname $root/$datadir)
-    ln -nsf /data$datadir $root/$datadir
-done
+pl_fixdirs root "${datadirs[@]}"
 
-# Shrink to 100 MB free space
-kb=$(python <<EOF
-import os
-df = os.statvfs('$root')
-target = 100 * 1024 * 1024 / df.f_bsize
-if df.f_bavail > target:
-    print (df.f_blocks - (df.f_bavail - target)) * df.f_bsize / 1024
-EOF
-)
-
-umount $root
-trap - ERR
+echo "* myplc: Installing base filesystem"
+mkdir -p root data
 
-if [ -n "$kb" ] ; then
-    # Setup loopback association. Newer versions of losetup have a -f
-    # option which finds an unused loopback device, but we must
-    # support FC2 for now.
-    # dev_loop=$(losetup -f)
-    for i in `seq 1 7` ; do
-       if ! grep -q "^/dev/loop$i" /proc/mounts ; then
-           dev_loop="/dev/loop$i"
-           break
-       fi
-    done
-    losetup $dev_loop $root.img
-    trap "losetup -d $dev_loop" ERR
+pl_root_makedevs root
+pkgsfile=$(pl_locateDistroFile ../build/ ${pldistro} myplc.pkgs)
+pl_root_mkfedora root $pldistro $pkgsfile
+pl_root_tune_image root
 
-    # Resize the filesystem
-    echo "* Checking filesystem"
-    e2fsck -a -f $dev_loop
-    echo "* Shrinking filesystem"
-    resize2fs $dev_loop ${kb}K
-
-    # Tear down loopback association
-    losetup -d $dev_loop
-    trap - ERR
-
-    # Truncate the image file
-    perl -e "truncate '$root.img', $kb*1024"
+# Install configuration scripts
+echo "* myplc: 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 plc-config-tty root/usr/bin/plc-config-tty
+install -D -m 755 db-config root/usr/bin/db-config
+install -D -m 755 dns-config root/usr/bin/dns-config
+install -D -m 755 plc-map.py root/usr/bin/plc-map.py
+install -D -m 755 clean-empty-dirs.py root/usr/bin/clean-empty-dirs.py
+install -D -m 755 mtail.py root/usr/bin/mtail.py
+install -D -m 755 check-ssl-peering.py root/usr/bin/check-ssl-peering.py
+# Extra scripts (mostly for mail and dns) not installed by myplc by default.  Used in production
+mkdir root/etc/support-scripts
+cp support-scripts/* root/etc/support-scripts 
+# copy initscripts to etc/plc_sliceinitscripts
+mkdir root/etc/plc_sliceinitscripts
+cp plc_sliceinitscripts/* root/etc/plc_sliceinitscripts
+
+# Install initscripts
+echo "* myplc: 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'
+
+# fetch the release stamp from the build if any
+# I could not come up with any more sensitive scheme 
+if [ -f ../../../myplc-release ] ; then
+  cp ../../../myplc-release myplc-release
+else
+  echo "Cannot find release information." > myplc-release
+  date >> myplc-release
+  echo "$HeadURL$" >> myplc-release
 fi
+# install it in /etc/myplc-release 
+install -m 444 myplc-release root/etc/myplc-release
 
-# Write sysconfig
-cat >plc.sysconfig <<EOF
-PLC_ROOT=$usr_share/plc/$root
-PLC_DATA=$usr_share/plc/$data
-#PLC_OPTIONS="-v"
-EOF
+### Thierry Parmentelat - april 16 2007
+# fix the yum.conf as produced by mkfedora
+# so we can use the build's fc4 mirror for various installs/upgrades
+# within the chroot jail
+# yum_conf_to_build_host is defined in build.functions
+yum_conf_to_build_host ../build > root/etc/yum.conf
 
-# Install node RPMs
-if [ -n "$RPM_BUILD_DIR" ] ; then
-    echo "* Installing node RPMs"
-    RPM_RPMS_DIR=$(cd $(dirname $RPM_BUILD_DIR)/RPMS && pwd -P)
-    mkdir -p $data/var/www/html/install-rpms/planetlab
-    # Exclude ourself (e.g., if rebuilding), the bootcd and
-    # bootmanager builds, and debuginfo RPMs.
-    rsync -a \
-       --exclude='myplc-*' \
-       --exclude='bootcd-*' --exclude='bootmanager-*' \
-       --exclude='*-debuginfo-*' \
-       $(find $RPM_RPMS_DIR -type f -and -name '*.rpm') \
-       $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
+### Thierry Parmentelat - may 8 2008
+# no doc built in this old-fashioned packaging anymore
+# use myplc-docs instead
 
-# 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 configuration file
+echo "* myplc: Installing configuration file"
+install -D -m 444 default_config.xml data/etc/planetlab/default_config.xml
+install -D -m 444 plc_config.dtd data/etc/planetlab/plc_config.dtd
+
+# handle root's homedir and tweak root prompt
+echo "* myplc: root's homedir and prompt"
+roothome=data/root
+mkdir -p $roothome
+cat << EOF > $roothome/.profile
+export PS1="<plc> \$PS1"
+EOF
+chmod 644 $roothome/.profile
 
-./plc-config --save $data/etc/planetlab/plc_config.xml bootstrap.xml
+# Move "data" directories out of the installation
+echo "* myplc: Moving data directories out of the installation"
+pl_move_dirs root data /data "${datadirs[@]}"
 
-# Otherwise, host.init will try to read /etc/sysconfig/plc
-export PLC_ROOT=$PWD/$root
-export PLC_DATA=$PWD/$data
-#export PLC_OPTIONS="-v"
+# Fix permissions on tmp directories
+pl_fixtmp_permissions data
 
-./host.init start
-RETVAL=$?
+# Remove generated bootmanager script
+rm -f data/var/www/html/boot/bootmanager.sh
 
-# Restore default configuration before shutting down
-install -D -m 644 $config $data/etc/planetlab/plc_config.xml
+# yumgroups.xml and yum repo : let noderepo handle that
 
-./host.init stop
-RETVAL=$(($RETVAL+$?))
+# Make image out of directory
+echo "* myplc: Building loopback image"
+pl_make_image root root.img 100000000
 
-exit $RETVAL
+exit 0