Skip to content

Commit de6f2b0

Browse files
worldofpeacepeterhoeg
authored andcommitted
nixos/dbus: support dbus-broker
1 parent 3be2a76 commit de6f2b0

File tree

1 file changed

+110
-50
lines changed

1 file changed

+110
-50
lines changed

nixos/modules/services/system/dbus.nix

Lines changed: 110 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ let
1414
serviceDirectories = cfg.packages;
1515
};
1616

17-
inherit (lib) mkOption types;
17+
inherit (lib) mkOption mkIf mkMerge types;
1818

1919
in
2020

@@ -33,6 +33,18 @@ in
3333
'';
3434
};
3535

36+
implementation = mkOption {
37+
type = types.enum [ "dbus" "broker" ];
38+
default = "dbus";
39+
description = lib.mdDoc ''
40+
The implementation to use for the message bus defined by the D-Bus specification.
41+
Can be either the classic dbus daemon or dbus-broker, which aims to provide high
42+
performance and reliability, while keeping compatibility to the D-Bus
43+
reference implementation.
44+
'';
45+
46+
};
47+
3648
packages = mkOption {
3749
type = types.listOf types.path;
3850
default = [ ];
@@ -66,66 +78,114 @@ in
6678
};
6779
};
6880

69-
config = lib.mkIf cfg.enable {
70-
environment.systemPackages = [
71-
pkgs.dbus
72-
];
81+
config = mkIf cfg.enable (mkMerge [
82+
{
83+
environment.etc."dbus-1".source = configDir;
7384

74-
environment.etc."dbus-1".source = configDir;
85+
environment.pathsToLink = [
86+
"/etc/dbus-1"
87+
"/share/dbus-1"
88+
];
7589

76-
users.users.messagebus = {
77-
uid = config.ids.uids.messagebus;
78-
description = "D-Bus system message bus daemon user";
79-
home = homeDir;
80-
group = "messagebus";
81-
};
90+
users.users.messagebus = {
91+
uid = config.ids.uids.messagebus;
92+
description = "D-Bus system message bus daemon user";
93+
home = homeDir;
94+
group = "messagebus";
95+
};
8296

83-
users.groups.messagebus.gid = config.ids.gids.messagebus;
97+
users.groups.messagebus.gid = config.ids.gids.messagebus;
8498

85-
systemd.packages = [
86-
pkgs.dbus
87-
];
99+
# You still need the dbus reference implementation installed to use dbus-broker
100+
systemd.packages = [
101+
pkgs.dbus
102+
];
88103

89-
security.wrappers.dbus-daemon-launch-helper = {
90-
source = "${pkgs.dbus}/libexec/dbus-daemon-launch-helper";
91-
owner = "root";
92-
group = "messagebus";
93-
setuid = true;
94-
setgid = false;
95-
permissions = "u+rx,g+rx,o-rx";
96-
};
104+
services.dbus.packages = [
105+
pkgs.dbus
106+
config.system.path
107+
];
97108

98-
services.dbus.packages = [
99-
pkgs.dbus
100-
config.system.path
101-
];
109+
systemd.user.sockets.dbus.wantedBy = [
110+
"sockets.target"
111+
];
112+
}
102113

103-
systemd.services.dbus = {
104-
# Don't restart dbus-daemon. Bad things tend to happen if we do.
105-
reloadIfChanged = true;
106-
restartTriggers = [
107-
configDir
114+
(mkIf (cfg.implementation == "dbus") {
115+
environment.systemPackages = [
116+
pkgs.dbus
108117
];
109-
environment = {
110-
LD_LIBRARY_PATH = config.system.nssModules.path;
118+
119+
security.wrappers.dbus-daemon-launch-helper = {
120+
source = "${pkgs.dbus}/libexec/dbus-daemon-launch-helper";
121+
owner = "root";
122+
group = "messagebus";
123+
setuid = true;
124+
setgid = false;
125+
permissions = "u+rx,g+rx,o-rx";
126+
};
127+
128+
systemd.services.dbus = {
129+
# Don't restart dbus-daemon. Bad things tend to happen if we do.
130+
reloadIfChanged = true;
131+
restartTriggers = [
132+
configDir
133+
];
134+
environment = {
135+
LD_LIBRARY_PATH = config.system.nssModules.path;
136+
};
111137
};
112-
};
113138

114-
systemd.user.services.dbus = {
115-
# Don't restart dbus-daemon. Bad things tend to happen if we do.
116-
reloadIfChanged = true;
117-
restartTriggers = [
118-
configDir
139+
systemd.user.services.dbus = {
140+
# Don't restart dbus-daemon. Bad things tend to happen if we do.
141+
reloadIfChanged = true;
142+
restartTriggers = [
143+
configDir
144+
];
145+
};
146+
147+
})
148+
149+
(mkIf (cfg.implementation == "broker") {
150+
environment.systemPackages = [
151+
pkgs.dbus-broker
119152
];
120-
};
121153

122-
systemd.user.sockets.dbus.wantedBy = [
123-
"sockets.target"
124-
];
154+
systemd.packages = [
155+
pkgs.dbus-broker
156+
];
125157

126-
environment.pathsToLink = [
127-
"/etc/dbus-1"
128-
"/share/dbus-1"
129-
];
130-
};
158+
# Just to be sure we don't restart through the unit alias
159+
systemd.services.dbus.reloadIfChanged = true;
160+
systemd.user.services.dbus.reloadIfChanged = true;
161+
162+
# NixOS Systemd Module doesn't respect 'Install'
163+
# https://github.com/NixOS/nixpkgs/issues/108643
164+
systemd.services.dbus-broker = {
165+
aliases = [
166+
"dbus.service"
167+
];
168+
# Don't restart dbus. Bad things tend to happen if we do.
169+
reloadIfChanged = true;
170+
restartTriggers = [
171+
configDir
172+
];
173+
environment = {
174+
LD_LIBRARY_PATH = config.system.nssModules.path;
175+
};
176+
};
177+
178+
systemd.user.services.dbus-broker = {
179+
aliases = [
180+
"dbus.service"
181+
];
182+
# Don't restart dbus. Bad things tend to happen if we do.
183+
reloadIfChanged = true;
184+
restartTriggers = [
185+
configDir
186+
];
187+
};
188+
})
189+
190+
]);
131191
}

0 commit comments

Comments
 (0)