Sebastian Walz 860d31cee1
Tohu vaBohu
2023-04-21 00:22:52 +02:00

213 lines
6.9 KiB
Nix

{ configurations, core, peers, ... } @ lib:
let
inherit(configurations) Configuration';
inherit(core) debug list path set string type;
inherit(peers) Peer PeerConfiguration;
NetworkConfiguration = Configuration' "Network";
collect
= { allowedTCPPorts, allowedUDPPorts, hostName, interfaces, peers, source, wireless, ... }:
debug.debug "collect"
{
text = "peers";
data = peers;
}
[
(
NetworkConfiguration
{
configuration
= { secret, ... }:
{
networking
= {
inherit hostName interfaces;
firewall
= {
enable = true;
inherit allowedTCPPorts allowedUDPPorts;
};
wireless
= wireless
// {
environmentFile
= secret.generateEnvFile' "wireless";
};
};
};
inherit source;
}
)
]
++ (
list.map
PeerConfiguration
peers
);
extendName
= networkName:
peerName:
if networkName != null
then
"${peerName}.${networkName}"
else
peerName;
prepare
= environment:
host:
network:
if set.isInstanceOf network
then
prepareNetwork environment host network
else
debug.panic
"prepare"
{
text = "The option `network` must be a set.";
data = network;
};
prepareNetwork
= { ... } @ environment:
host:
let
checkIP
= {
addresses ? [ ],
routes ? [ ],
}:
{
inherit addresses routes;
};
checkPort
= port:
if port >= 0 && port < 65356
then
port
else
debug.panic
[ "prepareNetwork" "checkPort" ]
"Invalid Port ${string port}. must be between including 0 and 65355";
collectPorts
= ports:
list.concat
(
set.mapToList
(
name:
port:
type.matchPrimitiveOrPanic port
{
int = [ (checkPort port) ];
list = list.map checkPort port;
set = collectPorts port;
}
)
ports
);
loadPeer
= peer:
peers.load
peer
environment;
mapPeers
= networkName:
peers:
list.concat
(
set.mapToList
(
peerName:
peer:
let
loadedPeer = loadPeer peer;
name
= extendName
networkName
peerName;
namedPeer = { inherit name; } // loadedPeer;
source = host.source "network" "peers" namedPeer.name;
in
if Peer.isInstanceOf loadedPeer
then
[ ({ inherit source; } // namedPeer) ]
else
mapPeers name loadedPeer
)
peers
);
mapPeers' = mapPeers null;
in
{
allowLegacyTLS ? true,
domain ? null,
interfaces ? { },
ips ? [ ],
peers ? [ ],
tcp ? { },
udp ? { },
wireless ? { },
}:
{
inherit allowLegacyTLS domain ips tcp udp wireless;
allowedTCPPorts = collectPorts (tcp.ports or {});
allowedUDPPorts = collectPorts (udp.ports or {});
hostName = host.name;
interfaces
= set.map
(
name:
{
ipv4 ? {},
ipv6 ? {},
macAddress ? null,
mtu ? null,
proxyARP ? false,
# tempAddress
useDHCP ? true,
virtual ? false,
virtualOwner ? "root",
# virtualType
wakeOnLan ? { enable = false; },
...
} @ config:
config
// {
inherit macAddress mtu name proxyARP useDHCP virtual virtualOwner wakeOnLan;
ipv4 = checkIP ipv4;
ipv6 = checkIP ipv6;
}
)
interfaces;
peers
= type.matchPrimitiveOrPanic peers
{
list
= mapPeers'
(
list.imapValuesToSet
(
index:
peer:
{
name = string index;
value = peer;
}
)
peers
);
set = mapPeers' peers;
};
source = host.source "network";
};
in
{
inherit collect extendName prepare;
}