diff options
author | einsibjarni <einar@isnic.is> | 2022-11-26 00:26:37 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-11-25 18:26:37 -0600 |
commit | 871edd50fb9da441e4ef2fbebc435dfb8baa4127 (patch) | |
tree | 3e12877ad7f2584f04e14f4aa21a7270be0d3ca4 /cloudinit/net | |
parent | 893df0d61179a6722c44267f57c57284543c2f12 (diff) | |
download | cloud-init-git-871edd50fb9da441e4ef2fbebc435dfb8baa4127.tar.gz |
Add support for static IPv6 addresses for FreeBSD (#1839)
Currently, FreeBSD ignores IPv6 addresses. This PR adds support for static IPv6 addresses
Diffstat (limited to 'cloudinit/net')
-rw-r--r-- | cloudinit/net/bsd.py | 66 | ||||
-rw-r--r-- | cloudinit/net/freebsd.py | 23 |
2 files changed, 74 insertions, 15 deletions
diff --git a/cloudinit/net/bsd.py b/cloudinit/net/bsd.py index e8778d27..b23279e5 100644 --- a/cloudinit/net/bsd.py +++ b/cloudinit/net/bsd.py @@ -30,6 +30,7 @@ class BSDRenderer(renderer.Renderer): config = {} self.target = None self.interface_configurations = {} + self.interface_configurations_ipv6 = {} self._postcmds = config.get("postcmds", True) def _ifconfig_entries(self, settings): @@ -62,8 +63,6 @@ class BSDRenderer(renderer.Renderer): LOG.info("Configuring interface %s", device_name) - self.interface_configurations[device_name] = "DHCP" - for subnet in interface.get("subnets", []): if subnet.get("type") == "static": if not subnet.get("netmask"): @@ -85,29 +84,70 @@ class BSDRenderer(renderer.Renderer): "mtu": subnet.get("mtu") or interface.get("mtu"), } + elif subnet.get("type") == "static6": + if not subnet.get("prefix"): + LOG.debug( + "Skipping IP %s, because there is no prefix", + subnet.get("address"), + ) + continue + LOG.debug( + "Configuring dev %s with %s / %s", + device_name, + subnet.get("address"), + subnet.get("prefix"), + ) + + self.interface_configurations_ipv6[device_name] = { + "address": subnet.get("address"), + "prefix": subnet.get("prefix"), + "mtu": subnet.get("mtu") or interface.get("mtu"), + } + elif ( + subnet.get("type") == "dhcp" + or subnet.get("type") == "dhcp4" + ): + self.interface_configurations[device_name] = "DHCP" + def _route_entries(self, settings): routes = list(settings.iter_routes()) for interface in settings.iter_interfaces(): subnets = interface.get("subnets", []) for subnet in subnets: - if subnet.get("type") != "static": + if subnet.get("type") == "static": + gateway = subnet.get("gateway") + if gateway and len(gateway.split(".")) == 4: + routes.append( + { + "network": "0.0.0.0", + "netmask": "0.0.0.0", + "gateway": gateway, + } + ) + elif subnet.get("type") == "static6": + gateway = subnet.get("gateway") + if gateway and len(gateway.split(":")) > 1: + routes.append( + { + "network": "::", + "prefix": "0", + "gateway": gateway, + } + ) + else: continue - gateway = subnet.get("gateway") - if gateway and len(gateway.split(".")) == 4: - routes.append( - { - "network": "0.0.0.0", - "netmask": "0.0.0.0", - "gateway": gateway, - } - ) routes += subnet.get("routes", []) + for route in routes: network = route.get("network") if not network: LOG.debug("Skipping a bad route entry") continue - netmask = route.get("netmask") + netmask = ( + route.get("netmask") + if route.get("netmask") + else route.get("prefix") + ) gateway = route.get("gateway") self.set_route(network, netmask, gateway) diff --git a/cloudinit/net/freebsd.py b/cloudinit/net/freebsd.py index ec42b60c..415f4a5a 100644 --- a/cloudinit/net/freebsd.py +++ b/cloudinit/net/freebsd.py @@ -17,14 +17,31 @@ class Renderer(cloudinit.net.bsd.BSDRenderer): def write_config(self): for device_name, v in self.interface_configurations.items(): - net_config = "DHCP" if isinstance(v, dict): - net_config = v.get("address") + " netmask " + v.get("netmask") + net_config = "inet %s netmask %s" % ( + v.get("address"), + v.get("netmask"), + ) mtu = v.get("mtu") if mtu: net_config += " mtu %d" % mtu + elif v == "DHCP": + net_config = "DHCP" self.set_rc_config_value("ifconfig_" + device_name, net_config) + for device_name, v in self.interface_configurations_ipv6.items(): + if isinstance(v, dict): + net_config = "inet6 %s/%d" % ( + v.get("address"), + v.get("prefix"), + ) + mtu = v.get("mtu") + if mtu: + net_config += " mtu %d" % mtu + self.set_rc_config_value( + "ifconfig_%s_ipv6" % device_name, net_config + ) + def start_services(self, run=False): if not run: LOG.debug("freebsd generate postcmd disabled") @@ -58,6 +75,8 @@ class Renderer(cloudinit.net.bsd.BSDRenderer): def set_route(self, network, netmask, gateway): if network == "0.0.0.0": self.set_rc_config_value("defaultrouter", gateway) + elif network == "::": + self.set_rc_config_value("ipv6_defaultrouter", gateway) else: route_name = "route_net%d" % self._route_cpt route_cmd = "-route %s/%s %s" % (network, netmask, gateway) |