Problème

Ma chère moitié étant prof’ de lycée, je suis directement impacté en tant qu’informaticien.

  • Je dois lui choisir, configurer et payer son outil de travail à la maison (ordinateur, scanner, et tout ce qui va avec) (et oui j’en aurai acheté une partie, pas tout, et oui, les frais réels en récupèrent une petite partie dans les impôts, à condition de faire assez de kilomètres pour que les frais réels soient déjà envisageables).
  • Je me tape donc le support informatique, les coups de gueule contre Word, alors qu’à titre professionnel il y a normalement des gens payés pour ça, et pas à 23 h quand je bouquine ou pianote dans une autre pièce.
  • Elle bosse aussi au lycée et doit y utiliser les documents créés à la maison.

C’est le troisième point que je cherche à régler élégamment.

  • L’option accès par webdav au site de la maison a été rejetée : trop geek, trop de problèmes potentiels (accès, sécurité…).
  • Reste le plus simple et évident (mais y être arrivé tout de suite n’aurait pas été assez geek) : la clé USB qui contient tout ce dont elle a besoin. Une clé de 8 Go est à présent peu chère et a une contenance largement assez grande pour l’intégralité de son répertoire Documents.

Clé achetée. Problème réglé… au premier niveau.

Sauvegarde

Une clé c’est pas fiable, ça se perd, ça se grille. Ajoutons que comme toute allergique à l’informatique non directement utilitaire, ma chère moitié ne pensera à sa sauvegarde qu’environ une fois par mois, en général au moment où elle n’aura ni le temps ni la possibilité de la faire.

Bref : comment forcer la sauvegarde automatique quand la clé USB est montée sur le Mac ?

Time Machine est hors concours car le disque dur dédié est, lui, allumé irrégulièrement (à cause du bruit et du courant consommé ; il ne sert en fait qu’à sauvegarder le système, il n’y a pas de document critique sur le Mac).

Google renvoie à des outils purement Mac qui fonctionnent peut-être bien, souvent payants (ah, la culture Mac !), mais que je ne vais même pas tester vu que tout ce que je veux c’est pouvoir déclencher un bête rsync, mon outil préféré (dans le futur, peut-être même rsnapshot que j’utilise avec bonheur sur ma Ubuntu). Oui, à la ligne de commande, c’est pas Mac, mais j’en ai acquis un en partie parce que c’était un Unix, justement.

Le Mac utilise launchd, qui a l’inconvénient de vouloir des fichiers de config en XML, ce qui est assez casse-c… à taper. Heureusement pour une feignasse sans temps comme moi, il y a Lingon, outil libre et gratuit, merci à l’auteur. (D’ailleurs l’auteur a arrêté de maintenir, faut espérer qu’Apple fournira un éditeur dans le futur.)

En pratique

  • À vérifier : que rsync soit présent sur le système de base. Sinon il est compris par exemple dans MacPorts qui permet d’utiliser sur Mac la plupart des outils en ligne de commande connus sur Linux.
  • Dans Lingon, configurer un nouveau User Agent. Le nom suit la convention tld.monnomdedomaine.cequejeveux. Le fichier .plist que créera Lingon se retrouvera dans /Library/LaunchAgents/ et peut au besoin y être modifié avec n’importe quel éditeur.
    NB : Ne pas mettre d’accent dans le nom ; comme tant de systèmes américains, c’est pas prévu pour (no comment).

