103

Is there such a thing as list of available D-Bus services? I've stumbled upon a few, like those provided by NetworkManager, Rhythmbox, Skype, HAL.

I wonder if I can find a rather complete list of provided services/interfaces.

Matthias Braun
  • 7,797
  • 7
  • 45
  • 54
madfriend
  • 1,133
  • 2
  • 8
  • 5
  • Similar question on ask Ubuntu site →[appmenu - How do I get a list of all of the available dbus properties? - Ask Ubuntu](https://askubuntu.com/questions/147568/how-do-i-get-a-list-of-all-of-the-available-dbus-properties) – user202729 Oct 15 '22 at 16:28

6 Answers6

123

On QT setups (short commands and clean, human readable output) you can run:

qdbus

will list list the services available on the session bus and

qdbus --system

will list list the services available on the system bus.


On any setup you can use dbus-send

dbus-send --print-reply --dest=org.freedesktop.DBus  /org/freedesktop/DBus org.freedesktop.DBus.ListNames

Just like qdbus, if --session or no message bus is specified, dbus will send to the login session message bus. So the above will list the services available on the session bus.
Use --system if you want instead to use the system wide message bus:

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

You could also use DFeet if you prefer a graphical tool (see the other answers for more GUI options).

don_crissti
  • 79,330
  • 30
  • 216
  • 245
48

With Python it can be simpler.

System services:

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

Session services:

import dbus
for service in dbus.SessionBus().list_names():
    print(service)
Pithikos
  • 3,214
  • 4
  • 23
  • 27
  • Upvoted. I asked a follow-up question to your answer. http://unix.stackexchange.com/questions/203410/how-to-list-all-object-paths-under-a-dbus-service – user768421 May 15 '15 at 01:58
  • I have a question, in a Plasma 5 desktop environment, the service __org.kde.Spectacle__ is used for taking screenshot (and it's working), but it is neither listed in system bus nor session bus, why is that? – Meow Nov 01 '16 at 12:20
  • To help those who may be looking: for at least python 2.7.13 and 3.6, the package needed for this is [dbus-python](https://pypi.python.org/pypi/dbus-python/), installable with `pip install dbus-python`. The python-dbus package is also available (I was unable to get in working in the 2 minutes I tried). – bschlueter Aug 30 '17 at 05:09
  • This solution was very helpful on an embedded system that didn't have qdbus installed. – ichabod Nov 02 '21 at 16:31
35

qdbusviewer is your best friend; it allows you to send D-bus messages as well:

qdbusviewer showing the Session Bus tab with three subpanels

Jeff Schaller
  • 66,199
  • 35
  • 114
  • 250
daisy
  • 53,527
  • 78
  • 236
  • 383
20

gdbus is part of glib2 and supports Bash completions. Here is how to use it (on Fedora):

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

This will show all possible destinations. To get a list of the available interfaces DBus exports the org.freedesktop.DBus.ListNames method. You can call it by running:

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

Unfortunately this leads to unreadable output. Fortunately the output is valid python, so this is 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()))'

I don't usually do this, but is a nice trick to keep on sleeve. I use gdbus for introspecting and proving concepts before moving to code. The bash completion saves a lot of typing and avoid typos. Would be nice to have gdbus displaying a nicer output.

Cristian Ciupitu
  • 2,430
  • 1
  • 22
  • 29
geckos
  • 341
  • 2
  • 3
  • 1
    Neat tool recommendation; thanks! As of F31 at least note that Bash completions are loaded by default, no need to source them manually. – tne Apr 19 '20 at 08:08
9

I prefer busctl.
Note that unlike other tools like qdbus and dbus-send this one defaults to the --system bus so to communicate with the session manager you have to explicitly use the --user switch. Also, the list command is the default operation if no command is specified so

busctl

is the same as

busctl list --system

or

# busctl list
NAME                                             PID PROCESS         USER             CONNECTION    UNIT                                                               SESSION DESCRIPTION
:1.0                                             162 systemd-timesyn systemd-timesync :1.0          systemd-timesyncd.service                                          -       -          
:1.1                                             157 systemd-network systemd-network  :1.1          systemd-networkd.service                                           -       -          
:1.10                                            199 phosphor-dump-m root             :1.10         obmc-dump-monitor.service                                          -       -          
:1.11                                            216 fru-device      root             :1.11         xyz.openbmc_project.FruDevice.service         
...

and after you can see the tree for each one

# busctl tree :1.0
`-/org
  `-/org/freedesktop
    |-/org/freedesktop/LogControl1
    `-/org/freedesktop/timesync1
don_crissti
  • 79,330
  • 30
  • 216
  • 245
1

I would recommend also dasbus

from dasbus.connection import SystemMessageBus

bus = SystemMessageBus()
busproxy = bus.proxy
for i in sorted(busproxy.ListNames()):
    print(i)

(Substitute SessionMessageBus for the session bus.)

From the shell, on systemd systems there is busctl

busctl list
Stefano M
  • 131
  • 3