Installer un serveur CVS

Denis Bodor

Historique des versions
Version 1.0Avril 2001
Article sous licence GNU FDL

Partager des informations est la base même d'une communauté d'utilisateurs et/ou de développeurs. Malheureusement, quand le nombre de personnes collaborant à un projet dépassent la limite fatidique (2 personnes), les problèmes commencent à voir le jour. La synchronisation des travaux de chacun utilise alors de plus en plus de temps du responsable du projet. Ajoutant à cela des problèmes de répartition géographique, il devient indispensable de faire usage d'un outil spécialisé : CVS.

CVS signifie Concurrent Versions System. Il s'agit d'un utilitaire permettant de gérer efficacement des fichiers ou plus exactement toutes les versions des mêmes fichiers modifiés au fil du temps. On peut alors, en toute simplicité, retrouver d'anciennes versions de fichiers, consulter l'historique des modifications, bref, garder une trace de tout le "vécu" du projet.

CVS est un système habituellement utilisé pour maintenir et gérer des fichiers sources. Mais il peut également convenir pour tout autre élément nécessitant les mêmes besoins de gestion (fichiers HTML, documentation, répertoire téléphonique, etc.). Il peut être utilisé de manière locale ou via un réseau. Ce dernier point est très important car il permet de s'acquitter du problème géographique cité plus haut.

Utilisation locale

Même si vous développez un logiciel ou une documentation "en solitaire", CVS est une sécurité qui peut parfois vous sauver la mise. En effet, avec CVS, vous ne travaillez jamais directement sur les données. Ces dernières sont stockées dans un dépôt (repository) accompagnées d'informations complémentaires utilisées par CVS. Lorsque vous souhaitez modifier votre oeuvre, vous devez récupérer la version la plus à jour depuis le dépôt, appliquer vos modifications pour enfin retransmettre la nouvelle version au dépôt.

Utilisez CVS en local est un jeu d'enfant. Il suffit de définir une variable d'environnement renseignant l'utilitaire cvs de l'endroit où est placé le dépôt. Voici un petit exemple:


$ export CVSROOT='/usr/local/moncvs/depot'

Ensuite on initialise le dépôt et on y place la première version des fichiers :


$ cvs init
$ cd /vers/mes/sources
$ cvs import -m "premiere version" monprojet demoi starter
N monprojet/...
N monprojet/...
N monprojet/...
[...]
No conflicts created by this import

Nous venons d'ajouter les fichiers du répertoire courant dans la branche monprojet du dépôt sous le nom demoi avec comme marqueur (mot clef) starter. Vous pouvez, à présent, directement vous placer n'importe où dans votre arborescence pour faire votre premier checkout du dépôt CVS :


$ cd ~/ailleurs
$ cvs co monprojet

Un répertoire monprojet sera créé comprenant les fichiers du dépôt. Ici, nous précisons le nom d'un répertoire à récupérer, mais vous avez peut-être remarqué que, habituellement, on parle de module et non de répertoire. Un module peut être considéré comme une sorte d'alias. Pour associer un nom de module à votre répertoire monprojet, commencez par récupére le répertoire de gestion CVS :


$ cvs co CVSROOT

En plus de monprojet, vous devez à présent trouver un répertoire CVSROOT. Dans ce dernier sont placés tous les fichiers de paramétrage de votre serveur CVS. Les modules se définissent dans CVSROOT/modules. Editez ce fichier et ajoutez :

X57 monprojet

Enregistrez le fichier et appliquez directement ces modifications au dépôt avec :


$ cvs commit -m "ajout modules"
Checking in CVSROOT/modules;
/usr/local/moncvs/depot/CVSROOT/modules,v <-- modules
new revision: 1.2; previous revision: 1.1
done
cvs commit: Rebuilding administrative file database

Et voilà. Vérifions tout de même :


$ rm -rf *
$ cvs co X57

Nous obtenons cette fois un répertoire du nom du module (X57). Donc, ça marche. Vous l'aurez compris, les récupérations se font habituellement avec co (ou update) et les mises à jour avec commit. Ajoutons à cela que les ajouts de fichiers se font avec add et qu'il n'est pas possible de supprimer un fichier du dépôt.

En réseau

Qui dit réseau sous-entend implicitement multi-utilisateurs et donc gestion des utilisateurs. Il faut donc vous préparer à gérer autant d'utilisateurs sur la machine que vous aurez de participants à votre projet. Partez donc sur de bonnes bases en créant un groupe d'utilisateurs cvs et les différents comptes pour vos participants. Comme les bonnes habitudes doivent être prises rapidement, interdisez immédiatement les logins pour tous ces utilisateurs (sauf vous) en ajoutant leur nom dans /etc/security/access.conf. Ceci suppose bien sûr que vous utilisiez PAM sur le système et que vous utilisiez ce module pour les services sshd, rlogin, login, etc. Les utilisateurs n'ont pas besoin de se logger sur le système pour avoir accès au dépôt cvs, mais la gestion des permissions sur les fichiers du dépôt nécessite l'existence des utilisateurs dans le système. Dans le cas contraire, la moindre manipulation en lecture ou en écriture sur le dépôt provoquera tout simplement une erreur


"Fatal error, aborting. machin: no such user".

