Publication massive des rapports sur un Intranet🔗
Introduction
Maintenant que nous avons produit tous nos rapports, il faut les rendre visibles c'set à dire les publier. Si déposer 300 fichiers sur un serveur web est à la portée de tout administrateur système digne de ce nom, déposer 300 fichiers sur un serveur "Intranet" peut se révéler plus complexe notamment si vous n'avez accès qu'à un CMS avec des droits limités !
C'est le cas de ma structure: je n'ai accès qu'à une interface web dans SPIP qui me permet d'uploader un à un mes fichiers ! Il va sans dire que tout faire à la main prendrait plus de temps que de coder un simple script shell ou Python pour faire ce travail.
Publions généreusement
D'abord, vous devez créer un article dans SPIP au bon endroit. Cet article peut être vide mais il doit être actif c'est à dire créé (pas forcément publié). Vous devez ensuite repérer l'identifiant de l'article. C'est assez facile et vous le récupérerez dans l'interface de SPIP ou en surveillant les URL.
Pour la publication, il vous faut un script. Pour ma part, j'ai commencé à développer un script en Python qui gère l'ajout de documents dans SPIP 2.0 où l'authentification se fait par un système CAS. J'ai rapidement été confronté au problème de tout webscrappeur: malgré le fait de coller directement au étapes d'authentification, de navigation et de chargement de formulaire (via urllib2 et autres joyeusetés), le résultat final aboutissait à une erreur 403
Au bout de quelques heures, je me suis dit que finalement, il me fallait juste faire un chargement complet à partir du navigateur web (en bon debianneux, j'utilise iceweasel). J'ai découvert l'extension Firefox iMacros qui permet d'automatiser un processus en quelques clics. C'est une solution très crade mais elle a l'avantage de fonctionner rapidement et de s'adapter assez bien à votre environnement Web.
iMacros permet de stocker des macros dans des fichiers textes qu'on peut ensuite modifier. Cette extension a ses limites, notamment, elle ne gère pas les formulaires par leur nom mais dans l'ordre d'affichage (ordre d'apparition dans le fichier HTML plutôt). C'est embêtant pour les formulaires qui changent de place après un petit changement.
Comment utiliser iMacros ?
Le travail est assez simple. Tout d'abord, vous devez télécharger et installer l'extension. Ensuite, je vous conseille d'observer les deux premières vidéos de démonstration.
Une fois que vous aurez maitrisé les concepts de l'enregistrement et de la lecture de macros (ce qui prend 5 minutes), vous serez à même de générer votre propre macro et de la rejouer ensuite.
Retenez que iMacros s'exécute dans l'environnement du navigateur web. Ainsi, si vous êtes déjà authentifié (vous avez les bons cookies de session), votre macro en profitera. C'est d'ailleurs ce que j'ai dû faire pour gérer l'authentification CAS qui est très dynamique. Une fois la barrière de l'authentification passée, enregistrez votre macro en effectuant simplement le chargement d'un seul document dans votre CMS.
Voici un exemple de macro que j'ai enregistrée:
VERSION BUILD=7401110 RECORDER=FX TAB T=1 TAB CLOSEALLOTHERS URL GOTO=http://myintranet.mydomain.com/ecrire/?exec=articles_edit&id_article=3258 TAG POS=1 TYPE=INPUT:FILE FORM=ACTION:http://myintranet.mydomain.com/ecrire/?exec=articles_edit ATTR=ID:fichier_choix_0 CONTENT=/home/mederic.ribreux/rapports/Fiche_Habitat_49001-Les Alleuds.odt TAG POS=1 TYPE=INPUT:SUBMIT FORM=ACTION:http://myintranet.mydomain.com/ecrire/?exec=articles_edit ATTR=NAME:sousaction1&&VALUE:Télécharger
Les 3 premières lignes permettent de gérer le fait qu'on souhaite uniquement interagir sur l'onglet 1. La ligne 4 permet de se rendre à l'URL qui permet l'afichage du formulaire initial de chargement des documents dans l'article.
La ligne 5 remplit le formulaire situé en position n°1 avec les bonnes valeurs d'attribut INPUT (le bon nom de fichier).
La ligne 6 déclenche l'upload (appui sur le bouton de téléchargement). Pas besoin de faire plus compliqué. Pour télécharger nos fichiers, nous allons devoir rajouter les deux dernières lignes en substituant le bon nom de fichier. Attention, iMacros ne gère pas bien les espaces dans les noms de fichier (qu'on corrige à grand coups de rename 's/ /_/g' *.odt).
Pour réaliser ce travail, c'est très facile: il vous suffit d'ammender le fichier de macro avec un one-liner Shell:
for f in *.odt;do echo "TAG POS=1 TYPE=INPUT:FILE FORM=ACTION:http://myintranet.mydomain.com/ecrire/?exec=articles_edit ATTR=ID:fichier_choix_0 CONTENT=/home/mederic.ribreux/rapports/$f"; echo "TAG POS=1 TYPE=INPUT:SUBMIT FORM=ACTION:http://myintranet.mydomain.com/ecrire/?exec=articles_edit ATTR=NAME:sousaction1&&VALUE:Télécharger"; done >> ~/iMacros/Macros/#Current.iim
Enfin, il vous suffit de lancer la macro et le tour est joué. Ca prend environ 1h30 de charger 360 fichiers odt de 30ko environ (le débit réseau varie fortement). Pendant ce temps, vous ne pouvez plus utiliser votre navigateur web et vous avez amplement mérité de boire un café.
L'intérêt essentiel de iMacros c'est que même un non informaticien peut s'y mettre pour réaliser cette tâche très pénible et fastidieuse. J'ai dû y recourrir car j'avais déjà passé trop de temps à essayer de comprendre pourquoi mon upload en Python ne fonctionnait pas.
Autre intérêt, lorsque la macro plante car le serveur en face ne suit plus, vous n'avez besoin que de supprimer les lignes déjà passées…
Conclusion
Nous voici en possession d'une technique intéressante pour effectuer une tâche fastidieuse. Le temps nécéssaire à la programmation du dispositif est très court (compter 1h30 en complet) comparé au temps d'upload manuel. De plus, une fois cette technique maîtrisée, on peut très bien l'employer pour d'autres situations.
Ainsi, une personne qui travaille sur ce projet de fiches communales n'a pas besoin d'avoir un background complet en développement. Elle peut se contenter des techniques évoquées dans les articles de ce projet.
Petit bémol sécurité: je ne suis pas sûr que l'extension iMacros soit complètement sécurisée. Rien ne dit que des éléments sur la vie privée ne soient pas remontés lors de son utilisation.