freeX: Anonyme Quellen für jeden

Die ausschließlichen Vertriebsrechte an diesem Artikel liegen beim Computer- & Literaturverlag (C&L). Der Artikel darf nicht kopiert oder gar erneut in einer Zeitschrift oder einem Buch veröffentlicht werden ohne vorherige Erlaubnis von C&L. Der Verlag gestattet freundlicherweise die Veröffentlichung auf diesen Seiten. Wer öfter auf diesen Hinweis trifft, sollte sich überlegen, die Zeitschrift freeX zu abonnieren.

Anonyme Quellen für jeden

 

Sourceforge, Debian und andere Projekte stellen anonyme Zugänge zu ihren Quellcode-Archiven über CVS zur Verfügung. Wer hat sich nicht schon gefragt, wie man das schafft? Wurde dort CVS speziell erweitert, um einen anonymen Zugang zum Archiv zu bieten? Oder läßt sich das auch mit Bordmitteln erreichen?

Um eines vorweg klarzustellen: Es ist keine Magie im Spiel und auch kein gepatchtes CVS vonnöten, um einen anonymen Zugang zu einem CVS-Archiv anzubieten.

 

1. CVS-Server einrichten
2. CVS Netzwerk-tauglich machen
3. Accounts anlegen
4. Anonymen Zugang nutzen
5. Hinweis für Debian-Benutzer
6. Öffentlicher Zugang
7. Ressourcen:

Ein anonymer Zugang bietet viele Vorteile. Auf diese Weise kann beliebig vielen Personen der Zugang zum CVS-Archiv gestattet werden, ohne daß jede Person mühsam in die Paßwort-Datei eingetragen werden muß und ohne daß jede Person gleich Schreibrechte auf die Dateien im Archiv erhält. Beliebig viele Personen können so die Entwicklung des Quellcodes direkt verfolgen oder bei der Fehlersuche später nachvollziehen. Bei stark belasteten Servern könnte man auf diese Weise sogar einen CVS-Server als master und weitere als Clients ausweisen, wobei die Clients lediglich lesenden Zugriff auf das Archiv gestatten würden.

Wer einen eigenen CVS-Server betreibt und nicht auf einen bestehenden bei Sourceforge oder BerliOS zurückgreifen möchte, der muß zwangsläufig CVS selbst einrichten. Dieser Artikel beweist, daß die Einrichtung nicht kompliziert ist.

Auf dem CVS-Server werden die Dateien in einem sogenannten Repository verwaltet. Dort gibt es zur weiteren Unterscheidung Module, die jeweils für ein Projekt oder einen Teil eines Projekts stehen. Innerhalb eines Moduls können Dateien und Verzeichnisse beliebig verwendet werden. Die Position des CVS-Depots (CVS-Repositories) wird in der Variablen »CVSROOT« gespeichert oder mit dem Parameter »-d« in der Kommandozeile angegeben. Von einem Modul im CVS-Repository legt man mit dem folgenden Befehl eine aktuelle lokale Kopie an:

   cvs -d /pfad/zum/repository co modulname

Wenn das CVS-Repository auf einem anderen Rechner liegt, auf den man jedoch per »rsh« oder »ssh« zugreifen kann, dann werden der Rechnername und das Protokoll zum Pfad zum Repository hinzugeschrieben:

   cvs -d :ext:rechner:/pfad/zum/repository co modulname

Wenn zudem die normale Remote-Shell »rsh« nicht verwendet werden kann (sie ist aus Sicherheitsgründen oftmals nicht zugelassen), dann wird zusätzlich vorher die Variable »CVS_RSH« entsprechend gesetzt. Das geschieht in einer Bourne Shell mit der folgenden Anweisungsfolge:

   CVS_RSH=ssh
   export CVS_RSH

Dieser Zugang ist jedoch Account-gebunden. Nur die Personen, die auf dem CVS-Server einen Shell-Zugang haben, können auf das CVS-Archiv zugreifen. Das schränkt den Benutzerkreis stark ein und erfordert für neue Leute zudem ein zusätzliches Login. Im folgenden wird daher beschrieben, wie man ein solches Repository für einen größeren Benutzerkreis öffnet.

CVS-Server einrichten

Zuerst wird das CVS-Repository auf dem Server eingerichtet. Auf dieses wird anschließend mit den oben beschriebenen Methoden zugegriffen. Da CVS einige organisatorische Dateien benötigt, reicht es nicht aus, nur das Verzeichnis anzulegen, sondern das Archiv muß mit »cvs init« initialisiert werden. Zusätzlich wird lediglich der Pfad zum Archiv (für »CVSROOT« o.ä.) benötigt. Wenn die CVS-Depots unterhalb von »/var/cvs« liegen sollen, legt der folgende Befehl das freeX-Archiv an:

   cvs -d /var/cvs/freeX init

