By default, the D-Bus system bus is locked down tightly. Each service is
expected to provide its own bus configuration that tells D-Bus what is and is not
allowed. Our configurations are stored in etc-conf/com.redhat.RHSM1.conf
and
etc-conf/com.redhat.RHSM1.Facts.conf
. If you add a new interface, you must
edit the appropriate file to expose it.
For example, let’s suppose we add a new interface com.redhat.RHSM1.Products
that reports on a consumer’s installed products. We would need to edit
etc-conf/com.redhat.RHSM1.conf
and add a stanza like
<allow send_destination="com.redhat.RHSM1"
send_interface="com.redhat.RHSM1.Config"/>
under the default context policy element.
You may want to develop subscription-manager without having its RPMs installed.
For D-Bus development, you have to copy the two mentioned .conf
files to
/etc/dbus-1/system.d/
. After adding or editing them, you have to tell D-Bus
to reload the configuration for the changes to take effect:
$ sudo systemctl reload dbus
Then you can start the server by running
$ sudo PYTHONPATH=src/ python3 -m subscription_manager.scripts.rhsm_service --verbose
I find the easy way to test is with d-feet
which is a graphically application
that allows you to browse D-Bus objects and the interfaces they make available.
Unfortunately d-feet
is only available in Fedora. So when testing on Red Hat
Enterprise Linux systems, my tool of choice is dbus-send
. The manual page for
dbus-send
is fairly good, but in essence you tell dbus-send
the bus to use,
the bus name to talk to and the bus method (including the interface) to call
and then any required arguments. Here’s how to call the Config
object’s
GetAll
method for example.
$ sudo dbus-send --system --print-reply --dest=com.redhat.RHSM1
'/com/redhat/RHSM1/Config' com.redhat.RHSM1.Config.GetAll
Note that sudo
is required since I’m talking to the system bus.
The services can be brought up without installing them and all the requisite
configuration files by running the relevant executable in the bin
directory.
For example, running bin/rhsm-service
will bring up the com.redhat.RHSM1
object. Pass in the -h
flag for information on the options the script can
take. You can define verbosity level, a different bus name, and specify which
bus (system or session) to use.
I find d-feet to be the easiest to use for just ad-hoc tests. One of the CLI tools is the better choice if you’re going to be running the same command over and over.
certmonger
has a D-Bus api that models X.509 certs (org.fedorahosted.certmonger.ca interface
)dnfdaemon
has an interface to packages/repos (org.baseurl.DNfSession
)telepathy
has and extensive D-Bus API and python bindings
(org.freedesktop.Telepath
)seahorse
is a keyring tool with D-Bus interfaces (org.gnome.seahorse
)kwallet
has a large D-Bus API (org.kde.kwallet5
)org.freedesktop.Udisks2
is a good example of using the
org.freedesktop.DBus.ObjectManager
interfaceorg.fedoraproject.FirewallD1
is another large API