summaryrefslogtreecommitdiff
path: root/lib/hosts.nix
diff options
context:
space:
mode:
Diffstat (limited to 'lib/hosts.nix')
-rw-r--r--lib/hosts.nix80
1 files changed, 80 insertions, 0 deletions
diff --git a/lib/hosts.nix b/lib/hosts.nix
new file mode 100644
index 0000000..91b6b40
--- /dev/null
+++ b/lib/hosts.nix
@@ -0,0 +1,80 @@
+{
+ pkgs,
+ hostsDir ? ../hosts,
+ commonImports ? [],
+ pkgsPath ? ../pkgs,
+ modules ? {},
+ overlays ? {},
+ profiles ? {},
+ users ? {},
+ sources ? {}
+}:
+
+with pkgs.lib;
+
+rec {
+ hostNames = attrNames (
+ filterAttrs (
+ name: type: type == "directory"
+ ) (
+ builtins.readDir hostsDir
+ )
+ );
+
+ hostConfig = hostName: { config, ... }: {
+ _module.args = {
+ inherit hosts groups;
+ };
+ imports = [
+ (import (hostsDir + "/${hostName}/configuration.nix"))
+ # urgh, yes, we still need to manually import the deploy module for now
+ # at least if i want to keep my thing reusable.
+ ../modules/deploy
+ ] ++ commonImports;
+ networking = {
+ inherit hostName;
+ };
+ nixpkgs.pkgs =
+ let pkgs = import pkgsPath {
+ inherit (config.nixpkgs) config system;
+ };
+ in if pkgs ? nixpkgs then pkgs.nixpkgs else pkgs;
+ };
+
+ hosts = listToAttrs (
+ map (
+ hostName: nameValuePair hostName (
+ import (pkgs.path + "/nixos/lib/eval-config.nix") {
+ modules = [
+ (hostConfig hostName)
+ (if sources ? home-manager then sources.home-manager + "/nixos" else {})
+ ];
+ specialArgs = { inherit modules overlays profiles users sources; };
+ }
+ )
+ ) hostNames
+ );
+
+ groupNames = unique (
+ concatLists (
+ mapAttrsToList (
+ name: host: host.config.hexchen.deploy.groups
+ ) hosts
+ )
+ );
+
+ groups = listToAttrs (
+ map (
+ groupName: nameValuePair groupName (
+ filter (
+ host: elem groupName host.config.hexchen.deploy.groups
+ ) (
+ attrValues (
+ filterAttrs (_: h: h.config.hexchen.deploy.enable) hosts
+ )
+ )
+ )
+ ) groupNames
+ );
+}
+