Merge pull request #46100 from jfindlay/resolv_scope

Handle IPv6 scope parameter in resolv.conf
This commit is contained in:
Nicole Thomas 2018-03-07 14:51:19 -05:00 committed by GitHub
commit 93a572f229
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 24 additions and 8 deletions

View file

@ -797,6 +797,8 @@ def parse_resolv(src='/etc/resolv.conf'):
'''
nameservers = []
ip4_nameservers = []
ip6_nameservers = []
search = []
sortlist = []
domain = ''
@ -815,10 +817,20 @@ def parse_resolv(src='/etc/resolv.conf'):
lambda x: x[0] not in ('#', ';'), arg))
if directive == 'nameserver':
# Split the scope (interface) if it is present
addr, scope = arg[0].split('%', 1) if '%' in arg[0] else (arg[0], '')
try:
ip_addr = ipaddress.ip_address(arg[0])
ip_addr = ipaddress.ip_address(addr)
version = ip_addr.version
# Rejoin scope after address validation
if scope:
ip_addr = '%'.join((str(ip_addr), scope))
if ip_addr not in nameservers:
nameservers.append(ip_addr)
if version == 4 and ip_addr not in ip4_nameservers:
ip4_nameservers.append(ip_addr)
elif version == 6 and ip_addr not in ip6_nameservers:
ip6_nameservers.append(ip_addr)
except ValueError as exc:
log.error('{0}: {1}'.format(src, exc))
elif directive == 'domain':
@ -870,8 +882,8 @@ def parse_resolv(src='/etc/resolv.conf'):
return {
'nameservers': nameservers,
'ip4_nameservers': [ip for ip in nameservers if ip.version == 4],
'ip6_nameservers': [ip for ip in nameservers if ip.version == 6],
'ip4_nameservers': ip4_nameservers,
'ip6_nameservers': ip6_nameservers,
'sortlist': [ip.with_netmask for ip in sortlist],
'domain': domain,
'search': search,

View file

@ -39,6 +39,7 @@ IP4_ADD2 = '10.0.0.2'
IP6_LOCAL = '::1'
IP6_ADD1 = '2001:4860:4860::8844'
IP6_ADD2 = '2001:4860:4860::8888'
IP6_ADD_SCOPE = 'fe80::6238:e0ff:fe06:3f6b%enp2s0'
OS_RELEASE_DIR = os.path.join(os.path.dirname(__file__), "os-releases")
@ -673,15 +674,18 @@ PATCHLEVEL = 3
'''
resolv_mock = {'domain': '', 'sortlist': [], 'nameservers':
[ipaddress.IPv4Address(IP4_ADD1),
ipaddress.IPv6Address(IP6_ADD1)], 'ip4_nameservers':
ipaddress.IPv6Address(IP6_ADD1),
IP6_ADD_SCOPE], 'ip4_nameservers':
[ipaddress.IPv4Address(IP4_ADD1)],
'search': ['test.saltstack.com'], 'ip6_nameservers':
[ipaddress.IPv6Address(IP6_ADD1)], 'options': []}
[ipaddress.IPv6Address(IP6_ADD1),
IP6_ADD_SCOPE], 'options': []}
ret = {'dns': {'domain': '', 'sortlist': [], 'nameservers':
[IP4_ADD1, IP6_ADD1], 'ip4_nameservers':
[IP4_ADD1, IP6_ADD1,
IP6_ADD_SCOPE], 'ip4_nameservers':
[IP4_ADD1], 'search': ['test.saltstack.com'],
'ip6_nameservers': [IP6_ADD1], 'options':
[]}}
'ip6_nameservers': [IP6_ADD1, IP6_ADD_SCOPE],
'options': []}}
self._run_dns_test(resolv_mock, ret)
def _run_dns_test(self, resolv_mock, ret):