Una lista de servicios DBus disponibles

65

¿Existe una lista de servicios DBus disponibles?
Me topé con algunos (como los proporcionados por NetworkManager, Rhythmbox, Skype, HAL).
Me pregunto si puedo encontrar una lista bastante completa de servicios / interfaces proporcionados.

loco
fuente

Respuestas:

85

Sesión:

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

Sistema:

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

También puede usar DFeet si prefiere una herramienta GUI.

don_crissti
fuente
1
@ don-crissti, ¿cómo enumerar todas las rutas de objetos en un servicio con dbus-sendo gdbus?
Khurshid Alam
1
@ KhurshidAlam: he agregado una respuesta aquí .
don_crissti
30

qdbusvieweres tu mejor amigo; también le permite enviar mensajes D-bus:

qdbusviewer muestra la pestaña Bus de sesión con tres subpaneles

margarita
fuente
Parece roto a partir de 2014. Enumera los servicios pero no puede enviar mensajes ..
Pithikos
55
Ni siquiera puedo iniciarlo en Ubuntu 14.04. Falla con:qdbusviewer: could not exec '/usr/lib/i386-linux-gnu/qt4/bin/qdbusviewer': No such file or directory
kasperd
3
@Pithikos d-feetfunciona a partir de hoy.
sherrellbc
@sherrellbc Considere agregar d-feetcomo respuesta para hacerlo más visible
mivk
27

La forma de pitón es la forma hermosa.

Servicios del sistema:

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

Servicios de sesión:

import dbus
for service in dbus.SessionBus().list_names():
    print(service)
Pithikos
fuente
Votado. Hice una pregunta de seguimiento a su respuesta. unix.stackexchange.com/questions/203410/…
user768421
Tengo una pregunta, en un entorno de escritorio Plasma 5, el servicio org.kde.Spectacle se usa para tomar capturas de pantalla (y está funcionando), pero no figura en el bus del sistema ni en el bus de sesión, ¿por qué es eso?
Miau
Para ayudar a aquellos que pueden estar buscando: al menos python 2.7.13 y 3.6, el paquete necesario para esto es dbus-python , instalable con pip install dbus-python. El paquete python-dbus también está disponible (no pude trabajar en los 2 minutos que probé).
bschlueter
6

gdbuses parte de glib2 y admite terminaciones de Bash. Aquí está cómo usarlo (en Fedora):

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

Esto mostrará todos los destinos posibles. Para obtener una lista de las interfaces disponibles, DBus exporta el org.freedesktop.DBus.ListNamesmétodo. Puedes llamarlo ejecutando:

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

Desafortunadamente, esto conduce a resultados ilegibles. Afortunadamente, el resultado es Python válido, por lo que esto es posible:

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

Normalmente no hago esto, pero es un buen truco para mantener en la manga. Lo uso gdbuspara introspectar y probar conceptos antes de pasar al código. La finalización de bash ahorra mucho tipeo y evita errores tipográficos. Sería bueno tener gdbusuna salida más agradable.

gecos
fuente