#!/bin/sh

#
# Include al relevent build environment stuff.
#
. /etc/profile.d/nbe.sh
export USER=$MYRELMAN
export PATH=/usr/local/nbe/bin:/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/home/$MYRELMAN/bin

# If the locking directory does not exists, create it.
if [ ! -d /home/$MYRELMAN/locking ]
then
	mkdir -p /home/$MYRELMAN/locking
fi

# Include locking lib.
. /usr/local/nbe/bin/nbe_locking_lib.sh

#
# If nbe_update_dist_mirror is running, do not continue.
#
if [ -f /home/$MYRELMAN/locking/nbe_update_dist_mirror.running ]
then
	exit 1
fi

#
# Update all rpms for $MYPROD-$MYARCH-$MYDIST.
#
test=`cat /etc/nbe/external-rpms |grep fedora|sed s/^.*=//g|grep y|head -1`
if [ -n "$test" ]
then
	LOCKFILE="/home/$MYRELMAN/locking/mirror-update-$MYPROD-$MYARCH-$MYDIST.running"
	getlockfile $LOCKFILE
	OLWPWD=`pwd`
	cd /home/$MYRELMAN/current/reltree/allrpms/$MYVENDOR/$MYDIST/$MYARCH/
	make update
	make
	cd $OLDPWD
	removelockfile $LOCKFILE
fi

#
# Try to get a lock file otherwise quit.
#
ETH0IP=`/sbin/ifconfig eth0|grep addr:|sed -e s/.*addr:// -e 's/ .*//'`
LOCKFILE="/home/$MYRELMAN/locking/nbe_autorebuild.running.$ETH0IP"
LASTRUN="/tmp/nbe_autorebuild_done"
getlockfile "$LOCKFILE"

#
# Set some global vars.
#
FEDORA_UPDATES=0
SVN_UPDATES=0
MAKE_SVN_FAILED=0
FEDORA_SYNC=0
NBE_DIFF="/usr/local/nbe/bin/nbe_update_diff"
ERROR_MESSAGE_SEND="/tmp/nbe_autorebuild_error_message_send"

# Create tmp directory.
TMPDIR=/tmp/nbe_autorebuild.$$
mkdir -p $TMPDIR

# Do a cd to the buildenvironment.
cd $MYSHORTLINK

# Get global subversion revision.

# Set global svn_revision.
if [ -z "`echo $MYREVISION | tr -d "[:digit:]"`" -a -n "$MYREVISION" ]
then
	SVN_REVISION=$MYREVISION
else
	SVN_REVISION=`svn info http://svn.neonova.nl/svn/private|grep ^Revision|sed -e "s/^Revision://g"`
fi
echo $SVN_REVISION > $MYBASEDIR/.REVISION
export SVN_REVISION

#
# Build al svn files for current distro.
#
make files
> build.log
cd Neonova/RPMS
make svn > $TMPDIR/autorebuild-svn.$$ 2>&1
cd ../..

#
# Print all Succesful and Failed package rebuild to debug file.
#
test1=`grep OK build.log`
test2=`grep FAILED build.log`
if [ -n "$test1" ]
then
  	SVN_UPDATES=1
fi

if [ -n "$test2" ]
then
	MAKE_SVN_FAILED=1
fi

if [ $MAKE_SVN_FAILED -eq 1 ] 
then
	echo "WARNING WARNING WARNING WARNING WARNING" >> $TMPDIR/autorebuild.$$
	echo " Some packages failed to build.        " >> $TMPDIR/autorebuild.$$
	echo "WARNING WARNING WARNING WARNING WARNING" >> $TMPDIR/autorebuild.$$
	echo ""                                        >> $TMPDIR/autorebuild.$$
	echo "The following packages FAILED:"          >> $TMPDIR/autorebuild.$$
	cat build.log |grep FAILED                     >> $TMPDIR/autorebuild.$$
	echo ""                                        >> $TMPDIR/autorebuild.$$
fi

if [ $SVN_UPDATES -eq 1 -o $MAKE_SVN_FAILED -eq 1 ] 
then
	echo "The following packages build OK:" >> $TMPDIR/autorebuild.$$
	for i in `grep OK build.log|sed s/:.*//g`
	do
  		if [ -f $TMPDIR/$i ]
		then
    			grep "$i :" build.log >> $TMPDIR/autorebuild.$$
    			cat $TMPDIR/$i >> $TMPDIR/autorebuild.$$
  		fi
	done
fi

