Activation of multiple services provided by the same executable
Darren Garvey
darren.garvey at gmail.com
Thu Apr 4 04:23:51 PDT 2013
On 28 March 2013 10:54, Simon McVittie <simon.mcvittie at collabora.co.uk>wrote:
> On 27/03/13 19:46, Darren Garvey wrote:
> > We have a situation where some of our processes expose themselves over
> > dbus with more than one well-known name.
>
> telepathy-mission-control does this too. It's directly activatable under
> the last name it acquires (AccountManager) and the .service file for its
> other name (MissionControl5) runs a helper utility which requests
> activation of AccountManager, waits for that name to exist, then exits.
> (It's util/wait-for-name.c in our source tree.) This only works because
> dbus-daemon does not currently require that the process that eventually
> takes the name is a descendant of the process that it executed.
>
We have similar tools that we can use which fix the problem we're seeing,
albeit in a rather inelegant way.
Why do you need to wait for the busname to appear in your helper utility?
Rather than using say a "ping" script? For example, something akin to this:
----------8<----------
$ cat /usr/bin/ping-service.sh
#!/bin/bash
dbus-send --session --type=method_call --print-reply --dest=$1 /
org.freedesktop.DBus.Peer.Ping
$ cat Acme.Tool.service
[D-BUS Service]
Name=Acme.Tool
Exec=/usr/bin/acmetool
User=acme
$ cat Acme.AltTool.service
[D-BUS Service]
Name=Acme.AltTool
Exec=/usr/bin/ping-service.sh Acme.Tool
User=acme
---------->8----------
My hope would be that dbus-daemon would see that the "Exec" in the alias
service file had exited with a zero return code and then wait for a
RequestName message for the expected bus name. This /appears/ to work after
some testing, but I'm not convinced.
>From bus/activation.c:
1337 /* There are two major cases here; are we the system bus or the
> session? Here this
> 1338 * is distinguished by whether or not we use a setuid helper
> launcher. With the launch helper,
> 1339 * some process exit codes are meaningful, processed by
> handle_servicehelper_exit_error.
> 1340 *
> 1341 * In both cases though, just ignore when a process exits with
> status 0; it's possible for
> 1342 * a program to (misguidedly) "daemonize", and that appears to us
> as an exit. This closes a race
> 1343 * condition between this code and the child process claiming the
> bus name.
> 1344 */
> 1345 uses_servicehelper = bus_context_get_servicehelper
> (pending_activation->activation->context) != NULL;
>
I haven't fully followed through this code to be sure if we need to wait,
but the comment above implies otherwise. In this case, the ping script
would return with a 0 exit status which I guess would look like a
"daemonize".
> This could be extended to cover an arbitrary number of "secondary names"
> (MissionControl5 here; potentially ChannelDispatcher in future) pointing
> to one "primary name" (AccountManager here).
>
> This is not a great solution, and D-Bus would be better off if we could
> write something like this (analogous to systemd's Alias):
>
> # ...AccountManager.service
> [D-BUS Service]
> Name=...AccountManager
> Exec=/usr/libexec/mission-control-5
>
> # ...MissionControl5.service
> [D-BUS Service]
> Name=...MissionControl5
> ActivateInstead=...AccountManager
>
> # ...ChannelDispatcher.service
> [D-BUS Service]
> Name=...ChannelDispatcher
> ActivateInstead=...AccountManager
>
I prefer this solution over the other (snipped from below). It's more
explicit.
> If not, we might consider patching dbus to make it check the "Exec"
> > in a service file in a similar way to how it checks the service name,
> > to fix any raciness in this situation.
>
> This was added in commit 075945f6 (with a not-particularly-helpful
> changelog entry) and reverted in commit 171934b37, because this
> behaviour is not described in the spec and it was breaking conversion of
> some system services to systemd activation (which for some reason
> involved changing those services to Exec=/bin/false).
> See <https://bugs.freedesktop.org/show_bug.cgi?id=35750>.
>
> So, to merge this, I'd need a clear explanation of why it's OK (or
> possibly, how those services were wrong and how they could have been
> corrected), and a patch to the D-Bus Specification describing the new
> de-duplication semantics.
>
OK. Thanks for the history, very useful.
Cheers,
Darren
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/dbus/attachments/20130404/7969bcd3/attachment.html>
More information about the dbus
mailing list