2016-10-08 15:10:56 +01:00
|
|
|
{ config, lib , pkgs, ...}:
|
|
|
|
|
|
|
|
with lib;
|
|
|
|
with import ./systemd-unit-options.nix { inherit config lib; };
|
|
|
|
with import ./systemd-lib.nix { inherit config lib pkgs; };
|
|
|
|
|
|
|
|
let
|
|
|
|
cfg = config.systemd.nspawn;
|
|
|
|
|
|
|
|
checkExec = checkUnitConfig "Exec" [
|
|
|
|
(assertOnlyFields [
|
|
|
|
"Boot" "ProcessTwo" "Parameters" "Environment" "User" "WorkingDirectory"
|
|
|
|
"Capability" "DropCapability" "KillSignal" "Personality" "MachineId"
|
2017-05-19 21:42:20 +01:00
|
|
|
"PrivateUsers" "NotifyReady"
|
2016-10-08 15:10:56 +01:00
|
|
|
])
|
|
|
|
(assertValueOneOf "Boot" boolValues)
|
|
|
|
(assertValueOneOf "ProcessTwo" boolValues)
|
2017-05-20 20:32:45 +01:00
|
|
|
(assertValueOneOf "NotifyReady" boolValues)
|
2016-10-08 15:10:56 +01:00
|
|
|
];
|
|
|
|
|
|
|
|
checkFiles = checkUnitConfig "Files" [
|
|
|
|
(assertOnlyFields [
|
|
|
|
"ReadOnly" "Volatile" "Bind" "BindReadOnly" "TemporaryFileSystems"
|
|
|
|
"PrivateUsersChown"
|
|
|
|
])
|
|
|
|
(assertValueOneOf "ReadOnly" boolValues)
|
|
|
|
(assertValueOneOf "Volatile" (boolValues ++ [ "state" ]))
|
|
|
|
(assertValueOneOf "PrivateUsersChown" boolValues)
|
|
|
|
];
|
|
|
|
|
|
|
|
checkNetwork = checkUnitConfig "Network" [
|
|
|
|
(assertOnlyFields [
|
|
|
|
"Private" "VirtualEthernet" "VirtualEthernetExtra" "Interface" "MACVLAN"
|
|
|
|
"IPVLAN" "Bridge" "Zone" "Port"
|
|
|
|
])
|
|
|
|
(assertValueOneOf "Private" boolValues)
|
|
|
|
(assertValueOneOf "VirtualEthernet" boolValues)
|
|
|
|
];
|
|
|
|
|
|
|
|
instanceOptions = {
|
2017-05-21 19:23:09 +01:00
|
|
|
options = sharedOptions // {
|
2016-10-20 17:31:54 +01:00
|
|
|
execConfig = mkOption {
|
|
|
|
default = {};
|
|
|
|
example = { Parameters = "/bin/sh"; };
|
|
|
|
type = types.addCheck (types.attrsOf unitOption) checkExec;
|
|
|
|
description = ''
|
|
|
|
Each attribute in this set specifies an option in the
|
|
|
|
<literal>[Exec]</literal> section of this unit. See
|
|
|
|
<citerefentry><refentrytitle>systemd.nspawn</refentrytitle>
|
|
|
|
<manvolnum>5</manvolnum></citerefentry> for details.
|
|
|
|
'';
|
|
|
|
};
|
2016-10-08 15:10:56 +01:00
|
|
|
|
2016-10-20 17:31:54 +01:00
|
|
|
filesConfig = mkOption {
|
|
|
|
default = {};
|
|
|
|
example = { Bind = [ "/home/alice" ]; };
|
|
|
|
type = types.addCheck (types.attrsOf unitOption) checkFiles;
|
|
|
|
description = ''
|
|
|
|
Each attribute in this set specifies an option in the
|
|
|
|
<literal>[Files]</literal> section of this unit. See
|
|
|
|
<citerefentry><refentrytitle>systemd.nspawn</refentrytitle>
|
|
|
|
<manvolnum>5</manvolnum></citerefentry> for details.
|
|
|
|
'';
|
|
|
|
};
|
2016-10-08 15:10:56 +01:00
|
|
|
|
2016-10-20 17:31:54 +01:00
|
|
|
networkConfig = mkOption {
|
|
|
|
default = {};
|
|
|
|
example = { Private = false; };
|
|
|
|
type = types.addCheck (types.attrsOf unitOption) checkNetwork;
|
|
|
|
description = ''
|
|
|
|
Each attribute in this set specifies an option in the
|
|
|
|
<literal>[Network]</literal> section of this unit. See
|
|
|
|
<citerefentry><refentrytitle>systemd.nspawn</refentrytitle>
|
|
|
|
<manvolnum>5</manvolnum></citerefentry> for details.
|
|
|
|
'';
|
|
|
|
};
|
2016-10-08 15:10:56 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
};
|
|
|
|
|
2017-05-19 21:42:20 +01:00
|
|
|
instanceToUnit = name: def:
|
2017-05-21 19:23:09 +01:00
|
|
|
let base = {
|
|
|
|
text = ''
|
|
|
|
[Exec]
|
|
|
|
${attrsToSection def.execConfig}
|
2016-10-08 15:10:56 +01:00
|
|
|
|
2017-05-21 19:23:09 +01:00
|
|
|
[Files]
|
|
|
|
${attrsToSection def.filesConfig}
|
2016-10-08 15:10:56 +01:00
|
|
|
|
2017-05-21 19:23:09 +01:00
|
|
|
[Network]
|
|
|
|
${attrsToSection def.networkConfig}
|
|
|
|
'';
|
|
|
|
} // def;
|
|
|
|
in base // { unit = makeUnit name base; };
|
2016-10-08 15:10:56 +01:00
|
|
|
|
|
|
|
in {
|
|
|
|
|
|
|
|
options = {
|
|
|
|
|
|
|
|
systemd.nspawn = mkOption {
|
|
|
|
default = {};
|
2016-10-20 17:31:54 +01:00
|
|
|
type = with types; attrsOf (submodule instanceOptions);
|
2016-10-08 15:10:56 +01:00
|
|
|
description = "Definition of systemd-nspawn configurations.";
|
|
|
|
};
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
config =
|
|
|
|
let
|
2017-07-04 14:12:47 +01:00
|
|
|
units = mapAttrs' (n: v: let nspawnFile = "${n}.nspawn"; in nameValuePair nspawnFile (instanceToUnit nspawnFile v)) cfg;
|
2016-10-08 15:10:56 +01:00
|
|
|
in mkIf (cfg != {}) {
|
|
|
|
|
|
|
|
environment.etc."systemd/nspawn".source = generateUnits "nspawn" units [] [];
|
|
|
|
|
|
|
|
systemd.services."systemd-nspawn@" = {
|
|
|
|
wantedBy = [ "machine.target" ];
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
}
|