83 lines
2.4 KiB
Nix
83 lines
2.4 KiB
Nix
{ user-name, host-name }:
|
|
|
|
let
|
|
lib = import <nixpkgs/lib>;
|
|
|
|
krebs-modules-path = ./krebs/3modules;
|
|
krebs-pkgs-path = ./krebs/5pkgs;
|
|
user-modules-path = ./. + "/${user-name}/3modules";
|
|
user-pkgs-path = ./. + "/${user-name}/5pkgs";
|
|
|
|
out =
|
|
(lib.mapAttrs (k: v: mk-namespace (./. + "/${k}"))
|
|
(lib.filterAttrs
|
|
(k: v: !lib.hasPrefix "." k && v == "directory" &&
|
|
builtins.pathExists (./. + "/${k}/1systems"))
|
|
(builtins.readDir ./.)));
|
|
|
|
eval = path: import <nixpkgs/nixos/lib/eval-config.nix> {
|
|
system = builtins.currentSystem;
|
|
modules = [
|
|
({ config, ... }:
|
|
with import ./krebs/4lib { inherit lib; };
|
|
{
|
|
options.krebs.exec.host = mkOption {
|
|
type = types.host;
|
|
default = config.krebs.hosts.${host-name};
|
|
};
|
|
options.krebs.exec.user = mkOption {
|
|
type = types.user;
|
|
default = config.krebs.users.${user-name};
|
|
};
|
|
}
|
|
)
|
|
path
|
|
krebs-modules-path
|
|
user-modules-path
|
|
] ++ [
|
|
({ config, lib, pkgs, ... }@args: {
|
|
_module.args.pkgs =
|
|
(import krebs-pkgs-path args) //
|
|
(import user-pkgs-path args);
|
|
})
|
|
];
|
|
};
|
|
|
|
mk-namespace = path: mapNixDir mk-system (path + "/1systems");
|
|
|
|
mk-system = path: rec {
|
|
inherit (eval path) config options;
|
|
system = config.system.build.toplevel;
|
|
fetch = import ./krebs/0tools/fetch.nix { inherit config lib; };
|
|
};
|
|
|
|
mapNixDir = f: path: lib.mapAttrs (_: f) (nixDir path);
|
|
|
|
nixDir = path:
|
|
builtins.listToAttrs
|
|
(catMaybes
|
|
(lib.mapAttrsToList
|
|
(k: v: {
|
|
directory =
|
|
let p = path + "/${k}/default.nix"; in
|
|
if builtins.pathExists p
|
|
then Just (lib.nameValuePair k p)
|
|
else Nothing;
|
|
regular =
|
|
let p = path + "/${k}"; in
|
|
if lib.hasSuffix ".nix" p
|
|
then Just (lib.nameValuePair (lib.removeSuffix ".nix" k) p)
|
|
else Nothing;
|
|
}.${v} or Nothing)
|
|
(builtins.readDir path)));
|
|
|
|
# TODO move to lib
|
|
Just = x: { type = "maybe"; value = x; };
|
|
Nothing = { type = "maybe"; };
|
|
isMaybe = x: builtins.typeOf x == "set" && x.type or false == "maybe";
|
|
isJust = x: isMaybe x && builtins.hasAttr "value" x;
|
|
fromJust = x: assert isJust x; x.value;
|
|
catMaybes = xs: map fromJust (builtins.filter isJust xs);
|
|
|
|
in out
|