{ lib, config, ... }: let cfg = config.crans.networking; inherit (lib) mkEnableOption mkIf mkOption types ; idString = toString cfg.id; hostId = lib.mod cfg.id 100; hostIdString = lib.fixedWidthString 2 "0" (toString hostId); isVm = cfg.id >= 100; isVmString = toString isVm; in { options.crans.networking = { enable = mkEnableOption "Configuration réseaux commune à toutes les machines du Crans."; id = mkOption { type = types.int; example = 135; description = "Le numéro de la VM dans Proxmox."; }; adm = { enable = mkEnableOption "Configuration du VLAN adm."; interface = mkOption { type = types.str; default = "ens18"; example = "ens20"; description = "Nom de l'interface réseau sur laquelle est située le VLAN adm."; }; }; srv = { enable = mkEnableOption "Configuration du VLAN srv."; interface = mkOption { type = types.str; default = "ens19"; example = "ens20"; description = "Nom de l'interface réseau sur laquelle est située le VLAN srv."; }; ipv4 = mkOption { type = types.str; example = "185.230.79.1"; description = "Adresse IPv4 de la machine."; }; }; srvNat = { enable = mkEnableOption "Configuration du VLAN srv-nat."; interface = mkOption { type = types.str; default = "ens19"; example = "ens20"; description = "Nom de l'interface réseau sur laquelle est située le VLAN srv-nat."; }; }; san = { enable = mkEnableOption "Configuration du VLAN san."; interface = mkOption { type = types.str; example = "ens19"; description = "Nom de l'interface réseau sur laquelle est située le VLAN san."; }; }; }; config = mkIf cfg.enable { networking = { useDHCP = false; firewall.enable = lib.mkDefault false; nameservers = [ "172.16.10.128" ]; # La configuration des interfaces se fait de la manière suivante : # elle est écrite de manière générique pour toutes les machines, puis # on filtre pour ne garder que les interfaces activées. nix fait de # l'évaluation paresseuse donc ça fonctionne bien ! interfaces = # On change le nom des interfaces de "adm", "srv", ... pour leur vrai # nom (on ne le met pas directement pour faire fonctionner le filter # plus bas). lib.attrsets.mapAttrs' (interface: conf: { name = cfg."${interface}".interface; value = conf; }) ( # On filtre sur les interfaces activées lib.attrsets.filterAttrs (interface: _: cfg."${interface}".enable) { # Configuration du VLAN adm adm = { ipv4.addresses = [ { address = "172.16.10.${idString}"; prefixLength = 24; } ]; ipv6.addresses = [ { address = "fd00::10:0:ff:fe0${isVmString}:${hostIdString}10"; prefixLength = 64; } ]; }; # Configuration du VLAN srv srv = { ipv4 = { addresses = [ { address = cfg.srv.ipv4; prefixLength = 26; } ]; routes = [ { address = "0.0.0.0"; via = "185.230.79.62"; prefixLength = 0; } ]; }; ipv6 = { addresses = [ { address = "2a0c:700:2::ff:fe0${isVmString}:${hostIdString}02"; prefixLength = 64; } ]; routes = [ { address = "::"; via = "2a0c:700:2::ff:fe00:9902"; prefixLength = 0; } ]; }; }; # Configuration du VLAN srv-nat srvNat = { ipv4 = { addresses = [ { address = "172.16.3.${idString}"; prefixLength = 24; } ]; routes = [ { address = "0.0.0.0"; via = "172.16.3.99"; prefixLength = 0; } ]; }; ipv6 = { addresses = [ { address = "2a0c:700:3::ff:fe0${isVmString}:${hostIdString}03"; prefixLength = 64; } ]; routes = [ { address = "::"; via = "2a0c:700:3::ff:fe00:9903"; prefixLength = 0; } ]; }; }; # Configuration du VLAN san san = { ipv4.addresses = [ { address = "172.16.4.${idString}"; prefixLength = 24; } ]; ipv6.addresses = [ { address = "fd00::4:0:ff:fe0${isVmString}:${hostIdString}04"; prefixLength = 64; } ]; }; } ); }; }; }