#!/bin/bash
# Script to run daily update of Scientific Linux Linux system using apt-get
# version: 0.4
#
# 14.07.2004 Jaroslaw.Polok@cern.ch
#
# ---------- DO NOT MODIFY THIS FILE --------------------------------
# ---------- change settings in /etc/sysconfig/apt-autoupdate -------
# ---------- enable/disable with /sbin/service apt-autoupdate .. ----
# -------------------------------------------------------------------
PATH=/bin:/usr/bin
APTVERSION=0.4

init() {

if [ -r /etc/sysconfig/apt-autoupdate ]; then
 . /etc/sysconfig/apt-autoupdate
fi

[ -z "$APTAPPLET" ]        && APTAPPLET=4
[ -z "$APTHOUR" ]          && APTHOUR=4
[ -z "$APTMAILTO" ]        && APTMAILTO="root"
[ -z "$APTMAIL" ]          && APTMAIL=1
[ -z "$APTUPDATE" ]        && APTUPDATE=1
[ -z "$APTRANDOMWAIT" ]    && APTRANDOMWAIT=30
[ -z "$APTCLEAN" ]         && APTCLEAN=1
[ -z "$APTCHECKKERNEL" ]   && APTCHECKKERNEL=1
[ -z "$APTUPGRADEKERNEL" ] && APTUPGRADEKERNEL=0
[ -z "$APTINTERACTIVE" ]   && APTINTERACTIVE=1
[ -z "$APTLOGFILE" ]       && APTLOGFILE="/var/log/apt-autoupdate.log"
[ -z "$APTSAYYES" ]        && APTSAYYES=0
[ -z "$APTONBOOT" ]        && APTONBOOT=1
[ -z "$APTBOOTRUN" ]       && APTBOOTRUN=0

DATE="$(/bin/date)"
HOUR="$(/bin/date +%H)"
TEMPFILE=`/bin/mktemp /tmp/$$.XXXXXXXX`
TEMPMAIL=`/bin/mktemp /tmp/$$.XXXXXXXX`
TEMPCODE=`/bin/mktemp /tmp/$$.XXXXXXXX`
APTLOCKFILE="/var/lock/subsys/apt-autoupdate"
APTCONFFILE="/etc/sysconfig/apt-autoupdate"
APT="/usr/bin/apt-get"
APTARGS="-Vuyq"

[ $APTINTERACTIVE -eq 1 ] && APTARGS="-Vu"
[ $APTBOOTRUN -eq 1 ] &&  APTARGS="-Vuyq"
APTRANDOMWAIT=$(( $APTRANDOMWAIT %60 )) 
[ $(( ($APTHOUR +1) %24 )) -eq 0 ] && HOUR2=25 || HOUR2=$(( ($APTHOUR +1) %24 ))
[ $HOUR -ge $(( $APTHOUR %24 )) ] && [ $HOUR -lt $HOUR2 ] && GOAHEAD=1 || GOAHEAD=0
[ $APTBOOTRUN -eq 1 ] && [ $APTONBOOT -eq 1 ] && GOAHEAD=1
  
}

log() {
[ $APTINTERACTIVE -eq 1 ] && echo $1 
[ $APTBOOTRUN -eq 1 ] && echo "   $1"
[ $APTINTERACTIVE -eq 0 ] && echo $1 >> $APTLOGFILE
}
    
out() {
 /bin/rm -f $TEMPFILE
 /bin/rm -f $TEMPCODE
 /bin/rm -f $TEMPMAIL
 exit $1 
}

count_changes() {
 CHANGES=`/bin/cat $1 | /bin/grep -c -P "^Inst|will be upgraded|will be installed"`
}

randomsleep() {
[ $APTRANDOMWAIT -eq 0 ] && return
 SLEEPTIME=$(( ( $RANDOM % $APTRANDOMWAIT ) * 60 ))
 log "sleeping for $SLEEPTIME seconds"
 /bin/sleep $SLEEPTIME
}

msg() {
cat $1 | /bin/grep -v -P \
"^Reading Package Lists|^Building Dependency Tree|^Conf|^Inst|^Get|\
^Fetched|^Need to|^Preparing|^After unpacking|^Committing changes|\
#######|^The following|.*upgraded.*installed|Done." \
    >> $2
}


msg_toupdate () {
echo "Following packages are available for upgrade on your system:" > $2
msg $1 $2
echo "" >> $2
echo "********************************************************" >> $2
echo "* To upgrade manually your system, run as root:" >> $2
echo "*" >> $2
echo "*   $APT update" >> $2
echo "*   $APT upgrade" >> $2
echo "********************************************************" >> $2
}

