Probleme mit dem Tidy Gem unter Ubuntu 8.04 LTS

In einem unserer Ruby on Rails Projekte wird benutzergeneriertes HTML ausgegeben. Um dabei (leider nicht seltene) Fehler im HTML zu reparieren, setzen wir Tidy ein. Auf unseren Entwicklungssystemen (Mac OS X 10.5) hatten wir damit keine Probleme. Leider gab es aber beim ersten Deploy auf unserem Staging Server (Ubuntu 8.04, Passenger und Enterprise Ruby) keine Exception, sondern direkt eine weiße Seite.

Eine weiße Seite spricht immer für ein tieferliegendes Problem, so war auch im production.log nichts zu finden, dafür aber im error.log des Apache.

/opt/ruby-enterprise/lib/ruby/gems/1.8/gems/tidy-1.1.2/lib/tidy/tidybuf.rb:40: 
  [BUG] Segmentation fault

Im ersten Moment hatte ich Enterprise Ruby im Verdacht, da es offensichtlich ein Ruby Problem war. Umschalten auf das Default-Ruby der Ubuntu Installation brachte aber keine Veränderung.

In Google wurde ich dann fündig, wie man auf RubyForge nachlesen kann.

Kurz und Knapp, das aktuellste Tidy Gem hinkt leider noch hinter der unter Ubuntu installierten Tidy-Version (nicht gem) hinterher. Seit Tidy 0.99 gibt es eine Änderung in der Tidy Buffer-Structure, durch Hinzufügen einer Zeile in der tidybuf.rb lässt sich das Problem beheben.

Vorher:
TidyBuffer = struct [
    "byte* bp",
    "uint size",
    "uint allocated",
    "uint next" 
]
Nachher:
TidyBuffer = struct [
    "int* allocator",
    "byte* bp",
    "uint size",
    "uint allocated",
    "uint next" 
  ]

Beim Updaten der Gems muss nun nur darauf geachtet werden, dass falls eine neue Version des Tidy Gems released wird, dort gegebenenfalls wieder gepatcht werden muss.

Schlüsselwörter: ruby, server, tidy

Von Stefan Haubold vor 564 Tagen hinzugefügt (0 Kommentare)

Hosting von Git-Repositories mit Gitosis

Schon wieder Git. Nach den Artikeln zu Git, iDisk und so und GitNub hat mich in den letzten Tagen beschäftigt, wie man Git-Repositories auf einem Server hosten kann, beispielsweise um diese der Allgemeinheit zur Verfügung zu stellen (man kann natürlich auch einfach github verwenden). Dabei stieß ich auf Gitosis und es entstand die nachfolgende kurze Anleitung.

Ausgangsbasis

Um beim Lesen nicht durcheinander zu kommen, sind Befehle, die auf dem Server einzugeben sind, mit dunklem Hintergrund und heller Schrift formatiert. Beispiel:

uname

Befehle, die auf dem Client einzugeben sind, haben entsprechend einen hellen Hintergrund und dunkle Schrift. Beispiel:

uname

Für alle nachfolgenden Schritte wird davon ausgegangen, dass auf dem Server schon Git und Python (inkl. dem Paket Setuptools) installiert sind sowie ein Benutzer mit root- oder sudo-Rechten verfügbar ist. In meinem Fall lief auf dem Server Ubuntu Linux, die Anleitung sollte sich aber leicht auf andere Linux-Varianten anpassen lassen (sofern überhaupt Änderungen notwendig sind). Auf dem Client verwende ich Mac OS X 10.5, die Installation von Git kann man in einem älteren Beitrag nachlesen.

Installation & Konfiguration

  1. Git-Repository von Gitosis klonen:
    cd ~
    mkdir sources
    cd sources
    git clone git://eagain.net/gitosis.git
  2. Gitosis installieren:
    cd gitosis/
    sudo python setup.py install
  3. Benutzer "git" anlegen:
    sudo adduser --system --shell /bin/sh --gecos 'git version control' --group --disabled-password --home /home/git git
    Mit den letzten beiden Parametern wird ein Login per Passwort deaktiviert und das Heimatverzeichnis des Benutzers auf /home/git gesetzt.

  4. Im nächsten Schritt muss der eigene öffentliche SSH-Schlüssel auf den Server kopiert werden. Zunächst ist zu prüfen, ob ein solcher schon existiert:
    ls ~/.ssh/id_rsa.pub
    Falls ja, direkt weiter mit dem nächsten Schritt. Falls nein, einen neuen Schlüssel erzeugen:
    ssh-keygen -t rsa
  5. Den Öffentlichen SSH-Schlüssel auf den Server kopieren:
    scp -P 10022 ~/.ssh/id_rsa.pub USER@SERVER:/tmp
    USER ist dabei durch den Benutzernamen auf dem Server, SERVER durch den Servernamen zu ersetzen.

  6. Zurück auf dem Server wird nun Gitosis initialisiert und dabei der eigene SSH-Schlüssel in die Liste der autorisierten Benutzer aufgenommen:
    sudo -H -u git gitosis-init < /tmp/id_rsa.pub
  7. Je nach Debian-Version kann es notwendig sein, noch folgende Rechte zu setzen (siehe Kommentare von Wir und MacLovin):
    chmod 750 /home/git/repositories/gitosis-admin.git/hooks/post-update
  8. Zum Schluss kann der gitdaemon gestartet werden, sofern ein öffentlicher Zugriff auf eines der Repositories gewünscht ist (Konfiguration der Rechte wird weiter unten beschrieben):
    sudo -u git git-daemon --base-path=/home/git/repositories/
    Der Daemon läuft auf Port 9418, je nach Konfiguration des Servers müssen möglicherweise die Regeln einer vorhandenen Firewall angepasst werden.

