Starting out simple. Small.

This commit is contained in:
Yaro Kasear 2025-07-20 12:45:51 -05:00
parent cde6ba8905
commit 96cc5e9501
5 changed files with 47 additions and 62 deletions

View file

@ -1,22 +1,28 @@
# Metanix
*Declare your infrastructure!*
_Declare your infrastructure!_
**THIS IS STILL IN DESIGN AND EXPERIMENTATION PHASE**
## Description
Metanix is a nix library designed to allow a central, no-nonsense nix file to be written to allow for a Source of Truth leading to deterministic configuration identifiers like IP addresses, UIDs, GIDs, and enable quickly establishing frameworks for NixOS systems existing within an ecosystem.
As such, I am trying to design this system to enable a would-be admin to answer very simple one-word questions. Sort of.
## What?
Or, in other words, what systems do you want Metanix to manage or at least be aware of?
## Where?
Or, in other words, what networks and subnets do you have and where do your systems/users belong?
## Who?
Or, in other words, who are your users?
## How?
Or, in other words, what kind of access control groups do you want or need to best control how everything is used.
## Enter: THINGS
@ -119,28 +125,32 @@ More on each of these categories of things later.
role = "infrastructure";
tags = [ "router" "linode" ];
services = [ "nginx-proxy" "headscale" ];
config = {...}: { # NixOS config here, or use a path to one. };
config = {...}: { # NixOS config here, or use a path to one.
};
};
metatron = {
owner = "yaro";
nixOS = true;
role = "server";
tags = ["server" "linode" "upstream"];
config = {...}: { # NixOS config here, or use a path to one. };
config = {...}: { # NixOS config here, or use a path to one.
};
};
io = {
owner = "yaro";
nixOS = true;
role = "infrastructure";
tags = ["router" "downstream"];
config = {...}: { # NixOS config here, or use a path to one. };
config = {...}: { # NixOS config here, or use a path to one.
};
};
europa = {
owner = "yaro";
nixOS = true;
role = "infrastructure";
tags = ["router" "downstream"];
config = {...}: { # NixOS config here, or use a path to one. };
config = {...}: { # NixOS config here, or use a path to one.
};
};
deimos = {
owner = "yaro";
@ -157,7 +167,8 @@ More on each of these categories of things later.
"forgejo"
"headscale"
];
config = {...}: { # NixOS config here, or use a path to one. };
config = {...}: { # NixOS config here, or use a path to one.
};
};
phobos = {
owner = "yaro";
@ -171,7 +182,8 @@ More on each of these categories of things later.
"sandbox"
"node-red"
];
config = {...}: { # NixOS config here, or use a path to one. };
config = {...}: { # NixOS config here, or use a path to one.
};
};
terra = {
owner = "yaro";
@ -189,7 +201,8 @@ More on each of these categories of things later.
group = {
userGroups = {
programmers = {
config = { ... }: { # Home-manager config here, or use a path to one. };
config = { ... }: { # Home-manager config here, or use a path to one.
};
};
};
systemGroups = {
@ -198,7 +211,8 @@ More on each of these categories of things later.
"nfs"
"isci"
];
config = { ... }: { # Home-manager config here, or use a path to one. };
config = { ... }: { # Home-manager config here, or use a path to one.
};
};
};
};

16
flake.lock generated
View file

@ -2,18 +2,14 @@
"nodes": {
"nixpkgs": {
"locked": {
"lastModified": 1752950548,
"narHash": "sha256-NS6BLD0lxOrnCiEOcvQCDVPXafX1/ek1dfJHX1nUIzc=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "c87b95e25065c028d31a94f06a62927d18763fdf",
"type": "github"
"lastModified": 0,
"narHash": "sha256-NV4S2Lf2hYmZQ3Qf4t/YyyBaJNuxLPyjzvDma0zPp/M=",
"path": "/nix/store/4878dzkl1bdxv6wqavzy7bdracvl9q16-source",
"type": "path"
},
"original": {
"owner": "NixOS",
"ref": "nixos-unstable",
"repo": "nixpkgs",
"type": "github"
"id": "nixpkgs",
"type": "indirect"
}
},
"root": {

View file

@ -0,0 +1 @@
locations: builtins.attrNames locations

View file

@ -1,45 +1,12 @@
# lib/metanix.nix
{ data, lib }:
let
buildSystemIndex =
indexOf = name: names:
let
flattenSystems = locationName: subnetName: systems:
lib.mapAttrsToList
(systemName: systemCfg: {
inherit systemName locationName subnetName;
primary = systemCfg.primary or false;
macs = systemCfg.macAddresses or [ ];
})
systems;
indexed = builtins.imap0 (i: v: { inherit i v; }) names;
matches = builtins.filter (x: x.v == name) indexed;
in
if matches == [ ] then null else (builtins.head matches).i;
allSystems =
builtins.concatLists (
lib.mapAttrsToList
(locationName: location:
builtins.concatLists (
lib.mapAttrsToList
(subnetName: subnet:
flattenSystems locationName subnetName (subnet.systems or { })
)
(location.subnets or { })
)
)
data.locations
);
in
builtins.foldl'
(acc: entry:
let
existing = acc.${entry.systemName} or [ ];
in
acc // {
${entry.systemName} = existing ++ [ builtins.removeAttrs entry [ "systemName" ] ];
}
)
{ }
allSystems;
in
{
inherit buildSystemIndex;
}
{ indexOf = indexOf; }

View file

@ -0,0 +1,7 @@
let
buildLocationList = import ../lib/functions/buildLocationList.nix;
sampleData = import ./meta.nix;
in
{
result = buildLocationList sampleData.locations;
}