# Fedora Sync.
if [ $MAKE_SVN_FAILED -eq 0 ]
then
  
    	if [ -f $LASTRUN ] 
    	then	  	
    		test=`find $LASTRUN -ctime +1` 
    		if [ -n $test ]
    		then
        		FEDORA_SYNC=1
    		fi
	fi
fi

#
if [ $SVN_UPDATES -eq 1 -a $MAKE_SVN_FAILED -eq 0 ]
then
    FEDORA_SYNC=1
fi

#
# Sync to Fedora.
#
if [ $FEDORA_SYNC -eq 1 ] 
then
	cd $MYSHORTLINK

	make update

	BASE="distr/$MYPROD/$MYPRODREL/$MYDIST/$MYPRODSTABILITY/$MYCUST/$MYARCH/base.list"
	svn diff $BASE > $TMPDIR/base.list.diff
	COUNT1=`cat $TMPDIR/base.list.diff|grep ^+|grep -v ^++|wc -l`

	UPDATES="distr/$MYPROD/$MYPRODREL/$MYDIST/$MYPRODSTABILITY/$MYCUST/$MYARCH/updates.list"
	svn diff $UPDATES > $TMPDIR/update.list.diff
	COUNT2=`cat $TMPDIR/update.list.diff|grep ^+|grep -v ^++|wc -l`

	EXTRAS="distr/$MYPROD/$MYPRODREL/$MYDIST/$MYPRODSTABILITY/$MYCUST/$MYARCH/extras.list"
	svn diff $EXTRAS > $TMPDIR/extras.list.diff
	COUNT3=`cat $TMPDIR/extras.list.diff|grep ^+|grep -v ^++|wc -l`

	if [ $COUNT1 -gt 0 -o $COUNT2 -gt 0 -o $COUNT3 -gt 0 ]
	then
	  svn commit $BASE $UPDATES $EXTRAS -m "Synced $MYPROD $MYPRODREL ($MYCUST) to $MYDIST"
	  FEDORA_UPDATES=1
	fi 
fi

#
# When there is at least one OK and no FAILED package rebuild.
# Then build repo.
#
if [ $SVN_UPDATES -eq 1 -a $MAKE_SVN_FAILED -eq 0 ] 
then
	cd $MYSHORTLINK/Neonova/RPMS
	make all2 >> $TMPDIR/autorebuild-make-all2.$$ 2>&1
	cd $MYSHORTLINK
	make repo > $TMPDIR/autorebuild-make-repo.$$ 2>&1
	echo "Distro build Done!"  >> $TMPDIR/autorebuild.$$

        # Create rebuild file done.
        touch $LASTRUN
fi

# If there are svn updates and there is no build error do a repository_rsync.
DO_REPOSITORY_RSYNC=0
if [ $SVN_UPDATES -eq 1 -a $MAKE_SVN_FAILED -eq 0 ] 
then
	DO_REPOSITORY_RSYNC=1
fi

# If rsync failed file exists and there is no build error do a repository_rsync.
if [ $MAKE_SVN_FAILED -eq 0 -a -f "/tmp/rsync-repository-failed" ] 
then
	DO_REPOSITORY_RSYNC=1
fi

# The build was OK!, so copy it to de yum respository.
if [ $DO_REPOSITORY_RSYNC -eq 1 ] 
then

	# Check if myrephost is set.
	if [ -n "$MYREPHOST" ]
	then
		DISTR="$MYPROD/$MYPRODREL/$MYDIST/$MYCUST/$MYPRODSTABILITY/$MYARCH/$MYBUILD/"
		REPOSITORY="$MYREPUSER@$MYREPHOST:/home/$MYREPUSER/$MYREPPATH/$DISTR"
	fi

	# Try to resync files to the yum repository, max try is 5 and timeout is 300.
       	max_retry=5
       	counter=0
	exit_status=1

      	until [ $counter -gt $max_retry -o $exit_status -eq 0 ]
       	do
		# Set Rsync options.
		RSYNC_OPTIONS='--delete --delete-excluded -H -aqv --timeout=300 --safe-links'
		RSYNC_EXCLUDE1="--exclude=build.log --exclude=*.svn* --exclude=svn.list --exclude=*external_rpms.filter*" 
                RSYNC_EXCLUDE2="--exclude=*Makefile* --exclude=Neonova/RPMS/cache/ --exclude=distr/"
		RSYNC_EXCLUDE3="--exclude=base.list --exclude=comps-default.xml --exclude=comps-fedora.xml --exclude=comps-mycust.xml"
		RSYNC_EXCLUDE4="--exclude=extras.list --exclude=kickstart --exclude=svn-default.list --exclude=svn-mycust.list --exclude=updates.list"

		# Copy the distribution to the yum repository.
		rsync $RSYNC_OPTIONS $RSYNC_EXCLUDE1 $RSYNC_EXCLUDE2 $RSYNC_EXCLUDE3 $RSYNC_EXCLUDE4 $MYSHORTLINK/ $REPOSITORY

               	# Get exit_status.
               	exit_status=$?

               	# Icrease counter
               	counter=`expr $counter + 1`
       	done

	# If rsync failed then set rsync failed flag.
	if [ $exit_status -ne 0 ]
	then
		touch /tmp/rsync-repository-failed
	fi

	# If rsync ok, then remove rsync-failed flag.
	if [ $exit_status -eq 0 -a -f /tmp/rsync-repository-failed ]
	then
		rm -f /tmp/rsync-repository-failed
	fi	
fi

if [ $FEDORA_UPDATES -eq 1 ]
then
	if [ $COUNT1 -gt 0 ]
	then
		echo "------------------------"        		>> $TMPDIR/autorebuild.$$
		echo "$MYVENDOR Base             "        	>> $TMPDIR/autorebuild.$$ 
		echo "------------------------"        		>> $TMPDIR/autorebuild.$$
		cat $TMPDIR/base.list.diff|$NBE_DIFF|sort   	>> $TMPDIR/autorebuild.$$
	fi

	if [ $COUNT2 -gt 0 ]
	then
		echo "------------------------"        		>> $TMPDIR/autorebuild.$$
		echo "$MYVENDOR Updates          "        	>> $TMPDIR/autorebuild.$$ 
		echo "------------------------"        		>> $TMPDIR/autorebuild.$$
		cat $TMPDIR/update.list.diff|$NBE_DIFF|sort 	>> $TMPDIR/autorebuild.$$
	fi

	if [ $COUNT3 -gt 0 ]
	then
		echo "------------------------"        		>> $TMPDIR/autorebuild.$$
		echo "$MYVENDOR extras Updates   "        	>> $TMPDIR/autorebuild.$$ 
		echo "------------------------"        		>> $TMPDIR/autorebuild.$$
		cat $TMPDIR/extras.list.diff|$NBE_DIFF|sort 	>> $TMPDIR/autorebuild.$$
	fi
fi


SEND_MESSAGE=0
if [ $SVN_UPDATES -eq 1 -o $MAKE_SVN_FAILED -eq 1 -o $FEDORA_UPDATES -eq 1 ] 
then
	SEND_MESSAGE=1
fi

if [ -f $ERROR_MESSAGE_SEND ]
then
	find $ERROR_MESSAGE_SEND -cmin +720>/dev/null | xargs rm -f
fi

if [ $MAKE_SVN_FAILED -eq 1 -a -f $ERROR_MESSAGE_SEND ]
then
	SEND_MESSAGE=0
fi

if [ $SEND_MESSAGE -eq 1 ] 
then
	if [ $MAKE_SVN_FAILED -eq 1 ] 
	then
        	SUBJECT="ERROR: FAILED Autorebuild: $MYPROD $MYPRODREL $MYPRODSTABILITY $MYARCH $MYDIST $MYCUST"
        else
        	SUBJECT="Autorebuild: $MYPROD $MYPRODREL $MYPRODSTABILITY $MYARCH $MYDIST $MYCUST"
        fi
	
	# Get email adresses.
	EMAILADRES=""
	for i in `cat /etc/nbe/email`
	do
  		EMAILADRES=$EMAILADRES$i,
	done
	EMAILADRES=`echo $EMAILADRES|sed -e "s/,$//g"`

	# Send build email.
        cat $TMPDIR/autorebuild.$$ |mail $EMAILADRES -s "$SUBJECT" >> $TMPDIR/autorebuild-mail.$$ 2>&1

	if [ $MAKE_SVN_FAILED -eq 1 ] 
	then
		touch $ERROR_MESSAGE_SEND
	fi
fi

if [ $SVN_UPDATES -eq 1 -a $MAKE_SVN_FAILED -eq 0 ] 
then
	if [ -f $ERROR_MESSAGE_SEND ]
	then
		rm -f touch $ERROR_MESSAGE_SEND
	fi
fi

#
# Remove log files when there are 0 updated of failed packages.
#
if [ -z "$test1" -a -z "$test2" ]
then
	rm -rf /tmp/nbe_autorebuild.$$
fi

#
# Remove lock file.
#
rm -f /tmp/tmp.*
removelockfile "$LOCKFILE"
