options: add physicalInterfaces

This commit is contained in:
Astro 2021-05-31 00:06:56 +02:00
parent 280292b631
commit 24b36568ca
6 changed files with 84 additions and 12 deletions

View File

@ -186,6 +186,13 @@ let
type = with types; attrsOf (submodule interfaceOpts); type = with types; attrsOf (submodule interfaceOpts);
description = "Network interfaces"; description = "Network interfaces";
}; };
physicalInterfaces = mkOption {
default = lib.filterAttrs (_: { type, ... }:
builtins.elem type [ "phys" "veth" ]
) config.site.hosts.${name}.interfaces;
type = with types; attrsOf (submodule interfaceOpts);
description = "Network interfaces that are not virtual (don't set!)";
};
isRouter = mkOption { isRouter = mkOption {
type = types.bool; type = types.bool;
# isRouter = Part of the core network? # isRouter = Part of the core network?

View File

@ -161,7 +161,7 @@ in
password "${config.site.net.${net}.ospf.secret}"; password "${config.site.net.${net}.ospf.secret}";
}; };
'' ''
) hostConf.interfaces ) hostConf.physicalInterfaces
) )
)} )}
}; };
@ -195,7 +195,7 @@ in
password "${config.site.net.${net}.ospf.secret}"; password "${config.site.net.${net}.ospf.secret}";
}; };
'' ''
) hostConf.interfaces ) hostConf.physicalInterfaces
) )
)} )}
}; };
@ -230,7 +230,7 @@ in
stubnet ${subnet6} {}; stubnet ${subnet6} {};
'') (builtins.attrValues config.site.net.${net}.subnets6) '') (builtins.attrValues config.site.net.${net}.subnets6)
) )
) hostConf.interfaces ) hostConf.physicalInterfaces
) )
)} )}
${builtins.concatStringsSep "\n" ( ${builtins.concatStringsSep "\n" (
@ -263,7 +263,7 @@ in
password "${config.site.net.${net}.ospf.secret}"; password "${config.site.net.${net}.ospf.secret}";
}; };
'' ''
) hostConf.interfaces ) hostConf.physicalInterfaces
) )
)} )}
}; };
@ -294,7 +294,7 @@ in
password "${config.site.net.${net}.ospf.secret}"; password "${config.site.net.${net}.ospf.secret}";
}; };
'' ''
) hostConf.interfaces ) hostConf.physicalInterfaces
) )
)} )}
}; };

View File

@ -0,0 +1,67 @@
{ hostName, inputs, lib, ... }:
let
hostConf = config.site.hosts.${hostName};
pppoeInterfaces =
lib.filterAttrs (_: { type, ... }: type == "pppoe")
hostConf.interfaces;
firstUpstreamInterface =
if builtins.length (builtins.attrNames upstreamInterfaces) > 0
then builtins.head (
builtins.attrNames upstreamInterfaces
)
else null;
inherit (inputs.zentralwerk-network-key.lib.pppoe.${hostName}) user password;
in lib.mkIf (pppoeInterfaces != {}) {
boot.postBootCommands = ''
if [ ! -c /dev/ppp ]; then
mknod -m 666 /dev/ppp c 108 0
fi
'';
environment.etc."ppp/pap-secrets".text = ''
"${user}" * "${password}"
'';
services.pppd = {
enable = true;
peers = builtins.mapAttrs (ifName: { upstream, ... }: {
enable = true;
autostart = true;
config = ''
plugin rp-pppoe.so
nic-${upstream.link}
ifname ${ifName}
# Login settings. (PAP)
name "${user}"
noauth
hide-password
# Connection settings.
persist
# Max connection attempts (0 = no limit)
maxfail 0
# Seconds between reconnection attempts
holdoff 1
# LCP settings.
lcp-echo-interval 5
lcp-echo-failure 6
# PPPoE compliant settings.
noaccomp
default-asyncmap
mtu 1492
# IP settings.
#noipdefault
defaultroute
+ipv6
defaultroute6
# Increase debugging level
debug
'';
};
};
}

View File

@ -53,7 +53,7 @@ in
optional (gw4 != null) config.site.net.${ifName}.hosts4.${gw4} ++ optional (gw4 != null) config.site.net.${ifName}.hosts4.${gw4} ++
optional (gw6 != null) (findGw6 ifName gw6); optional (gw6 != null) (findGw6 ifName gw6);
}) config.site.hosts.${hostName}.interfaces; }) config.site.hosts.${hostName}.physicalInterfaces;
}; };
# DNS settings # DNS settings

View File

@ -152,9 +152,7 @@ in
"lxc/containers/${ctName}/config" = { "lxc/containers/${ctName}/config" = {
enable = true; enable = true;
source = source =
let builtins.toFile "${ctName}.conf" ''
inherit (containers.${ctName}) interfaces;
in builtins.toFile "${ctName}.conf" ''
# For lxcfs and sane defaults # For lxcfs and sane defaults
lxc.include = /etc/lxc/common.conf lxc.include = /etc/lxc/common.conf
@ -181,7 +179,7 @@ in
# tuntap # tuntap
lxc.cgroup.devices.allow = c 10:200 rw lxc.cgroup.devices.allow = c 10:200 rw
${netConfig ctName interfaces} ${netConfig ctName containers.${ctName}.physicalInterfaces}
''; '';
}; };
}) { }) {

View File

@ -22,8 +22,8 @@ let
# Every network (both veth+phys) required by all containers # Every network (both veth+phys) required by all containers
ctNets = ctNets =
lib.lists.unique ( lib.lists.unique (
builtins.concatMap ({ interfaces, ... }: builtins.concatMap ({ physicalInterfaces, ... }:
builtins.attrNames interfaces builtins.attrNames physicalInterfaces
) (builtins.attrValues containers) ) (builtins.attrValues containers)
); );