Surveiller les mises à jour de WordPress

January 2, 2013 by nono
Catégories geekeries - Mots-clés Nagios wordpress

J'administre des serveurs qui hébergent un certain nombre de sites web sous WordPress. Comme tout WordPress qui se respecte, ceux-ci ne sont généralement pas à jour, sinon on risquerait d'avoir un minimum de sécurité, ce qui, convenez-en, ne serait pas très drôle.

J'ai donc bricolé une sonde Nagios rudimentaire pour me tenir au courant. Elle est en deux parties : un bout de script sur le serveur web, et la sonde elle-même sur le serveur de supervision.

Côté WordPress, donc, un petit script PHP qui se contente de retourner la version de WordPress installée avec un minimum de contrôle d'accès :

<?php
// Generated by /usr/local/sbin/new-wordpress
// FIXME: Should probably not be hardcoded.
if (preg_match('/^(129\.102\.6\.|2001:660:3004:6:)/', $_SERVER['REMOTE_ADDR'])) {
        require_once('./wp-includes/version.php');
        print($wp_version);
        exit;
} else {
        print('Circulez, rien a voir.');
        exit;
}
?>

Bien entendu, vous remplacerez là-dedans mes adresses IP par les vôtres, sinon ça ne vous servira pas à grand chose.

L'intelligence (très modérée) se trouve côté Nagios :

#!/bin/bash
#
# Arnaud Gomes 2011

curl="/usr/bin/curl"
# Wordpress API URL for determining latest version.
apiurl="http://api.wordpress.org/core/version-check/1.1/"

ok () {
        echo "WORDPRESS OK - $*"
        exit 0
}

warning () {
        echo "WORDPRESS WARNING - $*"
        exit 1
}

critical () {
        echo "WORDPRESS CRITICAL - $*"
        exit 2
}

unknown () {
        echo "WORDPRESS UNKNOWN - $*"
        exit 3
}

[ -x "$curl" ] || unknown "No CURL at $curl."
[ $# -eq 1 ] || unknown "Usage: $0 URL"
url="$1"

latest=$($curl -s "$apiurl" | tail -n1)
echo "$latest" | egrep -q '^[0-9.]+$' || unknown "Could not determine latest version."
installed=$($curl -s "$url/ircam-wp-version.php")
echo "$installed" | egrep -q '^[0-9.]+$' || critical "Could not determine installed version."
[ "$installed" = "$latest" ] && ok "Version $installed installed."
warning "Version $installed installed, should be $latest."

Et voilà, maintenant mes WordPress ne sont pas plus à jour mais je sais quand je dois râler. :-)