É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 :

  1. 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.
  2. 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`
  • user/pc/sysadmin/rvi.txt
  • Dernière modification : 2011/07/24 12:30
  • de pc