Ein Perl-Tool, um Distributionsrepositories abzufragen
Linux-Analyse-Automat
Passend zum Titelthema: Mike
Schilli nutzt Mouse und Moose, um
Distributionsrepositories abzufragen.
© Jane Rix, 123RF.com
Passend zum Titelthema: Mike
Schilli nutzt Mouse und Moose, um
Distributionsrepositories abzufragen.
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).
Online PLUS
In einem Screencast demonstriert Michael Schilli das Beispiel: http://www.linux-magazin.de/plus/2013/03
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).
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 }
Umfang: 4 Heftseiten
Preis € 0,99
(inkl. 19% MwSt.)
Alle Rezensionen aus dem Linux-Magazin
Im Insecurity Bulletin widmet sich Mark Vogelsberger aktuellen Sicherheitslücken sowie Hintergründen und Security-Grundlagen. mehr...