#! /bin/bash

################
# Version 0.85 #
################
#run as root only ... exit if not
iam=`whoami`

if [ "$iam" != "root" ]; then
  echo "Only run this script as root!"
  exit 1
fi
#

export PYTHONPATH=/usr/lib/anaconda

VERSION="4.3"
SUBVERSION="Final"
DISTRONAME="CentOS"
ARCH=`uname -i`
BUILDDIR=/home/buildcentos/rpmbuild
DISTDIR=/home/buildcentos/CENTOS/en/4.0
BUILDTIME=`date +%Y%m%d%H%M`
BACKUP_SRPMS=/home/buildcentos/backup_srpms
NORMAL_USER_CHMOD="buildcentos:buildcentos"
latest_comps=`ls -lt ${DISTDIR}/SRPMS/comps-4* | grep -m1 .src.rpm | awk {'print $9'}`
latest_rpmdb=`ls -lt ${DISTDIR}/SRPMS/rpmdb-CentOS* | grep -m1 .src.rpm | awk {'print $9'}`
publisher='CentOS Project'
bootimg='isolinux/isolinux.bin'
bootcat='isolinux/boot.cat'
mkisopts='-r -N -allow-leading-dots -d -D -J'
today="$(date '+%d %b %Y')"
write_dir="/home/buildcentos/centos-isos"
LOGFILE=/home/buildcentos/rpmbuild/build.$BUILDTIME.log

# remove old build logs
rm -f /home/buildcentos/rpmbuild/build.*.log

cd ${DISTDIR}

echo "Starting Build ... - logging to ${LOGFILE}"
echo "Starting Build" > ${LOGFILE}

## Backup latest SRPMS for comps and rpm-db
cp -f -a ${latest_comps} ${BACKUP_SRPMS}/
cp -f -a ${latest_rpmdb} ${BACKUP_SRPMS}/

#Check for spec files and install them if necessary
if [ ! -f ${BUILDDIR}/SPECS/comps-centos.spec ]; then
  
  rpm -Uvh ${latest_comps}
fi

if [ ! -f ${BUILDDIR}/SPECS/rpmdb-centos.spec ]; then
  
  rpm -Uvh ${latest_rpmdb}
fi

