systemd: merge unit definitions recursively

This removes the need for monolithic unit definitions and allows
users to modify existing units.

Example:
```
{
  systemd.user.services.owncloud-client.Unit.OnFailure = "my-notify-service";
}
```
This commit is contained in:
Cornelius Mika 2018-05-09 15:22:34 +02:00 committed by Robert Helgesson
parent 394045f68a
commit 73b8aa8bcc
No known key found for this signature in database
GPG key ID: 36BDAA14C2797E89

View file

@ -50,6 +50,10 @@ let
servicesStartTimeoutMs = builtins.toString cfg.servicesStartTimeoutMs; servicesStartTimeoutMs = builtins.toString cfg.servicesStartTimeoutMs;
attrsRecursivelyMerged = types.attrs // {
merge = loc: foldl' (res: def: recursiveUpdate res def.value) {};
};
in in
{ {
@ -70,26 +74,38 @@ in
services = mkOption { services = mkOption {
default = {}; default = {};
type = types.attrs; type = attrsRecursivelyMerged;
description = "Definition of systemd per-user service units."; description = ''
Definition of systemd per-user service units. Attributes are
merged recursively.
'';
}; };
sockets = mkOption { sockets = mkOption {
default = {}; default = {};
type = types.attrs; type = attrsRecursivelyMerged;
description = "Definition of systemd per-user sockets"; description = ''
Definition of systemd per-user sockets. Attributes are
merged recursively.
'';
}; };
targets = mkOption { targets = mkOption {
default = {}; default = {};
type = types.attrs; type = attrsRecursivelyMerged;
description = "Definition of systemd per-user targets"; description = ''
Definition of systemd per-user targets. Attributes are
merged recursively.
'';
}; };
timers = mkOption { timers = mkOption {
default = {}; default = {};
type = types.attrs; type = attrsRecursivelyMerged;
description = "Definition of systemd per-user timers"; description = ''
Definition of systemd per-user timers. Attributes are merged
recursively.
'';
}; };
startServices = mkOption { startServices = mkOption {