Script bash de mise à jour automatisée de WordPress locaux et distants

Maintenance WordPress multi-sites

J’administre de plus en plus de sites web via WordPress et je me trouve confronté à un problème de maintenance. En effet, j’ai besoin de mettre à jour l’ensemble de mes sites rapidement après la mise à disposition d’une nouvelle version stable de WordPress afin notamment d’en réduire les risques de piratage. Car c’est un problème très spécifique aux solutions logicielles open source : la correction des failles de sécurité au sein dun logiciel open source permet aux pirates de les identifier et d’en tirer parti sur les versions plus anciennes du logiciel.

WordPress Mu et sites multiples

Dans un premier temps, pour mieux gérer l’infrastructure logicielle de mes sites, je me suis orienté vers WordPress Mu, mais je ne suis pas pleinement satisfait des limitations qu’implique cette solution. Si WordPress Mu est sans nul doute un bon point de départ pour avoir de nombreux blogs installés en sous-domaines, si l’on veut réellement tirer pleinement profit du réseau de blogs, notamment en matière de référencement ou en performances, on finit très vite par développer ses propres plugins d’administration de la plateforme. Or, je ne le souhaite pas.

WordPress et liens symboliques

Aussi, depuis quelques semaines, j’essaye une nouvelle approche, à savoir des installations multiples de WordPress avec partage de fichiers via des liens symboliques du système d’exploitation. Malheureusement, cette solution théoriquement séduisante est limitée dans la pratique par de nombreux plugins WordPress qui utilisent la constante __FILE__ spécifique à chaque fichier pour connaître leur emplacement dans le système de fichiers à la place de la constante ABSPATH, définie par WordPress, ce qui conduit à dupliquer de nombreux fichiers, voire dossiers, augmentant la complexité de l’arborescence que le gain d’espace disque ou de performances ne justifie pas.

Script bash de mise-à-jour d’installations WordPress multiples

Code

Depuis peu, j’ai donc opté pour une solution complémentaire, insatisfaisante en l’état, mais allant dans une bonne direction, je pense : un script bash de mise-à-jour WordPress que voici :

#!/bin/bash

# ******************************************************
# *** WORDPRESS UPDATING BASH V0.1 *********************
# *** by [email protected] / http://petitnuage.fr ***
# ******************************************************

# ***
# *** Variables
# ***
WP_TEMPORARY_DIRECTORY=/tmp

WP_REMOTE_HOSTS=( "[email protected]:www,wordpress,755" )
WP_REMOTE_HOSTS=( "${WP_REMOTE_HOSTS[@]}" "/home/lesperle/sd/blog/www,wordpress,775" )
#WP_REMOTE_HOSTS=( "${WP_REMOTE_HOSTS[@]}" "" )

WP_PLUGINS=( "akismet" )
WP_PLUGINS=( "${WP_PLUGINS[@]}" "all-in-one-seo-pack" )
WP_PLUGINS=( "${WP_PLUGINS[@]}" "google-sitemap-generator.3.1.0.1" )
WP_PLUGINS=( "${WP_PLUGINS[@]}" "redirection" )
WP_PLUGINS=( "${WP_PLUGINS[@]}" "sociable.2.9.5" )
WP_PLUGINS=( "${WP_PLUGINS[@]}" "twitter-tools.1.5.1" )
WP_PLUGINS=( "${WP_PLUGINS[@]}" "ultimate-google-analytics" )
WP_PLUGINS=( "${WP_PLUGINS[@]}" "wordpress-23-related-posts-plugin.1.0" )
WP_PLUGINS=( "${WP_PLUGINS[@]}" "wp-super-cache.0.8.4" )
#WP_PLUGINS=( "${WP_PLUGINS[@]}" "" )

# ***********************************
# *** DO NOT EDIT BELOW THIS LINE ***
# ***********************************

# ***
# *** Additionnal variables
# ***
WP_WORKING_DIRECTORY=${WP_TEMPORARY_DIRECTORY}/wp-update-`date '+%Y%m%d'`
WP_WORKING_PLUGINS_DIRECTORY=${WP_WORKING_DIRECTORY}/wordpress/wp-content/plugins
WP_WORKING_THEMES_DIRECTORY=${WP_WORKING_DIRECTORY}/wordpress/wp-content/themes

# ***
# *** Create working directories
# ***
mkdir -p ${WP_WORKING_DIRECTORY}
mkdir -p ${WP_WORKING_PLUGINS_DIRECTORY}
mkdir -p ${WP_WORKING_THEMES_DIRECTORY}

