Re: How to update GSettings from DBus without X display ?

Simon McVittie <smcv-ZGY8ohtN/[email protected]>
Newsgroups gmane.comp.freedesktop.dbus
Message-ID <[email protected]>
On Tue, 21 Mar 2017 at 11:43:20 +0100, Alex ARNAUD wrote:
> I'm trying to update a GSettings user configuration from a Debian
> package. In the case where I apply the update without an X session I
> always obtain an error from DConf due to inability for its to find an X
> display.

I would like to re-word the error message in libdbus that mentions X11,
because it misleads people like you into thinking that D-Bus requires
X11. However, I'm not sure what replacement would be better.

Here is the situation, in terms that are too verbose for an error message:

To run things that use D-Bus and act per-user, you need to be able to
connect to that user's D-Bus session bus. dconf is one example of
something that is per-user (it is not *my system's* settings, but *my*
settings), and it uses the D-Bus session bus to coordinate access to a
single configuration store by multiple writers.

There are basically five ways you can get a session bus:

* distro/system infrastructure can start one that is shared between
  all your concurrent login sessions while you log in to any graphical
  or non-graphical session, like systemd does when you have the
  dbus-user-session package installed

* distro infrastructure can start one while you log in to a graphical
  session (in Debian, /etc/X11/Xsession.d does this)

* your desktop environment infrastructure can start one while you log in;
  for example, I know GNOME does this if necessary, and KDE probably does
  the same thing (but it should never be necessary on Debian)

* you can start one yourself with dbus-run-session(1) or dbus-launch(1)

* if you are in X11 and something tries to use the session bus without
  you already having one, as a last resort, the D-Bus client library
  will try to launch a session bus by running dbus-launch(1) in a
  special mode

The error message you saw that mentioned X11 was because none of the
ways to get a session bus was applicable to your situation, and the last
one that was tried was the last one in that list (which, yes, relies
on X11).

I suspect that the real problem here is that you are trying to do things
that affect a particular user, from a context where you are not logged in
as that user. This is not something that can generally be supported.

If you explain the problem you are trying to solve, at a higher level,
then perhaps someone can describe how you can solve it. The solution
might involve D-Bus, but it might not.

If you are writing a Debian package's "maintainer scripts" (e.g.
postinst) and you find yourself writing things like

    su - user -c "gsettings set something.something something"

then please try to avoid doing that: it is not how GSettings or dconf are
meant to work, and it is not how maintainer scripts are meant to work
either. It is almost always inappropriate for system-level code to
run commands in a per-user context like that.

    S
_______________________________________________
dbus mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/dbus
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.