Bon j'ai fini par m'en sortir avec tout ces trucs là, donc pour ceux que ça intéresse je vais détailler la procédure ci-dessous...
Déjà, il faut un serveur linux. Et il faut installer le validateur de liens autonome du WDG (Web Design Group) que l'on peut trouver ici :
http://htmlhelp.com/tools/validator/offline/index.html.fr
Pour ceux qui ont red hat ou fedora c'est facile, il existe des paquets tout prêts. Mais moi je suis sous gentoo, alors ce que j'ai fait :
- j'ai copié le script validate dans /usr/local/bin.
- j'ai téléchargé les sources de lq-nsgmls, je les ai compilées avec un simple "Make", puis j'ai mis le programme ainsi obtenu dans /usr/local/bin aussi.
- j'ai téléchargé wdg-sgml-lib puis je l'ai décompressé dans le répertoire indiqué par défaut sur le site précédent, /usr/local/share/wdg/sgml-lib
Mais là ça n'installe que le validateur, qui prend en entrée juste un lien. Moi j'avais besoin d'un système qui prenne en entrée un fichier xml qui contient une suite de liens.
J'ai donc créé une suite de scripts, les voici : (je les ai tous mis dans /usr/local/bin et je les ai rendus exécutables par un chmod u+x)
D'abord, le script principal, qui valide l'ensemble du site :
#!/bin/bash ### On change le répertoire par défaut cd $1 ### On commence par récupérer tous les fichiers xml get-xml http://www.mindenice.fr/index.php?id=88 pages.xml get-xml http://www.mindenice.fr/index.php?id=89 entreprises.xml ### Puis on transforme ces fichiers en liens xmltolinks pages xmltolinks entreprises ### On supprime le fichier de résumé de l'opération if [ -e validate.err ] then rm validate.err fi ### Puis on valide tous ces fichiers batch-validate pages batch-validate entreprises ### Puis on supprime tous les fichiers inutiles rm *.log rm *.links rm *.xml ### Enfin on envoie un mail de résultat if [ ! -e validate.err ] then echo "Tous les liens ont été vérifiés et sont conformes à la norme !" > validate.err fi mail webmaster_AT_domain.com -s "Résultats de la vérification du $(date) pour le site http://www.mindenice.fr" -a "From: postmaster_AT_domain.com" < validate.err rm *.err
Alors ce script prend en paramètre le répertoire de travail, et il utilise plusieurs scripts pour :
- récupérer des fichiers .xml de sitemap et les renommer comme on veut
- extraire tous les liens de ces fichiers xml
- valider les liens
- écrire les éventuelles erreurs dans un fichier et envoyer le résultat au webmaster par mail
- faire le ménage en effaçant les fichiers de travail
Le script pour récupérer les fichiers .xml
#!/bin/bash ### Ce script récupère un fichier xml jusqu'au succès ### On commence par supprimer le fichier destination s'il existe if [ -e $2 ] then rm $2 fi ### Puis on fait un wget du fichier jusqu'au succès, maximum 100 essais (( i = 100 )); while (( i > 0 )) do wget -q $1 -O $2 if [ -e $2 ] then (( i = 0 )) fi done
Ce script est assez simple, il prend deux paramètres, l'url à récupérer et le nom du fichier à enregistrer. Pourquoi plusieurs tentatives ? Parce que dans mon cas parfois la récupération du fichier xml ne fonctionne pas du premier coup, donc pour être sûr de le récupérer je fais plusieurs essais, bien sûr en stoppant dès le premier succès.
Voyons voir le script pour transformer le fichier xml en liens :
#!/bin/bash ### Ce script transforme un fichier xml en une suite de liens if [ -e $1.xml ] then sed -n 's_.*<loc>\(.\+\)</loc>.*_\1_p' $1.xml > $1.links fi
Ce script utilise tout simplement une fonction de gawk pour transformer un fichier xml en une suite de liens. Dans mon cas les liens étaient encadrés par des balises LOC.
Et enfin le script qui me valide tout ça en prenant en paramètre le nom du fichier .links.
#!/bin/bash ### On supprime le fichier log s'il existe déjà if [ -e $1.log ] then rm $1.log fi ### Si le fichier existe if [ -e $1.links ] then ### On test tous les liens et on renvoie un log si erreur while read line do validate -w $line >> $1.log done < $1.links ### En cas d'erreur on copie le fichier log dans un fichier d'erreur if [ -s $1.log ] then cat $1.log >> validate.err fi fi
Donc en fait ce script lit toutes les lignes du fichier .links, lance le script validate avec ce paramètre, et écrit le log.
Et finalement je me suis créé une tâche cron qui me lance /usr/local/bin/site-validate ~ (pour utiliser le répertoire home comme répertoire de travail) toutes les semaines, comme ça je reçois un mail hebdomadaire m'informant de la conformité de tout mon site...
Voilà, donc bon si vous avez des commentaires...