infrastructure/modules/system/network/networks.nix
2024-05-13 15:31:34 -07:00

88 lines
2.1 KiB
Nix

{
config,
lib,
inputs,
...
}: let
inherit (inputs.self.lib.lib) eui64;
inherit (lib.options) mkOption mkEnableOption;
inherit (lib.modules) mkIf mkOptionDefault;
inherit (lib.trivial) mapNullable;
networkModule = {
config,
name,
system,
...
}: let
knownNetworks = {
local.slaac = {
enable = true;
prefix = "fd0a:";
};
int.slaac.prefix = "fd0c:";
};
in {
options = with lib.types; {
enable =
mkEnableOption "network"
// {
default = true;
};
slaac = {
enable = mkOption {
type = bool;
};
prefix = mkOption {
type = str;
};
postfix = mkOption {
type = str;
};
};
name = mkOption {
type = str;
default = name;
};
domain = mkOption {
type = nullOr str;
};
fqdn = mkOption {
type = nullOr str;
};
macAddress = mkOption {
type = nullOr str;
default = null;
};
address4 = mkOption {
type = nullOr str;
};
address6 = mkOption {
type = nullOr str;
};
};
config = {
slaac = {
enable = mkOptionDefault (knownNetworks.${config.name}.slaac.enable or false);
prefix = mkIf (knownNetworks.${config.name}.slaac.prefix or null != null) (
mkOptionDefault knownNetworks.${config.name}.slaac.prefix
);
postfix = mkIf (config.macAddress != null) (mkOptionDefault (eui64 config.macAddress));
};
domain = mkOptionDefault "${config.name}.${system.access.domain}";
fqdn = mkOptionDefault (mapNullable (domain: "${system.access.hostName}.${domain}") config.domain);
address6 = mkIf config.slaac.enable (mkOptionDefault "${config.slaac.prefix}:${config.slaac.postfix}");
};
};
in {
options.network = with lib.types; {
networks = mkOption {
type = attrsOf (submoduleWith {
modules = [networkModule];
specialArgs = {
system = config;
};
});
default = {};
};
};
}