fix config attributes contrain mechanism for SP modules
Now it should work for all nested imports too. `imports` are traversed recursively to redefine each imported module function with altered one, constraining its config attribute (respecting config-paths-needed.json).pull/55/head
parent
26b3071929
commit
4419a1323a
49
flake.nix
49
flake.nix
|
@ -18,9 +18,6 @@
|
||||||
, top-level-flake
|
, top-level-flake
|
||||||
, sp-modules
|
, sp-modules
|
||||||
}:
|
}:
|
||||||
let
|
|
||||||
lib = nixpkgs.legacyPackages.${system}.lib;
|
|
||||||
in
|
|
||||||
{
|
{
|
||||||
sp-nixos = nixpkgs.lib.nixosSystem {
|
sp-nixos = nixpkgs.lib.nixosSystem {
|
||||||
specialArgs = { inherit system; };
|
specialArgs = { inherit system; };
|
||||||
|
@ -43,20 +40,42 @@
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
++
|
++
|
||||||
# add SP modules, but filter available config attributes for each
|
# add SP modules, but contrain available config attributes for each
|
||||||
|
# (TODO revise evaluation performance of the code below)
|
||||||
map
|
map
|
||||||
(sp-module: args@{ pkgs, ... }: (sp-module.nixosModules.default
|
(sp-module: args@{ config, pkgs, ... }:
|
||||||
(args // {
|
let
|
||||||
config =
|
lib = nixpkgs.lib;
|
||||||
# TODO use lib.attrsets.mergeAttrsList from nixpkgs 23.05
|
constrainConfigArgs = args'@{ pkgs, ... }: args' // {
|
||||||
(builtins.foldl' lib.trivial.mergeAttrs { }
|
config =
|
||||||
(map
|
# TODO use lib.attrsets.mergeAttrsList from nixpkgs 23.05
|
||||||
(p: lib.attrsets.setAttrByPath p
|
(builtins.foldl' lib.attrsets.recursiveUpdate { }
|
||||||
(lib.attrsets.getAttrFromPath p args.config))
|
(map
|
||||||
sp-module.configPathsNeeded));
|
(p: lib.attrsets.setAttrByPath p
|
||||||
}))
|
(lib.attrsets.getAttrFromPath p config))
|
||||||
|
sp-module.configPathsNeeded));
|
||||||
|
};
|
||||||
|
constrainImportsArgsRecursive = lib.attrsets.mapAttrsRecursive
|
||||||
|
(p: v:
|
||||||
|
if lib.lists.last p == "imports"
|
||||||
|
then
|
||||||
|
map
|
||||||
|
(m:
|
||||||
|
(args'@{ pkgs, ... }: constrainImportsArgsRecursive
|
||||||
|
(if builtins.isPath m
|
||||||
|
then import m (constrainConfigArgs args')
|
||||||
|
else
|
||||||
|
if builtins.isFunction m
|
||||||
|
then constrainConfigArgs args'
|
||||||
|
else m))
|
||||||
|
)
|
||||||
|
v
|
||||||
|
else v);
|
||||||
|
in
|
||||||
|
constrainImportsArgsRecursive
|
||||||
|
(sp-module.nixosModules.default (constrainConfigArgs args))
|
||||||
)
|
)
|
||||||
(lib.attrsets.attrValues sp-modules);
|
(nixpkgs.lib.attrsets.attrValues sp-modules);
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
formatter.x86_64-linux = nixpkgs.legacyPackages.x86_64-linux.nixpkgs-fmt;
|
formatter.x86_64-linux = nixpkgs.legacyPackages.x86_64-linux.nixpkgs-fmt;
|
||||||
|
|
|
@ -1,24 +1,16 @@
|
||||||
[
|
[
|
||||||
[
|
[ "mailserver" ],
|
||||||
"services",
|
[ "selfprivacy", "userdata", "domain" ],
|
||||||
"redis"
|
[ "selfprivacy", "userdata", "email" ],
|
||||||
],
|
[ "selfprivacy", "userdata", "hashedMasterPassword" ],
|
||||||
[
|
[ "selfprivacy", "userdata", "simple-nixos-mailserver" ],
|
||||||
"mailserver"
|
[ "selfprivacy", "userdata", "useBinds" ],
|
||||||
],
|
[ "selfprivacy", "userdata", "username" ],
|
||||||
[
|
[ "selfprivacy", "userdata", "users" ],
|
||||||
"selfprivacy",
|
[ "services", "dovecot2" ],
|
||||||
"userdata",
|
[ "services", "opendkim" ],
|
||||||
"email"
|
[ "services", "postfix", "group" ],
|
||||||
],
|
[ "services", "postfix", "user" ],
|
||||||
[
|
[ "services", "redis" ],
|
||||||
"selfprivacy",
|
[ "services", "rspamd" ]
|
||||||
"userdata",
|
|
||||||
"domain"
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"selfprivacy",
|
|
||||||
"userdata",
|
|
||||||
"username"
|
|
||||||
]
|
|
||||||
]
|
]
|
||||||
|
|
|
@ -6,17 +6,14 @@
|
||||||
|
|
||||||
outputs = { self, mailserver }: {
|
outputs = { self, mailserver }: {
|
||||||
# tricks to rename (alias) the original module
|
# tricks to rename (alias) the original module
|
||||||
nixosModules.default = args@{ pkgs, ... }:
|
nixosModules.default = args@{ pkgs, config, ... }:
|
||||||
let
|
let
|
||||||
module = mailserver.nixosModules.default args;
|
module = mailserver.nixosModules.default args;
|
||||||
in
|
in
|
||||||
module // {
|
module // {
|
||||||
imports = module.imports ++ [
|
imports = module.imports ++ [
|
||||||
./config.nix
|
./config.nix
|
||||||
({ config, ... }: {
|
{ mailserver = config.selfprivacy.userdata.simple-nixos-mailserver; }
|
||||||
mailserver =
|
|
||||||
config.selfprivacy.userdata.simple-nixos-mailserver;
|
|
||||||
})
|
|
||||||
];
|
];
|
||||||
options = module.options // {
|
options = module.options // {
|
||||||
selfprivacy.userdata.simple-nixos-mailserver =
|
selfprivacy.userdata.simple-nixos-mailserver =
|
||||||
|
|
Loading…
Reference in New Issue