Open Source im professionellen Einsatz
Linux-Magazin 04/2011
© BeneA, Photocase.com

© BeneA, Photocase.com

Perl-Skript überwacht D-Bus

Bus-Touristik

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

476

Ich gebe nur ungern zu, dass mein Ubuntu-Laptop zusehends verstaubt, seit mir mein Arbeitgeber vor einem halben Jahr ein Macbook aufgedrängt hat. Dafür gibt es zwei Gründe: Ein schlafen gelegtes Macbook wacht in 99 von 100 Fällen wieder korrekt auf und ist in 5 Sekunden samt Wireless betriebsbereit. Und um ein Backup zu ziehen, stöpselt der User einfach die vorkonfigurierte Backup-USB-Platte ein und braucht keinen Finger zu rühren und keinen Gedanken an den weiteren Ablauf zu verschwenden (Abbildung 1).

Abbildung 1: Auf dem Macbook springt sofort die Backup-Utility Time Machine an, sobald der User das USB-Backup-Drive einstöpselt.

Süchtig nach Schnickschnack

Man könnte das alles als Schnickschnack abtun, aber derartige Zuckerl versüßen den Alltag. Werden sie entzogen, wehrt sich der Körper sofort mit allergischen Reaktionen. Spontane, langgezogene "Waruuum?"-Rufe sind häufig die Folge, sobald es statt Torte wieder nur Diätgerichte gibt. Dabei können auch moderne Linux-Desktops solche Aktionen auslösen. Der von Gnome und mittlerweile auch von KDE verwendete D-Bus stellt einen praktischen Kommunikationskanal zwischen verschiedenen Applikationen her, die dabei nicht direkt voneinander wissen müssen.

Bekommt etwa der Hardware Abstraction Layer (HAL) mit, dass der User einen USB-Stick einstöpselt, verbreitet er diese Nachricht auf dem D-Bus. Andere Applikationen schnappen sie dort auf. Der Gnome-Desktop zum Beispiel mountet den Stick - unter Ubuntu im Verzeichnis »/media« - und zeigt ein Fenster des File-Browsers auf dem Desktop.

Fahr mit im Systembus

Das Einklinken in den D-Bus ist selbst in einer Skriptsprache wie Perl dank des CPAN-Moduls Net::DBus sehr einfach möglich. Das Skript in Listing 1 wählt in Zeile 5 den Systembus aus, der unabhängig von der gerade laufenden Desktopsession systemweite Meldungen sammelt und weitergibt. Alternativ betreibt D-Bus den Session-Bus, der die Daten der aktuellen Usersession bereithält. Die Methode »get_service()« befragt das Busobjekt nach dem Service »org.freedesktop.Hal«, der die HAL-Daten in der Hierarchie »freedesktop.org«, dem D-Bus-Mutterschiff, beherbergt. Die verdrehte Notation dient der hierarchischen Ordnung und ist aus der Java-Welt bekannt.

Listing 1:
»hal-status«

01 #!/usr/local/bin/perl -w
02 use strict;
03 use Net::DBus;
04
05 my $bus = Net::DBus->system();
06 my $hal = $bus->get_service( "org.freedesktop.Hal" );
07
08 my $manager = $hal->get_object(
09   "/org/freedesktop/Hal/Manager",
10   "org.freedesktop.Hal.Manager" );
11
12 my $devices = $manager->GetAllDevices();
13
14 for my $device ( @$devices ) {
15     print "$devicen";
16 }

Über diesen Service versucht nun Zeile 8 mit »get_object()« ein Objekt der Klasse des HAL-Managers einzuholen. In Hochsprachen bietet D-Bus seine Dienste oft als Objekte an, deren Methoden die Busdaten schicken oder empfangen. Der HAL-Manager verfügt über die Methode »GetAllDevices()«, die für jedes angeschlossene und von HAL erkannte Gerät einen beschreibenden String zurückgibt. Abbildung 2 zeigt eine von der For-Schleife ausgegebene Auswahl.

Abbildung 2: Net::DBus verbindet sich mit dem HAL-Manager-Objekt und gibt alle bisher erkannten Hardwareteile aus.

Linux-Magazin kaufen

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

Deutschland

Ähnliche Artikel

comments powered by Disqus

Ausgabe 09/2017

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