#!/bin/sh

# cal_up.sh - a script for automating the process of keeping an
#		OpenLinux box updated

# Release - 4.2.0

PRODUCT_STRING=`/usr/bin/awk '
BEGIN {
	ReleaseType = "OpenLinux"
	}
{
if ( ($3 == "eServer") || ($3 == "eDesktop") )
	{
	ReleaseType = $3
	}
if ( $1 == "Version" )
	{
	VersionNumber = $2
	}
}
END {
	printf ("%s %s\n", ReleaseType, VersionNumber)
	}' /etc/.issue`

LOGFILE=`/bin/mktemp /tmp/cal_up.XXXXXX`
XFER_LOG=`/bin/mktemp /tmp/cal_up.xfer.XXXXXX`

# Do NOT mess with these or the script will fail mysteriously
ARGV="$*"
RECURSE=1

# --- USER-defined variables ---
#
# Set these variables here for defaults. Note that they can be over-ridden
# by command-line options.
CALDERA_PRODUCT=`echo $PRODUCT_STRING|/usr/bin/awk '{print $1}'`
CALDERA_VERSION=`echo $PRODUCT_STRING|/usr/bin/awk '{print $2}'`

MAILTO=matt				# who gets an email of our activity
LOCAL_UPDATE_DIR=/sto/updates	# where to keep the updates locally

HOST=ftp.caldera.com			# where to get the updates

INSTALL=yes				# try to auto-install the update
REBOOT=no				# reboot after installing

INSTALL_SOURCE=no			# install from .src RPMS

QUIET=yes				# be verbose on the update downloads
# --- END of USER-defined variables ---

while getopts ":p:v:m:l:h:i:r:s:u:q:X" opt
do
	case $opt in
		p)
			CALDERA_PRODUCT=$OPTARG
			;;
		v)
			CALDERA_VERSION=$OPTARG
			;;
		m)
			MAILTO=$OPTARG
			;;
		l)
			LOCAL_UPDATE_DIR=$OPTARG
			;;
		h)
			HOST=$OPTARG
			;;
		i)
			INSTALL=$OPTARG
			;;
		r)
			REBOOT=$OPTARG
			;;
		s)
			INSTALL_SOURCE=$OPTARG
			;;
		u)
			NEXT_UPDATE=$OPTARG
			;;
		q)
			QUIET=$OPTARG
			;;
		X)
			EXCLUDE_SRPM=yes
			;;
		\?)
			echo "$0: invalid argument"
			exit 1
			;;
	esac
done
shift $(($OPTIND - 1))

if [ "$QUIET" = "yes" ] ; then
	NV="-nv"
else
	NV=""
fi

# Some smoke and mirrors to deal with Caldera's new extended version numbers
CALDERA_VERSION="`echo $CALDERA_VERSION | /usr/bin/cut -c1-3`"

Log()
{
	echo "`date` - $*" >> $LOGFILE
}

Mail()
{
	echo >> $LOGFILE
	/bin/cat $LOGFILE | /bin/mail -s "Caldera Update script" $MAILTO
}

Determine_next()
{
	cd $LOCAL_UPDATE_DIR
	/bin/mkdir -p $LOCAL_UPDATE_DIR/$CALDERA_PRODUCT/$CALDERA_VERSION/000 >/dev/null 2>&1
	cd $LOCAL_UPDATE_DIR/$CALDERA_PRODUCT/$CALDERA_VERSION
	LAST_UPDATE=`/usr/bin/find . -type d -maxdepth 1 -print | /usr/bin/sort | /usr/bin/tail -1 | /usr/bin/cut -c3- | /usr/bin/tr -d '/'`
	Log "Last installed update was #$LAST_UPDATE"
	if [ -z "$NEXT_UPDATE" ] ; then
		NEXT_UPDATE=`/usr/bin/expr $LAST_UPDATE + 1`
	else
		Log "User requested update #$NEXT_UPDATE"
		unset RECURSE
	fi
	count=`echo $NEXT_UPDATE | /usr/bin/wc -c`
	if [ "`/usr/bin/expr $count - 1`" -eq 1 ] ; then
		NEXT_UPDATE=00$NEXT_UPDATE
	elif [ "`/usr/bin/expr $count - 1`" -eq 2 ] ; then
		NEXT_UPDATE=0$NEXT_UPDATE
	fi
	Log "Trying to find update #$NEXT_UPDATE"
	Mirror
}

