rix101/modules/flake/topology/default.nix
reo101 f90ac47d91
feat(topology): add legacyPackages package for convenience
Can now also build with (1) instead of just (2)
- `nix build .#topology`
(from `legacyPackages`, hidden in `nix flake show`)
- `nix build .#topology.${system}.config.output`
(raw flake output)
2024-07-27 13:39:33 +03:00

167 lines
4.8 KiB
Nix

{ lib, config, self, inputs, ... }:
{
imports = [
inputs.nix-topology.flakeModule
];
perSystem = { lib, pkgs, system, ... }: let
removebg = { image, fuzz ? 10, ... }:
pkgs.runCommand "${image.name}.png" {
buildInputs = [
pkgs.imagemagick
];
} ''
magick ${image} \
-bordercolor white \
-border 1x1 \
-alpha set \
-channel RGBA \
-fuzz ${toString fuzz}% \
-fill none \
-floodfill +0+0 white \
-shave 1x1 \
$out
'';
images = {
TL-WR740N = removebg {
image = pkgs.fetchurl {
name = "TL-WR740N.jpg";
url = "https://static.tp-link.com/res/images/products/TL-WR740N_un_V6_1068_large_2_20150807163606.jpg";
hash = "sha256-/NpnnDh2V015lc3TGzez9eS8rINFtzVbCdN7d85NOt4=";
};
fuzz = 15;
};
ZBT-WR8305RT = removebg {
image = pkgs.fetchurl {
name = "ZBT-WR8305RT.jpg";
url = "https://vseplus.com/images/p/full/213140a.jpg";
hash = "sha256-ftTuXaBm99n+y+6fpRf0i63ykDx6xoJgwsQFpu2fNy4=";
};
fuzz = 2;
};
cheetah = removebg {
image = pkgs.fetchurl {
name = "cheetah.jpg";
url = "https://m.media-amazon.com/images/I/51OFxuD1GgL._AC_SL1000_.jpg";
hash = "sha256-Lvylh1geh81FZpqK1shj108M217zobWRgR4mEfbvKrc=";
};
fuzz = 20;
};
};
in {
# NOTE: hide from `nix flake show`
# requires `allow-import-from-derivation`
legacyPackages = {
topology = self.topology.${system}.config.output;
};
topology = {
# nixosConfigurations = {
# inherit (self.nixosConfigurations)
# jeeves;
# };
nixosConfigurations = self.nixosConfigurations;
modules = [
({ config, ... }: let
inherit (config.lib.topology)
mkInternet
mkRouter
mkSwitch
mkConnection
mkConnectionRev
;
in {
nodes.internet = mkInternet {
connections = mkConnection "router1" "eth1";
};
nodes.router1 = mkRouter "router1" {
info = "TP-Link TL-WR740N";
image = images.TL-WR740N;
interfaceGroups = [
["eth1" "eth2" "eth3" "eth4"]
["wan1"]
];
};
networks.router1 = {
name = "router1";
cidrv4 = "192.168.0.0/24";
style = {
primaryColor = "#b87f0d";
secondaryColor = null;
# one of "solid", "dashed", "dotted"
pattern = "solid";
};
};
nodes.router2 = mkRouter "router2" {
info = "Zbtlink ZBT-WR8305RT";
image = images.ZBT-WR8305RT;
interfaceGroups = [
["eth0"]
["lan1" "lan2" "lan3" "lan4"]
["wan"]
];
interfaces.eth0 = {
addresses = ["192.168.0.101"];
network = "router1";
physicalConnections = [(mkConnectionRev "router1" "eth2")];
};
};
networks.router2 = {
name = "router2";
cidrv4 = "192.168.1.0/24";
style = {
primaryColor = "#0dd62e";
secondaryColor = null;
pattern = "solid";
};
};
nodes.jeeves = {
interfaces.eth0 = {
addresses = ["192.168.1.210"];
network = "router2";
physicalConnections = [(mkConnectionRev "router2" "lan3")];
};
interfaces.wan0 = {
icon = "interfaces.wifi";
addresses = ["192.168.1.123"];
network = "router2";
physicalConnections = [(mkConnectionRev "router2" "wan")];
};
};
networks.wg0 = {
name = "wg0";
cidrv4 = "10.100.0.0/24";
style = {
primaryColor = "#ff0000";
secondaryColor = null;
pattern = "solid";
};
};
nodes.cheetah = {
deviceType = "device";
hardware = {
info = "Goole Pixel 7 Pro (cheetah)";
image = images.cheetah;
};
interfaces.wlan0 = {
icon = "interfaces.wifi";
addresses = ["192.168.1.240"];
network = "router2";
physicalConnections = [(mkConnectionRev "router2" "wan")];
};
interfaces.jeeves = {
addresses = ["10.100.0.2"];
network = "wg0";
physicalConnections = [(mkConnectionRev "jeeves" "wg0")];
};
};
})
];
};
};
}