Chargement de profils… selon l’endroit

Char­ger un pro­fil colo­ri­mé­trique selon l’endroit ousqu’on est. Oui, je sais, ça paraît bizarre : un ordi­na­teur, un écran, un pro­fil, et pis bas­ta.

Sauf dans cer­tains cas.

Il se trouve que je suis dans un de ces cas.

His­to­ri­que­ment, je tra­vaillais le same­di et le dimanche. His­toire de ne pas être tout seul dans 200 m², et aus­si pour m’éviter des heures inutiles de trans­port, je tra­vaillais ces jours-là de chez moi. Et pour m’éviter les prises de tête genre “merde, j’ai besoin de ce fichier”, je trim­bal­lais mon uni­té cen­trale avec moi.

En fait, j’utilise pour ce faire un ordi­na­teur por­table. Je le pro­mène dans mon sac à dos qua­si­ment en per­ma­nence, ce qui me per­met de retrou­ver mon bureau et mes docu­ments que je sois à la rédac­tion, à la mai­son ou en voyage. Mais un écran 15″ (1440x900 px), c’est un peu juste pour bos­ser : ce por­table est donc, hor­mis en voyage, bran­ché sur un écran.

À la rédac­tion comme chez moi, j’ai un Sam­sung F2380M, bran­ché en Dis­play­Port-HDMI, et bosse en bi-écran avec le moni­teur inté­gré du por­table comme moni­teur secon­daire.

Or, bien que du même modèle, même avec des réglages iden­tiques ou une cali­bra­tion iden­tique, les deux F2380M n’affichent pas la même chose. J’ai donc dû me résoudre à les éta­lon­ner sépa­ré­ment, n’ayant pu trou­ver de réglages don­nant des résul­tats satis­fai­sants avec le même pro­fil ICC. Je rentre pas dans le détail, il n’est pas exclu que ça fasse un article sur Les­nums un de ces quatre.

Le pro­blème, ensuite, est simple : com­ment char­ger sys­té­ma­ti­que­ment, et aus­si auto­ma­ti­que­ment que pos­sible, le pro­fil sou­hai­té à chaque démar­rage ? Com­ment faire que l’ordinateur choi­sisse le pro­fil adap­té au moni­teur du bureau lorsqu’il j’y suis, au mien lorsque je me trouve à domi­cile, et pour­quoi pas celui du por­table quand je suis en voyage ?

La suite du billet est un long mono­logue gee­kesque et unixien. Ne lisez pas. Si vous lisez, ne vous plai­gnez pas. Vous êtes pré­ve­nus.

La réponse évi­dente serait : recon­naître le moni­teur. Pour les voyages, pas de pro­blème pour voir si le por­table est seul : la taille de l’écran le dit.

Au bureau ou chez moi, en revanche, pro­blème : l’écran externe est tou­jours un F2380M (et de toute façon, les pilotes pro­prié­taires Nvi­dia masquent les moni­teurs au sys­tème, qui ne voit qu’un “écran incon­nu” de la taille cumu­lée des deux écrans bran­chés) et aucune dif­fé­rence de bran­che­ment ne per­met de recon­naître lequel. Impos­sible donc d’identifier clai­re­ment le moni­teur du bureau ou le mien, à moins que vous ne connais­siez un outil pour récu­pé­rer en ligne de com­mande le numé­ro de série du moni­teur bran­ché.

Il me faut donc un élé­ment constant, dif­fé­rent chez moi et au bureau. Les péri­phé­riques pour­raient l’être, mais je puis chan­ger de sou­ris ou de cla­vier plus ou moins régu­liè­re­ment, donc ce n’est pas fiable.

J’ai jeté mon dévo­lu sur le réseau. En effet, le réseau des Nums est tou­jours le même, et mon réseau chez moi aus­si ; l’un ou l’autre peut chan­ger un jour (choix d’un autre FAI, inter­rup­tion de ser­vice…), mais ça n’arrivera pas tous les quatre matins. Il y a dif­fé­rentes façons de savoir sur quel réseau on est, la plus simple étant de deman­der à des sites spé­cia­li­sés qui vous diront tout, mais cette solu­tion pose un pro­blème poten­tiel (qui ne s’est jamais pro­duit à ce jour, mais sait-on jamais) : si je me branche chez quelqu’un qui a le même FAI que moi ou la rédac et se situe géo­gra­phi­que­ment un peu près, il n’y a plus de moyen de les dis­tin­guer.

Un truc sûr, c’est donc : c’est qui ma box ?

À ce stade, l’objectif est simple : trou­ver l’adresse MAC de mon rou­teur. Cet iden­ti­fiant ne change en prin­cipe pas et est spé­ci­fique à un modem don­né.

C’est tout con, en fait, mais ça m’a deman­dé pas mal de recherches vu que j’ai pas une grande expé­rience de ce domaine (pour ceux qui ne l’auraient pas com­pris pas, ce billet est sur­tout une anti-sèche pour pas avoir à trop réflé­chir si pour une rai­son quel­conque je devais refaire ça). Pour récu­pé­rer l’adresse MAC du rou­teur, il suf­fit d’une seule com­mande sous Linux (doit mar­cher dans n’importe quel Unix, en fait, je pense) :

arp `route | grep default | awk '{print $2}'` | tail -n 1 | awk '{print $3}'

Pour ceux qui ne parlent pas le Bourne Shell cou­ram­ment, décom­po­sons :

La com­mande de base, c’est “route”. Elle per­met de connaître les rou­tages appli­qués au réseau local, et en par­ti­cu­lier la route par défaut (“grep default”). On va récu­pé­rer un truc du genre “defaul­t         192.168.0.1     0.0.0.0         UG    0      0        0 eth0”, qui dit : pour les adresses incon­nues, deman­dez à la pas­se­relle sur 192.168.0.1. Un petit coup de awk per­met de récu­pé­rer juste l’adresse IP de la pas­se­relle.

Mais une adresse IPv4 locale, c’est ambi­gu. Y’a sans doute plein de réseaux dont la pas­se­relle répond à cette adresse. L’objectif, je l’ai dit, est d’identifier spé­ci­fi­que­ment le rou­teur du bureau ou le rou­teur du stu­dio, et rien d’autre.

Donc, on passe par “arp”, qui per­met de trou­ver l’adresse MAC (unique) asso­ciée à une adresse IP. Un coup de tail pour récu­pé­rer la der­nière ligne (au-des­sus, arp affiche un en-tête de tableau qui ne nous inté­resse pas), puis un coup de awk pour n’avoir plus que l’adresse MAC, et ça y est : j’ai un iden­ti­fiant de réseau qui non seule­ment n’est pas le même sur la Free­box du bureau et le modem de chez moi, mais ne sera pas la même sur une autre Free­box même située dans le bâti­ment, et qui en revanche sera tou­jours la même pour la Free­box sou­hai­tée même en cas de redé­mar­rage.

Après, y’a plus qu’à habiller un peu tout ça, pour char­ger les pro­fils qu’on veut selon les cas. À l’heure actuelle, le script com­plet, que j’ai rajou­té dans la liste de lan­ce­ment au démar­rage de Gnome, res­semble à ça :

#!/bin/sh
sleep 10 #attendre que les préférences Nvidia soient chargées, sinon elles virent le profil... -_-
date >> .profil.log
if xrandr 2> /dev/null | grep "3360 x 900"
then
		echo "	Portable seul" >> .profil.log
		xcalib .color/icc/Screen 2 2010-11-22 max D6500 min natif 2.2 HQ 1xCurve+MTX.icc	#profil Dell
else
	until ifconfig eth0 | grep "inet adr:" > /dev/null	#attendre que le réseau soit connecté
	do
		sleep 5
	done

	macrouteur=`arp `route | grep default | awk '{print $2}'` | tail -n 1 | awk '{print $3}'`
	if test "$macrouteur" = "00:1f:33:xx.xx.xx"	#modem Numéricable
	then
		echo "	Réseau Meezon" >> .profil.log
		xcalib .color/icc/LPL 2010-12-14 max D6000 min natif 2.2 HQ 1xCurve+MTX.icc	#profil Samsung meezon
	elif test "$macrouteur" = "00:07:cb:xx.xx.xx"	#Freebox Lesnums
	then
		echo "	Réseau Free Lesnums" >> .profil.log
		xcalib .color/icc/LPL 2010-12-15 max D6000 min natif 2.2 HQ 1xCurve+MTX.icc	#profil Samsung boulot
	else
		echo "	Pas de position identifiée" >> .profil.log
		xcalib .color/icc/Screen 2 2010-11-22 max D6500 min natif 2.2 HQ 1xCurve+MTX.icc	#profil Dell
	fi
fi

Il y a peut-être plus élé­gant, mais ça fonc­tionne.