In dieses Archiv werden nun mit dem »import«-Befehl ein Modul nach dem anderen aufgenommen. Dazu muß man sich in dem Verzeichnis befinden, das ins CVS-Archiv aufgenommen werden soll, nicht außerhalb. Bevor es importiert wird, sollte das Verzeichnis genau untersucht werden, damit nicht versehentlich überflüssige Dateien mit aufgenommen werden. Ein beispielhafter Befehl zum Importieren des Moduls »myIRC« lautet daher:

   cvs -d /var/cvs/freeX import -m Initial myIRC no-vendor no-release

CVS Netzwerk-tauglich machen

Der nächste Schritt besteht darin, das CVS-Archiv auch im Netzwerk anzubieten. Dazu liefert CVS den sogenannten »pserver« mit, der die Authentifizierung über das Netzwerk übernimmt und Zugang zum Archiv gewährt. Für CVS ist der TCP-Port 2401 vorgesehen, der textuell »cvspserver« genannt wird. Dieser sollte mit der folgenden Zeile in der Datei »/etc/services« eingetragen sein:

   cvspserver      2401/tcp        # CVS client/server operations

Die eigentlichen TCP-Verbindungen für CVS werden vom Internet Superserver »inetd« betrieben. Dieser Server nimmt die Verbindung an und gibt sie an CVS weiter. Anschließend werden Authentifizierung und Datenaustausch durchgeführt.

Damit ein CVS-Benutzer nicht auf beliebige Dateien auf dem Server zugreifen kann, muß zusätzlich noch eingestellt werden, welche Archive zur Verfügung stehen. Das geschieht mit dem Parameter »--allow-root=«, von dem quasi beliebig viele angegeben werden können. Zusammen mit der Unterstützung für den TCP-Dämon sieht, der über »/etc/hosts.allow« und »/etc/hosts.access« eine zusätzliche Zugangskontrolle bietet, die entsprechende Zeile für die Konfigurationsdatei »/etc/inetd.conf« wie folgt aus.

   cvspserver  stream  tcp  nowait  root  /usr/sbin/tcpd cvs --allow-root=/var/cvs/freeX pserver

Wird dieses neu eingetragen, muß dem Programm »inetd« das Signal SIGHUP geschickt werden. Auf das Archiv wird jetzt mit dem speziellen CVSROOT »:pserver:« zugegriffen. Die Variable CVSROOT wird dazu wie folgt aufgebaut:

   CVSROOT=:pserver:<:account>@<cvs-rechner>:<cvs-repository>

Accounts anlegen

Noch kann allerdings niemand so auf das Archiv zugreifen, denn es wurden keine Benutzer definiert. Das folgt im nächsten Schritt. Dazu müssen die organisatorischen Dateien erweitert werden. Diese werden im dem Verzeichnis »CVSROOT« im CVS-Archiv gespeichert.

Dieses Verzeichnis unterscheidet sich grundlegend von allen anderen Verzeichnissen im CVS-Archiv. In diesem liegen neben den üblichen Dateien mit RCS-Suffix »,v« auch welche ohne dieses Suffix. In einer Datei »foo,v« sind jeweils alle von RCS (und CVS) benötigten Informationen gespeichert. Da dieses Verzeichnis jedoch für die Verwaltung des Archivs benötigt wird, müssen ein Teil der Dateien auch in der reinen Form vorliegen. Wenn diese Dateien geändert und die Änderungen eingecheckt werden, checkt »cvs« sie selbständig wieder in diesem Verzeichnis aus.

Als nächstes eine Paßwort-Datei erstellt werden, in der für jeden Benutzer des »pserver«-Zugangs das Paßwort eingetragen wird, und in dem festgelegt wird, unter welcher Benutzer-Kennung die Aktionen ausgeführt werden sollen. Dazu wird zuerst eine lokale Kopie vom administrativen Verzeichnis angelegt:

   cvs -d /var/cvs/freeX co CVSROOT

Die erste zusätzliche Datei heißt »passwd«. Sie hat die folgende Struktur:

   anonymous:zhDIk1EoEXiaU:cvsuser
   joey:C0zef6uvOg.JM:cvsuser

Weitere Benutzer werden unten angehängt. Das dritte Feld ist die Benutzer-ID, unter der die Aktionen im Repository für diesen Benutzer ausgeführt werden sollen. Zusätzlich dazu wird eine zweite Datei benötigt, die sicherstellt, daß bestimmte Benutzer nur lesenden Zugriff auf das Archiv haben und keine Schreibberechtigung. Dazu ist die Datei »readers« vorgesehen. In dieser werden zeilenweise die jeweiligen Accounts eingetragen.

Anschließend werden die Dateien mit »cvs add« für die Aufnahme markiert und mit »cvs commit« zum Archiv hinzugefügt.

Die Paßwörter in der Datei »passwd« sind einfach mit dem unter Unix typischen Algorithmus DES verschlüsselt (siehe Manpage crypt(3)). Sie werden mit einem der bekannten Generatoren (z.B. »mkpasswd«) erzeugt oder von diesem einfachen Progrämmchen:

   perl -e 'printf "%s\n", crypt ("pass", "cd");'

