gpsprune: 24.5 -> 25
[NixPkgs.git] / nixos / modules / services / system / dbus.nix
blobb07bbc12574d1b830c059266c946948f3825337b
1 # D-Bus configuration and system bus daemon.
3 { config, lib, pkgs, ... }:
5 let
7   cfg = config.services.dbus;
9   configDir = pkgs.makeDBusConf.override {
10     inherit (cfg) apparmor;
11     dbus = cfg.dbusPackage;
12     suidHelper = "${config.security.wrapperDir}/dbus-daemon-launch-helper";
13     serviceDirectories = cfg.packages;
14   };
16   inherit (lib) mkOption mkEnableOption mkIf mkMerge types;
21   options = {
23     boot.initrd.systemd.dbus = {
24       enable = mkEnableOption "dbus in stage 1";
25     };
27     services.dbus = {
29       enable = mkOption {
30         type = types.bool;
31         default = false;
32         internal = true;
33         description = ''
34           Whether to start the D-Bus message bus daemon, which is
35           required by many other system services and applications.
36         '';
37       };
39       dbusPackage = lib.mkPackageOption pkgs "dbus" {};
41       brokerPackage = lib.mkPackageOption pkgs "dbus-broker" {};
43       implementation = mkOption {
44         type = types.enum [ "dbus" "broker" ];
45         default = "dbus";
46         description = ''
47           The implementation to use for the message bus defined by the D-Bus specification.
48           Can be either the classic dbus daemon or dbus-broker, which aims to provide high
49           performance and reliability, while keeping compatibility to the D-Bus
50           reference implementation.
51         '';
52       };
54       packages = mkOption {
55         type = types.listOf types.path;
56         default = [ ];
57         description = ''
58           Packages whose D-Bus configuration files should be included in
59           the configuration of the D-Bus system-wide or session-wide
60           message bus.  Specifically, files in the following directories
61           will be included into their respective DBus configuration paths:
62           {file}`«pkg»/etc/dbus-1/system.d`
63           {file}`«pkg»/share/dbus-1/system.d`
64           {file}`«pkg»/share/dbus-1/system-services`
65           {file}`«pkg»/etc/dbus-1/session.d`
66           {file}`«pkg»/share/dbus-1/session.d`
67           {file}`«pkg»/share/dbus-1/services`
68         '';
69       };
71       apparmor = mkOption {
72         type = types.enum [ "enabled" "disabled" "required" ];
73         description = ''
74           AppArmor mode for dbus.
76           `enabled` enables mediation when it's
77           supported in the kernel, `disabled`
78           always disables AppArmor even with kernel support, and
79           `required` fails when AppArmor was not found
80           in the kernel.
81         '';
82         default = "disabled";
83       };
84     };
85   };
87   config = mkIf cfg.enable (mkMerge [
88     {
89       environment.etc."dbus-1".source = configDir;
91       environment.pathsToLink = [
92         "/etc/dbus-1"
93         "/share/dbus-1"
94       ];
96       users.users.messagebus = {
97         uid = config.ids.uids.messagebus;
98         description = "D-Bus system message bus daemon user";
99         home = "/run/dbus";
100         homeMode = "0755";
101         group = "messagebus";
102       };
104       users.groups.messagebus.gid = config.ids.gids.messagebus;
106       # Install dbus for dbus tools even when using dbus-broker
107       environment.systemPackages = [
108         cfg.dbusPackage
109       ];
111       # You still need the dbus reference implementation installed to use dbus-broker
112       systemd.packages = [
113         cfg.dbusPackage
114       ];
116       services.dbus.packages = [
117         cfg.dbusPackage
118         config.system.path
119       ];
121       systemd.user.sockets.dbus.wantedBy = [
122         "sockets.target"
123       ];
124     }
126     (mkIf config.boot.initrd.systemd.dbus.enable {
127       boot.initrd.systemd = {
128         users.messagebus = { };
129         groups.messagebus = { };
130         contents."/etc/dbus-1".source = pkgs.makeDBusConf.override {
131           inherit (cfg) apparmor;
132           dbus = cfg.dbusPackage;
133           suidHelper = "/bin/false";
134           serviceDirectories = [ cfg.dbusPackage config.boot.initrd.systemd.package ];
135         };
136         packages = [ cfg.dbusPackage ];
137         storePaths = [
138           "${cfg.dbusPackage}/bin/dbus-daemon"
139           "${config.boot.initrd.systemd.package}/share/dbus-1/system-services"
140           "${config.boot.initrd.systemd.package}/share/dbus-1/system.d"
141         ];
142         targets.sockets.wants = [ "dbus.socket" ];
143       };
144     })
146     (mkIf (cfg.implementation == "dbus") {
147       security.wrappers.dbus-daemon-launch-helper = {
148         source = "${cfg.dbusPackage}/libexec/dbus-daemon-launch-helper";
149         owner = "root";
150         group = "messagebus";
151         setuid = true;
152         setgid = false;
153         permissions = "u+rx,g+rx,o-rx";
154       };
156       systemd.services.dbus = {
157         aliases = [
158           # hack aiding to prevent dbus from restarting when switching from dbus-broker back to dbus
159           "dbus-broker.service"
160         ];
161         # Don't restart dbus-daemon. Bad things tend to happen if we do.
162         reloadIfChanged = true;
163         restartTriggers = [
164           configDir
165         ];
166         environment = {
167           LD_LIBRARY_PATH = config.system.nssModules.path;
168         };
169       };
171       systemd.user.services.dbus = {
172         aliases = [
173           # hack aiding to prevent dbus from restarting when switching from dbus-broker back to dbus
174           "dbus-broker.service"
175         ];
176         # Don't restart dbus-daemon. Bad things tend to happen if we do.
177         reloadIfChanged = true;
178         restartTriggers = [
179           configDir
180         ];
181       };
183     })
185     (mkIf (cfg.implementation == "broker") {
186       environment.systemPackages = [
187         cfg.brokerPackage
188       ];
190       systemd.packages = [
191         cfg.brokerPackage
192       ];
194       # Just to be sure we don't restart through the unit alias
195       systemd.services.dbus.reloadIfChanged = true;
196       systemd.user.services.dbus.reloadIfChanged = true;
198       # NixOS Systemd Module doesn't respect 'Install'
199       # https://github.com/NixOS/nixpkgs/issues/108643
200       systemd.services.dbus-broker = {
201         aliases = [
202           # allow other services to just depend on dbus,
203           # but also a hack aiding to prevent dbus from restarting when switching from dbus-broker back to dbus
204           "dbus.service"
205         ];
206         unitConfig = {
207           # We get errors when reloading the dbus-broker service
208           # if /tmp got remounted after this service started
209           RequiresMountsFor = [ "/tmp" ];
210         };
211         # Don't restart dbus. Bad things tend to happen if we do.
212         reloadIfChanged = true;
213         restartTriggers = [
214           configDir
215         ];
216         environment = {
217           LD_LIBRARY_PATH = config.system.nssModules.path;
218         };
219       };
221       systemd.user.services.dbus-broker = {
222         aliases = [
223           # allow other services to just depend on dbus,
224           # but also a hack aiding to prevent dbus from restarting when switching from dbus-broker back to dbus
225           "dbus.service"
226         ];
227         # Don't restart dbus. Bad things tend to happen if we do.
228         reloadIfChanged = true;
229         restartTriggers = [
230           configDir
231         ];
232       };
233     })
235   ]);