Une liste des services DBus disponibles

65

Existe-t-il une liste des services DBus disponibles?
Je suis tombé sur quelques-uns (comme ceux fournis par NetworkManager, Rhythmbox, Skype, HAL).
Je me demande si je peux trouver une liste assez complète des services / interfaces fournis.

folle amie
la source

Réponses:

85

Session:

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

Système:

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

Vous pouvez également utiliser DFeet si vous préférez un outil graphique.

don_crissti
la source
1
@ don-crissti comment lister tous les chemins d'objet sous un service avec dbus-sendou gdbus?
Khurshid Alam
1
@ KhurshidAlam - J'ai ajouté une réponse ici .
don_crissti
30

qdbusviewerEst ton meilleur ami; il vous permet également d’envoyer des messages D-bus:

qdbusviewer montrant l'onglet Session Bus avec trois sous-panneaux

Marguerite
la source
Semble cassé depuis 2014. Il répertorie les services, mais ne peut pas envoyer de messages.
Pithikos
5
Je ne peux même pas le démarrer sur Ubuntu 14.04. Il échoue avec:qdbusviewer: could not exec '/usr/lib/i386-linux-gnu/qt4/bin/qdbusviewer': No such file or directory
kasperd
3
@Pithikos d-feetfonctionne à partir d'aujourd'hui.
sherrellbc
@sherrellbc S'il vous plaît envisager d'ajouter d-feetcomme une réponse pour le rendre plus visible
mivk
27

La façon python est la belle façon.

Services système:

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

Services de session:

import dbus
for service in dbus.SessionBus().list_names():
    print(service)
Pithikos
la source
Upvote. J'ai posé une question de suivi à votre réponse. unix.stackexchange.com/questions/203410/…
user768421
J'ai une question: dans un environnement de bureau Plasma 5, le service org.kde.Spectacle est utilisé pour prendre une capture d'écran (et cela fonctionne), mais il n'est ni répertorié dans le bus système ni dans le bus de session. Pourquoi?
Meow
Pour aider ceux qui cherchent peut-être: au moins pour python 2.7.13 et 3.6, le paquet nécessaire à cet effet est dbus-python , installable avec pip install dbus-python. Le paquet python-dbus est également disponible (je n’ai pas pu travailler pendant les 2 minutes que j’ai essayées).
bschlueter
6

gdbusfait partie de glib2 et supporte les complétions de Bash. Voici comment l'utiliser (sur Fedora):

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

Cela montrera toutes les destinations possibles. Pour obtenir une liste des interfaces disponibles, DBus exporte la org.freedesktop.DBus.ListNamesméthode. Vous pouvez l'appeler en exécutant:

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

Malheureusement, cela conduit à une sortie illisible. Heureusement, la sortie est valide en python, donc c'est possible:

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()))'

Je ne fais généralement pas cela, mais c'est un bon truc à garder en manche. J'utilise l' gdbusintrospection et la démonstration de concepts avant de passer au code. L’achèvement de bash évite beaucoup de frappe et évite les fautes de frappe. Ce serait bien d'avoir gdbusune meilleure sortie.

geckos
la source