diff --git a/nixos/modules/services/system/dbus.nix b/nixos/modules/services/system/dbus.nix
index 6c4833afbe8..6eb7f268fc8 100644
--- a/nixos/modules/services/system/dbus.nix
+++ b/nixos/modules/services/system/dbus.nix
@@ -8,7 +8,7 @@ let
cfg = config.services.dbus;
- homeDir = "/var/run/dbus";
+ homeDir = "/run/dbus";
systemExtraxml = concatStrings (flip concatMap cfg.packages (d: [
"${d}/share/dbus-1/system-services"
@@ -20,6 +20,8 @@ let
"${d}/etc/dbus-1/session.d"
]));
+ daemonArgs = "--address=systemd: --nofork --nopidfile --systemd-activation";
+
configDir = pkgs.stdenv.mkDerivation {
name = "dbus-conf";
@@ -29,6 +31,14 @@ let
buildCommand = ''
mkdir -p $out
+ cp ${pkgs.dbus.out}/share/dbus-1/{system,session}.conf $out
+
+ # avoid circular includes
+ sed -ri 's@(/etc/dbus-1/(system|session)\.conf)@@g' $out/{system,session}.conf
+
+ # include by full path
+ sed -ri "s@/etc/dbus-1/(system|session)-@$out/\1-@" $out/{system,session}.conf
+
sed '${./dbus-system-local.conf.in}' \
-e 's,@servicehelper@,${config.security.wrapperDir}/dbus-daemon-launch-helper,g' \
-e 's,@extra@,${systemExtraxml},' \
@@ -75,11 +85,16 @@ in
'';
};
+ socketActivated = mkOption {
+ type = types.bool;
+ default = false;
+ description = ''
+ Make the user instance socket activated.
+ '';
+ };
};
-
};
-
###### implementation
config = mkIf cfg.enable {
@@ -117,13 +132,29 @@ in
config.system.path
];
- # Don't restart dbus-daemon. Bad things tend to happen if we do.
- systemd.services.dbus.reloadIfChanged = true;
+ systemd.services.dbus = {
+ # Don't restart dbus-daemon. Bad things tend to happen if we do.
+ reloadIfChanged = true;
+ restartTriggers = [ configDir ];
+ serviceConfig.ExecStart = [
+ ""
+ "${lib.getBin pkgs.dbus}/bin/dbus-daemon --config-file=${configDir}/system.conf ${daemonArgs}"
+ ];
+ };
- systemd.services.dbus.restartTriggers = [ configDir ];
+ systemd.user = {
+ services.dbus = {
+ # Don't restart dbus-daemon. Bad things tend to happen if we do.
+ reloadIfChanged = true;
+ restartTriggers = [ configDir ];
+ serviceConfig.ExecStart = [
+ ""
+ "${lib.getBin pkgs.dbus}/bin/dbus-daemon --config-file=${configDir}/session.conf ${daemonArgs}"
+ ];
+ };
+ sockets.dbus.wantedBy = mkIf cfg.socketActivated [ "sockets.target" ];
+ };
environment.pathsToLink = [ "/etc/dbus-1" "/share/dbus-1" ];
-
};
-
}
diff --git a/nixos/modules/services/x11/display-managers/default.nix b/nixos/modules/services/x11/display-managers/default.nix
index 75d80609f73..ce82af4ca68 100644
--- a/nixos/modules/services/x11/display-managers/default.nix
+++ b/nixos/modules/services/x11/display-managers/default.nix
@@ -134,13 +134,8 @@ let
(*) echo "$0: Desktop manager '$desktopManager' not found.";;
esac
- # FIXME: gdbus should not be in glib.dev!
- ${optionalString (cfg.startDbusSession && cfg.updateDbusEnvironment) ''
- ${pkgs.glib.dev}/bin/gdbus call --session \
- --dest org.freedesktop.DBus --object-path /org/freedesktop/DBus \
- --method org.freedesktop.DBus.UpdateActivationEnvironment \
- "{$(env | ${pkgs.gnused}/bin/sed "s/'/\\\\'/g; s/\([^=]*\)=\(.*\)/'\1':'\2'/" \
- | ${pkgs.coreutils}/bin/paste -sd,)}"
+ ${optionalString cfg.updateDbusEnvironment ''
+ ${lib.getBin pkgs.dbus}/bin/dbus-update-activation-environment --systemd --all
''}
test -n "$waitPID" && wait "$waitPID"
diff --git a/pkgs/development/libraries/dbus/default.nix b/pkgs/development/libraries/dbus/default.nix
index 789aae18aaa..531188d7419 100644
--- a/pkgs/development/libraries/dbus/default.nix
+++ b/pkgs/development/libraries/dbus/default.nix
@@ -44,7 +44,11 @@ self = stdenv.mkDerivation {
"--localstatedir=/var"
"--sysconfdir=/etc"
"--with-session-socket-dir=/tmp"
+ "--with-system-pid-file=/run/dbus/pid"
+ "--with-system-socket=/run/dbus/system_bus_socket"
"--with-systemdsystemunitdir=$(out)/etc/systemd/system"
+ "--with-systemduserunitdir=$(out)/etc/systemd/user"
+ "--enable-user-session"
# this package installs nothing into those dirs and they create a dependency
"--datadir=/run/current-system/sw/share"
"--libexecdir=$(out)/libexec" # we don't need dbus-daemon-launch-helper
@@ -81,4 +85,3 @@ self = stdenv.mkDerivation {
};
};
in self
-