{ self, nixpkgs, agenix, nixos-exporter, solid-xmpp-alarm, ... }@inputs: rec { generateNixosSystem = { name, system ? "x86_64-linux", group ? null, }: let localNixpkgs = nixpkgs.lib.attrByPath [ "nixpkgs-${name}" ] nixpkgs inputs; in localNixpkgs.lib.nixosSystem { system = system; modules = [ ({ ... }: { /* Make the contents of the flake availiable to modules. Useful for having the monitoring server scraping the target config from all other servers automatically. */ _module.args._nixfiles = self; }) ../configuration/common ../users/clerie ({ ... }: { nixpkgs.overlays = [ (_: _: { inherit (nixos-exporter.packages."x86_64-linux") nixos-exporter; }) ]; clerie.monitoring = nixpkgs.lib.attrsets.optionalAttrs (group != null) { serviceLevel = group; }; }) agenix.nixosModules.default solid-xmpp-alarm.nixosModules.solid-xmpp-alarm (../hosts + "/${name}/configuration.nix") # Automatically load secrets from the hosts secrets directory ({ lib, ... }: let secretsPath = ../hosts + "/${name}/secrets"; in { age.secrets = lib.mapAttrs' (filename: _: lib.nameValuePair (lib.removeSuffix ".age" filename) { file = secretsPath + "/${filename}"; }) (lib.filterAttrs (name: type: (type == "regular") && (lib.hasSuffix ".age" name) ) (if builtins.pathExists secretsPath then builtins.readDir secretsPath else {})); }) ]; }; mapToNixosConfigurations = hosts: builtins.mapAttrs (name: host: generateNixosSystem host) hosts; generateColmenaHost = name: hostSystem: { deployment = { targetHost = "${name}.net.clerie.de"; targetUser = null; tags = let group = nixpkgs.lib.attrByPath [ "clerie" "monitoring" "serviceLevel" ] null hostSystem.config; in nixpkgs.lib.lists.optional (group != null) group; }; nixpkgs.system = hostSystem.config.nixpkgs.system; imports = hostSystem._module.args.modules; deployment.allowLocalDeployment = builtins.any (n: n == name) [ "schule" "osmium" ]; }; mapToColmenaHosts = hosts: builtins.mapAttrs (generateColmenaHost) hosts; buildHosts = hosts: builtins.mapAttrs (name: host: host.config.system.build.toplevel) (nixpkgs.lib.filterAttrs (name: host: (builtins.substring 0 1 name) != "_") hosts); }