check_rc_upgrade/check_rc_upgrade.sh
2014-12-31 10:59:43 +01:00

318 lines
7.8 KiB
Bash
Executable file

#!/bin/bash
### CONFIGURATION ###
#NAME="My Roundcube"
RC_HOME=/var/www/webmail/public_html
MAIL=root
SEND_EVERY_NB_DAY=7
CACHE=$RC_HOME/../.cache_check_upgrade
CACHE_FAILED=$CACHE.failed
MAX_CHECK=10
MAX_FAILED=3
SLEEP_ON_FAILED=10
CHECK_URL=http://www.roundcube.net/download
DOWNLOAD=0
DOWNLOAD_DIR=$RC_HOME/../upstream
### DO NOT MODIFY AFTER THIS LINE ###
DEBUG=0
NAGIOS=0
UPGRADE=0
EXTRACT=0
JUST_DISP=0
function usage() {
echo "Usage : $0 [-v] [-n] [-d] [-u]"
echo " -v Verbose mode"
echo " -n Nagios mode"
echo " -d Download new release"
echo " -u Upgrade installation"
echo " -j Just display current stable version"
echo " -h Display this help"
}
while getopts ":dvnhuj" opt; do
case $opt in
v)
DEBUG=1
;;
n)
NAGIOS=1
;;
d)
DOWNLOAD=1
;;
u)
DOWNLOAD=1
UPGRADE=1
DEBUG=1
EXTRACT=1
;;
j)
JUST_DISP=1
;;
h)
usage
exit 0
;;
\?)
echo "Invalid option: -$OPTARG" >&2
echo
usage
exit 1
;;
:)
echo "Option -$OPTARG requires an argument." >&2
echo
usage
exit 1
;;
esac
done
[ -f "$0.local" ] && source "$0.local" && [ $DEBUG -eq 1 ] && echo "Import local config file : $0.local"
for i in `seq 1 $MAX_CHECK`
do
tmpfile=`mktemp`
wget -q $CHECK_URL -O $tmpfile
newest=`cat $tmpfile|grep dlversion|grep Complete|head -n 1|sed 's/^.*: \([0-9\.]*\).*$/\1/'`
if [ -n "$newest" ]
then
[ $DEBUG -eq 1 ] && echo "Newest : $newest"
[ $NAGIOS -ne 1 ] && rm -f $CACHE_FAILED > /dev/null 2>&1
DOWNLOAD_URL=`cat $tmpfile|grep "$newest"|grep "tar.gz"|head -1|sed 's/.* href="[ \t]*\([^"]*\)[ \t]*" .*$/\1/'`
[ $DEBUG -eq 1 ] && echo "Download URL : $DOWNLOAD_URL"
[ ! -n "$DOWNLOAD_URL" ] && DOWNLOAD_URL="$CHECK_URL" && [ $DEBUG -eq 1 ] && echo "Use check URL as download URL : $DOWNLOAD_URL"
rm -f $tmpfile > /dev/null 2>&1
break;
elif [ $i -eq $MAX_CHECK ]
then
[ $NAGIOS -eq 1 ] && echo "WARNING : Fail to retrieve current stable version" && exit 1
error="Site du projet injoignable (ou structure du site modifie !!) => Impossible de recuperer le numero de la version stable actuel."
[ $DEBUG -eq 1 ] && echo $error
if [ -f $CACHE_FAILED ]
then
NB=`cat $CACHE_FAILED`
[ $DEBUG -eq 1 ] && echo "Fichier de cache d'erreur existe : $NB echec. Max : $MAX_FAILED"
if [ $NB -lt $MAX_FAILED ]
then
let NNB=NB+1
[ $DEBUG -eq 1 ] && echo "Augmentation du nb d'erreur dans le fichier de cache d'erreur : $NB -> $NNB"
echo -n $NNB > $CACHE_FAILED
else
[ $DEBUG -eq 1 ] && echo "MAX_FAILED atteint : on envoi un mail"
echo $error|mail -s "New RoundCude release check : FAILED" $MAIL
fi
else
[ $DEBUG -eq 1 ] && echo "Fichier de cache d'erreur n'existe pas : on l'initialise à 1."
echo -n 1 > $CACHE_FAILED
fi
[ $DEBUG -eq 1 ] && echo "exit 1"
exit 1
fi
[ $DEBUG -eq 1 ] && echo "Check failed ($i/$MAX_CHECK) : Sleep $SLEEP_ON_FAILED second before try again ..."
sleep $SLEEP_ON_FAILED
done
[ $JUST_DISP -eq 1 ] && echo -e "Current stable version : $newest\nDownload URL : $DOWNLOAD_URL" && exit 0
current=`egrep "define.*RCMAIL_VERSION" $RC_HOME/program/include/iniset.php|sed "s/define('.*', '\([^']*\)'.*$/\1/"`
current="`echo $current|sed 's/-rc$//'`"
current="`echo $current|sed 's/-beta$//'`"
[ $DEBUG -eq 1 ] && echo "Current : $current"
if [ -z "$current" ]
then
[ $NAGIOS -eq 1 ] && echo "UNKNOWN : Fail to retrieve current installed version" && exit 3
echo "ERROR : Fail to retrieve current version !"
exit 3
fi
if [ "$newest" != "$current" ]
then
if [ $NAGIOS -eq 1 ]
then
echo "CRITICAL : A newest version of Roundcube Webmail is available (newest : $newest / current : $current)"
exit 2
fi
if [ $DOWNLOAD -eq 1 ]
then
if [ -d "$DOWNLOAD_DIR" ]
then
cd "$DOWNLOAD_DIR"
DOWNLOAD_FILE="$( pwd )/roundcubemail-$newest.tar.gz"
[ $DEBUG -eq 1 ] && echo "Download new release in $DOWNLOAD_FILE"
wget -q -O "$DOWNLOAD_FILE" "$DOWNLOAD_URL"
if [ $EXTRACT -eq 1 ]
then
[ $DEBUG -eq 1 ] && echo "Extract new release"
tar xzf $DOWNLOAD_FILE
DOWNLOAD_FILE_DIR=$( tar tzf $DOWNLOAD_FILE 2> /dev/null|head -n1|cut -d'/' -f1 )
fi
else
echo "[WARNING] Le dossier de telechargement n'existe pas ($DOWNLOAD_DIR)."
[ $UPGRADE -eq 1 ] && exit 1
fi
fi
if [ $UPGRADE -eq 1 ]
then
cd "$DOWNLOAD_DIR"
default_src="$( pwd )/$DOWNLOAD_FILE_DIR"
src=""
while [ ! -n "$src" ]
do
echo -n "Source de la nouvelle version [$default_src] : "
read a
if [ -n "$a" ]
then
src="$a"
else
src="$default_src"
fi
if [ ! -d "$src" ]
then
echo -n "[WARNING] Le dossier $src n'existe pas."
src=""
[ ! -n "$a" ] && default_src=""
fi
if [ ! -x "$src/bin/installto.sh" ]
then
echo -n "[WARNING] Le script bin/installto.sh n'est pas présent dans ce répertoire source."
src=""
[ ! -n "$a" ] && default_src=""
fi
done
echo "Source : $src"
cd "$RC_HOME/../"
from=""
while [ ! -n "$from" ]
do
echo -n "Installation source [$RC_HOME] : "
read a
if [ -n "$a" ]
then
if [ -d "$a" ]
then
from="$a"
else
from=""
echo "[ERROR] $a n'est pas un dossier valide"
fi
else
from="$RC_HOME"
fi
done
echo "From : $from"
default_to="$( pwd )/roundcubemail-$newest"
to=""
while [ ! -n "$to" ]
do
echo -n "Destination de la nouvelle installation [$default_to] : "
read a
if [ -n "$a" ]
then
to="$a"
else
to="$default_to"
fi
if [ -d "$to" ]
then
echo -n "[WARNING] Le dossier $to existe deja. Celui-ci va etre deplace dans $to.old. Confirmez-vous votre choix [Y/n] ? "
read b
if [ "$b" == "n" -o "$b" == "N" ]
then
to=""
[ ! -n "$a" ] && default_to=""
else
echo "Deplace $to dans $to.old"
mv "$to" "$to.old"
fi
fi
done
echo "To : $to"
echo "Copie de $from dans $to"
rsync -a --copy-dirlinks "$from/" "$to/"
echo "Mise a jour de l'installation $to a partir de $src : "
cd "$src"
./bin/installto.sh "$to"
type after_upgrade > /dev/null 2>&1
if [ $? -eq 0 ]
then
echo "Execution de la fonction custom after_upgrade() :"
after_upgrade "$to"
echo "Fin de la fonction after_upgrade()"
fi
if [ -L "$RC_HOME" ]
then
echo -n "Voulez-vous faire pointer le lien symbolique $RC_HOME vers cette nouvelle installation [Y/n] ? "
read a
if [ "$a" != "n" -a "$a" != "N" ]
then
echo " - Suppression de l'actuel lien $RC_HOME"
rm -f $RC_HOME
echo " - Creation du nouveau lien $RC_HOME vers $to"
ln -s "$to" "$RC_HOME"
fi
fi
else
tmp=`mktemp`
echo "New RoundCude release" > $tmp
echo "=====================" >> $tmp
echo "Current : $current" >> $tmp
echo "Newest : $newest" >> $tmp
echo >> $tmp
echo "Download URL : $DOWNLOAD_URL" >> $tmp
[ -n "$DOWNLOAD_FILE" -a -f "$DOWNLOAD_FILE" ] && echo "Download file : $( pwd )/roundcubemail-$newest.tar.gz" >> $tmp
M=0
if [ -f $CACHE ]
then
if [ "`diff $tmp $CACHE`" != "" -o `find $CACHE -mtime +$SEND_EVERY_NB_DAY | wc -l` -eq 1 ]
then
[ $DEBUG -eq 1 ] && echo "Cache trop vieux ou modif => On envoi"
M=1
else
[ $DEBUG -eq 1 ] && echo "Pas de modif et cache trop recent : pas d'envoi"
fi
else
[ $DEBUG -eq 1 ] && echo "Pas encore de cache => On envoi"
M=1
fi
if [ $DEBUG -eq 1 -a $M -eq 1 ]
then
echo "Mode debug : Pas d'envoi de mail"
fi
if [ $M -eq 1 -a $DEBUG -ne 1 ]
then
cat $tmp > $CACHE
if [ -n "$NAME" ]
then
S="[$NAME] New RoundCude release"
else
S="New RoundCude release"
fi
cat $tmp | mail -s "$S : $newest" $MAIL
[ $DEBUG -eq 1 ] && echo "Mail envoyé"
fi
rm -f $tmp
fi
else
[ $DEBUG -eq 1 ] && echo "Pas de changement de version"
[ $NAGIOS -eq 1 ] && echo "OK : Lastest version installed" && exit 0
fi