From 197433a4c397aaf8bb6de1299e2b2bed851788c4 Mon Sep 17 00:00:00 2001 From: h7x4 Date: Tue, 30 Dec 2025 02:01:10 +0900 Subject: [PATCH] topology: localize nixos module, add custom extractor, fix misc --- flake.nix | 54 +++++++++++++++------- topology.nix => topology/default.nix | 59 ++++++++++++++++++------ topology/icons/greg-ng.png | Bin 0 -> 41224 bytes topology/service-extractors/greg-ng.nix | 11 +++++ 4 files changed, 93 insertions(+), 31 deletions(-) rename topology.nix => topology/default.nix (67%) create mode 100644 topology/icons/greg-ng.png create mode 100644 topology/service-extractors/greg-ng.nix diff --git a/flake.nix b/flake.nix index d2431b8..9601dd4 100644 --- a/flake.nix +++ b/flake.nix @@ -93,7 +93,6 @@ modules = [ configurationPath sops-nix.nixosModules.sops - inputs.nix-topology.nixosModules.default ] ++ extraArgs.modules or []; pkgs = import nixpkgs { @@ -244,27 +243,50 @@ bluemap = pkgs.callPackage ./packages/bluemap.nix { }; out-of-your-element = pkgs.callPackage ./packages/out-of-your-element.nix { }; - } // + } + // + # Mediawiki extensions (lib.pipe null [ (_: pkgs.callPackage ./packages/mediawiki-extensions { }) (lib.flip builtins.removeAttrs ["override" "overrideDerivation"]) (lib.mapAttrs' (name: lib.nameValuePair "mediawiki-${name}")) ]) - // lib.genAttrs allMachines - (machine: self.nixosConfigurations.${machine}.config.system.build.toplevel); - }; + // + # Machines + lib.genAttrs allMachines + (machine: self.nixosConfigurations.${machine}.config.system.build.toplevel) + // + # Nix-topology + (let + topology' = import inputs.nix-topology { + pkgs = import nixpkgs { + system = "x86_64-linux"; + overlays = [ inputs.nix-topology.overlays.default ]; + }; - topology.x86_64-linux = import inputs.nix-topology { - pkgs = import nixpkgs { - system = "x86_64-linux"; - overlays = [inputs.nix-topology.overlays.default]; - }; # Only this package set must include nix-topology.overlays.default - modules = [ - # Your own file to define global topology. Works in principle like a nixos module but uses different options. - ./topology.nix - # Inline module to inform topology of your existing NixOS hosts. - { nixosConfigurations = self.nixosConfigurations; } - ]; + modules = [ + ./topology + { + nixosConfigurations = lib.mapAttrs (_name: nixosCfg: nixosCfg.extendModules { + modules = [ + inputs.nix-topology.nixosModules.default + ./topology/service-extractors/greg-ng.nix + ]; + }) self.nixosConfigurations; + } + ]; + }; + in { + topology = topology'.config.output; + topology-png = pkgs.runCommand "pvv-config-topology-png" { + nativeBuildInputs = [ pkgs.writableTmpDirAsHomeHook ]; + } '' + mkdir -p "$out" + for file in '${topology'.config.output}'/*.svg; do + ${lib.getExe pkgs.imagemagick} -density 300 -background none "$file" "$out"/"$(basename "''${file%.svg}.png")" + done + ''; + }); }; }; } diff --git a/topology.nix b/topology/default.nix similarity index 67% rename from topology.nix rename to topology/default.nix index 8253ac5..eb1cd93 100644 --- a/topology.nix +++ b/topology/default.nix @@ -1,4 +1,4 @@ -{ config, ... }: +{ lib, config, ... }: let inherit (config.lib.topology) @@ -8,10 +8,9 @@ let mkDevice mkConnection mkConnectionRev; - values = import ./values.nix; + values = import ../values.nix; in { - -### Networks + ### Networks networks.pvv = { name = "PVV Network"; @@ -44,7 +43,7 @@ in { interfaces.eth1.network = "ntnu"; }; -### Brus + ### Brus nodes.ntnu-pvv-router = mkRouter "NTNU PVV Gateway" { interfaceGroups = [ ["wan1"] ["eth1"] ]; @@ -53,12 +52,19 @@ in { }; nodes.brus-switch = mkSwitch "Brus Switch" { - interfaceGroups = [ ["eth1" "eth2" "eth3" "eth4" "eth5" "eth6" "eth7"] ]; + interfaceGroups = [ (lib.genList (i: "eth${toString i}") 16) ]; + connections.eth2 = mkConnection "bekkalokk" "enp2s0"; - connections.eth3 = mkConnection "bicep" "enp6s0f0"; - # connections.eth4 = mkConnection "buskerud" "enp3s0f0"; + # connections.eth3 = mkConnection "bicep" "enp6s0f0"; + connections.eth4 = mkConnection "buskerud" "eth1"; connections.eth5 = mkConnection "knutsen" "eth1"; - connections.eth7 = mkConnection "joshua" "eth1"; + connections.eth6 = mkConnection "powerpuff-cluster" "eth1"; + + connections.eth8 = mkConnection "lupine-1" "enp0s31f6"; + connections.eth9 = mkConnection "lupine-2" "enp0s31f6"; + connections.eth11 = mkConnection "lupine-3" "enp0s31f6"; + connections.eth10 = mkConnection "lupine-4" "enp0s31f6"; + connections.eth12 = mkConnection "lupine-5" "enp0s31f6"; }; nodes.knutsen = mkRouter "knutsen" { @@ -69,17 +75,37 @@ in { interfaces.vpn1.virtual = true; }; - nodes.joshua = mkDevice "joshua" { + nodes.buskerud = mkDevice "buskerud" { interfaceGroups = [ ["eth1"] ]; }; nodes.shark = { guestType = "proxmox"; - parent = config.nodes.joshua.id; + parent = config.nodes.buskerud.id; }; + ### Powerpuff -### PVV + nodes.powerpuff-cluster = mkDevice "powerpuff-cluster" { + interfaceGroups = [ ["eth1"] ]; + }; + + nodes.kommode = { + guestType = "proxmox"; + parent = config.nodes.powerpuff-cluster.id; + }; + + nodes.bicep = { + guestType = "proxmox"; + parent = config.nodes.powerpuff-cluster.id; + }; + + nodes.ustetind = { + guestType = "proxmox"; + parent = config.nodes.powerpuff-cluster.id; + }; + + ### PVV nodes.ntnu-veggen = mkRouter "NTNU-Veggen" { interfaceGroups = [ ["wan1"] ["eth1"] ]; @@ -102,7 +128,7 @@ in { }; -### Openstack + ### Openstack nodes.stackit = mkDevice "stackit" { interfaceGroups = [ ["*"] ]; @@ -112,9 +138,12 @@ in { guestType = "openstack"; parent = config.nodes.stackit.id; }; - nodes.bob = { + nodes.wenche = { + guestType = "openstack"; + parent = config.nodes.stackit.id; + }; + nodes.bakke = { guestType = "openstack"; parent = config.nodes.stackit.id; }; - } diff --git a/topology/icons/greg-ng.png b/topology/icons/greg-ng.png new file mode 100644 index 0000000000000000000000000000000000000000..89f18f9842db59ea07b0f7f95fc2fb1f96ca8c0a GIT binary patch literal 41224 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 nu-EUiUf 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 M>FVdQ&MBb@0J%OQfdBvi literal 0 HcmV?d00001 diff --git a/topology/service-extractors/greg-ng.nix b/topology/service-extractors/greg-ng.nix new file mode 100644 index 0000000..ce81279 --- /dev/null +++ b/topology/service-extractors/greg-ng.nix @@ -0,0 +1,11 @@ +{ config, lib, ... }: +let + cfg = config.services.greg-ng or { enable = false; }; +in +{ + config.topology.self.services.greg-ng = lib.mkIf cfg.enable { + name = "Greg-ng"; + icon = ../icons/greg-ng.png; + details.listen = { text = "${cfg.settings.host}:${toString cfg.settings.port}"; }; + }; +}