Die Dateien liegen jetzt nur in der RCS-Version vor. Wenn zusätzliche Maßnahmen ergriffen werden (spezielle Benutzer-ID für den CVS-Administrator und Änderung der Zugriffsrechte für diese Dateien) oder wenn den Benutzern dieses CVS-Archives ausreichend Vertrauen entgegengebracht wird, können diese Dateien zusätzlich automatisch ausgecheckt werden.

Dazu müssen sie in die Datei »checkoutlist« eingetragen werden. Das Format dieser Datei ist denkbar einfach: ein Dateiname, gefolgt von einem oder mehreren Leerzeichen und eine Fehlermeldung für den Fall, daß die Datei nicht ausgecheckt werden konnte (z.B. wenn die Berechtigungen nicht ausreichten). Die Datei könnte somit wie folgt aussehen:

   passwd  Cannot checkout »passwd«.
   readers Cannot checkout »readers«.

Anonymen Zugang nutzen

Um nach erfolgter Einrichtung Zugang zum CVS-Repository über den »pserver« zu erhalten, muß man sich zuerst mit dem CVS-Befehl »login« auf dem Server einloggen. Anschließend führt man wie bisher die CVS-Aktionen aus. Das Paßwort für den Zugang wird während der Sitzung für weitere Aktionen in der Datei »~/.cvspass« gespeichert. Wenn alle Arbeiten am CVS-Repository durchgeführt sind, logt man sich mit dem CVS-Befehl »logout« aus. Im obigen Beispiel wurde für den Benutzer »anonymous« ein leeres Paßwort verwendet. Nicht selten wird stattdessen »guest« oder »anonymous« genommen. Die Aufforderung, das Paßwort einzugeben, ist daher in diesem Fall einfach mit »Enter« zu quittieren. Die folgenden Befehle sollen als Beispiel dienen:

   cvs -d :pserver:anonymous@localhost:/var/cvs/freeX login
   cvs -d :pserver:anonymous@localhost:/var/cvs/freeX co modul
   # weitere Aktionen
   cvs -d :pserver:anonymous@localhost:/var/cvs/freeX logout

Hinweis für Debian-Benutzer

Die Beschreibung zur Einrichtung des »pserver«-Zugangs im Artikel bezieht sich auf Debian GNU/Linux bis Version 2.2 alias »potato«. Bei neueren Versionen, für »woody« und »unstable«, hat sich der Debian-Entwickler, der das Paket betreut, dieses Problems angenommen und mit mehreren Skripten komfortabler gelöst.

Der Internet Superserver »inetd« ruft dazu nicht mehr direkt das Programm »cvs« auf, sondern einen Wrapper. Dieses Wrapper-Skript bindet seinerseits zuerst eine Konfigurationsdatei (»/etc/cvs-pserver.conf«) ein, in der die verschiedenen CVS-Depots eingetragen werden, die über den »pserver« erreichbar sein sollen, und übernimmt dann die Verbindung vom »inetd«, um normale CVS-Aktivitäten zu gestatten.

In der Datei muß die Variable »CVS_PSERV_REPOS« entsprechend gesetzt werden, die anfangs leer ist. Wenn mehrere CVS-Depots zur Verfügung gestellt werden sollen, müssen alle in dieser Variablen eingetragen werden. Als Trennzeichen wird der Doppelpunkt verwendet, kein Leerzeichen.

Öffentlicher Zugang

Wenn das CVS-Repository bereits anonym zur Verfügung gestellt wird, ist es oftmals gewünscht, daß interessierte Personen leicht im Archiv blättern und lesen können. Dazu sollte das CVS-Archiv im Web dargestellt werden und eine einfache Möglichkeit bieten, Log-Meldungen sowie Diff-Dateien anzuzeigen.

Dieser Wunsch kann leicht erfüllt werden. Mit »cvsweb« und »viewcvs« stehen zwei leistungsfähige CGI-Programme zur Verfügung, die genau diese Aufgabe erledigen. Während »cvsweb« in Perl geschrieben ist, handelt es sich bei »viewcvs« um dessen unabhängige Portierung auf Python. Welches der beiden Pakete letztendlich verwendet wird, ist also Geschmackssache.

Die Konfiguration beider Programme ist sehr einfach und beschränkt sich im Prinzip auf die Aufzählung der vorhandenen CVS-Depots, die im Web dargestellt werden sollen. Dazu gibt es die Dateien »/etc/cvsweb.conf« bzw. »/etc/viewcvs.conf«. Für »cvsweb« müssen in der entsprechenden Datei die Variablen »%CVSROOT« und »$cvstreedefault« konfiguriert werden, bei »viewcvs« sind es »cvs_roots« sowie »default_root«.

Ressourcen:

Martin Schulze
Quelle: freeX 6/01