Reformat with nixfmt
This commit is contained in:
parent
3aab6ab23a
commit
8441081b6b
11 changed files with 837 additions and 674 deletions
108
nix/lib.nix
108
nix/lib.nix
|
|
@ -1,7 +1,7 @@
|
|||
{ nixpkgs # The nixpkgs flake
|
||||
, self # The system-manager flake
|
||||
, nixos # The path to the nixos dir from nixpkgs
|
||||
,
|
||||
{
|
||||
nixpkgs, # The nixpkgs flake
|
||||
self, # The system-manager flake
|
||||
nixos, # The path to the nixos dir from nixpkgs
|
||||
}:
|
||||
let
|
||||
inherit (nixpkgs) lib;
|
||||
|
|
@ -11,45 +11,64 @@ in
|
|||
# reporting in module-system errors.
|
||||
# Usage example:
|
||||
# { _file = "${printAttrPos (builtins.unsafeGetAttrPos "a" { a = null; })}: inline module"; }
|
||||
printAttrPos = { file, line, column }: "${file}:${toString line}:${toString column}";
|
||||
printAttrPos =
|
||||
{
|
||||
file,
|
||||
line,
|
||||
column,
|
||||
}:
|
||||
"${file}:${toString line}:${toString column}";
|
||||
|
||||
makeSystemConfig =
|
||||
{ modules
|
||||
, extraSpecialArgs ? { }
|
||||
{
|
||||
modules,
|
||||
extraSpecialArgs ? { },
|
||||
}:
|
||||
let
|
||||
# Module that sets additional module arguments
|
||||
extraArgsModule = { lib, config, pkgs, ... }: {
|
||||
_file = "${self.lib.printAttrPos (builtins.unsafeGetAttrPos "a" { a = null; })}: inline module";
|
||||
_module.args = {
|
||||
pkgs = nixpkgs.legacyPackages.${config.nixpkgs.hostPlatform};
|
||||
utils = import "${nixos}/lib/utils.nix" {
|
||||
inherit lib config pkgs;
|
||||
extraArgsModule =
|
||||
{
|
||||
lib,
|
||||
config,
|
||||
pkgs,
|
||||
...
|
||||
}:
|
||||
{
|
||||
_file = "${self.lib.printAttrPos (builtins.unsafeGetAttrPos "a" { a = null; })}: inline module";
|
||||
_module.args = {
|
||||
pkgs = nixpkgs.legacyPackages.${config.nixpkgs.hostPlatform};
|
||||
utils = import "${nixos}/lib/utils.nix" {
|
||||
inherit lib config pkgs;
|
||||
};
|
||||
# Pass the wrapped system-manager binary down
|
||||
inherit (self.packages.${config.nixpkgs.hostPlatform}) system-manager;
|
||||
};
|
||||
# Pass the wrapped system-manager binary down
|
||||
inherit (self.packages.${config.nixpkgs.hostPlatform}) system-manager;
|
||||
};
|
||||
};
|
||||
|
||||
config = (lib.evalModules {
|
||||
specialArgs = { nixosModulesPath = "${nixos}/modules"; } // extraSpecialArgs;
|
||||
modules = [
|
||||
extraArgsModule
|
||||
./modules
|
||||
] ++ modules;
|
||||
}).config;
|
||||
config =
|
||||
(lib.evalModules {
|
||||
specialArgs = {
|
||||
nixosModulesPath = "${nixos}/modules";
|
||||
} // extraSpecialArgs;
|
||||
modules = [
|
||||
extraArgsModule
|
||||
./modules
|
||||
] ++ modules;
|
||||
}).config;
|
||||
|
||||
# Get the system as it was defined in the modules.
|
||||
system = config.nixpkgs.hostPlatform;
|
||||
pkgs = nixpkgs.legacyPackages.${system};
|
||||
|
||||
returnIfNoAssertions = drv:
|
||||
returnIfNoAssertions =
|
||||
drv:
|
||||
let
|
||||
failedAssertions = map (x: x.message) (lib.filter (x: !x.assertion) config.assertions);
|
||||
in
|
||||
if failedAssertions != [ ]
|
||||
then throw "\nFailed assertions:\n${lib.concatStringsSep "\n" (map (x: "- ${x}") failedAssertions)}"
|
||||
else lib.showWarnings config.warnings drv;
|
||||
if failedAssertions != [ ] then
|
||||
throw "\nFailed assertions:\n${lib.concatStringsSep "\n" (map (x: "- ${x}") failedAssertions)}"
|
||||
else
|
||||
lib.showWarnings config.warnings drv;
|
||||
|
||||
servicesPath = pkgs.writeTextFile {
|
||||
name = "services";
|
||||
|
|
@ -72,45 +91,50 @@ in
|
|||
|
||||
toplevel =
|
||||
let
|
||||
scripts = lib.mapAttrsToList
|
||||
(_: script: linkFarmBinEntryFromDrv script)
|
||||
config.build.scripts;
|
||||
scripts = lib.mapAttrsToList (_: script: linkFarmBinEntryFromDrv script) config.build.scripts;
|
||||
|
||||
entries = [
|
||||
(linkFarmEntryFromDrv servicesPath)
|
||||
(linkFarmEntryFromDrv etcPath)
|
||||
] ++ scripts;
|
||||
|
||||
addPassthru = drv: drv.overrideAttrs (prevAttrs: {
|
||||
passthru = (prevAttrs.passthru or { }) // {
|
||||
inherit config;
|
||||
};
|
||||
});
|
||||
addPassthru =
|
||||
drv:
|
||||
drv.overrideAttrs (prevAttrs: {
|
||||
passthru = (prevAttrs.passthru or { }) // {
|
||||
inherit config;
|
||||
};
|
||||
});
|
||||
in
|
||||
addPassthru (pkgs.linkFarm "system-manager" entries);
|
||||
in
|
||||
returnIfNoAssertions toplevel;
|
||||
|
||||
mkTestPreamble =
|
||||
{ node
|
||||
, profile
|
||||
, action
|
||||
}: ''
|
||||
{
|
||||
node,
|
||||
profile,
|
||||
action,
|
||||
}:
|
||||
''
|
||||
${node}.succeed("${profile}/bin/${action} 2>&1 | tee /tmp/output.log")
|
||||
${node}.succeed("! grep -F 'ERROR' /tmp/output.log")
|
||||
'';
|
||||
|
||||
activateProfileSnippet = { node, profile }:
|
||||
activateProfileSnippet =
|
||||
{ node, profile }:
|
||||
self.lib.mkTestPreamble {
|
||||
inherit node profile;
|
||||
action = "activate";
|
||||
};
|
||||
deactivateProfileSnippet = { node, profile }:
|
||||
deactivateProfileSnippet =
|
||||
{ node, profile }:
|
||||
self.lib.mkTestPreamble {
|
||||
inherit node profile;
|
||||
action = "deactivate";
|
||||
};
|
||||
prepopulateProfileSnippet = { node, profile }:
|
||||
prepopulateProfileSnippet =
|
||||
{ node, profile }:
|
||||
self.lib.mkTestPreamble {
|
||||
inherit node profile;
|
||||
action = "prepopulate";
|
||||
|
|
|
|||
|
|
@ -1,8 +1,9 @@
|
|||
{ lib
|
||||
, config
|
||||
, pkgs
|
||||
, system-manager
|
||||
, ...
|
||||
{
|
||||
lib,
|
||||
config,
|
||||
pkgs,
|
||||
system-manager,
|
||||
...
|
||||
}:
|
||||
{
|
||||
imports = [
|
||||
|
|
@ -31,7 +32,12 @@
|
|||
type = types.listOf types.unspecified;
|
||||
internal = true;
|
||||
default = [ ];
|
||||
example = [{ assertion = false; message = "you can't enable this for that reason"; }];
|
||||
example = [
|
||||
{
|
||||
assertion = false;
|
||||
message = "you can't enable this for that reason";
|
||||
}
|
||||
];
|
||||
description = lib.mdDoc ''
|
||||
This option allows modules to express conditions that must
|
||||
hold for the evaluation of the system configuration to
|
||||
|
|
@ -95,20 +101,27 @@
|
|||
allowAnyDistro = lib.mkEnableOption "the usage of system-manager on untested distributions";
|
||||
|
||||
preActivationAssertions = lib.mkOption {
|
||||
type = with lib.types; attrsOf (submodule ({ name, ... }: {
|
||||
options = {
|
||||
enable = lib.mkEnableOption "the assertion";
|
||||
type =
|
||||
with lib.types;
|
||||
attrsOf (
|
||||
submodule (
|
||||
{ name, ... }:
|
||||
{
|
||||
options = {
|
||||
enable = lib.mkEnableOption "the assertion";
|
||||
|
||||
name = lib.mkOption {
|
||||
type = types.str;
|
||||
default = name;
|
||||
};
|
||||
name = lib.mkOption {
|
||||
type = types.str;
|
||||
default = name;
|
||||
};
|
||||
|
||||
script = lib.mkOption {
|
||||
type = types.str;
|
||||
};
|
||||
};
|
||||
}));
|
||||
script = lib.mkOption {
|
||||
type = types.str;
|
||||
};
|
||||
};
|
||||
}
|
||||
)
|
||||
);
|
||||
default = { };
|
||||
};
|
||||
};
|
||||
|
|
@ -140,17 +153,22 @@
|
|||
system-manager.preActivationAssertions = {
|
||||
osVersion =
|
||||
let
|
||||
supportedIds = [ "nixos" "ubuntu" ];
|
||||
supportedIds = [
|
||||
"nixos"
|
||||
"ubuntu"
|
||||
];
|
||||
in
|
||||
{
|
||||
enable = !config.system-manager.allowAnyDistro;
|
||||
script = ''
|
||||
source /etc/os-release
|
||||
${lib.concatStringsSep "\n" (lib.flip map supportedIds (supportedId: ''
|
||||
if [ $ID = "${supportedId}" ]; then
|
||||
exit 0
|
||||
fi
|
||||
''))}
|
||||
${lib.concatStringsSep "\n" (
|
||||
lib.flip map supportedIds (supportedId: ''
|
||||
if [ $ID = "${supportedId}" ]; then
|
||||
exit 0
|
||||
fi
|
||||
'')
|
||||
)}
|
||||
echo "This OS is not currently supported."
|
||||
echo "Supported OSs are: ${lib.concatStringsSep ", " supportedIds}"
|
||||
exit 1
|
||||
|
|
@ -184,27 +202,27 @@
|
|||
|
||||
preActivationAssertionScript =
|
||||
let
|
||||
mkAssertion = { name, script, ... }: ''
|
||||
# ${name}
|
||||
mkAssertion =
|
||||
{ name, script, ... }:
|
||||
''
|
||||
# ${name}
|
||||
|
||||
echo -e "Evaluating pre-activation assertion ${name}...\n"
|
||||
(
|
||||
set +e
|
||||
${script}
|
||||
)
|
||||
assertion_result=$?
|
||||
|
||||
if [ $assertion_result -ne 0 ]; then
|
||||
failed_assertions+=${name}
|
||||
fi
|
||||
'';
|
||||
|
||||
mkAssertions = assertions:
|
||||
lib.concatStringsSep "\n" (
|
||||
lib.mapAttrsToList (name: mkAssertion) (
|
||||
lib.filterAttrs (name: cfg: cfg.enable)
|
||||
assertions
|
||||
echo -e "Evaluating pre-activation assertion ${name}...\n"
|
||||
(
|
||||
set +e
|
||||
${script}
|
||||
)
|
||||
assertion_result=$?
|
||||
|
||||
if [ $assertion_result -ne 0 ]; then
|
||||
failed_assertions+=${name}
|
||||
fi
|
||||
'';
|
||||
|
||||
mkAssertions =
|
||||
assertions:
|
||||
lib.concatStringsSep "\n" (
|
||||
lib.mapAttrsToList (name: mkAssertion) (lib.filterAttrs (name: cfg: cfg.enable) assertions)
|
||||
);
|
||||
in
|
||||
pkgs.writeShellScript "preActivationAssertions" ''
|
||||
|
|
@ -230,43 +248,40 @@
|
|||
# TODO: handle globbing
|
||||
etc =
|
||||
let
|
||||
addToStore = name: file: pkgs.runCommandLocal "${name}-etc-link" { } ''
|
||||
mkdir -p "$out/$(dirname "${file.target}")"
|
||||
ln -s "${file.source}" "$out/${file.target}"
|
||||
addToStore =
|
||||
name: file:
|
||||
pkgs.runCommandLocal "${name}-etc-link" { } ''
|
||||
mkdir -p "$out/$(dirname "${file.target}")"
|
||||
ln -s "${file.source}" "$out/${file.target}"
|
||||
|
||||
if [ "${file.mode}" != symlink ]; then
|
||||
echo "${file.mode}" > "$out/${file.target}.mode"
|
||||
echo "${file.user}" > "$out/${file.target}.uid"
|
||||
echo "${file.group}" > "$out/${file.target}.gid"
|
||||
fi
|
||||
'';
|
||||
if [ "${file.mode}" != symlink ]; then
|
||||
echo "${file.mode}" > "$out/${file.target}.mode"
|
||||
echo "${file.user}" > "$out/${file.target}.uid"
|
||||
echo "${file.group}" > "$out/${file.target}.gid"
|
||||
fi
|
||||
'';
|
||||
|
||||
filteredEntries = lib.filterAttrs
|
||||
(_name: etcFile: etcFile.enable)
|
||||
config.environment.etc;
|
||||
filteredEntries = lib.filterAttrs (_name: etcFile: etcFile.enable) config.environment.etc;
|
||||
|
||||
srcDrvs = lib.mapAttrs addToStore filteredEntries;
|
||||
|
||||
entries = lib.mapAttrs
|
||||
(name: file: file // { source = "${srcDrvs.${name}}"; })
|
||||
filteredEntries;
|
||||
entries = lib.mapAttrs (name: file: file // { source = "${srcDrvs.${name}}"; }) filteredEntries;
|
||||
|
||||
staticEnv = pkgs.buildEnv {
|
||||
name = "etc-static-env";
|
||||
paths = lib.attrValues srcDrvs;
|
||||
};
|
||||
in
|
||||
{ inherit entries staticEnv; };
|
||||
{
|
||||
inherit entries staticEnv;
|
||||
};
|
||||
|
||||
services =
|
||||
lib.mapAttrs'
|
||||
(unitName: unit:
|
||||
lib.nameValuePair unitName {
|
||||
storePath =
|
||||
''${unit.unit}/${unitName}'';
|
||||
})
|
||||
(lib.filterAttrs (_: unit: unit.enable)
|
||||
config.systemd.units);
|
||||
services = lib.mapAttrs' (
|
||||
unitName: unit:
|
||||
lib.nameValuePair unitName {
|
||||
storePath = ''${unit.unit}/${unitName}'';
|
||||
}
|
||||
) (lib.filterAttrs (_: unit: unit.enable) config.systemd.units);
|
||||
};
|
||||
};
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,4 +1,9 @@
|
|||
{ lib, config, pkgs, ... }:
|
||||
{
|
||||
lib,
|
||||
config,
|
||||
pkgs,
|
||||
...
|
||||
}:
|
||||
|
||||
{
|
||||
options.environment = {
|
||||
|
|
@ -24,10 +29,9 @@
|
|||
];
|
||||
|
||||
etc = {
|
||||
"profile.d/system-manager-path.sh".source =
|
||||
pkgs.writeText "system-manager-path.sh" ''
|
||||
export PATH=${pathDir}/bin/:''${PATH}
|
||||
'';
|
||||
"profile.d/system-manager-path.sh".source = pkgs.writeText "system-manager-path.sh" ''
|
||||
export PATH=${pathDir}/bin/:''${PATH}
|
||||
'';
|
||||
|
||||
# TODO: figure out how to properly add fish support. We could start by
|
||||
# looking at what NixOS and HM do to set up the fish env.
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
{ lib
|
||||
, pkgs
|
||||
, ...
|
||||
{
|
||||
lib,
|
||||
pkgs,
|
||||
...
|
||||
}:
|
||||
{
|
||||
options = {
|
||||
|
|
@ -18,99 +19,108 @@
|
|||
Set of files that have to be linked in {file}`/etc`.
|
||||
'';
|
||||
|
||||
type = lib.types.attrsOf (lib.types.submodule (
|
||||
{ name, config, options, ... }:
|
||||
{
|
||||
options = {
|
||||
type = lib.types.attrsOf (
|
||||
lib.types.submodule (
|
||||
{
|
||||
name,
|
||||
config,
|
||||
options,
|
||||
...
|
||||
}:
|
||||
{
|
||||
options = {
|
||||
|
||||
enable = lib.mkOption {
|
||||
type = lib.types.bool;
|
||||
default = true;
|
||||
description = lib.mdDoc ''
|
||||
Whether this /etc file should be generated. This
|
||||
option allows specific /etc files to be disabled.
|
||||
'';
|
||||
enable = lib.mkOption {
|
||||
type = lib.types.bool;
|
||||
default = true;
|
||||
description = lib.mdDoc ''
|
||||
Whether this /etc file should be generated. This
|
||||
option allows specific /etc files to be disabled.
|
||||
'';
|
||||
};
|
||||
|
||||
target = lib.mkOption {
|
||||
type = lib.types.str;
|
||||
description = lib.mdDoc ''
|
||||
Name of symlink (relative to
|
||||
{file}`/etc`). Defaults to the attribute
|
||||
name.
|
||||
'';
|
||||
};
|
||||
|
||||
text = lib.mkOption {
|
||||
default = null;
|
||||
type = lib.types.nullOr lib.types.lines;
|
||||
description = lib.mdDoc "Text of the file.";
|
||||
};
|
||||
|
||||
source = lib.mkOption {
|
||||
type = lib.types.path;
|
||||
description = lib.mdDoc "Path of the source file.";
|
||||
};
|
||||
|
||||
mode = lib.mkOption {
|
||||
type = lib.types.str;
|
||||
default = "symlink";
|
||||
example = "0600";
|
||||
description = lib.mdDoc ''
|
||||
If set to something else than `symlink`,
|
||||
the file is copied instead of symlinked, with the given
|
||||
file mode.
|
||||
'';
|
||||
};
|
||||
|
||||
uid = lib.mkOption {
|
||||
default = 0;
|
||||
type = lib.types.int;
|
||||
description = lib.mdDoc ''
|
||||
UID of created file. Only takes effect when the file is
|
||||
copied (that is, the mode is not 'symlink').
|
||||
'';
|
||||
};
|
||||
|
||||
gid = lib.mkOption {
|
||||
default = 0;
|
||||
type = lib.types.int;
|
||||
description = lib.mdDoc ''
|
||||
GID of created file. Only takes effect when the file is
|
||||
copied (that is, the mode is not 'symlink').
|
||||
'';
|
||||
};
|
||||
|
||||
user = lib.mkOption {
|
||||
default = "+${toString config.uid}";
|
||||
type = lib.types.str;
|
||||
description = lib.mdDoc ''
|
||||
User name of created file.
|
||||
Only takes effect when the file is copied (that is, the mode is not 'symlink').
|
||||
Changing this option takes precedence over `uid`.
|
||||
'';
|
||||
};
|
||||
|
||||
group = lib.mkOption {
|
||||
default = "+${toString config.gid}";
|
||||
type = lib.types.str;
|
||||
description = lib.mdDoc ''
|
||||
Group name of created file.
|
||||
Only takes effect when the file is copied (that is, the mode is not 'symlink').
|
||||
Changing this option takes precedence over `gid`.
|
||||
'';
|
||||
};
|
||||
};
|
||||
|
||||
target = lib.mkOption {
|
||||
type = lib.types.str;
|
||||
description = lib.mdDoc ''
|
||||
Name of symlink (relative to
|
||||
{file}`/etc`). Defaults to the attribute
|
||||
name.
|
||||
'';
|
||||
config = {
|
||||
target = lib.mkDefault name;
|
||||
source = lib.mkIf (config.text != null) (
|
||||
let
|
||||
name' = "etc-" + baseNameOf name;
|
||||
in
|
||||
lib.mkDerivedConfig options.text (pkgs.writeText name')
|
||||
);
|
||||
};
|
||||
|
||||
text = lib.mkOption {
|
||||
default = null;
|
||||
type = lib.types.nullOr lib.types.lines;
|
||||
description = lib.mdDoc "Text of the file.";
|
||||
};
|
||||
|
||||
source = lib.mkOption {
|
||||
type = lib.types.path;
|
||||
description = lib.mdDoc "Path of the source file.";
|
||||
};
|
||||
|
||||
mode = lib.mkOption {
|
||||
type = lib.types.str;
|
||||
default = "symlink";
|
||||
example = "0600";
|
||||
description = lib.mdDoc ''
|
||||
If set to something else than `symlink`,
|
||||
the file is copied instead of symlinked, with the given
|
||||
file mode.
|
||||
'';
|
||||
};
|
||||
|
||||
uid = lib.mkOption {
|
||||
default = 0;
|
||||
type = lib.types.int;
|
||||
description = lib.mdDoc ''
|
||||
UID of created file. Only takes effect when the file is
|
||||
copied (that is, the mode is not 'symlink').
|
||||
'';
|
||||
};
|
||||
|
||||
gid = lib.mkOption {
|
||||
default = 0;
|
||||
type = lib.types.int;
|
||||
description = lib.mdDoc ''
|
||||
GID of created file. Only takes effect when the file is
|
||||
copied (that is, the mode is not 'symlink').
|
||||
'';
|
||||
};
|
||||
|
||||
user = lib.mkOption {
|
||||
default = "+${toString config.uid}";
|
||||
type = lib.types.str;
|
||||
description = lib.mdDoc ''
|
||||
User name of created file.
|
||||
Only takes effect when the file is copied (that is, the mode is not 'symlink').
|
||||
Changing this option takes precedence over `uid`.
|
||||
'';
|
||||
};
|
||||
|
||||
group = lib.mkOption {
|
||||
default = "+${toString config.gid}";
|
||||
type = lib.types.str;
|
||||
description = lib.mdDoc ''
|
||||
Group name of created file.
|
||||
Only takes effect when the file is copied (that is, the mode is not 'symlink').
|
||||
Changing this option takes precedence over `gid`.
|
||||
'';
|
||||
};
|
||||
};
|
||||
|
||||
config = {
|
||||
target = lib.mkDefault name;
|
||||
source = lib.mkIf (config.text != null) (
|
||||
let name' = "etc-" + baseNameOf name;
|
||||
in lib.mkDerivedConfig options.text (pkgs.writeText name')
|
||||
);
|
||||
};
|
||||
}
|
||||
));
|
||||
}
|
||||
)
|
||||
);
|
||||
};
|
||||
};
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,8 +1,9 @@
|
|||
{ lib
|
||||
, config
|
||||
, pkgs
|
||||
, utils
|
||||
, ...
|
||||
{
|
||||
lib,
|
||||
config,
|
||||
pkgs,
|
||||
utils,
|
||||
...
|
||||
}:
|
||||
|
||||
let
|
||||
|
|
@ -19,14 +20,28 @@ in
|
|||
# We could consider copying the systemd lib from NixOS and removing the bits
|
||||
# that are not relevant to us, like this option.
|
||||
package = lib.mkOption {
|
||||
type = lib.types.oneOf [ lib.types.str lib.types.path lib.types.package ];
|
||||
type = lib.types.oneOf [
|
||||
lib.types.str
|
||||
lib.types.path
|
||||
lib.types.package
|
||||
];
|
||||
default = pkgs.systemdMinimal;
|
||||
};
|
||||
|
||||
globalEnvironment = lib.mkOption {
|
||||
type = with lib.types; attrsOf (nullOr (oneOf [ str path package ]));
|
||||
type =
|
||||
with lib.types;
|
||||
attrsOf (
|
||||
nullOr (oneOf [
|
||||
str
|
||||
path
|
||||
package
|
||||
])
|
||||
);
|
||||
default = { };
|
||||
example = { TZ = "CET"; };
|
||||
example = {
|
||||
TZ = "CET";
|
||||
};
|
||||
description = lib.mdDoc ''
|
||||
Environment variables passed to *all* systemd units.
|
||||
'';
|
||||
|
|
@ -104,7 +119,9 @@ in
|
|||
generators = lib.mkOption {
|
||||
type = lib.types.attrsOf lib.types.path;
|
||||
default = { };
|
||||
example = { systemd-gpt-auto-generator = "/dev/null"; };
|
||||
example = {
|
||||
systemd-gpt-auto-generator = "/dev/null";
|
||||
};
|
||||
description = lib.mdDoc ''
|
||||
Definition of systemd generators.
|
||||
For each `NAME = VALUE` pair of the attrSet, a link is generated from
|
||||
|
|
@ -129,14 +146,10 @@ in
|
|||
wantedBy = [ "default.target" ];
|
||||
};
|
||||
|
||||
timers =
|
||||
lib.mapAttrs
|
||||
(name: service:
|
||||
{
|
||||
wantedBy = [ "timers.target" ];
|
||||
timerConfig.OnCalendar = service.startAt;
|
||||
})
|
||||
(lib.filterAttrs (name: service: service.enable && service.startAt != [ ]) cfg.services);
|
||||
timers = lib.mapAttrs (name: service: {
|
||||
wantedBy = [ "timers.target" ];
|
||||
timerConfig.OnCalendar = service.startAt;
|
||||
}) (lib.filterAttrs (name: service: service.enable && service.startAt != [ ]) cfg.services);
|
||||
|
||||
units =
|
||||
lib.mapAttrs' (n: v: lib.nameValuePair "${n}.path" (systemd-lib.pathToUnit v)) cfg.paths
|
||||
|
|
@ -145,16 +158,24 @@ in
|
|||
// lib.mapAttrs' (n: v: lib.nameValuePair "${n}.socket" (systemd-lib.socketToUnit v)) cfg.sockets
|
||||
// lib.mapAttrs' (n: v: lib.nameValuePair "${n}.target" (systemd-lib.targetToUnit v)) cfg.targets
|
||||
// lib.mapAttrs' (n: v: lib.nameValuePair "${n}.timer" (systemd-lib.timerToUnit v)) cfg.timers
|
||||
// lib.listToAttrs (map
|
||||
(v:
|
||||
let n = utils.escapeSystemdPath v.where;
|
||||
in lib.nameValuePair "${n}.mount" (systemd-lib.mountToUnit v))
|
||||
cfg.mounts)
|
||||
// lib.listToAttrs (map
|
||||
(v:
|
||||
let n = utils.escapeSystemdPath v.where;
|
||||
in lib.nameValuePair "${n}.automount" (systemd-lib.automountToUnit v))
|
||||
cfg.automounts);
|
||||
// lib.listToAttrs (
|
||||
map (
|
||||
v:
|
||||
let
|
||||
n = utils.escapeSystemdPath v.where;
|
||||
in
|
||||
lib.nameValuePair "${n}.mount" (systemd-lib.mountToUnit v)
|
||||
) cfg.mounts
|
||||
)
|
||||
// lib.listToAttrs (
|
||||
map (
|
||||
v:
|
||||
let
|
||||
n = utils.escapeSystemdPath v.where;
|
||||
in
|
||||
lib.nameValuePair "${n}.automount" (systemd-lib.automountToUnit v)
|
||||
) cfg.automounts
|
||||
);
|
||||
};
|
||||
|
||||
environment.etc =
|
||||
|
|
@ -164,49 +185,59 @@ in
|
|||
enabledUnits = lib.filterAttrs (_: unit: unit.enable) cfg.units;
|
||||
in
|
||||
{
|
||||
"systemd/system".source = pkgs.runCommand "system-manager-units"
|
||||
{
|
||||
preferLocalBuild = true;
|
||||
allowSubstitutes = false;
|
||||
}
|
||||
''
|
||||
mkdir -p $out
|
||||
"systemd/system".source =
|
||||
pkgs.runCommand "system-manager-units"
|
||||
{
|
||||
preferLocalBuild = true;
|
||||
allowSubstitutes = false;
|
||||
}
|
||||
''
|
||||
mkdir -p $out
|
||||
|
||||
for i in ${toString (lib.mapAttrsToList (n: v: v.unit) enabledUnits)}; do
|
||||
fn=$(basename $i/*)
|
||||
if [ -e $out/$fn ]; then
|
||||
if [ "$(readlink -f $i/$fn)" = /dev/null ]; then
|
||||
ln -sfn /dev/null $out/$fn
|
||||
for i in ${toString (lib.mapAttrsToList (n: v: v.unit) enabledUnits)}; do
|
||||
fn=$(basename $i/*)
|
||||
if [ -e $out/$fn ]; then
|
||||
if [ "$(readlink -f $i/$fn)" = /dev/null ]; then
|
||||
ln -sfn /dev/null $out/$fn
|
||||
else
|
||||
${
|
||||
if allowCollisions then
|
||||
''
|
||||
mkdir -p $out/$fn.d
|
||||
ln -s $i/$fn $out/$fn.d/overrides.conf
|
||||
''
|
||||
else
|
||||
''
|
||||
echo "Found multiple derivations configuring $fn!"
|
||||
exit 1
|
||||
''
|
||||
}
|
||||
fi
|
||||
else
|
||||
${if allowCollisions then ''
|
||||
mkdir -p $out/$fn.d
|
||||
ln -s $i/$fn $out/$fn.d/overrides.conf
|
||||
'' else ''
|
||||
echo "Found multiple derivations configuring $fn!"
|
||||
exit 1
|
||||
''}
|
||||
ln -fs $i/$fn $out/
|
||||
fi
|
||||
else
|
||||
ln -fs $i/$fn $out/
|
||||
fi
|
||||
done
|
||||
done
|
||||
|
||||
${lib.concatStrings (
|
||||
lib.mapAttrsToList (name: unit:
|
||||
lib.concatMapStrings (name2: ''
|
||||
mkdir -p $out/'${name2}.wants'
|
||||
ln -sfn '../${name}' $out/'${name2}.wants'/
|
||||
'') (unit.wantedBy or [])
|
||||
) enabledUnits)}
|
||||
${lib.concatStrings (
|
||||
lib.mapAttrsToList (
|
||||
name: unit:
|
||||
lib.concatMapStrings (name2: ''
|
||||
mkdir -p $out/'${name2}.wants'
|
||||
ln -sfn '../${name}' $out/'${name2}.wants'/
|
||||
'') (unit.wantedBy or [ ])
|
||||
) enabledUnits
|
||||
)}
|
||||
|
||||
${lib.concatStrings (
|
||||
lib.mapAttrsToList (name: unit:
|
||||
lib.concatMapStrings (name2: ''
|
||||
mkdir -p $out/'${name2}.requires'
|
||||
ln -sfn '../${name}' $out/'${name2}.requires'/
|
||||
'') (unit.requiredBy or [])
|
||||
) enabledUnits)}
|
||||
'';
|
||||
${lib.concatStrings (
|
||||
lib.mapAttrsToList (
|
||||
name: unit:
|
||||
lib.concatMapStrings (name2: ''
|
||||
mkdir -p $out/'${name2}.requires'
|
||||
ln -sfn '../${name}' $out/'${name2}.requires'/
|
||||
'') (unit.requiredBy or [ ])
|
||||
) enabledUnits
|
||||
)}
|
||||
'';
|
||||
};
|
||||
};
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,19 +1,21 @@
|
|||
{ nixosModulesPath
|
||||
, lib
|
||||
, ...
|
||||
{
|
||||
nixosModulesPath,
|
||||
lib,
|
||||
...
|
||||
}:
|
||||
{
|
||||
imports = [
|
||||
./nginx.nix
|
||||
] ++
|
||||
# List of imported NixOS modules
|
||||
# TODO: how will we manage this in the long term?
|
||||
map (path: nixosModulesPath + path) [
|
||||
"/misc/meta.nix"
|
||||
"/security/acme/"
|
||||
"/services/web-servers/nginx/"
|
||||
];
|
||||
|
||||
imports =
|
||||
[
|
||||
./nginx.nix
|
||||
]
|
||||
++
|
||||
# List of imported NixOS modules
|
||||
# TODO: how will we manage this in the long term?
|
||||
map (path: nixosModulesPath + path) [
|
||||
"/misc/meta.nix"
|
||||
"/security/acme/"
|
||||
"/services/web-servers/nginx/"
|
||||
];
|
||||
|
||||
options =
|
||||
# We need to ignore a bunch of options that are used in NixOS modules but
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue