Publié le mercredi 19 avril 2006, mis a jour le lundi 26 mars 2007, par TGL
Au delà des aspects cosmétiques de l’interface (que je trouve plus agréable aussi), il y a quand même quelques différences plus fondamentales entre dispatch-conf et etc-update.
Tout d’abord, dispatch-conf effectue des sauvegardes à chaque intervention, soit sous forme de copies fichier.version dans un répertoire donné, soit sous forme RCS (un gestionnaire de version monoutilisateur, un genre de mini-CVS quoi). Ces sauvegardes permettent de retrouver les fichiers écrasés un peu trop vite, ou encore les fichiers tels qu’ils avaient été installés par le paquet si on a fait n’importe quoi dedans.
Mais surtout, dispatch-conf repose pour les mises à jour sur un diff à 3 fichiers entre : (1) - l’ancien fichier vanilla (le /etc/toto.conf tel qu’installé par le paquet toto-1.0) (2) - le nouveau fichier vanilla (le /etc/._cfg0001_toto.conf qu’y vient d’être installé par votre mise à jour vers toto-1.1) (3) - votre fichier customisé, dérivé de (1) (votre /etc/toto.conf actuellement en usage)
Ce que dispatch-conf propose donc, ça n’est pas simplement comme etc-update de remplacer (3) par (2) en oubliant tout au passage, mais plutôt d’intégrer à (3) les différences entre (1) et (2) :
s’il n’y a pas de différence (toto-1.0 et toto-1.1 propose la même config par défaut), il n’y a donc rien à faire, et dispatch-conf ne vous parlera même pas de ce fichier, quand bien même vous l’auriez configuré.
si les différences ne concernent que des lignes de commentaires, alors dispatch-conf en fera aussi silencieusement l’intégration (pour peu qu’il soit configuré pour, voir plus bas).
sinon, il vous proposera un merge interactif ou ce genre de choses, comme etc-update. Mais attention, il y aura moins de lignes à merger, puisque vos customisations portant sur des lignes communes à la conf 1.0 et 1.1 seront elles déjà automatiquement intégrées.
Bon, ça sera plus clair sur un exemple...
Commençons par configurer dispatch-conf, dans /etc/dispatch-conf.conf :
#
# dispatch-conf.conf
#
# Directory to archive replaced configs
archive-dir=/var/archive/config
# Use rcs for storing files in the archive directory?
# (yes or no)
use-rcs=no
# Diff for display
diff="colordiff -Nu %s %s"
# Pager for diff display
pager="less --no-init --QUIT-AT-EOF -R"
# Automerge files comprising only CVS interpolations (e.g. Header or Id)
# (yes or no)
replace-cvs=yes
# Automerge files comprising only whitespace and/or comments
# (yes or no)
replace-wscomments=yes
# Automerge files that the user hasn't modified
# (yes or no)
replace-unmodified=yes
# Per-session log file of changes made to configuration files
log-file=/var/log/dispatch-conf.log
Ici, j’ai choisi une sauvegarde sous forme de fichiers dans le répertoire /var/archive/config, et j’ai activé toutes les options qui facilitent la vie. Oh, et puis oui, j’ai remplacé diff par colordiff, parce que c’est plus joli ; si vous le faites aussi, pensez à installer ce programme :
# emerge -av colordiff
Maintenant, il faut savoir que dispatch-conf peut travailler sur un répertoire bidon qu’on lui passe en paramètre, au lieu des habituels /etc/ et compagnie. C’est ce qu’on va utiliser pour le test, comme ça on fait pas de bêtises. Mais dans la vraie vie, au lieu de dispatch-conf /foo/bar/, on ferait juste dispatch-conf.
% mkdir /tmp/etc
% <éditeur> /tmp/etc/toto.conf
On va commencer avec un toto.conf comme si on venait d’installer un paquet toto-1.0 :
# This is configuration file for toto
# This option roxor:
roxor=yes
# This option puxor:
puxor=no
Comme c’est une première installation, il n’y a pas dispatch-conf ou autre etc-update à faire. Imaginons maintenant qu’on met à jour vers toto-1.1. Ça installe un fichier de config légèrement différent :
% cp /tmp/etc/toto.conf /tmp/etc/._cfg0001_toto.conf
% <éditeur> /tmp/etc/._cfg0001_toto.conf
Disons que la nouvelle version aura quelques commentaires en plus à la fin :
# This is configuration file for toto
# This option roxor:
roxor=yes
# This option puxor:
puxor=no
# Optionally, you can set TGL's verbosity here:
#tglverb=3
Il est tant de faire un premier merge avec cette nouvelle configuration :
% dispatch-conf /tmp/etc/
Ici, on n’a pas eu à intervenir, parcequ’il ne s’agit que de merger des commentaires. Mais pourtant, le boulot est bel et bien fait, les lignes ayant été ajoutées :
% <éditeur> /tmp/etc/toto.conf
Et on voit :
# This is configuration file for toto
# This option roxor:
roxor=yes
# This option puxor:
puxor=no
# Optionally, you can set TGL's verbosity here:
#tglverb=3
Bon bah on va en profiter pour augmenter un peu la valeur de "tglverb", avant d’enregistrer :
...
# Optionally, you can set TGL's verbosity here:
tglverb=9
Bon, maintenant, et c’est là qu’on découvre la vraie puissance de dispatch-conf, on va faire une mise à jour vers un toto-1.2, dont la conf par défaut (roxor=yes et puxor=no) a été inversée. On se refait donc encore un "._cfg0001_toto.conf" qui ressemble cette fois à ça :
# This is configuration file for toto
# This option roxor:
roxor=no
# This option puxor:
puxor=yes
# Optionally, you can set TGL's verbosity here:
#tglverb=3
Et on le fusionne :
% dispatch-conf /tmp/etc/
--- /tmp/etc/toto.conf 2005-09-03 02:10:51.000000000 +0200
+++ /tmp/etc/._mrg0001_toto.conf 2005-09-03 02:11:34.000000000 +0200
@@ -1,10 +1,10 @@
# This is configuration file for toto
# This option roxor:
-roxor=yes
+roxor=no
# This option puxor:
-puxor=no
+puxor=yes
# Optionaly, you can set TGL's verbosity here:
tglverb=9
>> (1 of 1) -- /tmp/etc/toto.conf
>> q quit, h help, n next, e edit-new, z zap-new, u use-new
m merge, t toggle-merge, l look-merge:
On voit dispatch-conf afficher les modifications qu’il propose (changer les valeurs de "roxor" et "puxor", puisqu’elle sont changées dans la conf par défaut). Mais ce qu’il convient surtout de remarquer, c’est que notre customisation de "tglverb", elle, est conservée. Ici, etc-update aurait proposé de revenir à un ligne "#tglverb=3" telle qu’elle est dans la conf par défaut. Ça ne vous impressionne pas ? Et bah dites vous que si les lignes customizées c’était vos entrées de /etc/fstab, vous apprécieriez qu’on ne vous propose même pas de les massacrer. Bon, après cet intermède, il est temps d’accepter les modifs proposées. On appuie donc sur "u" (use-new), et dispatch-conf quitte en enregistrant la nouvelle version. Je vous laisse regarder "man dispatch-conf" pour les autres commandes. On a donc maintenant :
% cat /tmp/etc/toto.conf
# This is configuration file for toto
# This option roxor:
roxor=no
# This option puxor:
puxor=yes
# Optionaly, you can set TGL's verbosity here:
tglverb=9
Et on peut aussi jetter un oeil aux sauvegardes, où l’on retrouve nos précédentes versions de toto.conf, et la version d’origine (celle en ".dist") :
% ls /var/archive/config/etc/tmp
toto.conf toto.conf.1 toto.conf.dist
Et voilà pour la démo... en éspèrant qu’elle rend la chose un peu plus compréhensible. Mais si vous avez rien capté, retenez quand même au moins ça :
dispatch-conf fait des sauvegardes, et c’est Bien© ;
dispatch-conf est plus malin qu’etc-update, vous laissant moins de travail à faire manuellement, et donc moins de chances de faire des fausses manips.
Ah oui, pour finir, un bémol tout de même : la première fois qu’il voit un fichier, dispatch-conf n’a pas encore dans ces archive de sauvegarde de la précédente version du fichier standard, et ne peut donc pas faire grand chose d’intelligent (sinon les petits trucs comme la fusion de commentaires)... Ça n’est donc que à partir de la 2ème mise-à-jour d’un fichier qu’il devient intérressant. Bref, il faut l’utiliser régulièrement depuis quelques temps pour bien le juger.
Cet article est tiré du TIP etc-update des forums officiels Gentoo