nixos/dbus: support dbus-broker

This commit is contained in:
WORLDofPEACE 2021-02-12 04:36:23 -05:00 committed by Peter Hoeg
parent 3be2a76832
commit de6f2b0a07

View file

@ -14,7 +14,7 @@ let
serviceDirectories = cfg.packages; serviceDirectories = cfg.packages;
}; };
inherit (lib) mkOption types; inherit (lib) mkOption mkIf mkMerge types;
in in
@ -33,6 +33,18 @@ in
''; '';
}; };
implementation = mkOption {
type = types.enum [ "dbus" "broker" ];
default = "dbus";
description = lib.mdDoc ''
The implementation to use for the message bus defined by the D-Bus specification.
Can be either the classic dbus daemon or dbus-broker, which aims to provide high
performance and reliability, while keeping compatibility to the D-Bus
reference implementation.
'';
};
packages = mkOption { packages = mkOption {
type = types.listOf types.path; type = types.listOf types.path;
default = [ ]; default = [ ];
@ -66,66 +78,114 @@ in
}; };
}; };
config = lib.mkIf cfg.enable { config = mkIf cfg.enable (mkMerge [
environment.systemPackages = [ {
pkgs.dbus environment.etc."dbus-1".source = configDir;
];
environment.etc."dbus-1".source = configDir; environment.pathsToLink = [
"/etc/dbus-1"
users.users.messagebus = { "/share/dbus-1"
uid = config.ids.uids.messagebus;
description = "D-Bus system message bus daemon user";
home = homeDir;
group = "messagebus";
};
users.groups.messagebus.gid = config.ids.gids.messagebus;
systemd.packages = [
pkgs.dbus
];
security.wrappers.dbus-daemon-launch-helper = {
source = "${pkgs.dbus}/libexec/dbus-daemon-launch-helper";
owner = "root";
group = "messagebus";
setuid = true;
setgid = false;
permissions = "u+rx,g+rx,o-rx";
};
services.dbus.packages = [
pkgs.dbus
config.system.path
];
systemd.services.dbus = {
# Don't restart dbus-daemon. Bad things tend to happen if we do.
reloadIfChanged = true;
restartTriggers = [
configDir
]; ];
environment = {
LD_LIBRARY_PATH = config.system.nssModules.path; users.users.messagebus = {
uid = config.ids.uids.messagebus;
description = "D-Bus system message bus daemon user";
home = homeDir;
group = "messagebus";
}; };
};
systemd.user.services.dbus = { users.groups.messagebus.gid = config.ids.gids.messagebus;
# Don't restart dbus-daemon. Bad things tend to happen if we do.
reloadIfChanged = true; # You still need the dbus reference implementation installed to use dbus-broker
restartTriggers = [ systemd.packages = [
configDir pkgs.dbus
]; ];
};
systemd.user.sockets.dbus.wantedBy = [ services.dbus.packages = [
"sockets.target" pkgs.dbus
]; config.system.path
];
environment.pathsToLink = [ systemd.user.sockets.dbus.wantedBy = [
"/etc/dbus-1" "sockets.target"
"/share/dbus-1" ];
]; }
};
(mkIf (cfg.implementation == "dbus") {
environment.systemPackages = [
pkgs.dbus
];
security.wrappers.dbus-daemon-launch-helper = {
source = "${pkgs.dbus}/libexec/dbus-daemon-launch-helper";
owner = "root";
group = "messagebus";
setuid = true;
setgid = false;
permissions = "u+rx,g+rx,o-rx";
};
systemd.services.dbus = {
# Don't restart dbus-daemon. Bad things tend to happen if we do.
reloadIfChanged = true;
restartTriggers = [
configDir
];
environment = {
LD_LIBRARY_PATH = config.system.nssModules.path;
};
};
systemd.user.services.dbus = {
# Don't restart dbus-daemon. Bad things tend to happen if we do.
reloadIfChanged = true;
restartTriggers = [
configDir
];
};
})
(mkIf (cfg.implementation == "broker") {
environment.systemPackages = [
pkgs.dbus-broker
];
systemd.packages = [
pkgs.dbus-broker
];
# Just to be sure we don't restart through the unit alias
systemd.services.dbus.reloadIfChanged = true;
systemd.user.services.dbus.reloadIfChanged = true;
# NixOS Systemd Module doesn't respect 'Install'
# https://github.com/NixOS/nixpkgs/issues/108643
systemd.services.dbus-broker = {
aliases = [
"dbus.service"
];
# Don't restart dbus. Bad things tend to happen if we do.
reloadIfChanged = true;
restartTriggers = [
configDir
];
environment = {
LD_LIBRARY_PATH = config.system.nssModules.path;
};
};
systemd.user.services.dbus-broker = {
aliases = [
"dbus.service"
];
# Don't restart dbus. Bad things tend to happen if we do.
reloadIfChanged = true;
restartTriggers = [
configDir
];
};
})
]);
} }