--- /dev/null
+#!/bin/bash
+REVISION=$(echo '$Revision$' | sed -e 's,\$,,g' -e 's,^\w*:\s,,' )
+
+COMMANDPATH=$0
+COMMAND=$(basename $0)
+ROOT=/build
+
+# default values, tunable with command-line options
+DEFAULT_FC_DISTRO=fc6
+SVNPATH="http://svn.one-lab.org/build/trunk"
+DISTRO=onelab
+MAILTO="onelab-build@one-lab.org"
+DISTROMAKETAGS=onelab-tags.mk
+PLEBOX=root@planet-lab.eu
+TESTBUILDURL="http://build.one-lab.org/"
+TESTBOX=onelab-test.inria.fr
+TESTBOXSSH=root@onelab-test.inria.fr
+TESTSVNPATH="http://svn.one-lab.org/new_plc_api/trunk/plctest"
+TESTSCRIPT=TestMain.py
+TESTSEND=TestSendMail
+####################
+# plc chroot runs in UTC
+DATE=$(date -u +'%Y.%m.%d')
+
+###### copy this command into the vserver before invoking it - install in /
+###function install_in_vserver () {
+### vserver=$1; shift
+### cp $COMMANDPATH /vservers/$vserver/$COMMAND
+###}
+###
+###function run_in_vserver () {
+### vserver=$1; shift
+### vserver $vserver exec /$COMMAND "$@"
+###}
+
+# Notify recipient of failure or success, manage various stamps
+function failure() {
+ set -x
+ (echo -n "============================== $COMMAND: failure at" ; date ; tail -c 20k ${BUILD}/log-build.txt) >> ${BUILD}.broken
+ if [ -n "$MAILTO" ] ; then
+ tail -c 8k ${BUILD}/log-build.txt | mail -s "Failures for ${BUILD}" $MAILTO
+ fi
+ exit 1
+}
+
+function success () {
+ set -x
+ touch ${BUILD}.ok
+ if [ -n "$MAILTO" ] ; then
+ (echo "http://build.one-lab.org/$DISTRO/$BASE" ; echo "Completed on $(date)" ) | mail -s "Successfull build in ${BUILD}" $MAILTO
+ fi
+ cd ${ROOT}
+ rm -f latest
+ ln -s $BASE latest
+ exit 0
+}
+
+function create_vserver () {
+}
+
+function use_base () {
+ if
+ [ ! -d $BASE ] && mkdir $BASE
+ if [ ! -d $BASE ] ; then
+ echo $COMMAND failed to create base $BASE
+ exit 1
+ fi
+}
+
+
+function build () {
+ set -x
+ set -e
+ trap failure ERR INT
+
+ echo -n "============================== Starting $COMMAND:build on "
+ date
+
+ cd $ROOT
+ svn co $SVNPATH $BASE
+
+ # if TAGSRELEASE specified : update DISTROMAKETAGS with this tag
+ if [ -n "$TAGSRELEASE" ] ; then
+ cd $BASE
+ svn up -r $TAGSRELEASE $DISTROMAKETAGS
+ cd -
+ fi
+
+ show_env
+
+ echo "Running make IN build $(pwd)"
+ make stage1=true ${MAKEOPTS[@]} DISTROMAKETAGS=${DISTROMAKETAGS} PLDISTRO=${DISTRO} ${MAKEVARS[@]} -C $BASE
+ # in case we use an older build
+ set +e
+ make ${MAKEOPTS[@]} DISTROMAKETAGS=${DISTROMAKETAGS} PLDISTRO=${DISTRO} ${MAKEVARS[@]} -C $BASE versions
+ set -e
+ make ${MAKEOPTS[@]} DISTROMAKETAGS=${DISTROMAKETAGS} PLDISTRO=${DISTRO} ${MAKEVARS[@]} -C $BASE $MAKETARGETS
+
+ # restore silent mode - otherwise cron gets it
+ set +x
+}
+
+function runtest () {
+ set -x
+ set -e
+ trap failure ERR INT
+
+ echo -n"==============================> testing the sendmail service on PLE"
+ ssh ${PLEBOX} python -u /root/${TESTSEND}
+
+ echo -n "============================== Starting $COMMAND:runtest on "
+ date
+
+
+ ### compute URL to the myplc package
+ build=$1; shift
+ buildname=$(basename $build)
+ cd $build
+ rpm=$(find RPMS -name myplc\*.rpm )
+ url=${TESTBUILDURL}${DISTRO}/${buildname}/${rpm}
+ ### checkout the test material
+ svn co ${TESTSVNPATH} plctest
+ # compute test directory name on test box
+ testdir=plctest-${buildname}
+ # rsync/push test material onto the test box
+ ssh ${TESTBOXSSH} mkdir -p ${testdir}
+ rsync -a -v plctest/ ${TESTBOXSSH}:${testdir}
+ # invoke test on testbox
+ ssh ${TESTBOXSSH} python -u ${testdir}/${TESTSCRIPT} ${url}
+ #invoke make install from build to the testbox
+ make install PLCHOST=${TESTBOX}
+
+ if [ "$?" != 0 ] ; then
+ failure
+ fi
+
+ set +x
+}
+
+function show_env () {
+ echo ROOT=$ROOT
+ echo FC_DISTRO=$FC_DISTRO
+ echo DISTRO=$DISTRO
+ echo BASE=$BASE
+ echo SVNPATH=$SVNPATH
+ echo MAKEVARS="${MAKEVARS[@]}"
+ echo MAKEOPTS="${MAKEOPTS[@]}"
+ echo DISTROMAKETAGS="$DISTROMAKETAGS"
+ echo TAGSRELEASE="$TAGSRELEASE"
+ echo "XXXXXXXXXXXXXXXXXXXX Contents of tags definition file $DISTROMAKETAGS"
+ cat $BASE/$DISTROMAKETAGS
+ echo "XXXXXXXXXXXXXXXXXXXX end tags definition"
+}
+
+function usage () {
+ echo "Usage: $COMMAND [option] make-targets"
+ echo "This is revision $REVISION"
+ echo "Supported options"
+ echo " -f FC_DISTRO - defaults to $DEFAULT_FC_DISTRO"
+ echo " -b BASE - may include @, then replaced with current date"
+ echo " -u : uses directory given as BASE as is, even if already exists"
+ echo " -d PLDISTRO"
+ echo " -t PLDISTROMAKETAGS"
+ echo " -r TAGSRELEASE - a release number that refers to PLDISTROMAKETAGS - defaults to HEAD"
+ echo " -s MAKEVAR=value - spaces in value are not supported"
+ echo " -n dry-run : -n passed to make - no mail sent"
+ echo " -m MAILTO"
+ echo " -s SVNPATH"
+ echo " -B : run build only"
+ echo " -T : run test only"
+ exit 1
+}
+
+function main () {
+
+ # parse arguments
+ MAKEVARS=()
+ MAKEOPTS=()
+ DO_BUILD=true
+ DO_TEST=true
+ while getopts "f:b:ud:t:r:s:nm:s:BTh" opt ; do
+ case $opt in
+ f) FC_DISTRO=$OPTARG ;;
+ b) BASE=$OPTARG ;;
+ u) USEOLD=true ;;
+ d) DISTRO=$OPTARG ;;
+ t) DISTROMAKETAGS=$OPTARG ;;
+ r) TAGSRELEASE=$OPTARG ;;
+ s) MAKEVARS=(${MAKEVARS[@]} $OPTARG) ;;
+ n) MAILTO="" ; MAKEOPTS=(${MAKEOPTS[@]} -n) ;;
+ m) MAILTO=$OPTARG ;;
+ s) SVNPATH=$OPTARG ;;
+ B) DO_TEST= ;;
+ T) DO_BUILD= ; USEOLD=true ;;
+ h|*) usage ;;
+ esac
+ done
+
+ shift $(($OPTIND - 1))
+
+ [ -z "$FC_DISTRO" ] && FC_DISTRO=$DEFAULT_FC_DISTRO
+ MAKETARGETS="$@"
+
+ ### set BASE from DISTRO, if unspecified
+ [ -z "$BASE" ] && BASE=${DISTRO}-${FC_DISTRO}
+ BASE=$(echo ${BASE} | sed -e "s,@,${DATE},g")
+
+ # if we run in the root context :
+ # (*) create or check for the vserver to use
+ # (*) copy this command in the vserver
+ # (*) invoke it
+
+ if [ -d /vservers ] ; then
+
+ if [ -n "$USEOLD" ] ; then
+ ### Re-use a vserver (finish an unfinished build..)
+ if [ ! -d /vservers/${BASE} ] ; then
+ echo $COMMAND : cannot find vserver $BASE
+ exit 1
+ fi
+ # update build
+ vserver ${BASE} exec svn update /build
+ else
+ # create vserver: check it does not exist yet
+ i=
+ while [ -d /vservers/${BASE}${i} ] ; do
+ [ -z ${i} ] && BASE=${BASE}.
+ i=$((${i}+1))
+ if [ $i -gt 100 ] ; then
+ echo "$COMMAND: Failed to create release directory /vservers/${BASE}${i}"
+ exit 1
+ fi
+ done
+ BASE=${BASE}${i}
+ ### extract vbuild.setup and run it
+ svn checkout $SVNPATH/vbuild.setup /tmp/vbuild-$$
+ # Create vserver
+ /tmp/vbuild-$$ ${BASE} ${FC_DISTRO} $DISTRO
+ # Extract build
+ vserver ${BASE} exec svn checkout ${SVNPATH} /build
+ fi
+
+ cp $COMMANDPATH /vservers/${BASE}
+ # invoke this command in the vserver
+ vserver ${BASE} exec /$COMMAND "$@"
+
+ else
+ if [ -n "$DO_BUILD" ] ; then
+ build >> /log-build.txt 2>&1
+ touch /build-ok
+ fi
+
+ if [ -n "$DO_TEST" ] ; then
+ runtest ${BUILD} >> ${BUILD}/log-build.txt 2>&1
+ fi
+
+ success >> ${BUILD}/log-build.txt 2>&1
+
+ fi
+
+ # todo : gather results from various vservers into a single build index
+ #ROOT=$ROOT/$DISTRO
+ #BUILD=$ROOT/$BASE
+
+}
+
+##########
+main "$@"