Optionally install systemd user units for a per-user bus
authorSimon McVittie <simon.mcvittie@collabora.co.uk>
Mon, 9 Feb 2015 19:02:43 +0000 (19:02 +0000)
committerSimon McVittie <simon.mcvittie@collabora.co.uk>
Tue, 24 Feb 2015 11:15:37 +0000 (11:15 +0000)
The socket path used here, $XDG_RUNTIME_DIR/bus, does not match
what was used in user-session-units, but is what Lennart recommended
on fd.o #61303, and is also what kdbus will use for its bus proxy.

Installation of these units switches D-Bus to a different model of
the system: instead of considering each login session (approximately,
each password typed in) to be its own session, the user-session model
is that all concurrent logins by the same user form one large session.
This allows the same bus to be shared by a graphical session, cron jobs,
tty/ssh sessions, screen/tmux sessions and so on.

Because this is a different world-view, it is compile-time optional:
OS builders can choose which world their OS will live in. The default
is still the login-session model used in earlier D-Bus releases,
but might change to the user-session model in future. Explicit
configuration is recommended.

In OSs that support both models (either for sysadmin flexibility or as
a transitional measure), the OS builder should enable the user bus
units, but split them off into a dpkg binary package, RPM subpackage etc.;
the sysadmin can choose whether to enable the user-session model by
choosing whether to install that package.

Bug: https://bugs.freedesktop.org/show_bug.cgi?id=61301
Reviewed-by: Philip Withnall <philip.withnall@collabora.co.uk>
bus/Makefile.am
bus/systemd-user/dbus.service.in [new file with mode: 0644]
bus/systemd-user/dbus.socket.in [new file with mode: 0644]
configure.ac

index 1db7c9e..ac2b4fc 100644 (file)
@@ -250,6 +250,10 @@ if HAVE_SYSTEMD
        $(mkinstalldirs) $(DESTDIR)$(systemdsystemunitdir)/multi-user.target.wants
        ln -fs ../dbus.service $(DESTDIR)$(systemdsystemunitdir)/multi-user.target.wants/dbus.service
 endif
+if DBUS_ENABLE_USER_SESSION
+       $(mkinstalldirs) $(DESTDIR)$(systemduserunitdir)/sockets.target.wants
+       ln -fs ../dbus.socket $(DESTDIR)$(systemduserunitdir)/sockets.target.wants/dbus.socket
+endif
 
 if DBUS_UNIX
 install-exec-hook:
@@ -301,13 +305,23 @@ endif
 if HAVE_SYSTEMD
 SCRIPT_IN_FILES += \
        dbus.service.in \
-       dbus.socket.in
+       dbus.socket.in \
+       systemd-user/dbus.service.in \
+       systemd-user/dbus.socket.in \
+       $(NULL)
 
 systemdsystemunit_DATA = \
        dbus.service \
        dbus.socket
 endif
 
+if DBUS_ENABLE_USER_SESSION
+systemduserunit_DATA = \
+       systemd-user/dbus.service \
+       systemd-user/dbus.socket \
+       $(NULL)
+endif
+
 #### Extra dist
 
 EXTRA_DIST=$(CONFIG_IN_FILES) $(SCRIPT_IN_FILES)
diff --git a/bus/systemd-user/dbus.service.in b/bus/systemd-user/dbus.service.in
new file mode 100644 (file)
index 0000000..b41f522
--- /dev/null
@@ -0,0 +1,11 @@
+[Unit]
+Description=D-Bus User Message Bus
+Documentation=man:dbus-daemon(1)
+Requires=dbus.socket
+
+[Service]
+ExecStart=@EXPANDED_BINDIR@/dbus-daemon --session --address=systemd: --nofork --nopidfile --systemd-activation
+ExecReload=@EXPANDED_BINDIR@/dbus-send --print-reply --session --type=method_call --dest=org.freedesktop.DBus / org.freedesktop.DBus.ReloadConfig
+
+[Install]
+Also=dbus.socket
diff --git a/bus/systemd-user/dbus.socket.in b/bus/systemd-user/dbus.socket.in
new file mode 100644 (file)
index 0000000..77958f7
--- /dev/null
@@ -0,0 +1,9 @@
+[Unit]
+Description=D-Bus User Message Bus Socket
+
+[Socket]
+ListenStream=%t/bus
+
+[Install]
+WantedBy=sockets.target
+Also=dbus.service
index ac3ae26..303bc34 100644 (file)
@@ -1560,6 +1560,16 @@ if test "x$with_systemdsystemunitdir" != xno; then
 fi
 AM_CONDITIONAL(HAVE_SYSTEMD, [test "x$have_systemd" != "xno" -a -n "$with_systemdsystemunitdir" -a "x$with_systemdsystemunitdir" != xno ])
 
+AC_ARG_WITH([systemduserunitdir],
+AS_HELP_STRING([--with-systemduserunitdir=DIR], [Directory for systemd user service files]),
+    [],
+    [
+    PKG_CHECK_EXISTS([systemd],
+      [with_systemduserunitdir=$($PKG_CONFIG --variable=systemduserunitdir systemd)],
+      [with_systemduserunitdir='${libdir}/systemd/user'])
+    ])
+AC_SUBST([systemduserunitdir], [$with_systemduserunitdir])
+
 ##### Set up location for system bus socket
 if ! test -z "$with_system_socket"; then
    DBUS_SYSTEM_SOCKET=$with_system_socket
@@ -1813,6 +1823,13 @@ if test "x$enable_stats" = xyes; then
     [Define to enable bus daemon usage statistics])
 fi
 
+AC_ARG_ENABLE([user-session],
+  [AS_HELP_STRING([--enable-user-session],
+    [enable user-session semantics for session bus under systemd])],
+  [], [enable_user_session=no])
+AM_CONDITIONAL([DBUS_ENABLE_USER_SESSION],
+  [test "x$enable_user_session" = xyes])
+
 AC_CONFIG_FILES([
 Doxyfile
 dbus/Version
@@ -1828,6 +1845,8 @@ bus/org.freedesktop.dbus-session.plist
 bus/rc.messagebus
 bus/dbus.service
 bus/dbus.socket
+bus/systemd-user/dbus.service
+bus/systemd-user/dbus.socket
 Makefile
 dbus/Makefile
 bus/Makefile