Nous avons été challengés sur un problème de comportement divergent pour un logiciel répliqué sur un grand nombre de postes de travail. Tout ça dans plusieurs lieux géographiques différents.
Suspect #1: les synchro sous Windows — environ 10’000 fichiers et dossiers sur un DFS (Distributed File System) entre des serveurs Windows 2012, qui sont aussi traités sous robocopy entre les serveurs et les PC.
Bonne découverte, au passage, que ce « robust file copy » sous Windows 7 ! 🙂
Que faire… sous Windows ? … quels outils pour déterminer les différences ? … comment automatiser cela ? … via un script de commandes Windows ? … déranger tous les utilisateurs ? … No way, pas assez de temps pour ça!
Et pourquoi pas GNU/Linux ? Objectif: pondre le plus rapidement possible des scripts de relevé des différences sur les fichiers ou les dossiers à toutes les étapes de la chaîne de réplication.
Hey-hey, ingrédients de la recette:
- des montages de partages CIFS (Common Internet File System) des serveurs et des PC, aucun soucis
mount -t cifs //serveur_ip/montage_caché$/dossier_synchronisé montage_local -o username=nom_utilisateur
- un script en bash, des commandes find, des traitements par gawk, des commandes diff et un peu de md5, voire du sed
- des fonctions en bash pour afficher les commandes disponibles et orchestrer le tout
- des find pour récupérer les dossiers et les fichiers synchronisés avec visualisation du déroulement avec la commande tee (quand ça prend un peu de temps, voir ce qui ce passe est rassurant)
find "dossier_a_analyser" -type f ! -iname "*filtre_sur_des_dossiers_parasites*" -ls | tee "dossier/périphérique-fichiers.txt"
- des commandes gawk pour traiter les sorties des find pour récupérer les données pertinentes (nom, taille et date du fichier)
cat "dossier/périphérique-fichiers.txt" | grep -iv "filtre_sur_lignes" | grep -iv "autre_filtre" | grep -iv "autre_filtre" | gawk '{t=$7; d=$8 "-" $9 "-" $10; nom=""; for (p=11; p<=NF; p++) { nom = nom " " $p } print nom,t }' > dossier/périphérique-fichiers-nom-taille.txt
- des diff pour comparer les lignes sans tenir compte des différences de majuscules ou minuscules et indiquer si il n’existe aucune différence
diff dossier/périphérique-A-fichiers-nom-taille.txt dossier/périphérique-B-fichiers-nom-taille.txt -si
- et l’option -e pour diff permet aussi de récupérer une liste des fichiers différents pour permettre ensuite vérifier les différences par md5sum
diff dossier/périphérique-A-fichiers-nom-taille.txt dossier/périphérique-B-fichiers-nom-taille.txt -ei | gawk ' {nom=""; for (p=1; p<= (NF-2); p++) { nom = nom " " $p } print nom }' | grep -v ^$ | tee dossier/A-B-fichiers-nom-taille.txt
- des sommes md5 pour confirmer ou infirmer des différences
xargs -a "dossier/A-B-fichiers-nom-taille.txt" md5sum | tee dossier/A-B-md5.txt
Bilan ? Ben on a été déçus: la synchro DFS entre les serveurs Windows est nickel et robocopy fonctionne à merveille.
On a obtenu une réponse fiable et rapide sous GNU/Linux en utilisant des langages de script. Bonus: aucun utilisateur dérangé!
Et au final, avec la preuve que les installations logicielles étaient identique (fichiers + registres), on a pu faire bouger l’éditeur du logiciel qui a fini par révéler un comportement de réinitialisation des paramètres par défaut lorsqu’est détecté un changement de plate-forme matérielle.