Lingon.png

  • La ligne de commande pointe ici vers un script que j’ai écrit, ce peut être n’importe quoi n’importe où (si les droits le permettent). À titre expérimental, j’avais un temps sélectionné l’application Chess, j’avais donc un échiquier qui apparaissait à chaque insertion de clé !
  • Le script en question doit être autorisé pour les personnes qui vont bien. Un très laxiste chmod ugo+rx nom_du_script convient pour ce que je veux faire. Il faudrait verrouiller sur un utilisateur ou un groupe pour être plus propre.
  • Il n’y a (au moins avec Lingon) pas de moyen d’associer un « volume » (une clé, une partition de disque, un lecteur réseau…) au script, donc Run it every time a volume is mounted, et le script devra se débrouiller avec ça.
  • C’est une sauvegarde rapide, je la déclenche aussi toutes les heures.
  • À la sauvegarde, Lingon dit qu’il faut carrément redémarrer. J’ai bêtement obéi, ce qui n’est pas très pratique. En utilisant launchctl en ligne de commande, il y a peut-être moyen d’éviter ça.
  • L’exécution se voit sans problème dans la Console.
  • Piège : tel que défini ici, le script sera exécuté par chaque utilisateur logué. Pour un seul utilisateur, l’option My Agents de Lingon aurait pu convenir mais je voulais quelque chose qui puisse servir à plus que la seule clef de mon utilisatrice préférée. Dans le script il faut donc tester qui est le $USER. C‘est également important pour les droits (le fichier .log écrit dans /tmp appartient, lui, à son créateur, j’en crée donc un par utilisateur, sachant que sa place serait plus dans /var/log).
  • La variable $EXCL contient les fichiers à ne pas sauvegarder sur le Mac. Elle dépend de chaque clé utilisée.
  • Le script suivant tient compte de plusieurs clés sous deux utilisateurs. En bash je code de manière très naïve, sans subtilité esotérique, et pas par pas, le débogage y est plus laborieux que dans d’autres langages. Et quand ça marche, je ne cherche pas à optimiser et à paramétrer à donf’ comme si ça devait être réutilisé par d’autres (par exemple avec un fichier de config qui indiquerait quoi sauvegarder et où…).
    Comme modifications, je pense à un répertoire de sauvegarde commun, un rsnapshot ou carrément la copie sur une autre machine par le réseau.
#!/bin/bash

#Balaye les volumes montés
for VOL in `find /Volumes/ -type d -maxdepth 1` ; do

	echo "Volume $VOL"
	SHORTVOL=`basename "$VOL"`
	
	BACKUP=no
	CIBLE=""
	EXCL=""
	
	# Sauvegarde de certains volumes bien précis 
	# en fonction de l utilisateur connecté 
	
	# premier utilisateur 
	if [ $USER = "toto" ] ; then
	if [ $SHORTVOL = "CLE_TOTO" -o $SHORTVOL = "TOTO_1GO" ] ; then
		BACKUP=yes
		CIBLE="/Users/toto/Sauvegardes/$SHORTVOL"
	fi

	# deuxième utilisateur 
	elif [ $USER = "titi" ] ;then
	if [ $SHORTVOL = "BOULOT" -o $SHORTVOL = "PALM_1GO" ] ; then
		BACKUP=yes
		CIBLE="/Users/titi/SAUVEGARDES/$SHORTVOL"
		EXCL="--exclude *.mp3"
	fi

	# autre utilisateur 
	else
		echo "Rien pour $USER" 
		exit 0
	fi
	
	# si backup, sauvegarder le volume
	if [ $BACKUP = "yes" ] ; then
		mkdir "$CIBLE" 2>/dev/null
		LOG2="/tmp/$SHORTVOL.$USER.rsync.log"
		echo "rsync de $SHORTVOL vers $CIBLE"
		echo "rsync de $SHORTVOL vers $CIBLE" > $LOG2
		rsync -av --delete-after $EXCL "$VOL"/  "$CIBLE"/ >> $LOG2
		echo "Fini"
	else
		echo " Pas de sauvegarde "
 	fi

done

exit 0

PS : Ce billet, je le sais, sera lu à la fois par des maniaques promoteurs de la ligne de commande qui ont du mal à voir l’intérêt d’un terminal graphique pour l’administration et par des maqueux fondamentalistes émérites que Terminal effraie ; de plus il mélange les genres en mixant environnement graphique et scripts. Je m’attends donc au pire dans les commentaires (toujours mieux que l’indifférence).