## Clean out build area
rm -f ${BUILDDIR}/SRPMS/*
rm -f ${BUILDDIR}/RPMS/${ARCH}/*
rm -f ${BUILDDIR}/RPMS/i386/*
rm -f ${BUILDDIR}/RPMS/noarch/*
rm -f ${BUILDDIR}/RPMS/athlon/*
rm -f ${BUILDDIR}/RPMS/i686/*
rm -f ${BUILDDIR}/RPMS/i486/*
rm -f ${BUILDDIR}/RPMS/i586/*
rm -rf ${BUILDDIR}/BUILD/*

## Build comps
echo "Building Comps"

rpmbuild -ba ${BUILDDIR}/SPECS/comps-centos.spec >> ${LOGFILE} 2>&1

## sign the new packages
#rpm --resign ${BUILDDIR}/SRPMS/comps-4*
#rpm --resign ${BUILDDIR}/RPMS/${ARCH}/comps-4*

## copy them into place
rm -f ${DISTDIR}/SRPMS/comps-4* >> ${LOGFILE} 2>&1
cp ${BUILDDIR}/SRPMS/comps-4* ${DISTDIR}/SRPMS/ >> ${LOGFILE} 2>&1
rm -f ${DISTDIR}/${ARCH}/CentOS/RPMS/comps-4* >> ${LOGFILE} 2>&1
cp ${BUILDDIR}/RPMS/${ARCH}/comps-4* ${DISTDIR}/${ARCH}/CentOS/RPMS/ >> ${LOGFILE} 2>&1
cp -f ${BUILDDIR}/RPMS/${ARCH}/comps-4* ${DISTDIR}/${ARCH}/CentOS/base/comps.rpm >> ${LOGFILE} 2>&1

## Build rpmdb
echo "Building Rpmdb"
rpmbuild -ba  ${BUILDDIR}/SPECS/rpmdb-centos.spec >> ${LOGFILE} 2>&1

## copy them into place
rm -f ${DISTDIR}/SRPMS/rpmdb-CentOS* >> ${LOGFILE} 2>&1
cp ${BUILDDIR}/SRPMS/rpmdb-CentOS* ${DISTDIR}/SRPMS/ >> ${LOGFILE} 2>&1
rm -f ${DISTDIR}/${ARCH}/CentOS/RPMS/rpmdb-CentOS* >> ${LOGFILE} 2>&1
cp ${BUILDDIR}/RPMS/${ARCH}/rpmdb-CentOS* ${DISTDIR}/${ARCH}/CentOS/RPMS/ >> ${LOGFILE} 2>&1

## sign the all packages
cd ${DISTDIR}/SRPMS
rpm --resign *.rpm
cd ${DISTDIR}/${ARCH}/CentOS/RPMS
rpm --resign *.rpm
cd ${DISTDIR}

## Run genhd first time
echo "Running genhdlist"
/usr/lib/anaconda-runtime/genhdlist \
--withnumbers \
--productpath=CentOS \
${DISTDIR}/${ARCH} >> ${LOGFILE} 2>&1

## then pkgorder
echo "Getting pkgorder"

rm -f ${DISTDIR}/pkgorder-${ARCH}.txt

/usr/lib/anaconda-runtime/pkgorder \
${DISTDIR}/${ARCH} ${ARCH} \
| tee --append ${DISTDIR}/pkgorder-${ARCH}.txt ${LOGFILE} 2>&1

## then genhd again 
echo "Running genhdlist again"

/usr/lib/anaconda-runtime/genhdlist \
--withnumbers \
--productpath=CentOS \
--fileorder=${DISTDIR}/pkgorder-${ARCH}.txt \
${DISTDIR}/${ARCH} >> ${LOGFILE} 2>&1

## then build installer
echo "Building Installer"

/usr/lib/anaconda-runtime/buildinstall --comp dist-${VERSION} \
	--pkgorder ${DISTDIR}/pkgorder-${ARCH}.txt \
	--release "${DISTRONAME}-4 ${ARCH}" \
	--product "${DISTRONAME}-4 ${ARCH}" \
	--version ${VERSION} ${DISTDIR}/${ARCH}  >> ${LOGFILE} 2>&1

echo "Splitting Tree"

/usr/lib/anaconda-runtime/splittree.py --arch=${ARCH} --total-discs=8 \
        --bin-discs=4 --src-discs=4 \
        --release-string="${DISTRONAME} ${VERSION}${SUBVERSION} ${ARCH}" \
        --pkgorderfile=${DISTDIR}/pkgorder-${ARCH}.txt \
        --distdir=${DISTDIR}/${ARCH}/ \
        --srcdir=${DISTDIR}/SRPMS/ >> ${LOGFILE} 2>&1

rm -rf ${ARCH}-disc* >> ${LOGFILE} 2>&1

mv ${ARCH}/-disc1/ ${ARCH}-disc1 >> ${LOGFILE} 2>&1
mv ${ARCH}/-disc2/ ${ARCH}-disc2 >> ${LOGFILE} 2>&1
mv ${ARCH}/-disc3/ ${ARCH}-disc3 >> ${LOGFILE} 2>&1
mv ${ARCH}/-disc4/ ${ARCH}-disc4 >> ${LOGFILE} 2>&1
mv ${ARCH}/-disc5/ ${ARCH}-disc5 >> ${LOGFILE} 2>&1
mv ${ARCH}/-disc6/ ${ARCH}-disc6 >> ${LOGFILE} 2>&1
mv ${ARCH}/-disc7/ ${ARCH}-disc7 >> ${LOGFILE} 2>&1
mv ${ARCH}/-disc8/ ${ARCH}-disc8 >> ${LOGFILE} 2>&1
#mv ${ARCH}/-disc9/ ${ARCH}-disc9 >> ${LOGFILE} 2>&1
#mv ${ARCH}/-disc10/ ${ARCH}-disc10 >> ${LOGFILE} 2>&1

#in case comps-4 is not on ARCH-disc1 (but another disc) put it there 
#before the genhdlist
for i in 1 2 3 4 ; do 
 rm -f ${DISTDIR}/${ARCH}-disc${i}/CentOS/RPMS/comps-4* >> ${LOGFILE} 2>&1
done
cp -f ${DISTDIR}/${ARCH}/CentOS/RPMS/comps-4* ${DISTDIR}/${ARCH}-disc1/CentOS/RPMS/ >> ${LOGFILE} 2>&1

#do the same thing to put the comps SRPM on disc 5 if it is somewhere else on the source discs
for i in 5 6 7 8; do 
 rm -f ${DISTDIR}/${ARCH}-disc${i}/SRPMS/comps-4* >> ${LOGFILE} 2>&1
done
cp -f ${DISTDIR}/SRPMS/comps-4* ${DISTDIR}/${ARCH}-disc5/SRPMS/ >> ${LOGFILE} 2>&1

## run genhd on isos
echo "Running genhdlist on isos"

rm ${DISTDIR}/${ARCH}-disc1/CentOS/base/hdlist* >> ${LOGFILE} 2>&1

/usr/lib/anaconda-runtime/genhdlist \
--withnumbers --fileorder=${DISTDIR}/pkgorder-${ARCH}.txt \
${DISTDIR}/${ARCH}-disc[1234] >> ${LOGFILE} 2>&1

echo "Building final comps"

## build final comps

rm -f ${BUILDDIR}/RPMS/${ARCH}/comps-4* >> ${LOGFILE} 2>&1

rpmbuild -ba --define "basedir ${DISTDIR}/${ARCH}-disc1/CentOS/base" \
${BUILDDIR}/SPECS/comps-centos.spec >> ${LOGFILE} 2>&1

rpm --resign ${BUILDDIR}/SRPMS/comps-4*
rpm --resign ${BUILDDIR}/RPMS/${ARCH}/comps-4*

rm -f ${DISTDIR}/${ARCH}-disc5/SRPMS/comps-4* >> ${LOGFILE} 2>&1
rm -f ${DISTDIR}/SRPMS/comps-4* >> ${LOGFILE} 2>&1
cp ${BUILDDIR}/SRPMS/comps-4* ${DISTDIR}/${ARCH}-disc5/SRPMS/ >> ${LOGFILE} 2>&1
cp ${BUILDDIR}/SRPMS/comps-4* ${DISTDIR}/SRPMS/ >> ${LOGFILE} 2>&1
rm -f ${DISTDIR}/${ARCH}-disc1/CentOS/RPMS/comps-4* >> ${LOGFILE} 2>&1
rm -f ${DISTDIR}/${ARCH}/CentOS/RPMS/comps-4* >> ${LOGFILE} 2>&1
cp ${BUILDDIR}/RPMS/${ARCH}/comps-4* ${DISTDIR}/${ARCH}-disc1/CentOS/RPMS/ >> ${LOGFILE} 2>&1
cp ${BUILDDIR}/RPMS/${ARCH}/comps-4* ${DISTDIR}/${ARCH}/CentOS/RPMS/ >> ${LOGFILE} 2>&1
rm -f ${DISTDIR}/${ARCH}-disc1/CentOS/base/comps.rpm >> ${LOGFILE} 2>&1
rm -f ${DISTDIR}/${ARCH}/CentOS/base/comps.rpm >> ${LOGFILE} 2>&1
cp -f ${BUILDDIR}/RPMS/${ARCH}/comps-4* ${DISTDIR}/${ARCH}-disc1/CentOS/base/comps.rpm >> ${LOGFILE} 2>&1
cp -f ${BUILDDIR}/RPMS/${ARCH}/comps-4* ${DISTDIR}/${ARCH}/CentOS/base/comps.rpm >> ${LOGFILE} 2>&1

rm -rf ${DISTDIR}/${ARCH}/buildinstall.tree.*
rm -rf ${DISTDIR}/${ARCH}-disc1/buildinstall.tree.*

#Build repo / up2date data
cd ${DISTDIR}/${ARCH}

# Remark out the following line if you don't want to rewrite yumgroups everytime
rm -rf yumgroups.xml

if [ ! -f yumgroups.xml ]; then
  cp -af CentOS/base/comps.xml yumgroups.xml  >> ${LOGFILE} 2>&1
  cp -af CentOS/base/comps.xml ${DISTDIR}/${ARCH}-disc1/yumgroups.xml >> ${LOGFILE} 2>&1
fi

yum-arch .  >> ${LOGFILE} 2>&1
createrepo -g yumgroups.xml .  >> ${LOGFILE} 2>&1
cd ${DISTDIR}/${ARCH}/headers/
rsync --delete --progress -Cvuzlrt . ${DISTDIR}/${ARCH}-disc1/headers/  >> ${LOGFILE} 2>&1
cd ../repodata
rsync --delete --progress -Cvuzlrt . ${DISTDIR}/${ARCH}-disc1/repodata/  >> ${LOGFILE} 2>&1
cd ${DISTDIR}

#copy new splash into isolinux
#if [ -f ${BACKUP_SRPMS}/splash.lss ]; then
# cp -af ${BACKUP_SRPMS}/splash.lss ${DISTDIR}/${ARCH}-disc1/isolinux/
# cp -af ${BACKUP_SRPMS}/splash.lss ${DISTDIR}/${ARCH}/isolinux/
#fi

#Change permissions to the normal build user for all new files
echo "Changing newly built file permissions to ${NORMAL_USER_CHMOD}"

chown -R ${NORMAL_USER_CHMOD} ${DISTDIR} >> ${LOGFILE} 2>&1
chown -R ${NORMAL_USER_CHMOD} ${BACKUP_SRPMS} >> ${LOGFILE} 2>&1
chown -R ${NORMAL_USER_CHMOD} ${BUILDDIR} >> ${LOGFILE} 2>&1

echo "Writing isos"
## write the isos

mkisofs ${mkisopts} \
	-V "${DISTRONAME} ${VERSION}${SUBVERSION} ${ARCH} bin1of4" \
	-A "${DISTRONAME}-${VERSION}${SUBVERSION} ${ARCH} created on ${today}" \
	-publisher "${publisher}" \
	-p "${publisher}" \
	-b "${bootimg}" \
	-c "${bootcat}" \
	-no-emul-boot -boot-load-size 4 -boot-info-table \
	-x lost+found \
	-o "${write_dir}"/"${DISTRONAME}"-"${VERSION}"-"${ARCH}"-bin1of4.iso \
	${ARCH}-disc1 >> ${LOGFILE} 2>&1

/usr/lib/anaconda-runtime/implantisomd5 "${write_dir}"/"${DISTRONAME}"-"${VERSION}"-"${ARCH}"-bin1of4.iso >> ${LOGFILE} 2>&1

dd if=/dev/zero bs=2048 count=150 >> "${write_dir}"/"${DISTRONAME}"-"${VERSION}"-"${ARCH}"-bin1of4.iso

for i in 2 3 4 ; do
	mkisofs ${mkisopts} \
	-V "${DISTRONAME} ${VERSION} ${SUBVERSION} ${ARCH} bin${i}of4" \
	-A "${DISTRONAME} ${VERSION} ${SUBVERSION} ${ARCH} created ${today}" \
	-publisher "${publisher}" \
	-p "${publisher}" \
	-x lost+found \
	-o "${write_dir}"/"${DISTRONAME}"-"${VERSION}"-"${ARCH}"-bin${i}of4.iso \
	${ARCH}-disc${i} >> ${LOGFILE} 2>&1

	/usr/lib/anaconda-runtime/implantisomd5 "${write_dir}"/"${DISTRONAME}"-"${VERSION}"-"${ARCH}"-bin${i}of4.iso >> ${LOGFILE} 2>&1

       dd if=/dev/zero bs=2048 count=150 >> "${write_dir}"/"${DISTRONAME}"-"${VERSION}"-"${ARCH}"-bin${i}of4.iso
done

for i in 5 6 7 8 ; do
        si=$(($i-4))
	mkisofs ${mkisopts} \
	-V "${DISTRONAME} ${VERSION} ${SUBVERSION} ${ARCH} src${si}of4" \
	-A "${DISTRONAME} ${VERSION} ${SUBVERSION} ${ARCH} created ${today}" \
	-publisher "${publisher}" \
	-p "${publisher}" \
	-x lost+found \
	-o "${write_dir}"/"${DISTRONAME}"-"${VERSION}"-SRPMS-src${si}of4.iso \
	${ARCH}-disc${i} >> ${LOGFILE} 2>&1

	/usr/lib/anaconda-runtime/implantisomd5 "${write_dir}"/"${DISTRONAME}"-"${VERSION}"-SRPMS-src${si}of4.iso >> ${LOGFILE} 2>&1

       dd if=/dev/zero bs=2048 count=150 >> "${write_dir}"/"${DISTRONAME}"-"${VERSION}"-SRPMS-src${si}of4.iso
done

chown -R ${NORMAL_USER_CHMOD} ${write_dir} >> ${LOGFILE} 2>&1

echo "Finished - log is ${LOGFILE}"