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