From edaf55ba6284ebc7ff954efb87cbbdc142afce89 Mon Sep 17 00:00:00 2001 From: Jarrod Johnson Date: Fri, 2 Oct 2026 10:44:26 -0400 Subject: [PATCH] Try to scope DNS to interfaces if possible netplan and NetworkManager both scope dns to interface. In certain cases, it can really mean it, so try to match the nameservers to the appropriate interface, falling back to adding to every interface with a gateway. --- .../common/profile/scripts/confignet | 48 ++++++++++++++----- 1 file changed, 37 insertions(+), 11 deletions(-) diff --git a/confluent_osdeploy/common/profile/scripts/confignet b/confluent_osdeploy/common/profile/scripts/confignet index 3f8daecc..2dd7d152 100644 --- a/confluent_osdeploy/common/profile/scripts/confignet +++ b/confluent_osdeploy/common/profile/scripts/confignet @@ -8,7 +8,9 @@ import sys import time import shlex import subprocess +ipaddress = None try: + import ipaddress import yaml except ImportError: pass @@ -255,7 +257,10 @@ class NetplanManager(object): else: needcfgwrite = True cfgroutes.append({'via': gwaddr, 'to': 'default'}) - dnsips = self.deploycfg.get('nameservers', []) + if ipaddress: + dnsips = stgs.get('ipv4_nameservers', []) + stgs.get('ipv6_nameservers', []) + else: + dnsips = self.deploycfg.get('nameservers', []) dnsdomain = self.deploycfg.get('dnsdomain', '') if dnsips: currdnsips = self.getcfgarrpath([devname, 'nameservers', 'addresses']) @@ -526,16 +531,13 @@ class NetworkManager(object): cmdargs['ipv6.gateway'] = stgs['ipv6_gateway'] if stgs.get('mtu', None): cmdargs['802-3-ethernet.mtu'] = stgs['mtu'] - dnsips = self.deploycfg.get('nameservers', []) - if not dnsips: - dnsips = [] - dns4 = [] - dns6 = [] - for dnsip in dnsips: - if '.' in dnsip: - dns4.append(dnsip) - elif ':' in dnsip: - dns6.append(dnsip) + if ipaddress: + dns4 = stgs.get('ipv4_nameservers', []) + dns6 = stgs.get('ipv6_nameservers', []) + else: + dnsips = self.deploycfg.get('nameservers', []) + dns4 = [ip for ip in dnsips if '.' in ip] + dns6 = [ip for ip in dnsips if ':' in ip] if dns4: cmdargs['ipv4.dns'] = ','.join(dns4) if dns6: @@ -697,6 +699,30 @@ if __name__ == '__main__': elif os.path.exists('/usr/sbin/wicked'): nm = WickedManager() retrynics = [] + if ipaddress: + dnsbynetname = {} + dnsips = set(dc.get('nameservers', [])) + for dnsip in list(dnsips): + dnsipaddr = ipaddress.ip_address(dnsip) + ipver = f'ipv{dnsipaddr.version}' + for netn in netname_to_interfaces: + currstgs = netname_to_interfaces[netn]['settings'] + if currstgs.get(f'{ipver}_method') == 'static': + currip = currstgs.get(f'{ipver}_address') + if currip: + currip = ipaddress.ip_interface(currip) + if dnsipaddr in currip.network: + currstgs.setdefault(f'{ipver}_nameservers', []).append(dnsip) + dnsips.discard(dnsip) + for dnsip in dnsips: + dnsipaddr = ipaddress.ip_address(dnsip) + ipver = f'ipv{dnsipaddr.version}' + for netn in netname_to_interfaces: + currstgs = netname_to_interfaces[netn]['settings'] + if currstgs.get(f'{ipver}_method') == 'static': + gateway = currstgs.get(f'{ipver}_gateway') + if gateway: + currstgs.setdefault(f'{ipver}_nameservers', []).append(dnsip) for netn in netname_to_interfaces: redo = nm.apply_configuration(netname_to_interfaces[netn]) if redo == 1: