SVN Web Administration – Server einfach managen

Seit einiger Zeit betreiben wir einen SVN zur Quelltextverwaltung. Dieser ist mit einem Redmine Projektmanagementtool vernetzt.

Die Administration von Redmine geschieht über eine komfortable Web-Oberfläche. Für den SVN-Server habe ich jedoch noch keine analog einfach Weboberfläche zur Administration gefunden. Aktuell habe ich mich wieder mit dem Thema Administration von SVN beschäftigt und die folgende Oberfläche erstellt.

Zuerst der Verweis auf den ursprünglichen Ersteller dieses Webinterfaces. Ich habe nicht von Null aus angefangen, sondern konnte dankenswerterweise auf die wesentlichen Teile von Jaswinder zugreifen. Das Skript war ursprünglich auf die Verwendung unter Windows optimiert.

Voraussetzungen

Die Anforderungen an das Tool sind möglichst minimal gehalten, insbesondere auf die Verwendung einer Datenbank wurde verzichtet:

  • PHP 5.3+
  • Funktionierender system() Befehl in PHP (cmd/exec)
  • Alle SVN Repositories befinden sich auf dem Rechner in genau einem Ordner, bspw. /var/lib/svn
  • SVN Reposities und Dateien müssen per PHP veränderbar sein

Die aktuelle Debian version ist Debian 10 – Codename Buster. Folgt man dieser SVN-Installation [Link], ist die Basis für diese Applikation bereits gelegt. Es fehlt nur noch die Installation von PHP, welche unter Debian folgenderweise installiert werden kann:

apt install php5 libapache2-mod-php5

Arbeitsweise

  • Die Konfiguration erfolgt in der config.php
  • Alle Repositories aus dem angegebenen Verzeichnis (config.php) werden angezeigt
    • Zur Sicherheit wird nach der Datei <REPOSITORY>/conf/svnserve.conf gesucht, wenn diese im Verzeichnis liegt, ist es tatsächlich ein Repository
  • Berechtigungen, User und Groups werden in Dateien gespeichert (im Unterordner „_config“. Die Benutzer und Passwörter werden lesbar gespeichert.
  • Die Berechtigungsdateien werden bei jeder Änderung neu geschrieben. Deswegen sollten Änderungen nur sehr bedacht vorgenommen werden.

Installation

Apache

Damit der SVN-DAV-Server und dieses Webinterface auf der gleichen Maschine laufen können, müssen wir uns zuerst den Apache vornehmen und für zwei Ports öffnen. Sonst müssen später zusätzliche Handgriffe vorgenommen werden, um das System weiter zu betreiben (insbesondere für neue Repositories). Dazu fügen wir in der /etc/apache2/ports.conf einen zweiten Listen Port ein. Für meine Konfiguration wird Port 88 hinzugefügt:

nano /etc/apache2/ports.conf
Listen 88

Als nächstes wird der Apache so konfiguriert, dass DAV SVN nur auf Port 80 horcht. Dazu muss die Konfigurationsdatei /etc/apache2/mods-enabled/dav_svn.conf mit einem Virtualhost auf Port 80 versehen werden.

nano /etc/apache2/mods-enabled/dav_svn.conf

Diese Konfiguration kann dann beispielsweise so aussehen:

<VirtualHost *:80>
    <Location />
        DAV svn
        SVNParentPath /var/lib/svn/
        SVNListParentPath on
        AuthType Basic
        AuthName "Subversion Repository"
        AuthUserFile /var/www/html/svnadmin/_config/svn_users.conf.crypt
        AuthzSVNAccessFile /var/www/html/svnadmin/_config/svn_permissions.conf
        Require valid-user
    </Location>
</VirtualHost>

Jetzt noch den Apache durchstarten, damit die Konfiguration gezogen wird:

service apache2 restart

svnadmin

Als Ergebnis des vorherigen Kapitels hört nun DAV SVN auf Port 80 und der Apache kann zusätzlich Webseiten auf Port 88 bereitstellen. Damit auf dem http Port analog zum SVN Port eine kleine Webseite angezeigt wird (/var/www/html ist der Standard-Pfad), habe ich folgende index.php erstellt, die sowohl die verfügbaren Repositories anzeigt, als auch den Link zur Admin Oberfläche. In dieser Datei muss der absolute Pfad angegeben werden, wo die Repositories liegen:

<html><head><title>Collection of Repositories</title></head>
<body>
 <h2>Administration of SVN</h2>
	<a href="/svnadmin">Administration Interface</a>
 <h2>Collection of Repositories</h2>

<ul>
<?php
$path = "/var/lib/svn";
$dir = new DirectoryIterator($path);
$dir_array = array();
foreach ($dir as $fileinfo) {
    if ($fileinfo->isDir() && !$fileinfo->isDot()) {
	$dir_array[] = array(
			"filename" => $fileinfo->getFilename());
    }
}
asort($dir_array);
foreach ($dir_array as $dir) {
	echo '<li><a href='.$dir["filename"].'>'.$dir["filename"].'</a></li>';
}
?>
</ul>
</body></html>

Mit dieser Vorbereitung kann svnadmin herunter geladen werden (aktuelle Downloads immer unter „Download“ weiter unten) und nach /var/www/html entpackt werden. Damit sind die Dateien bereits am richtigen Platz (/var/www/html/svnadmin) und müssen nur noch konfiguriert werden.

cd /var/www/html/svnadmin
nano config.php

Nach der Konfiguration dieser Datei muss noch überprüft werden, ob auch die Konfiguration der /etc/apache2/mods-enabled/dav_svn.conf stimmt.

nano /etc/apache2/mods-enabled/dav_svn.conf

Hier ist es wichtig, dass die Parameter AuthUserFile und AuthzSVNAccessFile auf die korrekten Dateien zeigen. Insbesondere die AuthUserFile muss auf die Datei mit den verschlüsselten Passwörtern zeigen, nicht auf die plaintext Kopie im Konfigurationsordner.

<VirtualHost *:80>
    <Location />
        DAV svn
        SVNParentPath /var/lib/svn/
        SVNListParentPath on
        AuthType Basic
        AuthName "Subversion Repository"
        AuthUserFile /var/www/html/svnadmin/_config/svn_users.conf.crypt
        AuthzSVNAccessFile /var/www/html/svnadmin/_config/svn_permissions.conf
        Require valid-user
    </Location>
</VirtualHost>

Den Apache zur Sicherheit nochmals durchstarten, damit die Konfiguration aktiv wird. Danach sollten wir sowohl den DAV SVN auf Port 80, als auch das Webinterface über Port 88 erreichen können.

service apache2 restart

Verwendung

Das Webinterface ist in drei wesentliche Teile unterteilt und hat in diesem jeweiligen Teil die folgenden Funktionen.

Users

svnadmin users
  • Neuen Benutzer anlegen mit Benutzername und Passwort
  • Passwort von bestehendem Benutzer ändern
  • Benutzer löschen

Groups

2016-10-25-09_45_14-fotos
  • Neue Gruppe anlegen
  • Gruppe Löschen
  • Benutzer zu einer Gruppe zuordnen
  • Zuordnung von Benutzer zu Gruppe entfernen

SVN Repositories

2016-10-25-09_44_04-fotos
  • Neues Repository anlegen
  • Gruppe oder Benutzer für ein Repository berechtigen (als READ=r oder READWRITE=rw). Gruppen haben ein vorgestelltes „@“
  • Berechtigung verändern (rw -> r oder r -> rw)
  • Berechtigung für ein Repository einem Benutzer oder einer Gruppe entziehen (Benutzer/Gruppe wird nicht gelöscht)