diff --git a/src/systemd_resolved_docker/dockerdnsconnector.py b/src/systemd_resolved_docker/dockerdnsconnector.py index f4eb408376c3965f40d2a2f80a99ab75a64ce0cd..70aa2fbce172485e2cee606b3960cee49d752bb4 100644 --- a/src/systemd_resolved_docker/dockerdnsconnector.py +++ b/src/systemd_resolved_docker/dockerdnsconnector.py @@ -24,6 +24,7 @@ class DockerDNSConnector: self.dns_domains = dns_domains self.docker_interface = docker_interface self.handler = handler + self.resolved_registered = False self.dns_domains_globs = ['*%s' % domain if domain.startswith('.') else domain for domain in dns_domains] @@ -62,6 +63,9 @@ class DockerDNSConnector: self.handler.on_stop() def update_resolved(self, enabled=True): + if self.resolved_registered == enabled: + return + with IPRoute() as ipr: ifi = ipr.link_lookup(ifname=self.docker_interface) if not ifi: @@ -88,6 +92,8 @@ class DockerDNSConnector: else: manager.RevertLink(ifindex) + self.resolved_registered = enabled + def handle_hosts(self, hosts): zone = [] host_names = [] diff --git a/src/systemd_resolved_docker/zoneresolver.py b/src/systemd_resolved_docker/zoneresolver.py index 1a125ca888c9c099f28993efe911b9c593194f61..6147b6e2b96f51bb6adf1337883207d35f34776d 100644 --- a/src/systemd_resolved_docker/zoneresolver.py +++ b/src/systemd_resolved_docker/zoneresolver.py @@ -32,27 +32,29 @@ class ZoneResolver(BaseResolver): qname = request.q.qname qtype = QTYPE[request.q.qtype] + found_name_match = False + zone = self.zone for name, rtype, rr in zone: # Check if label & type match - if getattr(qname, self.eq)(name) and (qtype == rtype or - qtype == 'ANY' or - rtype == 'CNAME'): - # If we have a glob match fix reply label - if self.glob: - a = copy.copy(rr) - a.rname = qname - reply.add_answer(a) - else: - reply.add_answer(rr) - # Check for A/AAAA records associated with reply and - # add in additional section - if rtype in ['CNAME', 'NS', 'MX', 'PTR']: - for a_name, a_rtype, a_rr in zone: - if a_name == rr.rdata.label and a_rtype in ['A', 'AAAA']: - reply.add_ar(a_rr) - - if not reply.rr: + if getattr(qname, self.eq)(name): + found_name_match = True + if qtype == rtype or qtype == 'ANY' or rtype == 'CNAME': + # If we have a glob match fix reply label + if self.glob: + a = copy.copy(rr) + a.rname = qname + reply.add_answer(a) + else: + reply.add_answer(rr) + # Check for A/AAAA records associated with reply and + # add in additional section + if rtype in ['CNAME', 'NS', 'MX', 'PTR']: + for a_name, a_rtype, a_rr in zone: + if a_name == rr.rdata.label and a_rtype in ['A', 'AAAA']: + reply.add_ar(a_rr) + + if not found_name_match: reply.header.rcode = RCODE.NXDOMAIN return reply