#!/bin/sh
#
#  Yum cron file
#	Designed to work with Fermilab's workgroups
#	Designed to only send mail when something has been updated or installed
#
#  Written by Troy Dawson <dawson@fnal.gov>
#	Changed - May 7, 2003  by Troy Dawson <dawson@fnal.gov>
#	Changed - April 8, 2004  by Troy Dawson <dawson@fnal.gov>
#		Workgroup fix by Tom Rockwell <rockwell@pa.msu.edu>
#
#Change DEBUG to 0 to turn on debugging
DEBUG=1
MAXWAITTIME=180
#MAXWAITTIME=0
MAILLIST="farm-yum@fnal.gov"
#MAILLIST="root,me@mydomain.com,you@yourdomain.org"
RELEASE="lts301"

#*******************************************
# Function to ping a server
#  Return 0 - alive and able to access
#  Return 1 - failed
#*******************************************	
ping_server() {
	TESTSERVER=$1
	/usr/bin/wget -T 5 -t 1 -O - ftp://$TESTSERVER.fnal.gov/ > /dev/null 2>&1
	if [ $? -eq 0 ] ; then
		if [ $DEBUG -eq 0 ] ; then
			echo "   Server $TESTSERVER alive and ftpable"
		fi
		return 0
	fi
	if [ $DEBUG -eq 0 ] ; then
		echo "   Server $TESTSERVER not responding"
	fi
	return 1
}

#*******************************************
#sleep for a random amount of minutes
#*******************************************	
random_sleep() {
	RAN=$RANDOM
	if [ "$RAN" = "0" ] ; then
		RAN=1
	fi
	if [ $MAXWAITTIME -le 0 ] ; then
		MAXWAITTIME=1
	fi
	SLEEPTIME=$(($RAN % $MAXWAITTIME))
	if [ $DEBUG -eq 0 ] ; then
		echo "  Sleeping for $SLEEPTIME minutes"
	fi
	sleep ${SLEEPTIME}m
}

if [ -f /var/lock/subsys/yum ]; then
	if [ $DEBUG -eq 0 ] ; then
		echo "Yum crontab starting"
	fi
	#****************************
	#VARIABLES
	#****************************
	TEMPFILE="/tmp/yum.temp"
	TEMPCONFIGFILE="/tmp/yum.temp.config"
	TEMPMAILFILE="/tmp/yum.temp.mail"
	if [ -f /etc/workgroup ] ; then
		WORKGROUP="$(cat /etc/workgroup)"
	else
		WORKGROUP=""
	fi
	TODAY="$(date +%D)"
	CHANGE=0