Il n'y a pas de démon cvsd, vous devez simplement ajouter une ligne dans votre fichier de configuration de inetd :


cvspserver	stream	tcp	nowait	root	/usr/sbin/tcpd	/usr/bin/cvs \ --allow-root=/usr/local/moncvs/depot	pserver

N'oubliez pas de redémarrer inetd après la modification. Votre serveur CVS est maintenant prêt à répondre aux requêtes provenant d'autres machines du réseau, mais ce n'est pas fini. Nous l'avons dit plus haut, les fichiers de gestion du CVS sont placés dans un répertoire CVSROOT du dépôt. Un certain nombre de fichiers ont été créés grâce à la commande cvs init mais pas celui permettant de gérer les accès nominatifs. Ici, deux solutions se présentent :

  • soit vous permettez aux utilisateurs reconnus d'ajouter de nouveaux membres participant au projet
  • soit vous vous réservez ce privilège.

Quelle que soit votre décision, vous serez obligé de créer un fichier CVSROOT/passwd dans l'arborescence du dépôt. Ce fichier comprenant les noms et mots de passe des utilisateurs respecte la syntaxe classique user:pass.

Avertissement

Ce que vous allez faire maintenant n'est valable que pour cette manipulation. Dans aucune autre situation vous ne devez éditer, modifier ou manipuler des fichiers directement dans le dépôt ! Vous avez été prévenus !

Placez-vous dans le répertoire CVSROOT du dépôt et créez le fichier de mots de passe avec l'utilitaire htpasswd d'Apache :


$ cd /usr/local/moncvs/depot/CVSROOT
$ htpasswd -c passwd nom_utilisateur
Adding password for nom_utilisateur.
New password:
Re-type new password:

Un fichier passwd sera créé. Si vous désirez y ajouter de nouvelles entrées, vous pouvez utiliser la même syntaxe en supprimant l'option -c. A présent, vous devez faire le choix fatidique. Si vous désirez être le seul maître à bord, les manipulations s'arrêtent là. En revanche, si vous désirez permettre un checkout du répertoire CVSROOT avec ce fichier passwd, procédez comme suit :


$ cd ~/ailleurs
$ rm -rf *
$ cvs co CVSROOT
$ cd CVSROOT
$ cp /usr/local/moncvs/depot/CVSROOT/passwd .
$ cvs add passwd
$ cvs commit -m "ajout passwd"

Vous venez d'ajouter une entrée dans la gestion CVS pour le fichier passwd. Il est maintenant accessible pour tous les utilisateurs qui peuvent se connecter au serveur. Attention, ceci implique non seulement des ajouts d'utilisateurs de la part des membres de votre projet, mais également un risque potentiel pour les mots de passe existants. En effet, avoir en sa possession un tel fichier permet de tenter une attaque en force brute en testant toutes les valeurs possibles.

Tout est prêt pour le grand moment. Vous pouvez vous déplacer sur une autre machine du réseau et récupérer le module X57 :


$ export CVSROOT=':server:utilisateur@lamachine:/usr/local/moncvs/depot'
$ cvs login
(Logging in to utilisateur@lamachine)
CVS password:
$ cvs co X57

Si tous les paramètres entrés correspondent à ceux que vous avez définis dans les étapes précédentes, vous devez récupérer sans le moindre problème le module X57 (aka monprojet).

Si vous désirez simplifier les choses, vous pouvez associer un nom d'utilisateur CVS à un nom d'utilisateur du système. Plus clairement, vous pouvez préciser l'identité sous laquelle cvs tournera sur le serveur si l'authentification de l'utilisateur distant réussit. Pour cela, vous devez ajouter un champ dans votre fichier passwd :

# Voici une ligne classique où l'utilisateur authentifié est le même :


nom:XR4EZcEs0szik

# Voici des lignes où les utilisateurs titi et toto provoqueront une exécution de cvs sous l'identité de nom :


titi:ULtgRLXo7NRxs:nom
toto:tGX1fs8sun6rY:nom

Si vous désirez permettre à des utilisateurs anonymes de faire un checkout sur votre dépôt, vous devez tout d'abord ajouter un utilisateur anonymous ou anon. Il s'agit là des noms les plus utilisés mais vous n'êtes absolument pas obligé de respecter cette convention. Ajoutez une entrée à CVSROOT/passwd en validant simplement la demande de mot de passe. Enfin, ajoutez un fichier CVSROOT/readers dans votre dépôt. Ce fichier contiendra la ou les nom(s) des utilisateurs cvs anonymes qui ne possèdent qu'un droit de lecture sur le dépôt. Toute tentative d'écriture de la part de cet ou ces utilisateur(s) entraînera l'affichage du message :


cvs commit: Examining X57
cvs [server aborted]: "commit" requires write access to the repository

Vous avez à présent la base pour administrer vos projets avec CVS. Il existe un grand nombre d'options et de commandes dont nous n'avons pas parlé. Vous pourrez obtenir toutes les explications nécessaires sur le site officiel de CVS à la rubrique "Documentation" ou "FAQ".

Liens

CVS Homepage
http://www.cvshome.org
CVSup
http://www.polstra.com/projects/freeware/CVSup/
Cervisia
http://cervisia.sourceforge.net
LinCVS
http://www.lincvs.org