Compare commits

..

No commits in common. "b6eb29fad90ffa2a89823fe6ae72b10216cf4c6e" and "8b5f75a2b5611133bb8aef2e0a52770c9b0e0968" have entirely different histories.

20 changed files with 314 additions and 707 deletions

File diff suppressed because it is too large Load diff

View file

@ -5,7 +5,6 @@
./disk-config.nix ./disk-config.nix
"${self}/modules/nixos/optional/systemd-networkd-server.nix" "${self}/modules/nixos/optional/systemd-networkd-server.nix"
"${self}/modules/nixos/optional/nix-topology-self.nix"
]; ];
node.lockFromBootstrapping = lib.mkForce false; node.lockFromBootstrapping = lib.mkForce false;

View file

@ -5,7 +5,6 @@
./disk-config.nix ./disk-config.nix
"${self}/modules/nixos/optional/systemd-networkd-server.nix" "${self}/modules/nixos/optional/systemd-networkd-server.nix"
"${self}/modules/nixos/optional/nix-topology-self.nix"
]; ];
topology.self = { topology.self = {

View file

@ -8,9 +8,18 @@ in
./disk-config.nix ./disk-config.nix
"${self}/modules/nixos/optional/systemd-networkd-server.nix" "${self}/modules/nixos/optional/systemd-networkd-server.nix"
"${self}/modules/nixos/optional/nix-topology-self.nix"
]; ];
topology.self = {
icon = "devices.cloud-server";
interfaces.wg = {
addresses = [ "192.168.3.4" ];
renderer.hidePhysicalConnections = true;
virtual = true;
type = "wireguard";
};
};
system.stateVersion = "23.11"; system.stateVersion = "23.11";
services.syncthing = { services.syncthing = {

View file

@ -5,7 +5,6 @@
./disk-config.nix ./disk-config.nix
"${self}/modules/nixos/optional/systemd-networkd-server.nix" "${self}/modules/nixos/optional/systemd-networkd-server.nix"
"${self}/modules/nixos/optional/nix-topology-self.nix"
]; ];
topology.self = { topology.self = {

View file

@ -16,11 +16,6 @@ in
]; ];
topology.self.interfaces = {
"eth1" = { };
"wifi" = { };
};
swarselsystems = { swarselsystems = {
isLaptop = true; isLaptop = true;
isNixos = true; isNixos = true;

View file

@ -5,7 +5,6 @@
./disk-config.nix ./disk-config.nix
"${self}/modules/nixos/optional/systemd-networkd-server.nix" "${self}/modules/nixos/optional/systemd-networkd-server.nix"
"${self}/modules/nixos/optional/nix-topology-self.nix"
]; ];
topology.self = { topology.self = {

View file

@ -8,17 +8,6 @@
"${self}/modules/nixos/optional/systemd-networkd-server.nix" "${self}/modules/nixos/optional/systemd-networkd-server.nix"
]; ];
topology.self = {
interfaces = {
"eth1" = { };
"eth2" = { };
"eth3" = { };
"eth4" = { };
"eth5" = { };
"eth6" = { };
};
};
swarselsystems = { swarselsystems = {
info = "HUNSN RM02, 8GB RAM"; info = "HUNSN RM02, 8GB RAM";
flakePath = "/root/.dotfiles"; flakePath = "/root/.dotfiles";

View file

@ -16,8 +16,6 @@ in
WLR_RENDERER_ALLOW_SOFTWARE = 1; WLR_RENDERER_ALLOW_SOFTWARE = 1;
}; };
topology.self.interfaces."demo host" = { };
services.qemuGuest.enable = true; services.qemuGuest.enable = true;
boot = { boot = {

View file

@ -21,14 +21,6 @@ in
]; ];
topology.self = {
interfaces = {
"eth1" = { };
"wifi" = { };
"fritz-wg" = { };
};
};
swarselsystems = { swarselsystems = {
lowResolution = "1280x800"; lowResolution = "1280x800";
highResolution = "2560x1600"; highResolution = "2560x1600";

View file

@ -8,13 +8,6 @@
"${self}/modules/nixos/optional/microvm-host.nix" "${self}/modules/nixos/optional/microvm-host.nix"
]; ];
topology.self = {
interfaces = {
"eth1" = { };
"eth2" = { };
};
};
boot = { boot = {
loader.systemd-boot.enable = true; loader.systemd-boot.enable = true;
loader.efi.canTouchEfiVariables = true; loader.efi.canTouchEfiVariables = true;

View file

@ -6,8 +6,6 @@
./hardware-configuration.nix ./hardware-configuration.nix
]; ];
topology.self.interfaces."bootstrapper" = { };
networking = { networking = {
hostName = "toto"; hostName = "toto";
firewall.enable = false; firewall.enable = false;

View file

@ -5,11 +5,8 @@
./hardware-configuration.nix ./hardware-configuration.nix
"${self}/modules/nixos/optional/systemd-networkd-server.nix" "${self}/modules/nixos/optional/systemd-networkd-server.nix"
"${self}/modules/nixos/optional/nix-topology-self.nix"
]; ];
topology.self.interfaces."eth1" = { };
boot = { boot = {
loader.systemd-boot.enable = true; loader.systemd-boot.enable = true;
loader.efi.canTouchEfiVariables = true; loader.efi.canTouchEfiVariables = true;

View file

@ -1,5 +1,5 @@
{ {
description = "Minimal installer flake - automatically generated by SwarselSystems.org"; description = "Minimal installer flake - not to be used manually";
inputs.swarsel.url = "./.."; inputs.swarsel.url = "./..";

View file

@ -1,13 +0,0 @@
{ config, globals, ... }:
{
topology.self = {
icon = lib.mkIf config.swarselsystems.isCloud "devices.cloud-server";
interfaces.wan = lib.mkIf config.swarselsystems.isCloud { };
interfaces.wg = lib.mkIf (config.swarselsystems.server.wireguard.isClient || config.swarselsystems.server.wireguard.isServer) {
addresses = [ globals.networks.twothreetunnel-wg.hosts.${config.node.name}.ipv4 ];
renderer.hidePhysicalConnections = true;
virtual = true;
type = "wireguard";
};
};
}

View file

@ -5,6 +5,7 @@
]; ];
perSystem = { pkgs, ... }: { perSystem = { pkgs, ... }: {
# formatter = pkgs.nixpkgs-fmt;
# formatter is set by treefmt to: # formatter is set by treefmt to:
# formatter = lib.mkIf config.treefmt.flakeFormatter (lib.mkDefault config.treefmt.build.wrapper); # formatter = lib.mkIf config.treefmt.flakeFormatter (lib.mkDefault config.treefmt.build.wrapper);
treefmt = { treefmt = {

View file

@ -1,35 +1,25 @@
# adapted from https://github.com/oddlama/nix-config/blob/main/nix/globals.nix # adapted from https://github.com/oddlama/nix-config/blob/main/nix/globals.nix
{ self, inputs, ... }: { inputs, ... }:
{ {
flake = { config, lib, ... }:
imports = [
(
{ lib, flake-parts-lib, ... }:
flake-parts-lib.mkTransposedPerSystemModule {
name = "globals";
file = ./globals.nix;
option = lib.mkOption {
type = lib.types.unspecified;
};
}
)
];
perSystem = { lib, pkgs, ... }:
{ {
globals = globals =
let let
globalsSystem = lib.evalModules { globalsSystem = lib.evalModules {
prefix = [ "globals" ]; prefix = [ "globals" ];
specialArgs = { specialArgs = {
inherit (pkgs) lib; inherit (inputs.self.pkgs.x86_64-linux) lib; # fuck
inherit (self.outputs) nodes; # inherit (self.outputs) lib;
inherit inputs; inherit inputs;
inherit (config) nodes;
}; };
modules = [ modules = [
../modules/nixos/common/globals.nix ../modules/nixos/common/globals.nix
( (
{ lib, ... }: { lib, ... }:
let let
# Try to access the extra builtin we loaded via nix-plugins.
# Throw an error if that doesn't exist.
sopsImportEncrypted = sopsImportEncrypted =
assert lib.assertMsg (builtins ? extraBuiltins.sopsImportEncrypted) assert lib.assertMsg (builtins ? extraBuiltins.sopsImportEncrypted)
"The extra builtin 'sopsImportEncrypted' is not available, so repo.secrets cannot be decrypted. Did you forget to add nix-plugins and point it to `./nix/extra-builtins.nix` ?"; "The extra builtin 'sopsImportEncrypted' is not available, so repo.secrets cannot be decrypted. Did you forget to add nix-plugins and point it to `./nix/extra-builtins.nix` ?";
@ -48,7 +38,7 @@
{ {
globals = lib.mkMerge ( globals = lib.mkMerge (
lib.concatLists ( lib.concatLists (
lib.flip lib.mapAttrsToList self.outputs.nodes ( lib.flip lib.mapAttrsToList config.nodes (
name: cfg: name: cfg:
builtins.addErrorContext "while aggregating globals from nixosConfigurations.${name} into flake-level globals:" cfg.config._globalsDefs builtins.addErrorContext "while aggregating globals from nixosConfigurations.${name} into flake-level globals:" cfg.config._globalsDefs
) )
@ -60,6 +50,8 @@
}; };
in in
{ {
# Make sure the keys of this attrset are trivially evaluatable to avoid infinite recursion,
# therefore we inherit relevant attributes from the config.
inherit (globalsSystem.config.globals) inherit (globalsSystem.config.globals)
domains domains
services services

View file

@ -11,8 +11,7 @@
specialArgs = { specialArgs = {
inherit inputs outputs self minimal homeLib configName arch; inherit inputs outputs self minimal homeLib configName arch;
inherit (config.pkgs.${arch}) lib; inherit (config.pkgs.${arch}) lib;
inherit (config) nodes; inherit (config) globals nodes;
globals = config.globals.${arch};
type = "nixos"; type = "nixos";
}; };
modules = [ modules = [
@ -69,8 +68,7 @@
inputs.nix-darwin.lib.darwinSystem { inputs.nix-darwin.lib.darwinSystem {
specialArgs = { specialArgs = {
inherit inputs lib outputs self minimal configName; inherit inputs lib outputs self minimal configName;
inherit (config) nodes; inherit (config) globals nodes;
globals = config.globals.${arch};
}; };
modules = [ modules = [
# inputs.disko.nixosModules.disko # inputs.disko.nixosModules.disko
@ -105,8 +103,7 @@
inherit pkgs; inherit pkgs;
extraSpecialArgs = { extraSpecialArgs = {
inherit inputs lib outputs self configName arch type; inherit inputs lib outputs self configName arch type;
inherit (config) nodes; inherit (config) globals nodes;
globals = config.globals.${arch};
minimal = false; minimal = false;
}; };
modules = [ modules = [

View file

@ -7,7 +7,6 @@
perSystem.topology.modules = [ perSystem.topology.modules = [
({ config, ... }: ({ config, ... }:
let let
inherit (self.outputs) globals;
inherit (config.lib.topology) inherit (config.lib.topology)
mkInternet mkInternet
mkDevice mkDevice
@ -22,89 +21,95 @@
networks = { networks = {
home-lan = { home-lan = {
name = "Home LAN"; name = "Home LAN";
inherit (globals.networks.home-lan) cidrv4; cidrv4 = "192.168.1.0/24";
};
fritz-wg = {
name = "Wireguard Tunnel for Fritzbox net access";
inherit (globals.networks.twothreetunnel-wg) cidrv4;
}; };
wg = { wg = {
name = "Wireguard Tunnel for proxy access"; name = "Wireguard Tunnel";
inherit (globals.networks.twothreetunnel-wg) cidrv4; cidrv4 = "192.168.3.0/24";
}; };
}; };
nodes = { nodes = {
internet = mkInternet { internet = mkInternet {
connections = [ connections = [
(mkConnection "fritzbox" "dsl")
(mkConnection "moonside" "wan") (mkConnection "moonside" "wan")
(mkConnection "belchsfactory" "wan") (mkConnection "pfsense" "wan")
(mkConnection "twothreetunnel" "wan") (mkConnection "milkywell" "wan")
(mkConnection "stoicclub" "wan")
(mkConnection "liliputsteps" "wan")
(mkConnection "eagleland" "wan")
(mkConnection "magicant" "wifi") (mkConnection "magicant" "wifi")
(mkConnection "toto" "bootstrapper") (mkConnection "toto" "bootstrapper")
(mkConnection "hotel" "demo host") (mkConnection "hotel" "demo host")
]; ];
}; };
hotel.interfaces."demo host" = { };
toto.interfaces."bootstrapper" = { };
milkywell.interfaces.wan = { };
moonside.interfaces.wan = { };
fritzbox = mkRouter "FRITZ!Box" { pfsense = mkRouter "pfSense" {
info = "FRITZ!Box 7682"; info = "HUNSN RM02";
image = "${self}/files/topology-images/hunsn.png"; image = "${self}/files/topology-images/hunsn.png";
interfaceGroups = [ interfaceGroups = [
[ [
"eth1"
"eth2" "eth2"
"eth3" "eth3"
"eth-wan" "eth4"
"wifi" "eth5"
"eth6"
] ]
[ "dsl" ] [ "wan" ]
]; ];
interfaces.wg = {
addresses = [ "192.168.3.1" ];
network = "wg";
virtual = true;
type = "wireguard";
};
connections = { connections = {
eth1 = mkConnection "winters" "eth1"; eth2 = mkConnection "switch-livingroom" "eth1";
eth2 = mkConnection "switch-bedroom" "eth1"; eth4 = mkConnection "winters" "eth1";
eth3 = mkConnection "switch-livingroom" "eth1"; eth3 = mkConnection "switch-bedroom" "eth1";
eth-wan = mkConnection "hintbooth" "eth6"; eth6 = mkConnection "wifi-ap" "eth1";
wgPyramid = mkConnection "pyramid" "fritz-wg"; wg = mkConnection "moonside" "wg";
wgMagicant = mkConnection "magicant" "fritz-wg";
wifiPyramid = mkConnection "pyramid" "wifi";
wifiMagicant = mkConnection "magicant" "wifi";
wifiBakery = mkConnection "bakery" "wifi";
wifiMachpizza = mkConnection "machpizza" "wifi";
}; };
interfaces = { interfaces = {
eth1 = {
addresses = [ globals.networks.home-lan.hosts.fritzbox.ipv4 ];
network = "home-lan";
};
eth2 = { eth2 = {
addresses = [ globals.networks.home-lan.hosts.fritzbox.ipv4 ]; addresses = [ "192.168.1.1" ];
network = "home-lan"; network = "home-lan";
}; };
eth3 = { eth3 = {
addresses = [ globals.networks.home-lan.hosts.fritzbox.ipv4 ]; addresses = [ "192.168.1.1" ];
network = "home-lan"; network = "home-lan";
}; };
eth-wan = { eth4 = {
addresses = [ globals.networks.home-lan.hosts.fritzbox.ipv4 ]; addresses = [ "192.168.1.1" ];
network = "home-lan"; network = "home-lan";
}; };
wifi = { eth6 = {
addresses = [ globals.networks.home-lan.hosts.fritzbox.ipv4 ]; addresses = [ "192.168.1.1" ];
virtual = true;
network = "home-lan"; network = "home-lan";
}; };
fritz-wg = { };
addresses = [ globals.networks.fritz-wg.hosts.fritzbox.ipv4 ]; };
network = "wg";
virtual = true; winters.interfaces."eth1" = { };
type = "wireguard"; bakery.interfaces = {
}; "eth1" = { };
"wifi" = { };
};
wifi-ap = mkSwitch "Wi-Fi AP" {
info = "Huawei";
image = "${self}/files/topology-images/huawei.png";
interfaceGroups = [
[
"eth1"
"wifi"
]
];
connections = {
wifi = mkConnection "bakery" "wifi";
}; };
}; };
@ -130,6 +135,33 @@
}; };
}; };
nswitch = mkDevice "Nintendo Switch" {
info = "Nintendo Switch";
image = "${self}/files/topology-images/nintendo-switch.png";
interfaces.eth1 = { };
};
magicant = mkDevice "magicant" {
icon = "${self}/files/topology-images/phone.png";
info = "Samsung Z Flip 6";
image = "${self}/files/topology-images/zflip6.png";
interfaces.wifi = { };
};
machpizza = mkDevice "machpizza" {
info = "MacBook Pro 2016";
icon = "${self}/files/topology-images/mac.png";
interfaces."eth1" = { };
};
pc = mkDevice "Windows Gaming Server" {
info = "i7-4790k, GTX970, 32GB RAM";
image = "${self}/files/topology-images/pc.png";
interfaces.eth1 = { };
};
pyramid.interfaces.eth1 = { };
switch-bedroom = mkSwitch "Switch Bedroom" { switch-bedroom = mkSwitch "Switch Bedroom" {
info = "TL-SG1005D"; info = "TL-SG1005D";
image = "${self}/files/topology-images/TL-SG1005D.png"; image = "${self}/files/topology-images/TL-SG1005D.png";
@ -146,37 +178,6 @@
connections.eth3 = mkConnection "machpizza" "eth1"; connections.eth3 = mkConnection "machpizza" "eth1";
}; };
nswitch = mkDevice "Nintendo Switch" {
info = "Nintendo Switch";
image = "${self}/files/topology-images/nintendo-switch.png";
interfaces.eth1 = { };
};
magicant = mkDevice "magicant" {
icon = "${self}/files/topology-images/phone.png";
info = "Samsung Z Flip 6";
image = "${self}/files/topology-images/zflip6.png";
interfaces = {
wifi = { };
fritz-wg = { };
};
};
machpizza = mkDevice "machpizza" {
info = "MacBook Pro 2016";
icon = "${self}/files/topology-images/mac.png";
interfaces = {
eth1 = { };
wifi = { };
};
};
pc = mkDevice "Windows Gaming Server" {
info = "i7-4790k, GTX970, 32GB RAM";
image = "${self}/files/topology-images/pc.png";
interfaces.eth1 = { };
};
printer = mkDevice "Printer" { printer = mkDevice "Printer" {
info = "DELL C2665dnf"; info = "DELL C2665dnf";
image = "${self}/files/topology-images/DELL-C2665dnf.png"; image = "${self}/files/topology-images/DELL-C2665dnf.png";

View file

@ -1,5 +1,5 @@
{ {
"data": "ENC[AES256_GCM,data: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,iv:/e9U+fXMYBOjubsIOKa3dZV6bs6F+OqTyBryUrwPySM=,tag:ThVhvz+Hg6Wq8MMkR4eQOw==,type:str]", "data": "ENC[AES256_GCM,data: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,iv:dHojDlbXWHw/EkpZkAJjT25TRh5vvVUxRY+Y9pbFBxA=,tag:E6DwDyrk79dS49wjX9XLag==,type:str]",
"sops": { "sops": {
"age": [ "age": [
{ {
@ -51,8 +51,8 @@
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSAvbTFqR3RScWxnTFR3dlhv\nNUNEVGRkUDB4L3J6ckJIMWZCWk44RjdpVmxRCkhzZTBuSGduanBmQWsvNW5XMWQv\nYVZmNS9FVzN3a05kUVBheDljYUUrcHcKLS0tIGxPN1dWVkg4NUpnZGJ6VWFJWFVZ\nYnNvRG94MmFxYnlDQ0JyeDNFQldzdlkKsp+nYSR6Lxq8b3/dpMO7uTbNnO0Bva7w\nb9s908PLaZEN1jywEoba3yq743vuEHCKQWFIfDtsRcbNR6Yr4d2eGw==\n-----END AGE ENCRYPTED FILE-----\n" "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSAvbTFqR3RScWxnTFR3dlhv\nNUNEVGRkUDB4L3J6ckJIMWZCWk44RjdpVmxRCkhzZTBuSGduanBmQWsvNW5XMWQv\nYVZmNS9FVzN3a05kUVBheDljYUUrcHcKLS0tIGxPN1dWVkg4NUpnZGJ6VWFJWFVZ\nYnNvRG94MmFxYnlDQ0JyeDNFQldzdlkKsp+nYSR6Lxq8b3/dpMO7uTbNnO0Bva7w\nb9s908PLaZEN1jywEoba3yq743vuEHCKQWFIfDtsRcbNR6Yr4d2eGw==\n-----END AGE ENCRYPTED FILE-----\n"
} }
], ],
"lastmodified": "2025-12-19T16:02:26Z", "lastmodified": "2025-12-04T23:12:18Z",
"mac": "ENC[AES256_GCM,data:jP8kwTNwYRteIxbk5Zu8VHzapyVvUUTCmq67agl+uRYNaPmtkZiBjmrG8oN0hWgEpbytrvKPZzWJ92NTxzyGdvW7sIHX2z6PTU0O1u/x4jmWKvv/zDZhy9+7kVlWYrc7AO7gIRdzWtHmOzYkm2+soNmq/cd5sj2/DeiksmUK/10=,iv:qKayuVRwMg+qfEuYhIGqG1fx46SpKA9UFlt7aBSDhLM=,tag:fl0j4VBMaQzmA0clFEcEwg==,type:str]", "mac": "ENC[AES256_GCM,data:PzZro7emdnVU18DBrLzIcsJgFk8WzNT9uTZydHlHsdDZj2zTwQFrvQ+T6I8ZMDJ8e4DISC9yGcmMYIm/LebGUROGUQHIBfKH7VpWOaFUZj8N0FksQGdWso/Q83jO7TPMQXqUg80WIBT00hoNgWznZpHR15TNKJSvGo91Wrb0Ms4=,iv:UHL+biMhOOXZ2IRLhH7gQTg01VuwyqS2xOjfhqGzjpI=,tag:9Va8ieM8upWt0Mxk4rJ6cQ==,type:str]",
"pgp": [ "pgp": [
{ {
"created_at": "2025-12-15T21:53:38Z", "created_at": "2025-12-15T21:53:38Z",