Open Source im professionellen Einsatz
Linux-Magazin 01/2006
© photocase.com

© photocase.com

Automatische Versionierung von Dateien mit Perl-Daemon

Auferstanden aus Archiven

Ein Perl-Daemon beschert gelöschten Files ein zweites Leben und kann ungewollte Änderungen ungeschehen machen. Dafür überwacht er mit Hilfe der Kernelschnittstelle Dnotify eine Verzeichnishierarchie und integriert alle darin gefundenen Dateien transparent in ein eigenes Versionskontrollsystem.

726

Während früher Phasen eines Projekts probieren Entwickler gerne mehrere Möglichkeiten aus, selten sind sie gut beraten, schon die ersten Ergebnisse der zentralen Versionskontrolle zu übergeben. Existiert zum Beispiel das Repository noch nicht oder steht dessen Struktur noch nicht fest, arbeiten alle praktisch ohne Sicherheitsnetz. Manches Stück guter Code fällt so schnell einem übereilten »rm *« oder einem großflächigen Delete im Editor zum Opfer.

Das Perl-Skript »noworries« kann in einer solchen Situation eine eigene automatische Versionskontrolle übernehmen. Bei jedem Sichern einer Datei im Editor und bei jeder Dateimanipulation in der Shell (wie »rm« oder »mv«) erhält ein unsichtbar im Hintergrund laufender Daemon eine Nachricht. Daraufhin schnappt er sich die erzeugte oder geänderte Datei und versioniert sie mit RCS.

Für den Benutzer läuft der Vorgang unsichtbar ab. Abbildung 1 zeigt, wie ein Benutzer zunächst in der Shell eine neue Datei erzeugt und dann löscht. Ohne Perl-Hexerei wäre das File »Datei« damit endgültig verschwunden, doch ein Aufruf von »noworries -l Datei« zeigt an, dass der Versionierer 17 Sekunden zuvor eine Sicherungskopie angelegt hat. »noworries -r 1.1 Datei« holt sie hervor und schreibt sie nach STDOUT.

Kein Trick

Das Skript benutzt keineswegs manipulierte Shellfunktionen, alles geht mit rechten Dingen zu. Allerdings läuft im Hintergrund eine Instanz des Skripts mit der Option »-w« (watch) und bespitzelt den File Alteration Monitor (FAM), der wiederum an der Dnotify-Schnittstelle des Betriebssystemkernels lauscht. Immer wenn das Dateisystem ein neues Verzeichnis oder eine Datei erzeugt, verschiebt, löscht oder deren Inhalt manipuliert, kommt eine Nachricht über den Vorfall im Kernel an. Der File Alteration Monitor dockt sich an Dnotify an und bringt sein Interesse an Ereignissen in bestimmten Dateiverzeichnissen zum Ausdruck.

Im CPAN gibt es als passendes Perl-Modul SGI::FAM, das die C-Schnittstelle nach Perl verlagert. Ein Aufruf der Methode »next_event()« blockt den Daemon dann so lange, bis ein Ereignis eingetroffen ist. CPU-intensives Pollen ist daher nicht mehr erforderlich.

Abbildung 2 zeigt ein weiteres Beispiel. Es erzeugt zunächst eine Datei, die es dann zweimal hintereinander modifiziert. Im Hintergrund hat der Daemon deswegen drei Versionen angelegt (1.1, 1.2 und 1.3). Der Aufruf »noworries -l Datei« zeigt sie anschließend an. Daran ändert sich auch nichts, wenn ein anderer Prozess die Datei zwischenzeitlich gelöscht hat.

Mit der Option »-r 1.2« wählt der Benutzer die mittlere Version aus und leitet die Ausgabe zurück in die Datei »Datei«, die der Daemon natürlich sofort erneut versioniert. Abbildung 3 zeigt dessen Aktionen, die er der Ordnung halber in der Logdatei »/tmp/noworries.log« protokolliert.Das Skript »noworries« kümmert sich um alle Dateien und Verzeichnisse in beliebiger Tiefe unter »~/noworries« im Homeverzeichnis des Benutzers. Das ist die Spielwiese, auf der er gerne neue Verzeichnisse anlegen oder Tarbälle extrahieren kann.

Parallel dazu baut der Daemon mit jeder neuen Datei eine gleichartige Verzeichnisstruktur unter »~/.noworries.rcs« auf. Jedes Unterverzeichnis darin enthält ein Verzeichnis »RCS«, in dem die versionierten Dateien lagern. RCS ist ein Unix-Urgestein, Versionskontrollsysteme wie CVS oder Perforce verwenden es noch heute.

Abbildung 1: Hier bekommt eine Datei wieder Leben eingehaucht, nachdem der Benutzer sie zuerst löschte. Retter ist der Perl-Daemon im Hintergrund.

Für das Einchecken einer Datei »datei« ist die folgende kurze Kommandosequenz zuständig:

echo "Daten!" >datei
mkdir RCS
ci datei
co -l datei


Der Befehl »ci« aus dem RCS-Fundus erzeugt eine Versionsdatei »RCS/datei,v«. Das anschließende Auschecken über »co« mit der Option »-l« (für lock) holt die letzte Version wieder zurück ins aktuelle Verzeichnis. Verändert man anschließend »datei«, gefolgt von einer weiteren »ci/co«-Kommandosequenz, liegen schon zwei Versionen vor, die »co« separat hervorholen kann. Das ebenfalls aus dem RCS-Fundus stammende Programm »rlog« erlaubt es, Meta-Informationen über die eingecheckten Dateiversionen anzusehen.

Funktionsimport

Die Namen dieser Hilfsprogramme definiert Listing 1 in den Zeilen 18 bis 20. Sie müssen allerdings im »PATH« liegen, damit »noworries« sie findet, ohne den Pfad zu kennen. Falls nötig, lassen sich die vollständigen Pfade einkodieren.

Abbildung 2: An eine neu angelegte Datei wird in zwei Einzelschritten jeweils eine Zeile angehängt. Anschließend holt »noworries« auf Anfrage wieder die ältere Version 2 hervor.

»noworries« nutzt die von Sysadm::Install exportierten Funktionen »mkd« (Verzeichnis erzeugen), »cp« (Datei kopieren), »cd« (Verzeichnis wechseln) oder »cdback« (zurück zum alten Verzeichnis) und »tap« (Programme ausführen und Ausgaben aufsammeln), die alten Snapshot-Hasen natürlich allesamt schon aus [4] bekannt sind.

Linux-Magazin kaufen

Einzelne Ausgabe
 
Abonnements
 
TABLET & SMARTPHONE APPS
Bald erhältlich
Get it on Google Play

Deutschland

Ähnliche Artikel

  • Erwachet!

    Pünktlichkeit ist die Höflichkeit der Könige. Ein Perl-Daemon liest I-Calendar-Dateien mit Meeting-Terminen ein und alarmiert den User auf individuelle Weise kurz vor Beginn der Veranstaltung.

  • Bus-Touristik

    Sobald der D-Bus einen eingesteckten USB-Stick meldet, startet ein Perl-Daemon automatisch ein Backup mit Progressanzeige auf dem Desktop.

  • Perl-Snapshot

    Damit ein Anwender schnell über womöglich ungewollte Zu- und Abgänge in seinem Netzwerk informiert wird, speichert ein Perl-Daemon periodisch die Daten von Nmap-Scans und gibt sie über ein eingebautes Webinterface an Nagios weiter.

  • Perl-Snapshot

    Push-Notifications auf sein Handy halten den abwesenden Hausherrn darüber auf dem Laufenden, welche Clients sich im WLAN zu Hause an- und abmelden.

  • Am Fließband

    Beim halbautomatischen Umwandeln von gedruckten Zeitschriftenartikeln ins PDF-Format hilft das heute vorgestellte Perl-Skript. Den Ablauf triggert ein Taster am Scanner.

comments powered by Disqus

Ausgabe 06/2017

Artikelserien und interessante Workshops aus dem Magazin können Sie hier als Bundle erwerben.