# ***
# *** Download WordPress
# ***
echo Downloading WordPress...
curl -s -o ${WP_WORKING_DIRECTORY}/latest.zip http://fr.wordpress.org/latest-fr_FR.zip
unzip -o -d ${WP_WORKING_DIRECTORY} ${WP_WORKING_DIRECTORY}/latest.zip > /dev/null
rm  ${WP_WORKING_DIRECTORY}/latest.zip
rm  ${WP_WORKING_DIRECTORY}/wordpress/wp-content/plugins/hello.php

# ***
# *** Download WordPress Plugins
# ***
for WP_PLUGIN in ${WP_PLUGINS[@]}
do
echo Downloading plugin ${WP_PLUGIN}...
curl -s -o ${WP_WORKING_PLUGINS_DIRECTORY}/${WP_PLUGIN}.zip http://downloads.wordpress.org/plugin/${WP_PLUGIN}.zip
unzip -o -d ${WP_WORKING_PLUGINS_DIRECTORY} ${WP_WORKING_PLUGINS_DIRECTORY}/${WP_PLUGIN}.zip > /dev/null
rm ${WP_WORKING_PLUGINS_DIRECTORY}/${WP_PLUGIN}.zip
done

# ***
# *** Upload WordPress
# ***

for WP_REMOTE_HOST_DATA in ${WP_REMOTE_HOSTS[@]}
do
WP_REMOTE_HOST=`echo ${WP_REMOTE_HOST_DATA} | cut -f 1 -d,`
WP_REMOTE_DIRECTORY=`echo ${WP_REMOTE_HOST_DATA} | cut -f 2 -d,`
WP_REMOTE_MODE=`echo ${WP_REMOTE_HOST_DATA} | cut -f 3 -d,`

echo Uploading WordPress to ${WP_REMOTE_HOST}...
chmod ${WP_REMOTE_MODE} -R ${WP_WORKING_DIRECTORY}/wordpress/wp-content/

if [ "${WP_REMOTE_DIRECTORY}" != "wordpress" ]
then
mv ${WP_WORKING_DIRECTORY}/wordpress/ ${WP_WORKING_DIRECTORY}/${WP_REMOTE_DIRECTORY}/
fi

scp -Cpr ${WP_WORKING_DIRECTORY}/${WP_REMOTE_DIRECTORY}/ ${WP_REMOTE_HOST}

if [ "${WP_REMOTE_DIRECTORY}" != "wordpress" ]
then
mv ${WP_WORKING_DIRECTORY}/${WP_REMOTE_DIRECTORY}/ ${WP_WORKING_DIRECTORY}/wordpress/
fi
done

# ***
# *** Termination
# ***
rm -rf ${WP_WORKING_DIRECTORY}

Avantages

Ce script bash a quelques avantages :

  • il est relativement facile à comprendre par un non-spécialiste ;
  • il permet de mettre à jour des WordPress locaux et distants ;
  • il peut mettre à jour un site automatiquement (si vous installez des clés SSH à la place des mots de passes, vous n’aurez pas à taper votre mot de passe pour un accès distant automatisé) ;
  • il est compatible avec la plupart des UNIX (dont Linux et Mac OS X).

Inconvénients

Il a cependant de nombreux inconvénients :

  • il ne fait pas de sauvegarde (fichiers et base de données) avant d’appliquer la mise à jour (faites donc obligatoirement une sauvegarde avant de lancer ce script !) ;
  • il ne désactive pas les plugins avant la mise-à-jour comme conseillé officiellement par l’équipe de WordPress (d’où une nouvelle raison de faire une sauvegarde avant de lancer ce script !) ;
  • il ne charge que les plugins hébergés sur WordPress.org ;
  • il installe les mêmes plugins sur tous les sites ;
  • il ne récupère pas automatiquement les noms des fichiers à télécharger ;
  • il nécessite un accès en SSH aux sites distants pour la mise à jour distante ;
  • il ne fait pas la mise-à-jour de la base de données (vous devez vous connecter à WordPress pour lancer cette mise-à-jour) ;
  • il ne fait aucune vérification du bon fonctionnement avant et après installation du site ;
  • il n’est pas compatible avec Windows ;
  • sans doute de nombreux autres défauts.

Bref, il vaut mieux attendre une prochaine version de ce script qui ne devrait pas voir le jour avant décembre et bien après la sortir imminente de WordPress 2.7. D’ailleurs, j’essaierai d’améliorer et tester ce script à cette occasion pour fournir une version plus complète et plus stable que la version actuelle que l’on pourrait qualifier de prototype.

Enfin, vos suggestions, critiques et remarques sont évidemment appréciées !

3 réflexions sur « Script bash de mise à jour automatisée de WordPress locaux et distants »

  1. Ping : Script Multiblogs WordPress | un blog by LinKuFF

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.