You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
367 lines
8.9 KiB
367 lines
8.9 KiB
#!/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=https://roundcube.net/download/ |
|
DOWNLOAD=0 |
|
DOWNLOAD_DIR=$RC_HOME/../upstream |
|
DONT_CHECK_SSL_CERT=0 |
|
WGET_OPTS="" |
|
CURL_OPTS="" |
|
|
|
### DO NOT MODIFY AFTER THIS LINE ### |
|
|
|
DEBUG=0 |
|
NAGIOS=0 |
|
UPGRADE=0 |
|
CURL=0 |
|
EXTRACT=0 |
|
JUST_DISP=0 |
|
JUST_AFTER_UPGRADE=0 |
|
|
|
function usage() { |
|
echo "Usage : $0 [-v] [-n] [-d] [-u] [-c]" |
|
echo " -v Verbose mode" |
|
echo " -n Nagios mode" |
|
echo " -S Don't check SSL certificate (Wget only)" |
|
echo " -d Download new release" |
|
echo " -u Upgrade installation" |
|
echo " -c Use curl instead of wget" |
|
echo " -a Just run after_upgrade function" |
|
echo " -j Just display current stable version" |
|
echo " -h Display this help" |
|
} |
|
|
|
while getopts ":dvnShucaj" opt; do |
|
case $opt in |
|
v) |
|
DEBUG=1 |
|
;; |
|
n) |
|
NAGIOS=1 |
|
;; |
|
S) |
|
DONT_CHECK_SSL_CERT=1 |
|
;; |
|
d) |
|
DOWNLOAD=1 |
|
;; |
|
u) |
|
DOWNLOAD=1 |
|
UPGRADE=1 |
|
DEBUG=1 |
|
EXTRACT=1 |
|
;; |
|
c) |
|
CURL=1 |
|
;; |
|
a) |
|
JUST_AFTER_UPGRADE=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" |
|
|
|
function run_after_upgrade() { |
|
RC_NEW_HOME="$1" |
|
type after_upgrade > /dev/null 2>&1 |
|
if [ $? -eq 0 ] |
|
then |
|
echo "Execution de la fonction custom after_upgrade() :" |
|
after_upgrade "$RC_NEW_HOME" |
|
res=$? |
|
echo "Fin de la fonction after_upgrade() (Retour : $res)" |
|
return $res |
|
else |
|
echo "La fonction 'after_upgrade' n'est pas définie. On passe." |
|
return 0 |
|
fi |
|
} |
|
|
|
if [ $JUST_AFTER_UPGRADE -eq 1 ] |
|
then |
|
run_after_upgrade "$RC_HOME" |
|
exit $? |
|
fi |
|
|
|
WGET_SSL_OPT="" |
|
if [ "$DONT_CHECK_SSL_CERT" == "1" ] |
|
then |
|
[ $DEBUG -eq 1 ] && echo "Disable SSL certificate check" |
|
WGET_SSL_OPT="--no-check-certificate" |
|
fi |
|
|
|
for i in `seq 1 $MAX_CHECK` |
|
do |
|
tmpfile=`mktemp` |
|
if [ $CURL -eq 1 ] |
|
then |
|
curl $CURL_OPTS --location --silent --output $tmpfile $CHECK_URL |
|
else |
|
wget $WGET_OPTS $WGET_SSL_OPT -q $CHECK_URL -O $tmpfile |
|
fi |
|
newest=`cat $tmpfile|grep 'github.com'|grep 'complete.tar.gz'|head -n 1|sed 's|^.*github.com/roundcube/roundcubemail/releases/download/\([^/]*\)/roundcubemail-.*$|\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 "\-complete.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 "UNKNOWN : 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 "WARNING : 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" |
|
if [ $CURL -eq 1 ] |
|
then |
|
curl $CURL_OPTS --location --silent --output $DOWNLOAD_FILE $DOWNLOAD_URL |
|
else |
|
wget $WGET_OPTS $WGET_SSL_OPT -q -O "$DOWNLOAD_FILE" "$DOWNLOAD_URL" |
|
fi |
|
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" |
|
|
|
run_after_upgrade "$to" |
|
|
|
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 ($current)" && exit 0 |
|
fi
|
|
|