Skip to content

Expose sd_bus_open_address or sd_bus_set_address for custom D-Bus transports #120

@dingo9

Description

@dingo9

python-sdbus currently exposes sd_bus_open(), sd_bus_open_user(),
sd_bus_open_system_remote(host), and machine helpers, but there does not
appear to be a way to open an explicit D-Bus address from Python.

This makes it difficult to use libsystemd-supported transports such as:

unixexec:path=/usr/bin/ssh,argv1=host,argv2=systemd-stdio-bridge,argv3=--user

Use case: connect to a remote user bus over SSH via
systemd-stdio-bridge --user. This works if DBUS_SESSION_BUS_ADDRESS is set
before calling sdbus.sd_bus_open_user(), but mutating process-global
environment variables is awkward and unsafe when opening multiple clients
concurrently.

The underlying libsystemd APIs support this through
sd_bus_new() + sd_bus_set_address() + sd_bus_start() (and related
sd_bus_set_fd() / sd_bus_set_exec() APIs), but python-sdbus does not seem to
expose an equivalent API.

Would you consider adding an API such as:

sdbus.sd_bus_open_address(address: str) -> sdbus.SdBus

or exposing SdBus.set_address(address) before SdBus.start()?

Example desired usage:

address = (
    "unixexec:path=/usr/bin/ssh,"
    "argv1=my-host,"
    "argv2=systemd-stdio-bridge,"
    "argv3=--user"
)
bus = sdbus.sd_bus_open_address(address)

This would avoid relying on DBUS_SESSION_BUS_ADDRESS and would make custom
D-Bus transports usable from Python.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions