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
Alexander Tomokhov 2023-11-15 04:15:50 +04:00
parent 26b3071929
commit 4419a1323a
3 changed files with 50 additions and 42 deletions

View File

@ -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;

View File

@ -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"
]
] ]

View File

@ -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 =