Eine Liste der verfügbaren DBus-Dienste

65

Gibt es eine Liste der verfügbaren DBus-Dienste?
Ich bin auf einige gestoßen (wie die von NetworkManager, Rhythmbox, Skype, HAL).
Ich frage mich, ob ich eine ziemlich vollständige Liste der angebotenen Dienste / Schnittstellen finden kann.

verrückter freund
quelle

Antworten:

85

Session:

dbus-send --session           \
  --dest=org.freedesktop.DBus \
  --type=method_call          \
  --print-reply               \
  /org/freedesktop/DBus       \
  org.freedesktop.DBus.ListNames

System:

dbus-send --system            \
  --dest=org.freedesktop.DBus \
  --type=method_call          \
  --print-reply               \
  /org/freedesktop/DBus       \
  org.freedesktop.DBus.ListNames

Sie können DFeet auch verwenden, wenn Sie ein GUI-Tool bevorzugen.

don_crissti
quelle
1
@ don-crissti wie listet man mit dbus-sendoder alle objektpfade unter einem service auf gdbus?
Khurshid Alam
1
@ KhurshidAlam - Ich habe hier eine Antwort hinzugefügt .
don_crissti
30

qdbusviewerist dein bester Freund; Sie können damit auch D-Bus-Nachrichten senden:

qdbusviewer zeigt die Registerkarte "Sitzungsbus" mit drei Unterfenstern

Gänseblümchen
quelle
Scheint seit 2014 kaputt. Es listet die Dienste, kann aber keine Nachrichten senden.
Pithikos
5
Ich kann es nicht einmal auf Ubuntu 14.04 starten. Es schlägt fehl mit:qdbusviewer: could not exec '/usr/lib/i386-linux-gnu/qt4/bin/qdbusviewer': No such file or directory
Kasperd
3
@Pithikos d-feetfunktioniert ab heute.
Sherrellbc
@ Herrellbc Bitte als d-feetAntwort hinzufügen , um es sichtbarer zu machen
mivk
27

Der Python-Weg ist der schöne Weg.

Systemdienste:

import dbus
for service in dbus.SystemBus().list_names():
    print(service)

Sitzungsdienste:

import dbus
for service in dbus.SessionBus().list_names():
    print(service)
Pithikos
quelle
Upvoted. Ich habe eine Folgefrage zu Ihrer Antwort gestellt. unix.stackexchange.com/questions/203410/…
user768421
Ich habe eine Frage, in einer Plasma 5-Desktopumgebung wird der Dienst org.kde.Spectacle zum Aufnehmen von Screenshots verwendet (und er funktioniert), aber er ist weder im Systembus noch im Sitzungsbus aufgeführt. Warum ist das so?
Miau
Um denjenigen zu helfen, die vielleicht auf der Suche sind: Für mindestens Python 2.7.13 und 3.6 ist dbus-python als Paket erforderlich , das mit installiert werden kann pip install dbus-python. Das Paket python-dbus ist ebenfalls verfügbar (in den 2 Minuten, die ich versucht habe, konnte ich nicht arbeiten).
bschlueter
6

gdbusist Teil von glib2 und unterstützt Bash-Vervollständigungen. So verwenden Sie es (unter Fedora):

bash-4.4$ source /usr/share/bash-completion/completions/gdbus
bash-4.4$ gdbus call --system --dest <TAB><TAB>

Daraufhin werden alle möglichen Ziele angezeigt. Um eine Liste der verfügbaren Schnittstellen zu erhalten, exportiert DBus die org.freedesktop.DBus.ListNamesMethode. Sie können es aufrufen, indem Sie Folgendes ausführen:

gdbus call --system --dest org.freedesktop.DBus \
           --object-path /org/freedesktop/DBus  \
           --method org.freedesktop.DBus.ListNames

Dies führt leider zu einer unlesbaren Ausgabe. Glücklicherweise ist die Ausgabe eine gültige Python-Ausgabe. Dies ist also möglich:

gdbus call --system --dest org.freedesktop.DBus      \
           --object-path /org/freedesktop/DBus       \
           --method org.freedesktop.DBus.ListNames | \
    python -c 'import sys, pprint; pprint.pprint(eval(sys.stdin.read()))'

Normalerweise mache ich das nicht, aber es ist ein guter Trick, den Ärmel festzuhalten. Ich benutze es, gdbusum Konzepte zu überprüfen und zu beweisen, bevor ich zum Code übergehe. Die Bash-Vervollständigung spart viel Tipparbeit und vermeidet Tippfehler. Wäre schön gdbuseine schönere Ausgabe zu haben.

Geckos
quelle