On Wed, 15 May 2024 at 09:52:53 +0200, Jeremy Bícha wrote:
> I'm not happy with the performance of what I've implemented because it
> still has the 90 second delay even though gnome-remote-desktop is
> otherwise working now.

I don't think this is a debhelper or systemd bug.
I am able to reproduce it by building gnome-remote-desktop from
<https://salsa.debian.org/gnome-team/gnome-remote-desktop/-/merge_requests/7>,
which I believe is functionally equivalent to 46.1-2 (without the
workaround of invoking sysusers and tmpfiles in the opposite order as
was done in 46.1-3, which I think is the wrong workaround and I'm honestly
not sure why it would even help).

After reproducing the issue, I can re-reproduce it like this:

sudo systemctl stop gnome-remote-desktop
sudo deluser gnome-remote-desktop
sudo rm -fr /etc/gnome-remote-desktop /var/lib/gnome-remote-desktop
sudo dpkg-reconfigure gnome-remote-desktop

If I hack /lib/systemd/system/gnome-remote-desktop.service to have
"ExecStart=/usr/bin/env G_MESSAGES_DEBUG=all ...", then I can see output
from g-r-d, indicating that systemd has successfully executed the daemon
as the target user (in other words, probably not a systemd bug). However,
the daemon fails to acquire its name on the system bus. This made me think:
what is/should be giving it permission to own that name?

The answer is that it installs a D-Bus policy fragment to allow the g-r-d
user to own the intended name. dbus has an "interest-noawait" on the
directory containing policy fragments, which is sufficient for subsequent
on-demand activation of D-Bus services, but is not sufficient to ensure
that a system service that needs to own a bus name can be run immediately
from the postinst of a package that is configured during the same apt
transaction that created the system user!

However, an "interest-await" would happen too soon: it would reload the
bus policy before gnome-remote-desktop.postinst is allowed to run, but
at that point the gnome-remote-desktop uid wouldn't exist yet, so the
policy would have to be skipped.

So I think a correct invocation sequence would go something like this:

1. sysusers: Create user
2. tmpfiles: Create home directory owned by that user
3. invoke-rc.d dbus reload, as is done in polkitd.postinst
   (or busctl call org.freedesktop.DBus /org/freedesktop/DBus \
   org.freedesktop.DBus ReloadConfig)
   (or the equivalent with dbus-send, see dbus.postinst)
4. systemctl daemon-reload
5. Start system services that run as that user

Strictly speaking the partial order is: 1 < 2 < 5, 1 < 3 < 5, 1 < 4 < 5
but steps 2, 3, 4 can be arbitrarily parallelized, I think.

polkitd currently achieves this by not using the sysusers sequence, and
instead invoking sysusers and `invoke-rc.d dbus reload` before #DEBHELPER#.

It might be better if there was a way to ask debhelper to insert the
`invoke-rc.d dbus reload` into the generated part of the postinst, such
that it will be done in the appropriate sequence.

    smcv

Reply via email to