let sources' = import ./npins; infrastructure_sources = import "${sources'.infrastructure}/npins"; sources_merged = infrastructure_sources // sources'; # Patch sources directly sources = builtins.mapAttrs (patch.base { pkgs = import sources'.nixos-unstable { }; }) .applyPatches' sources_merged; nix-lib = import ./lib/nix-lib; patch = import ./lib/nix-patches { patchFile = ./patches; }; nodes' = import ./meta/nodes.nix; nodes = builtins.attrNames nodes'; mkNode = node: { # Import the base configuration for each node imports = [ ./machines/${node}/_configuration.nix ]; }; nixpkgs' = import ./meta/nixpkgs.nix; # All supported nixpkgs versions, instanciated nixpkgs = nix-lib.mapSingleFuse mkNixpkgs nixpkgs'.supported; # Get the configured nixos version for the node, # defaulting to the one defined in meta/nixpkgs version = node: nodes'.${node}.nixpkgs or nixpkgs'.default; # Builds a patched version of nixpkgs, only as the source mkNixpkgs' = v: patch.mkNixpkgsSrc rec { src = sources'.${name}; name = "nixos-${v}"; }; # Instanciates the required nixpkgs version mkNixpkgs = version: import (mkNixpkgs' version) { }; ### # Function to create arguments based on the node # mkArgs = node: rec { lib = nixpkgs.${version node}.lib // { extra = nix-lib; }; meta = (import ./meta) lib; nodeMeta = meta.nodes.${node}; }; in { meta = { nodeNixpkgs = nix-lib.mapSingleFuse (n: nixpkgs.${version n}) nodes; specialArgs = { inherit nixpkgs sources; dgn-keys = import ./keys; }; nodeSpecialArgs = nix-lib.mapSingleFuse mkArgs nodes; }; defaults = { pkgs, name, nodeMeta, ... }: { # Import the default modules imports = [ ./modules "${sources.infrastructure}/modules" (import "${sources.lix-module}/module.nix" { lix = pkgs.applyPatches { name = "lix-2.90.patched"; src = sources.lix; patches = [ ./patches/00-disable-installChecks-lix.patch ]; }; }) ]; # Include default secrets age-secrets.sources = [ ./machines/${name}/secrets ]; # Deployment config is specified in meta.nodes.${node}.deployment inherit (nodeMeta) deployment; nix = { # Set NIX_PATH to the patched version of nixpkgs nixPath = [ "nixpkgs=${mkNixpkgs' (version name)}" ]; optimise.automatic = true; gc = { automatic = true; dates = "weekly"; options = "--delete-older-than 7d"; }; }; # Allow unfree packages nixpkgs.config.allowUnfree = true; # Use the stateVersion declared in the metadata system = { inherit (nodeMeta) stateVersion; }; }; } // (nix-lib.mapSingleFuse mkNode nodes)