#!/bin/bash
#
# zbuild: this is the phased building script used to develop *ZyX
#
# more docs/functionality coming soon(ish)...
#
# todo: argument processing for (and usage) (see below/eof for comments)
#
# f11 performance issue, theoretically solved by a 'feature' in f12
#qcow_too_slow=1
# also solved by qemu-0.11.1
qcow_too_slow=0
#
# defaults to be overridden
#
# overrides md5verify and prelink (to off)
quickbuild=0
# mirrorcheck is not yet implemented
domirrorcheck=0
dosynthesis=0
doupdate=0
domutate=0
doxmutate=0
dobake=0
# useful for debugging smirfgen development
dosmirf=0
doxmog=0
# gathers srpms and does checksums
dopackage=0
#
# current overrides (need to be script args)
#
quickbuild=1
#domirrorcheck=1
#dosynthesis=1
#doupdate=1
domutate=1
dobake=1
#dosmirf=1
doxmog=1
#dopackage=1
#strain_name=F-ZyX
#strain_name=Fork-ZyX
#strain_name=G-ZyX
strain_name=Guitar-ZyX
#strain_name=D-ZyX
#strain_name=min
#strain_version="0.9.3"
strain_version="0.5.0"
#mirrorlist=/var/mirrors/f12/viros.mirrors.cfg
#mirrorlist=/mnt/big/pub/org/info/mirrors/f12/viros.mirrors.cfg
mirrorlist=/mnt/zbuild/mirrors/f12/viros.mirrors.cfg
workarea=$( pwd )
strain="${strain_name}-${strain_version}"
datestamp=$( date +%Y-%m-%d--%H-%M-%S )
rundir=$( pwd )
progdir=$( pushd $( dirname $0 ) > /dev/null 2>&1 ; \
pwd ; popd > /dev/null 2>&1 )
virosdir=$( pushd $( dirname $0 )/.. > /dev/null 2>&1 ; \
pwd ; popd > /dev/null 2>&1 )
builddir="${workarea}/build.${datestamp}"
mkdir -p $builddir
cd $builddir
find ${virosdir} -name "*~" -exec rm -vf '{}' ';'
find ${virosdir} -name "#*" -exec rm -vf '{}' ';'
if (($dosynthesis)); then
# --verbose --debug \
time \
${virosdir}/viros synthesize \
--verbose --debug \
--mirrorlist=${mirrorlist} \
--tmpdir=${builddir} \
--config=${strain} \
--vsysgen_screencast_output=${strain}.screencast \
--output=${builddir}/${strain}.vsi \
2>&1 | tee -a ${builddir}/zmakeit.phased.log
rm -f ${rundir}/${strain}.vsi
ln -fs ${builddir}/${strain}.vsi \
${rundir}/${strain}.vsi
else
ln -s $( readlink -f ${rundir}/${strain}.vsi ) \
${builddir}/${strain}.vsi
fi
if (($doupdate)); then
qemu-img create -b ${strain}.vsi \
-f qcow2 ${strain}-updated.vsi
if (($qcow_too_slow)); then
rm -f ${strain}-updated.vsi
cp -av --sparse=always \
$( readlink -f ${strain}.vsi ) \
${strain}-updated.vsi
fi
time \
${virosdir}/viros mutate \
--verbose --debug \
--mirrorlist=${mirrorlist} \
--tmpdir=${builddir} \
--traits=splice-compose.repos.f12::no_mutate_prepost=1:mode=install \
--traits=splice-kupdate \
--traits=splice-software::update=yes \
--traits=splice-compose.repos.f12::no_mutate_prepost=1:mode=uninstall \
${builddir}/${strain}-updated.vsi \
2>&1 | tee -a ${builddir}/zmakeit.phased.log
rm -f ${rundir}/${strain}-updated.vsi
ln -fs ${builddir}/${strain}-updated.vsi \
${rundir}/${strain}-updated.vsi
else
ln -s $( readlink -f ${rundir}/${strain}-updated.vsi ) \
${builddir}/${strain}-updated.vsi
fi
if (($domutate)); then
qemu-img create -b ${strain}-updated.vsi \
-f qcow2 ${strain}-mutated.vsi
if (($qcow_too_slow)); then
rm -f ${strain}-mutated.vsi
cp -av --sparse=always \
$( readlink -f ${strain}-updated.vsi ) \
${strain}-mutated.vsi
fi
if (($quickbuild)); then
xvmutopts="--traits=unsplice-restorecon"
else
xvmutopts="--traits=splice-noop"
fi
time \
${virosdir}/viros mutate \
--verbose --debug \
--mirrorlist=${mirrorlist} \
--tmpdir=${builddir} \
--config=${strain} \
"${xvmutopts}" \
${builddir}/${strain}-mutated.vsi \
2>&1 | tee -a ${builddir}/zmakeit.phased.log
rm -f ${rundir}/${strain}-mutated.vsi
ln -fs ${builddir}/${strain}-mutated.vsi \
${rundir}/${strain}-mutated.vsi
else
ln -s $( readlink -f ${rundir}/${strain}-mutated.vsi ) \
${builddir}/${strain}-mutated.vsi
fi
if (($dobake)); then
xdone=0
while ((!${xdone})); do
iter_datestamp=$( date +%Y-%m-%d--%H-%M-%S )
mkdir ${builddir}/vtmp.iter.${iter_datestamp}
if [ -f ${strain}-bake.img ]; then
mv ${strain}-bake.img ${strain}-bake.${iter_datestamp}.img
fi
if [ -f ${strain}-mutated-cooked.vsi ]; then
mv ${strain}-mutated-cooked.vsi ${strain}-mutated-cooked.${iter_datestamp}.vsi
fi
qemu-img create ${strain}-bake.img 1234M
qemu-img create \
-b ${strain}-mutated.vsi \
-f qcow2 \
${strain}-mutated-cooked.vsi
if (($qcow_too_slow)); then
rm -f ${strain}-mutated-cooked.vsi
cp -av --sparse=always \
$( readlink -f ${strain}-mutated.vsi ) \
${strain}-mutated-cooked.vsi
fi
# builddir is probably not getting expanded here, eval perhaps
# now seems like it may be expanced, but not what we want in the
# retry scenario, i.e. it kills the new one as well
eval "( sleep 3600 ; kill -KILL \$( < ${builddir}/vtmp.iter.${iter_datestamp}/vtmp.qrap*/qpid.txt ) ) &"
time \
env \
vopt_debug=1 \
vopt_verbose=1 \
viros_stupid_vncname="VirOS___Simulation___Monitor" \
TMPDIR=${builddir}/vtmp.iter.${iter_datestamp} \
${virosdir}/viros qrap \
--vdisplay=X \
--reaper=true \
--recvideo=./${strain}-bakecast \
-net none -m 512 -boot c \
-full-screen \
-hda ./${strain}-mutated-cooked.vsi \
-hdb ./${strain}-bake.img
rm -f ${rundir}/${strain}-mutated-cooked.vsi
ln -fs ${builddir}/${strain}-mutated-cooked.vsi \
${rundir}/${strain}-mutated-cooked.vsi
if ( tar tvf ./${strain}-bake.img | grep -q "output/guest.cooked/.mozilla/firefox/.*\.default/prefs.js" ); then
if ( tar tvf ./${strain}-bake.img | grep -q "output/guest.cooked/.mozilla/firefox/.*\.default/extensions.ini" ); then
xdone=1
fi
fi
done
else
ln -s $( readlink -f ${rundir}/${strain}-mutated.vsi ) \
${builddir}/${strain}-mutated-cooked.vsi
ln -s $( readlink -f ${rundir}/${strain}-bake.img ) \
${builddir}/${strain}-bake.img
fi
if (($dosmirf)); then
time \
${virosdir}/viros transmogrify \
--verbose --debug \
--tmpdir=${builddir} \
--config=${strain} \
zyx-smirf \
${builddir}/${strain}-mutated-cooked.vsi \
${builddir}/${strain}.smirf \
2>&1 | tee -a ${builddir}/zmakeit.phased.log
rm -f ${rundir}/${strain}.smirf
ln -fs ${builddir}/${strain}.smirf \
${rundir}/${strain}.smirf
fi
if (($doxmog)); then
# things to override config values with
xvxmogopts='--vxmogopts=bogus=0'
if (($quickbuild)); then
xvxmogopts+=" --vxmogopts=md5verify=0"
xvxmogopts+=" --vxmogopts=prelink=0"
xvxmogopts+=" --vxmogopts=timestamps=none"
fi
time \
${virosdir}/viros transmogrify \
--verbose --debug \
--tmpdir=${builddir} \
--config=${strain} \
${xvxmogopts} \
zyx-live \
${builddir}/${strain}-mutated-cooked.vsi \
${builddir}/${strain}.iso \
2>&1 | tee -a ${builddir}/zmakeit.phased.log
rm -f ${rundir}/${strain}.iso
ln -fs ${builddir}/${strain}.iso \
${rundir}/${strain}.iso
else
ln -s $( readlink -f ${rundir}/${strain}.iso ) \
${builddir}/${strain}.iso
fi
if (($dopackage)); then
rm -rf ./goldbits
mkdir ./goldbits
pushd ./goldbits
golden_iso=$( readlink -f "${rundir}/${strain}.iso" )
golden_iso_name=$( basename "${golden_iso}" )
golden_iso_dir=$( dirname "${golden_iso}" )
mutated_vsi=$( readlink -f "${rundir}/${strain}-mutated.vsi" )
mutated_vsi_name=$( basename "${mutated_vsi}" )
mutated_vsi_dir=$( dirname "${mutated_vsi}" )
mutated_cooked_vsi=$( readlink -f "${rundir}/${strain}-mutated-cooked.vsi" )
mutated_cooked_vsi_name=$( basename "${mutated_cooked_vsi}" )
mutated_cooked_vsi_dir=$( dirname "${mutated_cooked_vsi}" )
mirror_dir=$( dirname "${mirrorlist}" )
mkdir ./${strain}.srpms
echo "extracting srpm list from baked image ..."
tar xf "${mutated_cooked_vsi_dir}/${strain}-bake.img" output/sysinfo.srpms
mv output/sysinfo.srpms "./${strain}.srpms.txt"
rmdir output
echo "collecting srpms ..."
for srpm in $( < "./${strain}.srpms.txt" ); do
find "${mirror_dir}" -name "${srpm}" -exec cp -a '{}' "./${strain}.srpms/" ';'
done
echo "creating checksums for srpms ..."
sha512sum "./${strain}.srpms/"* > \
"./${strain}.srpms.sha512sums.txt"
# the .. is to facilitate the case when the phased run had to be split across multiple builds
echo "copying build logs to goldbits/${strain}.build.log ..."
cat "${builddir}"/../build.*/zmakeit.phased.log >> \
"./${strain}.build.log"
echo "copying output live iso to goldbits..."
cp -a "${golden_iso}" "./${strain}.iso"
echo "running checksum of liveiso, and other bits to be embedded in livesrc iso..."
sha512sum * > "./${strain}.sha512sums.txt"
echo "cloning live iso to livesrc iso..."
cp -a "${golden_iso}" "./${strain}.wsource.iso"
echo "creating source appendage for livesrc iso..."
tar cf - "./${strain}.srpms" *sha512sums* \
>> "./${strain}.wsource.append.tar"
cat "./${strain}.sha512sums.txt" \
>> "./${strain}.wsource.append.tar"
echo "appending source in reverse to livesrc iso..."
tac "./${strain}.wsource.append.tar" >> "./${strain}.wsource.iso"
rm -rf "./${strain}.srpms" *sha512sums*
echo "final checksumming of live and livesrc iso in progress..."
sha512sum \
"./${strain}.iso" \
"./${strain}.wsource.append.tar" \
"./${strain}.wsource.iso" \
"./${strain}.build.log" \
>> "./${strain}.sha512sum.txt"
bzip2 "./${strain}.build.log"
popd
rm -f ${rundir}/${strain}.goldbits
ln -fs ${builddir}/goldbits \
${rundir}/${strain}.goldbits
fi
# TODO
#
# --sig=<sigdir>
# [--check-keys=<check_key_dir>]
# --check-mirror
# [--mirrorlist=/var/mirrors/f10/viros.mirrors.cfg]
#
# --nox (hide viros synth monitor)
# --reuse-synthesis
# --reuse-update
# --reuse-mutate
# --reuse-bake
# --reuse-xmog
# --strain=
#
# - possibly need retry for synth and mutate
# - disk space checking - check for 31G to be on the safe side
# start with a make release, remaking the viros trait, then copying elsewhere.
# - save traits.tar in packaging, for nonsavetraits case
# - (use builddep to expand)
# - just pass over rpmqa doing query on each packages src,
# - then iter again skipping already done packages,
# - iter till no new packages
#