msg_updated () {
echo "The following packages have been upgraded on your system:" > $2
msg $1 $2
echo "" >> $2
}

msg_kernel () {
echo "" >> $2
echo "A new kernel is available for manual upgrade on your system:" >> $2
msg $1 $2
echo "" >> $2
echo "********************************************************" >> $2
echo "* To upgrade your system including kernel, run as root: " >> $2
echo "*" >> $2
echo "*   $APT update" >> $2
echo "*   $APT upgrade-kernel" >> $2echo " " >> $2
echo "********************************************************" >> $2
}

msg_signature () {
echo "" >> $1
echo "--" >> $1
echo "message sent by `basename $0` system from $HOSTNAME" >> $1
echo "see: /etc/sysconfig/apt-autoupdate for options." >> $1 
}

mail() {

if [ $APTINTERACTIVE -eq 0 ]; then
/bin/mail -s "[UPDATE] - $1 on $HOSTNAME: $DATE" $2 < $3
#echo "MAILSTART *************************************"
#echo "[UPDATE] - $1 on $HOSTNAME: $DATE (to: $2)"
#/bin/cat $3
#echo "MAILEND *************************************"
fi
}


runcomm() {
log "running: $1"
echo "" > $TEMPFILE
if [ $APTINTERACTIVE -eq 1 ] || 
   [ $APTBOOTRUN -eq 1 ]; then 
 { $1; echo $? > $TEMPCODE; } | /usr/bin/tee -a $TEMPFILE 2>&1
else
 { $1; echo $? > $TEMPCODE; } >> $TEMPFILE 2>&1
fi

/bin/cat $TEMPFILE >> $APTLOGFILE

RES=`/bin/cat $TEMPCODE` 

if [ "$RES" == 100 ]; then
 echo "" >> $TEMPFILE
 echo "There was a problem running $1" >> $TEMPFILE
 echo "Please check $APTLOGFILE" >> $TEMPFILE
 msg_signature $TEMPFILE
[ $APTMAIL -eq 1 ] && mail "FAILURE" $APTMAILTO $TEMPFILE 
out 1
fi
}

usage() {
echo 
echo "`basename $0`: automatic system updater using apt-get"
echo "version: $APTVERSION, linux.support@cern.ch"
echo 
echo "Usage:"         
echo "      `basename $0` -h|-y"
echo 
echo "Options:"
echo "      -h - this help"
echo "      -y - answer yes to all prompts"
echo 
echo "for options and defaults, check: "
echo "    $APTCONFFILE"
}



init

if [ $APTINTERACTIVE -eq 1 ]; then
 [ x"$1" == x"-h" ] && usage && out 0
 [ -n "$1" ] && [ x"$1" != x"-y" ] && echo "error: unknown option, try `basename $0` -h" && out 1
 [ -n "$1" ] && [ x"$1" == x"-y" ] && APTARGS="$APTARGS -y" 
fi
 
[ $APTINTERACTIVE -eq 0 ] && [ ! -f $APTLOCKFILE ] && out 0
[ $APTINTERACTIVE -eq 0 ] && [ $GOAHEAD -eq 0 ]  && out 0

log "-----------------------------------------------------------"
log "`basename $0` started at $DATE"
[ $APTINTERACTIVE -eq 0 ] && [ $APTBOOTRUN -eq 0 ] && randomsleep

runcomm "$APT $APTARGS -q update"


if [ $APTUPDATE -eq 0 ]; then 
 runcomm "$APT $APTARGS -s upgrade"
 if [ -s $TEMPFILE ]; then
  count_changes $TEMPFILE
  [ $CHANGES -ne 0 ] && msg_toupdate $TEMPFILE $TEMPMAIL 
 fi
else 
 runcomm "$APT $APTARGS upgrade"
 if [ -s $TEMPFILE ]; then 
  count_changes $TEMPFILE
  [ $CHANGES -ne 0 ] && msg_updated $TEMPFILE $TEMPMAIL 
 fi 
fi 
 
if [ $APTCHECKKERNEL -eq 1 ] && [ $APTBOOTRUN -ne 1 ]; then
 runcomm "$APT $APTARGS -s upgrade-kernel"
 if [ -s $TEMPFILE ]; then
  count_changes $TEMPFILE
  [ $CHANGES -ne 0 ] && msg_kernel $TEMPFILE $TEMPMAIL 
 fi
fi
  
[ -s $TEMPMAIL ] && msg_signature $TEMPMAIL

[ $APTCLEAN -eq 1 ] && runcomm "$APT $APTARGS clean"


[ -s $TEMPMAIL ] && [ $APTMAIL -eq 1 ] && mail "SUCCESS" $APTMAILTO $TEMPMAIL

out 0  