Verwalten von Repositories

Die Verwaltung von Repositories und (wie wir später sehen werden) von Benutzern geschieht bei Gitosis über ein eigens dafür vorgesehenes Git-Repository, welches bei der Installation auf dem Server erzeugt wurde. Es lässt sich wie folgt auf dem Client klonen:

cd ~/Projects
git clone git@SERVER:gitosis-admin.git

SERVER ist wiederum durch den Namen des Servers zu ersetzen. Da wir vorhin den eigenen öffentlichen SSH-Schlüssel auf den Server kopiert haben, ist kein Passwort notwendig.

Das Repository besteht grundsätzlich aus der Datei gitosis.conf zur Verwaltung der Repositories und Benutzer sowie dem Verzeichnis keydir, in dem die SSH-Schlüssel ablegt sind:

$ cd gitosis-admin/
$ ls -ln
total 8
-rw-r--r--  1 501  20  167  3 Jan 19:57 gitosis.conf
drwxr-xr-x  4 501  20  136  3 Jan 19:57 keydir

Die Datei gitosis.conf enthält im initialen Zustand folgende Zeilen:

[gitosis]

[group gitosis-admin]
writable = gitosis-admin
members = tom@mymac

Der Abschnitt "group gitosis-admin" definiert eine neue Benutzergruppe mit dem Namen "gitosis-admin", die Schreibzugriff auf das Repository "gitosis-admin" hat und derzeit nur aus einem Mitglied "tom@mymac" besteht. "tom" ist hierbei mein lokaler Benutzername, "mymac" der Name meines Client-Rechners. Entsprechend enthält das Verzeichnis keydir eine Datei mit dem Namen tom@mymac.pub.

Ein neues Repository kann nun erzeugt werden, in dem folgende Zeilen der Datei gitosis.conf hinzufügt werden:

[group developers]
writable = test
members = tom@mymac

Das Repository hat hier den Namen "test", gehört zur Gruppe "developers" und nur mein eigener Benutzer "tom@mymac" hat darauf Schreibrechte. Im Prinzip hätte es auch ausgereicht, den Bezeichner "test" an die obige Zeile "writable = gitosis-admin" mit Leerzeichen getrennt anzuhängen. Es ist aber aus meiner Sicht sinnvoll, gleich von Anfang an die Repositories für Projekte vom Repository für die administrativen Aufgaben zu unterscheiden.

Nach Speichern der Datei gitosis.conf wird nun gitosis-admin eingecheckt und auf den Server geschoben ("push"):

git commit -a -m "Created repository test." 
git push

Damit hat "tom@mymac" Zugriff auf das Repository "git@SERVER:test.git", das Repository selbst existiert aber noch nicht und muss entsprechend angelegt werden:

cd ~/Projects
mkdir test
cd test
git init
git remote add origin git@SERVER:test.git

Hat man bereits ein Projektverzeichnis (egal ob mit oder ohne Dateien), kann der Aufruf von "mkdir test" entfallen. Anschließend können Dateien dem Projekt hinzugefügt und eingecheckt werden. Beispiel:

echo "This is a test file." > README
git add README
git commit -m "Initial revision." 

Beim "push" auf den Server wird schlussendlich das Repository erzeugt:

git push origin master:refs/heads/master

Verwalten von Benutzern

Bisher hat auf das erzeugte Test-Repository lediglich der Benutzer "tom@mymac" Lese- und Schreibzugriff. Weitere Benutzer mit denselben Rechten können erstellt werden, indem diese dem Admin ihren öffentlichen SSL-Schlüssel zur Verfügung stellen. Angenommen, der Benutzer "joey@hismac" schickt seinen Schlüssel, dann sind folgende Schritte durchzuführen:

cd ~/Project/gitosis-admin
cp ~/Download/joey@hismac keydir

In der Datei gitosis.conf ist der Benutzer der Gruppe "developers" hinzuzufügen:

[group developers]
writable = test
members = tom@mymac joey@hismac

Dann weiter im Terminal:

git add .
git commit -m "Added joey to project test." 
git push

Will man das Repository hingegen für die Allgemeinheit mit Leserechten veröffentlichen (also ohne Abfrage von Benutzername und Passwort), muss auf dem Server die Datei git-daemon-export-ok innerhalb des Repositories erzeugt werden,

sudo touch /home/git/repositories/test.git/git-daemon-export-ok

und ist dann wie folgt klonbar:

git clone git://SERVER/test.git

Damit endet dieser Artikel über Gitosis. Für weitere Dokumentation sei auf die README-Datei von gitosis verwiesen.

Kommentare, Fragen und Kritik sind wie immer herzlich willkommen.

Schlüsselwörter: git, server, versionskontrolle

Von Thomas Dohmke vor 611 Tagen hinzugefügt (22 Kommentare)

Auch abrufbar als: Atom

Twitter

Uns auf Twitter verfolgen: