Aktionen bei Anwendungen auslösen

D-Bus unter Linux zur Fernsteuerung von Programmen nutzen

Linux krankt an vielen Stellen daran, dass einheitliche Schnittstellen für Entwickler fehlen. Dies bemerkt schon, wer nur einfache Skripte verteilen möchte. Doch die Desktopumgebungen, die architekturübergreifende Funktionen bieten wollen, geben sich zugeknöpft. Der Weg über den D-Bus zum Steuern von Programmen hilft.

Lösung: Die gesuchten Ressourcen sind unter Linux über den sogenannten D-Bus erreichbar. Dieses Interface soll alle zugänglichen Funktionen und Zustandsvariablen des Systems in einer Baumstruktur vereinen. Leider ist der D-Bus zwar sehr logisch, aber nicht gerade einsteigerfreundlich aufgebaut. Am Beispiel des KDE-Mixers soll gezeigt werden, wie sich die gesuchten Elemente finden und verwenden lassen.

Auf den D-Bus kann mit dem Programm qdbus zugegriffen werden. Startet man diesen Befehl alleinstehend, so gibt er eine Liste von an den Bus angeschlossenen Programmen aus. Auf diesem Wege lassen sich nicht nur die Kernfunktionen des Desktops manipulieren, auch beispielsweise der Messenger Kopete oder die Medienbibliothek Rhythmbox schließen sich an den D-Bus an. Die Namen der einzelnen Teilnehmer sind dabei nach dem Prinzip org.(Programmgruppe).(Programm) aufgebaut. Der Systemmixer von KDE nennt sich kmix, in diesem Fall ist also der Eintrag org.kde.kmix gesucht.

Promptlos: Mit D-Feet lässt sich der D-Bus auch grafisch erforschen.
Promptlos: Mit D-Feet lässt sich der D-Bus auch grafisch erforschen.
Foto: meeGo-Team

Die angeschlossenen Programme bieten auf dem D-Bus Objekte an, die verschiedene Funktionseinheiten der Anwendung repräsentieren. Diese lassen sich im hier besprochenen Fall betrachten, indem man qdbus org.kde.kmix in der Kommandozeile eingibt. In vielen Fällen sind die Namen selbsterklärend, in manchen jedoch benötigt der Anwender etwas Hintergrundwissen. Hat man bereits einmal hardwarenah auf Linux-Geräte zugegriffen, so ist bekannt, dass jene durchnummeriert werden, oft angefangen beim Standardgerät. Wir suchen also im einfachsten Fall nach der Funktionseinheit Mixer0.

Da die Objekte in Pfaden geordnet sind, findet sich der Mixer schnell als /Mixer0, ganz wie in einem Dateisystem. Nach gleichem Muster wie oben können die Inhalte der Funktionseinheit mit qdbus org.kde.kmix /Mixer0 abgefragt werden. Die daraufhin angezeigten Elemente stellen Kanäle dar, mit denen sich Daten zwischen Kommandozeile und Daemon verschieben lassen. Den Namen des Kanals vorangestellt ist jeweils das Wort method, sowie die Art seines Rückgabewertes. Mit den Aufrufen, die void, also nichts zurückgeben, lassen sich Steuerbefehle erteilen; jene mit anderen Rückgabewerten fragen bestimmte Zustände ab.

Wieder ist die Namensgebung selbsterklärend: Um die Lautstärke zu steuern, benötigt man die Funktionen org.kde.KMix.decreaseVolume beziehungsweise increaseVolume. Diese lassen sich wieder mit qdbus auslösen. So steigert der Befehl qdbus org.kde.kmix /Mixer0 org.kde.KMix.increaseVolume die Lautstärke um einen Schritt. Alternativ ließe sich mit dem Aufruf qdbus org.kde.kmix /Mixer0 org.kde.KMix.setAbsoluteVolume 50 ein absoluter Lautstärkewert von 50 einstellen.

Stellt die Funktion hingegen eine Abfrage dar, so gibt qdbus den empfangenen Wert an das Skript zurück. In einem BASH-Skript würde mit vol=`qdbus org.kde.kmix /Mixer0 org.kde.KMix.absoluteVolume` die momentane Lautstärke die Variable vol eingelesen. Wollte man diese halbieren, so könnte man zum Beispiel mit qdbus org.kde.kmix /Mixer0 org.kde.KMix.setAbsouluteVolume $((vol / 2)) die Hälfte des momentanen Wertes neu zuweisen.

Wie erwähnt lassen sich auf diese Weise sehr viele Programme ansteuern. Sofern keine willkürlichen Funktionen gedankenlos ausgelöst werden, kann also beliebig gestöbert werden. So findet sich oftmals ein Fernzugang zu Anwendungen, die von Haus aus kein Steuerprogramm mitbringen. Dank der logischen Struktur des D-Bus‘ lässt sich ein solches dann sehr schnell nach den eigenen Bedürfnissen zusammenstellen.

Produkte: Dieses Verfahren ist auf allen modernen, mit D-Bus ausgestatteten Linux-Systemen anwendbar. Ob dieser läuft, erkennt man leicht an der Ausgabe von qdbus. Auf älteren Systemen ist häufig noch der obsolete DCOP vorhanden, der aber je nach Desktopumgebung unterschiedlich aufgebaut ist. (dre)