Mirror()
{
	/bin/mkdir -p $LOCAL_UPDATE_DIR/$CALDERA_PRODUCT/$CALDERA_VERSION/$NEXT_UPDATE
	cd $LOCAL_UPDATE_DIR/$CALDERA_PRODUCT/$CALDERA_VERSION/$NEXT_UPDATE
	Log "Attempting to retrieve update #$NEXT_UPDATE"
	if [ -z "$EXCLUDE_SRPM" ] ; then
		/usr/bin/wget -r -np $NV ftp://$HOST/pub/updates/$CALDERA_PRODUCT/$CALDERA_VERSION/$NEXT_UPDATE/ >> $XFER_LOG 2>&1
	else
		/usr/bin/wget -r -np $NV -X *SRPM* ftp://$HOST/pub/updates/$CALDERA_PRODUCT/$CALDERA_VERSION/$NEXT_UPDATE/ >> $XFER_LOG 2>&1
	fi
	echo >> $LOGFILE
	/bin/cat $XFER_LOG >> $LOGFILE
	echo >> $LOGFILE
	Check_download
}

Check_download()
{
	Log "Checking for retrieval success/failure"
	/usr/bin/grep 'login incorrect' $XFER_LOG >/dev/null 2>&1
	if [ "$?" -eq 0 ] ; then
		Log "Couldn't log into $HOST"
		Mail
		exit 1
	else
		/usr/bin/grep 'No such' $XFER_LOG >/dev/null 2>&1
		if [ "$?" -eq 0 ] ; then
			Log "Update #$NEXT_UPDATE was not found"
			/bin/rm -f $LOGFILE $XFER_LOG 
			cd $LOCAL_UPDATE_DIR
			/bin/rm -r $LOCAL_UPDATE_DIR/$CALDERA_PRODUCT/$CALDERA_VERSION/$NEXT_UPDATE/ 2>/dev/null
			exit 0
		else
			/bin/mv $LOCAL_UPDATE_DIR/$CALDERA_PRODUCT/$CALDERA_VERSION/$NEXT_UPDATE/$HOST/pub/updates/$CALDERA_PRODUCT/$CALDERA_VERSION/$NEXT_UPDATE/* $LOCAL_UPDATE_DIR/$CALDERA_PRODUCT/$CALDERA_VERSION/$NEXT_UPDATE && cd $LOCAL_UPDATE_DIR && rm -r $LOCAL_UPDATE_DIR/$CALDERA_PRODUCT/$CALDERA_VERSION/$NEXT_UPDATE/$HOST
			if [ ! -s $LOCAL_UPDATE_DIR/$CALDERA_PRODUCT/$CALDERA_VERSION/$NEXT_UPDATE/README ] ; then
				Log "Update #$NEXT_UPDATE is not yet ready but will be soon"
				/bin/rm -r $LOCAL_UPDATE_DIR/$CALDERA_PRODUCT/$CALDERA_VERSION/$NEXT_UPDATE >/dev/null 2>&1
				/bin/rm -f $LOGFILE $XFER_LOG
				exit 0
			else
				Log "Update #$NEXT_UPDATE downloaded"
				Integrity_Check
			fi
		fi
	fi
}

Integrity_Check()
{
	if [ -s $LOCAL_UPDATE_DIR/$CALDERA_PRODUCT/$CALDERA_VERSION/$NEXT_UPDATE/01-MD5-sum ] ; then
		/bin/cat $LOCAL_UPDATE_DIR/$CALDERA_PRODUCT/$CALDERA_VERSION/$NEXT_UPDATE/01-MD5-sums | while read line
		do
			SUM=`echo $line | /usr/bin/awk '{print $1}'`
			FILE=`echo $line | /usr/bin/awk '{print $2}'`
			Log "Verifying MD5SUM on `basename $FILE`"
			if [ "$SUM" = "`/usr/bin/md5sum $FILE | /usr/bin/awk '{print $1}'`" ] ; then
				:
			else
				Log "Checksum mismatch!"
				Log "Deleting current download to try again later"
				/bin/rm -r $LOCAL_UPDATE_DIR/$CALDERA_PRODUCT/$CALDERA_VERSION/$NEXT_UPDATE >/dev/null 2>&1
				Mail
				/bin/rm -f $LOGFILE $XFER_LOG >/dev/null 2>&1
				exit 1
			fi
		done
	fi
	Install
}

Install()
{
	if [ "$INSTALL" = "yes" ] ; then
		if [ "$INSTALL_SOURCE" = "yes" ] ; then
			/bin/cat $LOCAL_UPDATE_DIR/$CALDERA_PRODUCT/$CALDERA_VERSION/$NEXT_UPDATE/01-MD5-sums | /usr/bin/grep SRPM | while read line
			do
				src=`echo $line|/usr/bin/awk '{print $2}'`
				package=`echo $src | /usr/bin/cut -c7-`
				package=`basename $package .rpm`
				package=`basename $package .src`
				Log "Building from source RPM"
				/bin/rpm --rebuild $src >> $LOGFILE 2>&1
				rpm=`/usr/bin/grep '^Wrote' $LOGFILE | /usr/bin/grep "$package"`
				command=`/usr/bin/grep 'rpm -' $LOCAL_UPDATE_DIR/$CALDERA_PRODUCT/$CALDERA_VERSION/$NEXT_UPDATE/README | /usr/bin/grep $package | /usr/bin/awk '{print $1 " " $2}' | /bin/sed 's/F/U/g'`
				echo >> $LOGFILE
				Log "Installing $package..."
				Log "...using $command $rpm"
				$command $rpm >> $LOGFILE 2>&1
			done
		else
			/bin/cat $LOCAL_UPDATE_DIR/$CALDERA_PRODUCT/$CALDERA_VERSION/$NEXT_UPDATE/01-MD5-sums | /usr/bin/grep RPM | /usr/bin/grep -v SRPM | while read line
			do
				rpm=`echo $line|/usr/bin/awk '{print $2}'`
                                package=`echo $rpm | /usr/bin/cut -c6-`
				command=`/usr/bin/grep 'rpm -' $LOCAL_UPDATE_DIR/$CALDERA_PRODUCT/$CALDERA_VERSION/$NEXT_UPDATE/README | /usr/bin/grep $package | /usr/bin/awk '{print $1 " " $2}' | /bin/sed 's/F/U/g'`
                                Log "Installing $package..."
				Log "...using $command $package"
                                $command $LOCAL_UPDATE_DIR/$CALDERA_PRODUCT/$CALDERA_VERSION/$NEXT_UPDATE/RPMS/$package >> $LOGFILE 2>&1
			done
		fi
		if [ "$REBOOT" = "yes" ] ; then
			Log "Scheduling system reboot"
			Mail
			/bin/rm -f $LOGFILE $XFER_LOG >/dev/null 2>&1
			/usr/bin/at now +5 minutes << !EOF! >/dev/null 2>&1
/sbin/shutdown -r now
!EOF!
		else
			Mail
			/bin/rm -f $LOGFILE $XFER_LOG >/dev/null 2>&1
		fi
	else
		Log "Update README follows"
		/bin/cat $LOCAL_UPDATE_DIR/$CALDERA_PRODUCT/$CALDERA_VERSION/$NEXT_UPDATE/README >> $LOGFILE
		Mail
		/bin/rm -f $LOGFILE $XFER_LOG >/dev/null 2>&1
	fi
}

# Now, we start the process
Determine_next

# if we make it to here, we successfully did an upgrade
# so now we decide if we should check for another one
if [ -z "$RECURSE" ] ; then
	# The user asked for a specific update, so we stop
	exit 0
else
	# let's look for another update
	cd $LOCAL_UPDATE_DIR
	sleep 5
	exec $0 $ARGV
fi

# this next exit is theoretically unreachable, but what the hell ;)
exit 0
