Open Source im professionellen Einsatz
Linux-Magazin 03/2013
© Jane Rix, 123RF.com

© Jane Rix, 123RF.com

Ein Perl-Tool, um Distributionsrepositories abzufragen

Linux-Analyse-Automat

Passend zum Titelthema: Mike
Schilli nutzt Mouse und Moose, um
Distributionsrepositories abzufragen.

628

Diesmal entstand die Software gewissermaßen als Auftragsarbeit: Die Redaktion brauchte für den Schwerpunkt dieses Magazins ein Tool, das die Update-Server der großen Linux-Distributionen nach Releasedaten durchforstet. Da Perl in dem Ruf steht, gut in komplexen Abfragen und Stringmanipulationen zu sein, widmet sich der folgende Artikel ganz der werkzeuglichen Unterstützung des Schwerpunkt-Themas. Ziel soll ein Skript sein, das die per Kommandozeile übergebene Anfrage entgegennimmt, die verschiedenen Lokalitäten aufsucht, passende Paketnamen ausfiltert, die Datumsangaben einsammelt und zum Schluss die Ergebnisse tabelliert ausgibt.

Die Schwierigkeit besteht nun freilich darin, dass die Distributionen ihre Release-Informationen in unterschiedlichen Formaten anbieten. So liegen die Pakete bei Ubuntu und Debian auf einem FTP-Server – allerdings nicht alle in einem Verzeichnis, sondern aufgespaltet in Unterverzeichnisse, deren Namen aus dem ersten Buchstaben des Paketnamens bestehen ( Abbildung 1 ).

So schlägt das Paket »pulseaudio« bei Debian im Verzeichnis »p« seine Zelte auf, während ein Server in Esslingen alle Fedora-Pakete im Verzeichnis zur Prozessor-Architektur auflistet ( Abbildung 2 ). Open Suse verfährt ähnlich, zeigt aber die Datei-Modifikationsdaten nicht wie ein FTP-Server an, sondern in einem wohl selbst erfundenen Format à la »19-Nov-2012 16:14« ( Abbildung 3 ).

Abbildung 1: Debian und Ubuntu stellen die Releasepakete in zweistufiger Hierarchie per FTP zur Schau.

Abbildung 2: Ein Verzeichnis auf dem FTP-Server von Fedora mit den Paketen und deren Releasedaten.

Abbildung 3: Open Suse wirft alle RPMs in ein Verzeichnis und serviert sie in einem eigenen Datumsformat.

Online PLUS

In einem Screencast demonstriert Michael Schilli das Beispiel: http://www.linux-magazin.de/plus/2013/03

Plugins überwinden Unterschiede

Ein Skript, das diese Informationen von den einzelnen Servern abholt, steht nun vor der Schwierigkeit, dass es einerseits Gemeinsamkeiten zwischen den Repositories gibt, zum Beispiel die FTP-Server-artige Darstellung, aber andererseits auch Unterschiede wie die verschiedenen URLs oder das Datumsformat. Die unterschiedlichen Paketnamen zwischen den Distributionen stellen ein weiteres Problem dar, das sich durch unscharfe Suchen und manuelle Auswahl aber mildern lässt ( Abbildung 4 ).

Abbildung 4: Das Skript dist in Aktion: Verschiedene Distributions-Server berichten ihre Releasedaten des Pulseaudio-Pakets.

Duplizieren verpönt

Code duplizieren gilt in Entwicklerkreisen als missliebig. Grund: Wer in einem der Copy-Paste-Abschnitte eine Kleinigkeit ändert, muss alle Duplikate aufspüren und nachbearbeiten. Die objektorientierte Programmierung bietet deshalb den Mechanismus der Vererbung, und das heute vorgestellte Perl-Skript »dist« macht davon Gebrauch. Es bedient sich nämlich zum Einholen der Informationen mehrerer Plugins, die ihrerseits von anderen funktionsähnlichen Plugins oder Utility-Modulen erben.

Das Skript in Listing 1 definiert eine Klasse »Distro« . Deren Methode »list()« klappert auf einen Suchstring hin die Paketserver von Distributionen ab. Das Skript nimmt die Abfrage auf der Kommandozeile entgegen, etwa »distro pulseaudio« , findet zur Laufzeit heraus, wie viele »Distro« -Plugins der User installiert hat, und ruft der Reihe nach die »list()« -Methode jedes einzelnen auf.

Alle Plugins halten sich an eine vorgegebene Schnittstelle, akzeptieren einen Aufruf der Methode »list()« mit einem Suchstring und geben eine Referenz auf einen Array mit den Treffern zurück. Jeder Treffer besteht aus einer Referenz auf einen Hash mit den Einträgen »pkg« und »mtime« , die den Namen gefundener Pakete und deren letztes Modifikationsdatum in Sekunden seit 1970 enthalten.

Listing 1

dist

01 #!/usr/local/bin/perl -w
02 use strict;
03 use Log::Log4perl qw(:easy);
04 # Log::Log4perl->easy_init($DEBUG);
05
06 my( $query ) = @ARGV;
07 die "usage: $0 query" if !defined $query;
08
09 my $distro = Distro->new();
10 $distro->list( $query );
11
12 ###########################################
13 package Distro;
14 ###########################################
15 use Mouse;
16 use Module::Pluggable
17   require     => 1,
18   search_dirs => ['.'];
19
20 sub list {
21   my( $self, $query ) = @_;
22
23   for my $plugin ( $self->plugins() ) {
24     next unless $plugin->can( "list" );
25
26     print "[$plugin]\n";
27     my $data = $plugin->list( $query );
28
29     for ( @$data ) {
30       print "$_->{ pkg }\t",
31         $plugin->dateformat(
32             $_->{ mtime } ), "\n";
33     }
34   }
35 }

Diesen Artikel als PDF kaufen

Express-Kauf als PDF

Umfang: 4 Heftseiten

Preis € 0,99
(inkl. 19% MwSt.)

Linux-Magazin kaufen

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

Deutschland

Ähnliche Artikel

  • Perl-Snapshot Linux-Magazin 03/2013

    Perlmeister Michael Schilli hat seinen Snapshot verfilmt.

  • Perl-Snapshot

    Test-driven Development mit einer nebenbei generierten Testsuite verspricht Code mit weniger Fehlern. Michael "Perlmeister" Schilli betritt gleich den Pfad der Agilität und findet am Wegesrand zufällig ein passendes, nagelneues CPAN-Modul.

  • Tierische Kurssprünge

    Ein in Perl geschriebenes Pidgin-Plugin ignoriert dröge Börsentage, an denen die Kurse stillstehen, aber schlägt per Instant Message Alarm, falls die Aktien anfangen Achterbahn zu fahren.

  • Schlüsseldienst

    Ein Perl-Skript erspart dem eiligen Nutzer das Herumklicken auf Splash-Pages von Wifi-Providern, indem es Geschäftsbedingungen automatisch abnickt und den Zugriff freischaltet.

  • Der Protokollant

    Trotz Konkurrenz durch andere Messenger, Twitter & Co.: IRC ist populär wie nie. Das Chat-Protokoll lässt außerdem selbst geschriebene Bots als automatische Helferlein zu. Im folgenden Beispiel protokolliert ein solcher Bot die Sitzung und archiviert sie in einer Datenbank.

comments powered by Disqus