#	if [ -s /etc/fermi-release ] ; then
#		RELEASE="$(cat /etc/fermi-release | cut -d' ' -f4 | tr -d .)"
#	else
#		RELEASE="lts301"
#	fi
	
	#****************************
	#Sleep for a random amount of minutes
	#****************************
	random_sleep
	
	#****************************
	#Figure out which server to use
	#****************************	
	if [ $DEBUG -eq 0 ] ; then
		echo "  Finding a random, alive server"
	fi
	#pick the server randomly
	let SERVERNUM=$RANDOM%2	
	if [ $SERVERNUM -eq 0 ] ; then
		SERVER="linux"
	else
		SERVER="linux1"
	fi
	#check to see if we can access that server
	ping_server $SERVER
	#if we can't access the server, change servers
	if [ $? -eq 1 ] ; then
		if [ $SERVERNUM -eq 0 ] ; then
			SERVER="linux1"
		else
			SERVER="linux"
		fi
		#check to see how these servers work
		ping_server $SERVER
		#we couldn't access any servers, so fail this
		if [ $? -eq 1 ] ; then
			echo "Could not access any distribution servers"
			exit 2
		fi
	fi
	if [ $DEBUG -eq 0 ] ; then
		echo "    Using $SERVER as ftp server"
	fi
	
	#****************************
	#Setup
	#****************************
	rm -f $TEMPMAILFILE
	rm -f $TEMPCONFIGFILE
	rm -f $TEMPFILE

	#****************************
	#Updates Addons
	#****************************
	if [ $DEBUG -eq 0 ] ; then
		echo "  Starting Yum for Addons"
		echo "   Creating Config File"
	fi
	rm -f $TEMPCONFIGFILE
	echo "[main]" > $TEMPCONFIGFILE
	echo "tolerant=1" >> $TEMPCONFIGFILE
	echo "" >> $TEMPCONFIGFILE
	echo "[${RELEASE}addons]" >> $TEMPCONFIGFILE
	echo "name=Fermi Linux $RELEASE addons" >> $TEMPCONFIGFILE
	echo "baseurl=ftp://$SERVER.fnal.gov/linux/$RELEASE/i386/updates/RedHat/addons/RPMS/" >> $TEMPCONFIGFILE
	if [ $DEBUG -eq 0 ] ; then
		echo "vvvvvvvvvvvvvvvvv"
		cat $TEMPCONFIGFILE
		echo "^^^^^^^^^^^^^^^^^"
		echo "    Starting Yum with command"
		echo "     /usr/bin/yum -c $TEMPCONFIGFILE -e 0 -d 1 -y install '*'"		
	fi
	/usr/bin/yum -c $TEMPCONFIGFILE -e 0 -d 1 -y install '*' > $TEMPFILE 2>&1
	if [ -s $TEMPFILE ] ; then
		if [ $DEBUG -eq 0 ] ; then
			echo "    We had changes"
			echo "vvvvvvvvvvvvvvvvv"
			cat $TEMPFILE
			echo "^^^^^^^^^^^^^^^^^"
		fi
		CHANGE=1
		echo " --------------------" >> $TEMPMAILFILE
		echo " YUM - Errata Addons" >> $TEMPMAILFILE
		echo " --------------------" >> $TEMPMAILFILE
		cat $TEMPFILE >> $TEMPMAILFILE
	fi
	#****************************
	#Cleanup Addons
	#****************************
	if [ $DEBUG -eq 0 ] ; then
		echo " Cleaning Up Addons"
	fi
	yum -e 0 -d 0 -c $TEMPCONFIGFILE clean all
	mv -f $TEMPCONFIGFILE /tmp/yum.conf.addons
	

	#****************************
	#Updates Update
	#****************************
	if [ $DEBUG -eq 0 ] ; then
		echo "  Starting Yum for Updates"
		echo "   Creating Config File"
	fi
	rm -f $TEMPCONFIGFILE
	echo "[main]" > $TEMPCONFIGFILE
	echo "tolerant=1" >> $TEMPCONFIGFILE
	cat /etc/yum.d/yum.cron.excludes >> $TEMPCONFIGFILE
	echo "" >> $TEMPCONFIGFILE
	echo "[${RELEASE}updates]" >> $TEMPCONFIGFILE
	echo "name=Fermi Linux $RELEASE updates" >> $TEMPCONFIGFILE
	echo "baseurl=ftp://$SERVER.fnal.gov/linux/$RELEASE/i386/updates/RedHat/RPMS/" >> $TEMPCONFIGFILE
	if [ $DEBUG -eq 0 ] ; then
		echo "vvvvvvvvvvvvvvvvv"
		cat $TEMPCONFIGFILE
		echo "^^^^^^^^^^^^^^^^^"
		echo "    Starting Yum with command"
		echo "     /usr/bin/yum -c $TEMPCONFIGFILE -e 0 -d 1 -y update"		
	fi
	/usr/bin/yum -c $TEMPCONFIGFILE -e 0 -d 1 -y update > $TEMPFILE 2>&1
	if [ -s $TEMPFILE ] ; then
		if [ $DEBUG -eq 0 ] ; then
			echo "    We had changes"
			echo "vvvvvvvvvvvvvvvvv"
			cat $TEMPFILE
			echo "^^^^^^^^^^^^^^^^^"
		fi
		CHANGE=1
		echo " --------------------" >> $TEMPMAILFILE
		echo " YUM - Errata Updates" >> $TEMPMAILFILE
		echo " --------------------" >> $TEMPMAILFILE
		cat $TEMPFILE >> $TEMPMAILFILE
	fi
	#****************************
	#Cleanup Updates
	#****************************
	if [ $DEBUG -eq 0 ] ; then
		echo " Cleaning Up Updates"
	fi
	yum -e 0 -d 0 -c $TEMPCONFIGFILE clean all
	mv -f $TEMPCONFIGFILE /tmp/yum.conf.updates
	
	#****************************
	#Workgroup Update
	#****************************
	if [ -n "$WORKGROUP" ] ; then
		if [ $DEBUG -eq 0 ] ; then
			echo "  Starting Yum for Workgroup"
			echo "   Creating Config File"
		fi
		rm -f $TEMPCONFIGFILE
		echo "[main]" > $TEMPCONFIGFILE
		echo "tolerant=1" >> $TEMPCONFIGFILE
		echo "" >> $TEMPCONFIGFILE
		echo "[${RELEASE}workgroup]" >> $TEMPCONFIGFILE
		echo "name=Fermi Linux $RELEASE $WORKGROUP workgroup" >> $TEMPCONFIGFILE
		echo "baseurl=ftp://$SERVER.fnal.gov/linux/$RELEASE/i386/Fermi/workgroups/$WORKGROUP/RPMS/" >> $TEMPCONFIGFILE
		if [ $DEBUG -eq 0 ] ; then
			echo "vvvvvvvvvvvvvvvvv"
			cat $TEMPCONFIGFILE
			echo "^^^^^^^^^^^^^^^^^"
			echo "    Starting Yum with command"
			echo "     /usr/bin/yum -c $TEMPCONFIGFILE -e 0 -d 1 -y install \'*\'"		
		fi
		/usr/bin/yum -c $TEMPCONFIGFILE -e 0 -d 1 -y install '*' > $TEMPFILE 2>&1
		if [ -s $TEMPFILE ] ; then
			if [ $DEBUG -eq 0 ] ; then
				echo "    We had changes"
				echo "vvvvvvvvvvvvvvvvv"
				cat $TEMPFILE
				echo "^^^^^^^^^^^^^^^^^"
			fi
			CHANGE=1
			echo " -----------------------" >> $TEMPMAILFILE
			echo " YUM - Workgroup Updates" >> $TEMPMAILFILE
			echo " -----------------------" >> $TEMPMAILFILE
			cat $TEMPFILE >> $TEMPMAILFILE
		fi
		#****************************
		#Cleanup Workgroups
		#****************************
		if [ $DEBUG -eq 0 ] ; then
			echo " Cleaning Up Workgoups"
		fi
		yum -e 0 -d 0 -c $TEMPCONFIGFILE clean all
		mv -f $TEMPCONFIGFILE /tmp/yum.conf.workgroups
	else
		if [ $DEBUG -eq 0 ] ; then
			echo "  No file /etc/workgroup"
			echo "  Not doing Workgroup section"
		fi	
	fi # End Workgroups
	
	#****************************
	#Send Mail If Needed
	#****************************
	if [ $CHANGE -eq 1 ] ; then
		if [ $DEBUG -eq 0 ] ; then
			echo " Mail Needs To Be Sent"
			echo "  /bin/mail -s \"YUM:$HOSTNAME:$TODAY\" $MAILLIST "
		fi
		/bin/mail -s "YUM:$HOSTNAME:$TODAY" $MAILLIST < $TEMPMAILFILE
	fi

	#****************************
	#Cleanup
	#****************************
	if [ $DEBUG -eq 0 ] ; then
		echo " Cleaning Up Interactive Yum"
	fi
	yum -e 0 -d 0 list yum > /dev/null 2>&1
	yum -e 0 -d 0 clean all
	rm -f $TEMPMAILFILE
	rm -f $TEMPCONFIGFILE
	rm -f $TEMPFILE
	if [ $DEBUG -eq 0 ] ; then
		echo "Yum Cron Exiting succesfully"
	fi
else
	if [ $DEBUG -eq 0 ] ; then
		echo "Yum cron not turned on.  Exiting"
	fi
	exit 1
fi
exit 0
