at 16.09-beta 3.4 kB view raw
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}