1# D-Bus configuration and system bus daemon.
2
3{ config, lib, pkgs, ... }:
4
5with lib;
6
7let
8
9 cfg = config.services.dbus;
10
11 homeDir = "/var/run/dbus";
12
13 systemExtraxml = concatStrings (flip concatMap cfg.packages (d: [
14 "<servicedir>${d}/share/dbus-1/system-services</servicedir>"
15 "<includedir>${d}/etc/dbus-1/system.d</includedir>"
16 ]));
17
18 sessionExtraxml = concatStrings (flip concatMap cfg.packages (d: [
19 "<servicedir>${d}/share/dbus-1/services</servicedir>"
20 "<includedir>${d}/etc/dbus-1/session.d</includedir>"
21 ]));
22
23 configDir = pkgs.stdenv.mkDerivation {
24 name = "dbus-conf";
25
26 preferLocalBuild = true;
27 allowSubstitutes = false;
28
29 buildCommand = ''
30 mkdir -p $out
31
32 sed '${./dbus-system-local.conf.in}' \
33 -e 's,@servicehelper@,${config.security.wrapperDir}/dbus-daemon-launch-helper,g' \
34 -e 's,@extra@,${systemExtraxml},' \
35 > "$out/system-local.conf"
36
37 sed '${./dbus-session-local.conf.in}' \
38 -e 's,@extra@,${sessionExtraxml},' \
39 > "$out/session-local.conf"
40 '';
41 };
42
43in
44
45{
46
47 ###### interface
48
49 options = {
50
51 services.dbus = {
52
53 enable = mkOption {
54 type = types.bool;
55 default = false;
56 internal = true;
57 description = ''
58 Whether to start the D-Bus message bus daemon, which is
59 required by many other system services and applications.
60 '';
61 };
62
63 packages = mkOption {
64 type = types.listOf types.path;
65 default = [ ];
66 description = ''
67 Packages whose D-Bus configuration files should be included in
68 the configuration of the D-Bus system-wide or session-wide
69 message bus. Specifically, files in the following directories
70 will be included into their respective DBus configuration paths:
71 <filename><replaceable>pkg</replaceable>/etc/dbus-1/system.d</filename>
72 <filename><replaceable>pkg</replaceable>/share/dbus-1/system-services</filename>
73 <filename><replaceable>pkg</replaceable>/etc/dbus-1/session.d</filename>
74 <filename><replaceable>pkg</replaceable>/share/dbus-1/services</filename>
75 '';
76 };
77
78 };
79
80 };
81
82
83 ###### implementation
84
85 config = mkIf cfg.enable {
86
87 environment.systemPackages = [ pkgs.dbus.daemon pkgs.dbus_tools ];
88
89 environment.etc = singleton
90 { source = configDir;
91 target = "dbus-1";
92 };
93
94 users.extraUsers.messagebus = {
95 uid = config.ids.uids.messagebus;
96 description = "D-Bus system message bus daemon user";
97 home = homeDir;
98 group = "messagebus";
99 };
100
101 users.extraGroups.messagebus.gid = config.ids.gids.messagebus;
102
103 systemd.packages = [ pkgs.dbus.daemon ];
104
105 security.setuidOwners = singleton
106 { program = "dbus-daemon-launch-helper";
107 source = "${pkgs.dbus_daemon.out}/libexec/dbus-daemon-launch-helper";
108 owner = "root";
109 group = "messagebus";
110 setuid = true;
111 setgid = false;
112 permissions = "u+rx,g+rx,o-rx";
113 };
114
115 services.dbus.packages = [
116 pkgs.dbus.out
117 config.system.path
118 ];
119
120 # Don't restart dbus-daemon. Bad things tend to happen if we do.
121 systemd.services.dbus.reloadIfChanged = true;
122
123 systemd.services.dbus.restartTriggers = [ configDir ];
124
125 environment.pathsToLink = [ "/etc/dbus-1" "/share/dbus-1" ];
126
127 };
128
129}