#!/bin/bash #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 OWNER=root GROUP=www-data DEBUG=0 UPGRADE=0 EXTRACT=0 function usage() { echo "Usage : $0 [-v] [-d] [-u]" echo " -v Verbose mode" echo " -d Download new release" echo " -u Upgrade installation" echo " -h Display this help" } while getopts ":dvhu" opt; do case $opt in v) DEBUG=1 ;; d) DOWNLOAD=1 ;; u) DOWNLOAD=1 UPGRADE=1 DEBUG=1 EXTRACT=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" 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" 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" 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 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 if [ "$newest" != "$current" ] then 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 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 : " for file in index.php bin/ SQL/ program/ installer/ skins/ plugins/ do echo " - Mise a jour de $file" rsync -a $src/$file $to/$file chown $OWNER:$GROUP -R $to/$file done cd "$to" if [ -x "bin/update.sh" ] then echo "Lancement de l'utilitaire de verification de mise a jour" ./bin/update.sh 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" fi