#!/bin/bash BUILD_LOG=~/public_html/BuildLive.out ALWAYS_SEND_LOG=yes LANG=C finish() { [ $? != "0" ] && STATUS="Failed" || STATUS="Successful" if [ "$STATUS" = "Failed" ] || [ "$ALWAYS_SEND_LOG" = "yes" ]; then SEND_LOG=yes fi if [ -e "$LOG" ]; then echo "======================= Log of livefs.sh output follows =======================" cat $LOG fi if [ "$SEND_LOG" = "yes" ]; then exec >/dev/null 2>&1 mailx -s "LiveCD: $STATUS $STE:$FS${SUBPROJECT:+-$SUBPROJECT}${SUBARCH:+-$SUBARCH}${UBUNTU_DEFAULTS_LOCALE:+-$UBUNTU_DEFAULTS_LOCALE} build on ${ARCH}" buildd+porters < "$BUILD_LOG" fi rm -f ~/buildLiveCD.lock nohup ~/bin/pruneLiveCD >/dev/null 2>&1 & } if [ -n "$SSH_ORIGINAL_COMMAND" ]; then set -- $SSH_ORIGINAL_COMMAND [ ${1##*/} != 'BuildLiveCD' ] && echo bad command >&2 && exit 2 shift fi ARCH=$(dpkg --print-architecture) SUBARCH="" SUBARCHARG="" NEWSUITE="precise" SUITES="" PROPOSED="" IMAGEFORMAT="" LIVE_BUILD=false UBUNTU_DEFAULTS_LOCALE="" while getopts :A:s:r:d:f:pa:lu:t: name; do case $name in A) ARCH="$OPTARG";; s) SUBARCH="$OPTARG";; r) SUBPROJECT="$OPTARG";; d) NEWSUITE="$OPTARG";; f) IMAGEFORMAT="$OPTARG";; p) PROPOSED="-p";; a) APT_SOURCE="-A $OPTARG";; l) LIVE_BUILD=:;; u) UBUNTU_DEFAULTS_LOCALE="$OPTARG";; t) UBUNTU_TOUCH_ANDROID="$OPTARG";; esac; done; shift $((OPTIND-1)) if [ -n "$SUBARCH" ]; then SUBARCHARG="-s$SUBARCH" fi for s in $NEWSUITE; do if [ -d build-${s}-live/chroot-${s} ]; then SUITES="$SUITES $s"; fi done if [ -z "$SUITES" ]; then echo "No valid suites to build for" >&2 && exit 1 fi for s in $SUITES; do case $s in dapper|edgy|feisty|gutsy|hardy) ARCHARG="" old_suite="yes" ;; *) ARCHARG="-a$ARCH" new_suite="yes" ;; esac done if [ "$new_suite" = "yes" ] && [ "$old_suite" = "yes" ]; then echo "Can't build images for suites older than intrepid and suites" >&2 echo "greater than hardy at the same time, please use two invocations" >&2 exit 1 fi if ([ $# = 0 ] || [ "X$1" = "Xall" ]) && ! $LIVE_BUILD; then set -- ubuntu kubuntu kubuntu-active edubuntu xubuntu mythbuntu base if [ "$ARCH" = "i386" ]; then set -- ubuntu ubuntu-dvd ubuntu-lpia ubuntu-netbook kubuntu kubuntu-dvd kubuntu-active edubuntu edubuntu-dvd xubuntu mythbuntu base fi fi case ${ARCH} in hppa|sparc|powerpc) LINUX32=linux32;; *) LINUX32="";; esac if [ "`echo $@ | wc -w`" -gt "1" ]; then for arg in "$@"; do $0 $arg done exit 0 fi FS="$1" shift # 12 hours should be enough for even the longest build queue to clear. lockfile -8 -r$((12 * 60 * 60 / 8)) ~/buildLiveCD.lock || exit 1 trap "finish" 0 trap "rm -f ~/buildLiveCD.lock; exit 1" 1 2 3 15 exec > $BUILD_LOG 2>&1 set -e for STE in $SUITES; do if [ -d ~/build-${STE}-live/chroot-${STE} ]; then sudo chroot ~/build-${STE}-live/chroot-${STE} apt-get -qq update || true sudo chroot ~/build-${STE}-live/chroot-${STE} apt-get -y dist-upgrade || true sudo chroot ~/build-${STE}-live/chroot-${STE} apt-get -y install livecd-rootfs || true sudo chroot ~/build-${STE}-live/chroot-${STE} apt-get -y --install-recommends install ubuntu-defaults-builder || true fi done for STE in $SUITES; do if cd ~/build-${STE}-live 2>/dev/null; then DIR=~/build-${STE}-live/chroot-${STE}/./build/ else cd ~/build.live DIR=~/build.live/chroot-${STE}/./build/ fi PUBDIR=~/public_html/LiveCD/${STE}/${FS}${SUBPROJECT:+-$SUBPROJECT}${SUBARCH:+-$SUBARCH}${UBUNTU_DEFAULTS_LOCALE:+-$UBUNTU_DEFAULTS_LOCALE}/ mkdir -p ${PUBDIR} NOW=$(date +%Y%m%d) if [ -d ${PUBDIR}${NOW} ]; then typeset -i n=1; while [ -d ${PUBDIR}${NOW}.$n ]; do n=n+1; done NOW=${NOW}.$n fi LOG=${PUBDIR}${NOW}/livecd-${NOW}-${ARCH}.out rm -f ${PUBDIR}latest ln -sf ${PUBDIR}${NOW} ${PUBDIR}latest mkdir -p ${PUBDIR}${NOW} > ${LOG} ln -sf livecd-${NOW}-${ARCH}.out ${PUBDIR}${NOW}/livecd-${ARCH}.out if $LIVE_BUILD; then $LINUX32 sudo chroot ${DIR%/./*} sh -c "cd /${DIR#*/./} && rm -rf auto && mkdir -p auto && for f in config build clean; do ln -s /usr/share/livecd-rootfs/live-build/auto/\$f auto/; done" >> ${LOG} 2>&1 || true $LINUX32 sudo chroot ${DIR%/./*} sh -c "cd /${DIR#*/./} && lb clean --purge" >> ${LOG} 2>&1 || true if ! $LINUX32 sudo chroot ${DIR%/./*} sh -c "cd /${DIR#*/./} && NOW=${NOW} SUITE=${STE} PROJECT=${FS} SUBPROJECT=${SUBPROJECT} ARCH=${ARCH} SUBARCH=${SUBARCH} IMAGEFORMAT=${IMAGEFORMAT} PROPOSED=${PROPOSED:+1} lb config" >> ${LOG} 2>&1; then exit 1 fi COMMAND="PROJECT=${FS} SUBPROJECT=${SUBPROJECT} ARCH=${ARCH} SUBARCH=${SUBARCH} lb build" elif [ "$UBUNTU_DEFAULTS_LOCALE" ]; then COMMAND="ubuntu-defaults-image --locale ${UBUNTU_DEFAULTS_LOCALE} --arch ${ARCH} --release ${STE}" elif [ "$UBUNTU_TOUCH_ANDROID" ]; then COMMAND="/usr/sbin/ubuntu-touch-android.sh ${SUBARCH}" else COMMAND="/usr/sbin/livecd.sh ${SUBARCHARG} ${APT_SOURCE} ${PROPOSED} -d${STE} ${IMAGEFORMAT:+-f$IMAGEFORMAT} ${ARCHARG} ${IMAGEARG} ${FS}" fi if $LINUX32 sudo chroot ${DIR%/./*} sh -c "cd /${DIR#*/./} && $COMMAND" >> ${LOG} 2>&1; then rm -f ${PUBDIR}current ln -sf ${NOW} ${PUBDIR}current for file in ${DIR}livecd.*; do if [ -f ${file} ]; then ext=${file##*.} base=${file%.*}; base=${base##*/} sudo chown buildd ${file} sudo mv ${file} ${PUBDIR}${NOW}/${base}-${NOW}-${ARCH}.${ext} ln -sf ${base}-${NOW}-${ARCH}.${ext} ${PUBDIR}${NOW}/${base}.${ext} fi done for f in ${PUBDIR}${NOW}/livecd.*.cloop-*; do if [ -f ${f} ]; then target=${f%-*} if [ ! -f ${target} ]; then for fsbs in 4096:4096 1024:65536; do if [ -f ${target}-${fsbs} ]; then ln -sf ${target##*/}-${fsbs} ${target} break fi done if [ ! -f ${target} ]; then best=$(ls -ld ${target}-* | sort -k5,5n| awk '{print $NF; quit}') ln -sf ${best##*/} ${target} fi fi fi done else exit 1 fi done