Avoid top-level with ...; in nixos/lib/systemd-unit-options.nix

This commit is contained in:
Philip Taron 2024-03-27 22:00:34 -07:00
parent 7d130cf752
commit ad920b32c2
No known key found for this signature in database

View File

@ -1,9 +1,33 @@
{ lib, systemdUtils }: { lib, systemdUtils }:
with systemdUtils.lib;
with lib;
let let
inherit (systemdUtils.lib)
assertValueOneOf
automountConfig
checkUnitConfig
makeJobScript
mountConfig
serviceConfig
unitConfig
unitNameType
;
inherit (lib)
any
concatMap
filterOverrides
isList
mdDoc
mergeEqualOption
mkIf
mkMerge
mkOption
mkOptionType
singleton
toList
types
;
checkService = checkUnitConfig "Service" [ checkService = checkUnitConfig "Service" [
(assertValueOneOf "Type" [ (assertValueOneOf "Type" [
"exec" "simple" "forking" "oneshot" "dbus" "notify" "notify-reload" "idle" "exec" "simple" "forking" "oneshot" "dbus" "notify" "notify-reload" "idle"
@ -31,7 +55,7 @@ in rec {
enable = mkOption { enable = mkOption {
default = true; default = true;
type = types.bool; type = types.bool;
description = lib.mdDoc '' description = mdDoc ''
If set to false, this unit will be a symlink to If set to false, this unit will be a symlink to
/dev/null. This is primarily useful to prevent specific /dev/null. This is primarily useful to prevent specific
template instances template instances
@ -45,7 +69,7 @@ in rec {
overrideStrategy = mkOption { overrideStrategy = mkOption {
default = "asDropinIfExists"; default = "asDropinIfExists";
type = types.enum [ "asDropinIfExists" "asDropin" ]; type = types.enum [ "asDropinIfExists" "asDropin" ];
description = lib.mdDoc '' description = mdDoc ''
Defines how unit configuration is provided for systemd: Defines how unit configuration is provided for systemd:
`asDropinIfExists` creates a unit file when no unit file is provided by the package `asDropinIfExists` creates a unit file when no unit file is provided by the package
@ -61,7 +85,7 @@ in rec {
requiredBy = mkOption { requiredBy = mkOption {
default = []; default = [];
type = types.listOf unitNameType; type = types.listOf unitNameType;
description = lib.mdDoc '' description = mdDoc ''
Units that require (i.e. depend on and need to go down with) this unit. Units that require (i.e. depend on and need to go down with) this unit.
As discussed in the `wantedBy` option description this also creates As discussed in the `wantedBy` option description this also creates
`.requires` symlinks automatically. `.requires` symlinks automatically.
@ -71,7 +95,7 @@ in rec {
upheldBy = mkOption { upheldBy = mkOption {
default = []; default = [];
type = types.listOf unitNameType; type = types.listOf unitNameType;
description = lib.mdDoc '' description = mdDoc ''
Keep this unit running as long as the listed units are running. This is a continuously Keep this unit running as long as the listed units are running. This is a continuously
enforced version of wantedBy. enforced version of wantedBy.
''; '';
@ -80,7 +104,7 @@ in rec {
wantedBy = mkOption { wantedBy = mkOption {
default = []; default = [];
type = types.listOf unitNameType; type = types.listOf unitNameType;
description = lib.mdDoc '' description = mdDoc ''
Units that want (i.e. depend on) this unit. The default method for Units that want (i.e. depend on) this unit. The default method for
starting a unit by default at boot time is to set this option to starting a unit by default at boot time is to set this option to
`["multi-user.target"]` for system services. Likewise for user units `["multi-user.target"]` for system services. Likewise for user units
@ -98,7 +122,7 @@ in rec {
aliases = mkOption { aliases = mkOption {
default = []; default = [];
type = types.listOf unitNameType; type = types.listOf unitNameType;
description = lib.mdDoc "Aliases of that unit."; description = mdDoc "Aliases of that unit.";
}; };
}; };
@ -108,12 +132,12 @@ in rec {
text = mkOption { text = mkOption {
type = types.nullOr types.str; type = types.nullOr types.str;
default = null; default = null;
description = lib.mdDoc "Text of this systemd unit."; description = mdDoc "Text of this systemd unit.";
}; };
unit = mkOption { unit = mkOption {
internal = true; internal = true;
description = lib.mdDoc "The generated unit."; description = mdDoc "The generated unit.";
}; };
}; };
@ -124,19 +148,19 @@ in rec {
description = mkOption { description = mkOption {
default = ""; default = "";
type = types.singleLineStr; type = types.singleLineStr;
description = lib.mdDoc "Description of this unit used in systemd messages and progress indicators."; description = mdDoc "Description of this unit used in systemd messages and progress indicators.";
}; };
documentation = mkOption { documentation = mkOption {
default = []; default = [];
type = types.listOf types.str; type = types.listOf types.str;
description = lib.mdDoc "A list of URIs referencing documentation for this unit or its configuration."; description = mdDoc "A list of URIs referencing documentation for this unit or its configuration.";
}; };
requires = mkOption { requires = mkOption {
default = []; default = [];
type = types.listOf unitNameType; type = types.listOf unitNameType;
description = lib.mdDoc '' description = mdDoc ''
Start the specified units when this unit is started, and stop Start the specified units when this unit is started, and stop
this unit when the specified units are stopped or fail. this unit when the specified units are stopped or fail.
''; '';
@ -145,7 +169,7 @@ in rec {
wants = mkOption { wants = mkOption {
default = []; default = [];
type = types.listOf unitNameType; type = types.listOf unitNameType;
description = lib.mdDoc '' description = mdDoc ''
Start the specified units when this unit is started. Start the specified units when this unit is started.
''; '';
}; };
@ -153,7 +177,7 @@ in rec {
upholds = mkOption { upholds = mkOption {
default = []; default = [];
type = types.listOf unitNameType; type = types.listOf unitNameType;
description = lib.mdDoc '' description = mdDoc ''
Keeps the specified running while this unit is running. A continuous version of `wants`. Keeps the specified running while this unit is running. A continuous version of `wants`.
''; '';
}; };
@ -161,7 +185,7 @@ in rec {
after = mkOption { after = mkOption {
default = []; default = [];
type = types.listOf unitNameType; type = types.listOf unitNameType;
description = lib.mdDoc '' description = mdDoc ''
If the specified units are started at the same time as If the specified units are started at the same time as
this unit, delay this unit until they have started. this unit, delay this unit until they have started.
''; '';
@ -170,7 +194,7 @@ in rec {
before = mkOption { before = mkOption {
default = []; default = [];
type = types.listOf unitNameType; type = types.listOf unitNameType;
description = lib.mdDoc '' description = mdDoc ''
If the specified units are started at the same time as If the specified units are started at the same time as
this unit, delay them until this unit has started. this unit, delay them until this unit has started.
''; '';
@ -179,7 +203,7 @@ in rec {
bindsTo = mkOption { bindsTo = mkOption {
default = []; default = [];
type = types.listOf unitNameType; type = types.listOf unitNameType;
description = lib.mdDoc '' description = mdDoc ''
Like requires, but in addition, if the specified units Like requires, but in addition, if the specified units
unexpectedly disappear, this unit will be stopped as well. unexpectedly disappear, this unit will be stopped as well.
''; '';
@ -188,7 +212,7 @@ in rec {
partOf = mkOption { partOf = mkOption {
default = []; default = [];
type = types.listOf unitNameType; type = types.listOf unitNameType;
description = lib.mdDoc '' description = mdDoc ''
If the specified units are stopped or restarted, then this If the specified units are stopped or restarted, then this
unit is stopped or restarted as well. unit is stopped or restarted as well.
''; '';
@ -197,7 +221,7 @@ in rec {
conflicts = mkOption { conflicts = mkOption {
default = []; default = [];
type = types.listOf unitNameType; type = types.listOf unitNameType;
description = lib.mdDoc '' description = mdDoc ''
If the specified units are started, then this unit is stopped If the specified units are started, then this unit is stopped
and vice versa. and vice versa.
''; '';
@ -206,7 +230,7 @@ in rec {
requisite = mkOption { requisite = mkOption {
default = []; default = [];
type = types.listOf unitNameType; type = types.listOf unitNameType;
description = lib.mdDoc '' description = mdDoc ''
Similar to requires. However if the units listed are not started, Similar to requires. However if the units listed are not started,
they will not be started and the transaction will fail. they will not be started and the transaction will fail.
''; '';
@ -216,7 +240,7 @@ in rec {
default = {}; default = {};
example = { RequiresMountsFor = "/data"; }; example = { RequiresMountsFor = "/data"; };
type = types.attrsOf unitOption; type = types.attrsOf unitOption;
description = lib.mdDoc '' description = mdDoc ''
Each attribute in this set specifies an option in the Each attribute in this set specifies an option in the
`[Unit]` section of the unit. See `[Unit]` section of the unit. See
{manpage}`systemd.unit(5)` for details. {manpage}`systemd.unit(5)` for details.
@ -226,7 +250,7 @@ in rec {
onFailure = mkOption { onFailure = mkOption {
default = []; default = [];
type = types.listOf unitNameType; type = types.listOf unitNameType;
description = lib.mdDoc '' description = mdDoc ''
A list of one or more units that are activated when A list of one or more units that are activated when
this unit enters the "failed" state. this unit enters the "failed" state.
''; '';
@ -235,7 +259,7 @@ in rec {
onSuccess = mkOption { onSuccess = mkOption {
default = []; default = [];
type = types.listOf unitNameType; type = types.listOf unitNameType;
description = lib.mdDoc '' description = mdDoc ''
A list of one or more units that are activated when A list of one or more units that are activated when
this unit enters the "inactive" state. this unit enters the "inactive" state.
''; '';
@ -243,7 +267,7 @@ in rec {
startLimitBurst = mkOption { startLimitBurst = mkOption {
type = types.int; type = types.int;
description = lib.mdDoc '' description = mdDoc ''
Configure unit start rate limiting. Units which are started Configure unit start rate limiting. Units which are started
more than startLimitBurst times within an interval time more than startLimitBurst times within an interval time
interval are not permitted to start any more. interval are not permitted to start any more.
@ -252,7 +276,7 @@ in rec {
startLimitIntervalSec = mkOption { startLimitIntervalSec = mkOption {
type = types.int; type = types.int;
description = lib.mdDoc '' description = mdDoc ''
Configure unit start rate limiting. Units which are started Configure unit start rate limiting. Units which are started
more than startLimitBurst times within an interval time more than startLimitBurst times within an interval time
interval are not permitted to start any more. interval are not permitted to start any more.
@ -271,7 +295,7 @@ in rec {
restartTriggers = mkOption { restartTriggers = mkOption {
default = []; default = [];
type = types.listOf types.unspecified; type = types.listOf types.unspecified;
description = lib.mdDoc '' description = mdDoc ''
An arbitrary list of items such as derivations. If any item An arbitrary list of items such as derivations. If any item
in the list changes between reconfigurations, the service will in the list changes between reconfigurations, the service will
be restarted. be restarted.
@ -281,7 +305,7 @@ in rec {
reloadTriggers = mkOption { reloadTriggers = mkOption {
default = []; default = [];
type = types.listOf unitOption; type = types.listOf unitOption;
description = lib.mdDoc '' description = mdDoc ''
An arbitrary list of items such as derivations. If any item An arbitrary list of items such as derivations. If any item
in the list changes between reconfigurations, the service will in the list changes between reconfigurations, the service will
be reloaded. If anything but a reload trigger changes in the be reloaded. If anything but a reload trigger changes in the
@ -299,13 +323,13 @@ in rec {
default = {}; default = {};
type = with types; attrsOf (nullOr (oneOf [ str path package ])); type = with types; attrsOf (nullOr (oneOf [ str path package ]));
example = { PATH = "/foo/bar/bin"; LANG = "nl_NL.UTF-8"; }; example = { PATH = "/foo/bar/bin"; LANG = "nl_NL.UTF-8"; };
description = lib.mdDoc "Environment variables passed to the service's processes."; description = mdDoc "Environment variables passed to the service's processes.";
}; };
path = mkOption { path = mkOption {
default = []; default = [];
type = with types; listOf (oneOf [ package str ]); type = with types; listOf (oneOf [ package str ]);
description = lib.mdDoc '' description = mdDoc ''
Packages added to the service's {env}`PATH` Packages added to the service's {env}`PATH`
environment variable. Both the {file}`bin` environment variable. Both the {file}`bin`
and {file}`sbin` subdirectories of each and {file}`sbin` subdirectories of each
@ -319,7 +343,7 @@ in rec {
{ RestartSec = 5; { RestartSec = 5;
}; };
type = types.addCheck (types.attrsOf unitOption) checkService; type = types.addCheck (types.attrsOf unitOption) checkService;
description = lib.mdDoc '' description = mdDoc ''
Each attribute in this set specifies an option in the Each attribute in this set specifies an option in the
`[Service]` section of the unit. See `[Service]` section of the unit. See
{manpage}`systemd.service(5)` for details. {manpage}`systemd.service(5)` for details.
@ -329,14 +353,14 @@ in rec {
script = mkOption { script = mkOption {
type = types.lines; type = types.lines;
default = ""; default = "";
description = lib.mdDoc "Shell commands executed as the service's main process."; description = mdDoc "Shell commands executed as the service's main process.";
}; };
scriptArgs = mkOption { scriptArgs = mkOption {
type = types.str; type = types.str;
default = ""; default = "";
example = "%i"; example = "%i";
description = lib.mdDoc '' description = mdDoc ''
Arguments passed to the main process script. Arguments passed to the main process script.
Can contain specifiers (`%` placeholders expanded by systemd, see {manpage}`systemd.unit(5)`). Can contain specifiers (`%` placeholders expanded by systemd, see {manpage}`systemd.unit(5)`).
''; '';
@ -345,7 +369,7 @@ in rec {
preStart = mkOption { preStart = mkOption {
type = types.lines; type = types.lines;
default = ""; default = "";
description = lib.mdDoc '' description = mdDoc ''
Shell commands executed before the service's main process Shell commands executed before the service's main process
is started. is started.
''; '';
@ -354,7 +378,7 @@ in rec {
postStart = mkOption { postStart = mkOption {
type = types.lines; type = types.lines;
default = ""; default = "";
description = lib.mdDoc '' description = mdDoc ''
Shell commands executed after the service's main process Shell commands executed after the service's main process
is started. is started.
''; '';
@ -363,7 +387,7 @@ in rec {
reload = mkOption { reload = mkOption {
type = types.lines; type = types.lines;
default = ""; default = "";
description = lib.mdDoc '' description = mdDoc ''
Shell commands executed when the service's main process Shell commands executed when the service's main process
is reloaded. is reloaded.
''; '';
@ -372,7 +396,7 @@ in rec {
preStop = mkOption { preStop = mkOption {
type = types.lines; type = types.lines;
default = ""; default = "";
description = lib.mdDoc '' description = mdDoc ''
Shell commands executed to stop the service. Shell commands executed to stop the service.
''; '';
}; };
@ -380,7 +404,7 @@ in rec {
postStop = mkOption { postStop = mkOption {
type = types.lines; type = types.lines;
default = ""; default = "";
description = lib.mdDoc '' description = mdDoc ''
Shell commands executed after the service's main process Shell commands executed after the service's main process
has exited. has exited.
''; '';
@ -389,7 +413,7 @@ in rec {
jobScripts = mkOption { jobScripts = mkOption {
type = with types; coercedTo path singleton (listOf path); type = with types; coercedTo path singleton (listOf path);
internal = true; internal = true;
description = lib.mdDoc "A list of all job script derivations of this unit."; description = mdDoc "A list of all job script derivations of this unit.";
default = []; default = [];
}; };
@ -434,7 +458,7 @@ in rec {
restartIfChanged = mkOption { restartIfChanged = mkOption {
type = types.bool; type = types.bool;
default = true; default = true;
description = lib.mdDoc '' description = mdDoc ''
Whether the service should be restarted during a NixOS Whether the service should be restarted during a NixOS
configuration switch if its definition has changed. configuration switch if its definition has changed.
''; '';
@ -443,7 +467,7 @@ in rec {
reloadIfChanged = mkOption { reloadIfChanged = mkOption {
type = types.bool; type = types.bool;
default = false; default = false;
description = lib.mdDoc '' description = mdDoc ''
Whether the service should be reloaded during a NixOS Whether the service should be reloaded during a NixOS
configuration switch if its definition has changed. If configuration switch if its definition has changed. If
enabled, the value of {option}`restartIfChanged` is enabled, the value of {option}`restartIfChanged` is
@ -459,7 +483,7 @@ in rec {
stopIfChanged = mkOption { stopIfChanged = mkOption {
type = types.bool; type = types.bool;
default = true; default = true;
description = lib.mdDoc '' description = mdDoc ''
If set, a changed unit is restarted by calling If set, a changed unit is restarted by calling
{command}`systemctl stop` in the old configuration, {command}`systemctl stop` in the old configuration,
then {command}`systemctl start` in the new one. then {command}`systemctl start` in the new one.
@ -475,7 +499,7 @@ in rec {
type = with types; either str (listOf str); type = with types; either str (listOf str);
default = []; default = [];
example = "Sun 14:00:00"; example = "Sun 14:00:00";
description = lib.mdDoc '' description = mdDoc ''
Automatically start this unit at the given date/time, which Automatically start this unit at the given date/time, which
must be in the format described in must be in the format described in
{manpage}`systemd.time(7)`. This is equivalent {manpage}`systemd.time(7)`. This is equivalent
@ -502,7 +526,7 @@ in rec {
default = []; default = [];
type = types.listOf types.str; type = types.listOf types.str;
example = [ "0.0.0.0:993" "/run/my-socket" ]; example = [ "0.0.0.0:993" "/run/my-socket" ];
description = lib.mdDoc '' description = mdDoc ''
For each item in this list, a `ListenStream` For each item in this list, a `ListenStream`
option in the `[Socket]` section will be created. option in the `[Socket]` section will be created.
''; '';
@ -512,7 +536,7 @@ in rec {
default = []; default = [];
type = types.listOf types.str; type = types.listOf types.str;
example = [ "0.0.0.0:993" "/run/my-socket" ]; example = [ "0.0.0.0:993" "/run/my-socket" ];
description = lib.mdDoc '' description = mdDoc ''
For each item in this list, a `ListenDatagram` For each item in this list, a `ListenDatagram`
option in the `[Socket]` section will be created. option in the `[Socket]` section will be created.
''; '';
@ -522,7 +546,7 @@ in rec {
default = {}; default = {};
example = { ListenStream = "/run/my-socket"; }; example = { ListenStream = "/run/my-socket"; };
type = types.attrsOf unitOption; type = types.attrsOf unitOption;
description = lib.mdDoc '' description = mdDoc ''
Each attribute in this set specifies an option in the Each attribute in this set specifies an option in the
`[Socket]` section of the unit. See `[Socket]` section of the unit. See
{manpage}`systemd.socket(5)` for details. {manpage}`systemd.socket(5)` for details.
@ -554,7 +578,7 @@ in rec {
default = {}; default = {};
example = { OnCalendar = "Sun 14:00:00"; Unit = "foo.service"; }; example = { OnCalendar = "Sun 14:00:00"; Unit = "foo.service"; };
type = types.attrsOf unitOption; type = types.attrsOf unitOption;
description = lib.mdDoc '' description = mdDoc ''
Each attribute in this set specifies an option in the Each attribute in this set specifies an option in the
`[Timer]` section of the unit. See `[Timer]` section of the unit. See
{manpage}`systemd.timer(5)` and {manpage}`systemd.timer(5)` and
@ -587,7 +611,7 @@ in rec {
default = {}; default = {};
example = { PathChanged = "/some/path"; Unit = "changedpath.service"; }; example = { PathChanged = "/some/path"; Unit = "changedpath.service"; };
type = types.attrsOf unitOption; type = types.attrsOf unitOption;
description = lib.mdDoc '' description = mdDoc ''
Each attribute in this set specifies an option in the Each attribute in this set specifies an option in the
`[Path]` section of the unit. See `[Path]` section of the unit. See
{manpage}`systemd.path(5)` for details. {manpage}`systemd.path(5)` for details.
@ -618,13 +642,13 @@ in rec {
what = mkOption { what = mkOption {
example = "/dev/sda1"; example = "/dev/sda1";
type = types.str; type = types.str;
description = lib.mdDoc "Absolute path of device node, file or other resource. (Mandatory)"; description = mdDoc "Absolute path of device node, file or other resource. (Mandatory)";
}; };
where = mkOption { where = mkOption {
example = "/mnt"; example = "/mnt";
type = types.str; type = types.str;
description = lib.mdDoc '' description = mdDoc ''
Absolute path of a directory of the mount point. Absolute path of a directory of the mount point.
Will be created if it doesn't exist. (Mandatory) Will be created if it doesn't exist. (Mandatory)
''; '';
@ -634,21 +658,21 @@ in rec {
default = ""; default = "";
example = "ext4"; example = "ext4";
type = types.str; type = types.str;
description = lib.mdDoc "File system type."; description = mdDoc "File system type.";
}; };
options = mkOption { options = mkOption {
default = ""; default = "";
example = "noatime"; example = "noatime";
type = types.commas; type = types.commas;
description = lib.mdDoc "Options used to mount the file system."; description = mdDoc "Options used to mount the file system.";
}; };
mountConfig = mkOption { mountConfig = mkOption {
default = {}; default = {};
example = { DirectoryMode = "0775"; }; example = { DirectoryMode = "0775"; };
type = types.attrsOf unitOption; type = types.attrsOf unitOption;
description = lib.mdDoc '' description = mdDoc ''
Each attribute in this set specifies an option in the Each attribute in this set specifies an option in the
`[Mount]` section of the unit. See `[Mount]` section of the unit. See
{manpage}`systemd.mount(5)` for details. {manpage}`systemd.mount(5)` for details.
@ -678,7 +702,7 @@ in rec {
where = mkOption { where = mkOption {
example = "/mnt"; example = "/mnt";
type = types.str; type = types.str;
description = lib.mdDoc '' description = mdDoc ''
Absolute path of a directory of the mount point. Absolute path of a directory of the mount point.
Will be created if it doesn't exist. (Mandatory) Will be created if it doesn't exist. (Mandatory)
''; '';
@ -688,7 +712,7 @@ in rec {
default = {}; default = {};
example = { DirectoryMode = "0775"; }; example = { DirectoryMode = "0775"; };
type = types.attrsOf unitOption; type = types.attrsOf unitOption;
description = lib.mdDoc '' description = mdDoc ''
Each attribute in this set specifies an option in the Each attribute in this set specifies an option in the
`[Automount]` section of the unit. See `[Automount]` section of the unit. See
{manpage}`systemd.automount(5)` for details. {manpage}`systemd.automount(5)` for details.
@ -719,7 +743,7 @@ in rec {
default = {}; default = {};
example = { MemoryMax = "2G"; }; example = { MemoryMax = "2G"; };
type = types.attrsOf unitOption; type = types.attrsOf unitOption;
description = lib.mdDoc '' description = mdDoc ''
Each attribute in this set specifies an option in the Each attribute in this set specifies an option in the
`[Slice]` section of the unit. See `[Slice]` section of the unit. See
{manpage}`systemd.slice(5)` for details. {manpage}`systemd.slice(5)` for details.