162 lines
4.3 KiB
Nix
162 lines
4.3 KiB
Nix
|
{ lib, systemdUtils, pkgs }:
|
||
|
|
||
|
let
|
||
|
inherit (systemdUtils.lib)
|
||
|
automountConfig
|
||
|
makeUnit
|
||
|
mountConfig
|
||
|
pathConfig
|
||
|
sliceConfig
|
||
|
socketConfig
|
||
|
stage1ServiceConfig
|
||
|
stage2ServiceConfig
|
||
|
targetConfig
|
||
|
timerConfig
|
||
|
unitConfig
|
||
|
;
|
||
|
|
||
|
inherit (systemdUtils.unitOptions)
|
||
|
concreteUnitOptions
|
||
|
stage1AutomountOptions
|
||
|
stage1CommonUnitOptions
|
||
|
stage1MountOptions
|
||
|
stage1PathOptions
|
||
|
stage1ServiceOptions
|
||
|
stage1SliceOptions
|
||
|
stage1SocketOptions
|
||
|
stage1TimerOptions
|
||
|
stage2AutomountOptions
|
||
|
stage2CommonUnitOptions
|
||
|
stage2MountOptions
|
||
|
stage2PathOptions
|
||
|
stage2ServiceOptions
|
||
|
stage2SliceOptions
|
||
|
stage2SocketOptions
|
||
|
stage2TimerOptions
|
||
|
;
|
||
|
|
||
|
inherit (lib)
|
||
|
mkDefault
|
||
|
mkDerivedConfig
|
||
|
mkEnableOption
|
||
|
mkIf
|
||
|
mkOption
|
||
|
;
|
||
|
|
||
|
inherit (lib.types)
|
||
|
attrsOf
|
||
|
coercedTo
|
||
|
enum
|
||
|
lines
|
||
|
listOf
|
||
|
nullOr
|
||
|
oneOf
|
||
|
package
|
||
|
path
|
||
|
singleLineStr
|
||
|
submodule
|
||
|
;
|
||
|
|
||
|
initrdStorePathModule = { config, ... }: {
|
||
|
options = {
|
||
|
enable = (mkEnableOption "copying of this file and symlinking it") // { default = true; };
|
||
|
|
||
|
target = mkOption {
|
||
|
type = nullOr path;
|
||
|
description = ''
|
||
|
Path of the symlink.
|
||
|
'';
|
||
|
default = null;
|
||
|
};
|
||
|
|
||
|
source = mkOption {
|
||
|
type = path;
|
||
|
description = "Path of the source file.";
|
||
|
};
|
||
|
|
||
|
dlopen = {
|
||
|
usePriority = mkOption {
|
||
|
type = enum [ "required" "recommended" "suggested" ];
|
||
|
default = "recommended";
|
||
|
description = ''
|
||
|
Priority of dlopen ELF notes to include. "required" is
|
||
|
minimal, "recommended" includes "required", and
|
||
|
"suggested" includes "recommended".
|
||
|
|
||
|
See: https://systemd.io/ELF_DLOPEN_METADATA/
|
||
|
'';
|
||
|
};
|
||
|
|
||
|
features = mkOption {
|
||
|
type = listOf singleLineStr;
|
||
|
default = [ ];
|
||
|
description = ''
|
||
|
Features to enable via dlopen ELF notes. These will be in
|
||
|
addition to anything included via 'usePriority',
|
||
|
regardless of their priority.
|
||
|
'';
|
||
|
};
|
||
|
};
|
||
|
};
|
||
|
};
|
||
|
|
||
|
in
|
||
|
|
||
|
{
|
||
|
units = attrsOf (submodule ({ name, config, ... }: {
|
||
|
options = concreteUnitOptions;
|
||
|
config = {
|
||
|
name = mkDefault name;
|
||
|
unit = mkDefault (makeUnit name config);
|
||
|
};
|
||
|
}));
|
||
|
|
||
|
services = attrsOf (submodule [ stage2ServiceOptions unitConfig stage2ServiceConfig ]);
|
||
|
initrdServices = attrsOf (submodule [ stage1ServiceOptions unitConfig stage1ServiceConfig ]);
|
||
|
|
||
|
targets = attrsOf (submodule [ stage2CommonUnitOptions unitConfig targetConfig ]);
|
||
|
initrdTargets = attrsOf (submodule [ stage1CommonUnitOptions unitConfig targetConfig ]);
|
||
|
|
||
|
sockets = attrsOf (submodule [ stage2SocketOptions unitConfig socketConfig]);
|
||
|
initrdSockets = attrsOf (submodule [ stage1SocketOptions unitConfig socketConfig ]);
|
||
|
|
||
|
timers = attrsOf (submodule [ stage2TimerOptions unitConfig timerConfig ]);
|
||
|
initrdTimers = attrsOf (submodule [ stage1TimerOptions unitConfig timerConfig ]);
|
||
|
|
||
|
paths = attrsOf (submodule [ stage2PathOptions unitConfig pathConfig ]);
|
||
|
initrdPaths = attrsOf (submodule [ stage1PathOptions unitConfig pathConfig ]);
|
||
|
|
||
|
slices = attrsOf (submodule [ stage2SliceOptions unitConfig sliceConfig ]);
|
||
|
initrdSlices = attrsOf (submodule [ stage1SliceOptions unitConfig sliceConfig ]);
|
||
|
|
||
|
mounts = listOf (submodule [ stage2MountOptions unitConfig mountConfig ]);
|
||
|
initrdMounts = listOf (submodule [ stage1MountOptions unitConfig mountConfig ]);
|
||
|
|
||
|
automounts = listOf (submodule [ stage2AutomountOptions unitConfig automountConfig ]);
|
||
|
initrdAutomounts = attrsOf (submodule [ stage1AutomountOptions unitConfig automountConfig ]);
|
||
|
|
||
|
initrdStorePath = listOf (coercedTo
|
||
|
(oneOf [ singleLineStr package ])
|
||
|
(source: { inherit source; })
|
||
|
(submodule initrdStorePathModule));
|
||
|
|
||
|
initrdContents = attrsOf (submodule ({ config, options, name, ... }: {
|
||
|
imports = [ initrdStorePathModule ];
|
||
|
options = {
|
||
|
text = mkOption {
|
||
|
default = null;
|
||
|
type = nullOr lines;
|
||
|
description = "Text of the file.";
|
||
|
};
|
||
|
};
|
||
|
|
||
|
config = {
|
||
|
target = mkDefault name;
|
||
|
source = mkIf (config.text != null) (
|
||
|
let name' = "initrd-" + baseNameOf name;
|
||
|
in mkDerivedConfig options.text (pkgs.writeText name')
|
||
|
);
|
||
|
};
|
||
|
}));
|
||
|
}
|