let lib = import ; in rec { network = { subnet = "192.168.2.0/24"; subnet_base = "192.168.2.0"; gateway = ips.router; cidr = 24; }; ips = { pi = "192.168.2.100"; desktop = "192.168.2.101"; router = "192.168.2.1"; remoteProxy = "193.31.24.99"; }; dhcp = { pool_start = "192.168.2.50"; pool_end = "192.168.2.90"; default_lease = 3600; max_lease = 86400; reservations = [{ ip-address = ips.desktop; hw-address = "30:9c:23:81:91:ea"; hostname = "desktop"; }]; }; fallback_dns_servers = [ "1.1.1.1" "8.8.8.8" ]; local_domain = "home"; services = { "pi" = { ip = ips.pi; }; "desktop" = { ip = ips.desktop; }; "torrent" = { ip = ips.pi; reverse_proxy = { port = 8085; }; }; "wiki" = { ip = ips.pi; reverse_proxy = { port = 8086; }; }; "router" = { ip = ips.router; }; "remoteProxy" = { ip = ips.remoteProxy; }; "continuwuity" = { ip = ips.pi; reverse_proxy = { port = 6167; ssl = true; allowExternConnections = true; listen = [ { port = 80; } { port = 443; ssl = true; } { port = 8448; ssl = true; }]; }; domainOverride = "nudelerde.de"; }; }; _serviceNames = (builtins.attrNames services); _dnsMappingObjects = builtins.listToAttrs ( map (name: { name = "${name}.${local_domain}"; value = services.${name}.ip; }) _serviceNames ); _predOnlyLocalObjs = (name: value: !(value ? domainOverride)); dnsMappings = lib.filterAttrs _predOnlyLocalObjs _dnsMappingObjects; reverse_proxy = lib.filterAttrs (name: value: value ? reverse_proxy) services; _portsUsedInService = (service: if service ? reverse_proxy then if service.reverse_proxy ? listen then map (obj: obj.port) service.reverse_proxy.listen else if service.reverse_proxy ? ssl && service.reverse_proxy.ssl then [80 443] else [80] else [80]); usedPorts = lib.unique (lib.concatLists (map _portsUsedInService (builtins.attrValues services))); }