|
14 | 14 | serviceDirectories = cfg.packages; |
15 | 15 | }; |
16 | 16 |
|
17 | | - inherit (lib) mkOption types; |
| 17 | + inherit (lib) mkOption mkIf mkMerge types; |
18 | 18 |
|
19 | 19 | in |
20 | 20 |
|
|
33 | 33 | ''; |
34 | 34 | }; |
35 | 35 |
|
| 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 | + |
36 | 48 | packages = mkOption { |
37 | 49 | type = types.listOf types.path; |
38 | 50 | default = [ ]; |
|
66 | 78 | }; |
67 | 79 | }; |
68 | 80 |
|
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; |
73 | 84 |
|
74 | | - environment.etc."dbus-1".source = configDir; |
| 85 | + environment.pathsToLink = [ |
| 86 | + "/etc/dbus-1" |
| 87 | + "/share/dbus-1" |
| 88 | + ]; |
75 | 89 |
|
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 | + }; |
82 | 96 |
|
83 | | - users.groups.messagebus.gid = config.ids.gids.messagebus; |
| 97 | + users.groups.messagebus.gid = config.ids.gids.messagebus; |
84 | 98 |
|
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 | + ]; |
88 | 103 |
|
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 | + ]; |
97 | 108 |
|
98 | | - services.dbus.packages = [ |
99 | | - pkgs.dbus |
100 | | - config.system.path |
101 | | - ]; |
| 109 | + systemd.user.sockets.dbus.wantedBy = [ |
| 110 | + "sockets.target" |
| 111 | + ]; |
| 112 | + } |
102 | 113 |
|
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 |
108 | 117 | ]; |
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 | + }; |
111 | 137 | }; |
112 | | - }; |
113 | 138 |
|
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 |
119 | 152 | ]; |
120 | | - }; |
121 | 153 |
|
122 | | - systemd.user.sockets.dbus.wantedBy = [ |
123 | | - "sockets.target" |
124 | | - ]; |
| 154 | + systemd.packages = [ |
| 155 | + pkgs.dbus-broker |
| 156 | + ]; |
125 | 157 |
|
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 | + ]); |
131 | 191 | } |
0 commit comments