Édition de fichiers et contrôle de versions avec RCS
L'administrateur système passe son temps à modifier des fichiers texte. Et il doit parfois revenir sur une modification malheureuse ou retrouver l'état d'un fichier à une date donnée. L'usage d'un système de contrôle de versions est donc indispensable.
S'il doit s'occuper de systèmes très différents les uns des autres, des solutions comme Cfengine ou Puppet lui seront de peu d'utilité.
Le vénérable RCS est vieillissant mais fait très bien le job. RCS a un avantage majeur pour l'administrateur système : il permet d'éditer les fichier sur place et de les verrouiller (co -l …
dans le script ci-dessous). Il a par contre deux gros inconvénients :
- Des répertoires
RCS
trainent partout, répertoires qui contiennent potentiellement des données confidentielles.mtree(8)
peut aider à s'assurer que ces répertoires ne sont pas accessibles à tout le monde. - Il est difficile de centraliser les fichiers versionnés.
En suivant une idée trouvée dans la FAQ de Squid, voici un script à utiliser en lieu et place de votre éditeur de textes favori :
#!/bin/ksh # RIGHTS=`stat -f %Op $1 | cut -c3-` OWNER=`stat -f %u:%g $1` date=`date +%Y%m%d.%H%M%S` dir=`dirname $1` file=`basename $1` if [ ! -d $dir/RCS ]; then mkdir -p $dir/RCS if [ -f $dir/$file,v -a -d $dir/RCS ]; then mv $dir/$file,v $dir/RCS fi fi if [ -f $dir/RCS/$file,v -a $dir/RCS/$file,v \ -ot $dir/$file -o -f $dir/$file,v -a $dir/$file,v -ot $dir/$file ] then echo "On a trouve un fichier $file,v plus vieux que $file" msg="## Warning! $1 est plus récent que le fichier $file,v\ du depot ($USER@`uname -n`:$PWD) \ Sauvegarde : $file.$date" logger -s -t rvi -p user.notice $msg echo $msg | mail -s "## rvi" -E netadmin@example.com cp $file $file.$date co -l -f $file cp $file.$date $file rcsdiff -u $file ci -u -m"rvi" $file chown $OWNER:$GROUP $FILE && chmod $RIGHTS $FILE #exit 1 fi co -l -f $1 chown $OWNER $1 && chmod $RIGHTS $1 ${EDITOR:=vi} $1 rcsdiff -u $1 ci -u -m"rvi" $1 chown $OWNER $1 && chmod $RIGHTS $1
Couplé à sudo(8)
et syslog(3)
, cela permet de savoir qui a fait quelle modification quand et de revenir sur la modification. Bref, indispensable.
Si quelqu'un a malencontreusement oublié d'utiliser le contrôle de version, les modifications ne sont pas perdues pour autant mais intégrées et une erreur est signalée par courrier et via syslog(3)
.
Sur les systèmes ne disposant pas de fstat(1)
, on peut par exemple utiliser Perl :
RIGHTS=`perl -e 'printf "%04o", (stat($ARGV[0]))[2] & 07777' $1` FILE=`perl -e 'print $ARGV[0]' $1` GROUP=`perl -e 'printf "%d", (stat($ARGV[0]))[5] ' $FILE` OWNER=`perl -e 'printf "%d", (stat($ARGV[0]))[4] ' $FILE`