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;
attrsRecursivelyMerged = types.attrs // {
merge = loc: foldl' (res: def: recursiveUpdate res def.value) {};
};
in
{
@ -70,26 +74,38 @@ in
services = mkOption {
default = {};
type = types.attrs;
description = "Definition of systemd per-user service units.";
type = attrsRecursivelyMerged;
description = ''
Definition of systemd per-user service units. Attributes are
merged recursively.
'';
};
sockets = mkOption {
default = {};
type = types.attrs;
description = "Definition of systemd per-user sockets";
type = attrsRecursivelyMerged;
description = ''
Definition of systemd per-user sockets. Attributes are
merged recursively.
'';
};
targets = mkOption {
default = {};
type = types.attrs;
description = "Definition of systemd per-user targets";
type = attrsRecursivelyMerged;
description = ''
Definition of systemd per-user targets. Attributes are
merged recursively.
'';
};
timers = mkOption {
default = {};
type = types.attrs;
description = "Definition of systemd per-user timers";
type = attrsRecursivelyMerged;
description = ''
Definition of systemd per-user timers. Attributes are merged
recursively.
'';
};
startServices = mkOption {