class Answers(dict):
"""A dict of DNS stub resolver answers, indexed by type."""
- pass
+
class HostAnswers(Answers):
"""A dict of DNS stub resolver answers to a host name lookup, indexed by
@classmethod
def make(
- self,
- v6 : Optional[Answer] = None,
- v4 : Optional[Answer] = None,
- add_empty : bool = True
- ) -> 'HostAnswers':
+ cls,
+ v6: Optional[Answer] = None,
+ v4: Optional[Answer] = None,
+ add_empty: bool = True,
+ ) -> "HostAnswers":
answers = HostAnswers()
if v6 is not None and (add_empty or v6.rrset):
answers[dns.rdatatype.AAAA] = v6
answers[dns.rdatatype.A] = v4
return answers
-
# Returns pairs of (address, family) from this result, potentiallys
# filtering by address family.
def addresses_and_families(
- self,
- family : int = socket.AF_UNSPEC
+ self, family: int = socket.AF_UNSPEC
) -> Iterator[Tuple[str, int]]:
if family == socket.AF_UNSPEC:
yield from self.addresses_and_families(socket.AF_INET6)
# Returns addresses from this result, potentially filtering by
# address family.
- def addresses(self, family : int = socket.AF_UNSPEC) -> Iterator[str]:
+ def addresses(self, family: int = socket.AF_UNSPEC) -> Iterator[str]:
return (pair[0] for pair in self.addresses_and_families(family))
# Returns the canonical name from this result.
self,
name: Union[dns.name.Name, str],
family: int = socket.AF_UNSPEC,
- **kwargs: Any
+ **kwargs: Any,
) -> HostAnswers:
"""Use a resolver to query for address records.
elif family != socket.AF_UNSPEC:
raise NotImplementedError(f"unknown address family {family}")
- raise_on_no_answer = modified_kwargs.pop('raise_on_no_answer', True)
- lifetime = modified_kwargs.pop('lifetime', None)
+ raise_on_no_answer = modified_kwargs.pop("raise_on_no_answer", True)
+ lifetime = modified_kwargs.pop("lifetime", None)
start = time.time()
- v6 = self.resolve(name, dns.rdatatype.AAAA,
- raise_on_no_answer=False,
- lifetime=self._compute_timeout(start, lifetime),
- **modified_kwargs)
+ v6 = self.resolve(
+ name,
+ dns.rdatatype.AAAA,
+ raise_on_no_answer=False,
+ lifetime=self._compute_timeout(start, lifetime),
+ **modified_kwargs,
+ )
# Note that setting name ensures we query the same name
# for A as we did for AAAA. (This is just in case search lists
# are active by default in the resolver configuration and
# we might be talking to a server that says NXDOMAIN when it
# wants to say NOERROR no data.
name = v6.qname
- v4 = self.resolve(name, dns.rdatatype.A,
- raise_on_no_answer=False,
- lifetime=self._compute_timeout(start, lifetime),
- **modified_kwargs)
+ v4 = self.resolve(
+ name,
+ dns.rdatatype.A,
+ raise_on_no_answer=False,
+ lifetime=self._compute_timeout(start, lifetime),
+ **modified_kwargs,
+ )
answers = HostAnswers.make(v6=v6, v4=v4, add_empty=not raise_on_no_answer)
if not answers:
raise NoAnswer(response=v6.response)
return answers
-
# pylint: disable=redefined-outer-name
def canonical_name(self, name: Union[dns.name.Name, str]) -> dns.name.Name:
def resolve_name(
- name: Union[dns.name.Name, str],
- family: int = socket.AF_UNSPEC,
- **kwargs: Any
+ name: Union[dns.name.Name, str], family: int = socket.AF_UNSPEC, **kwargs: Any
) -> HostAnswers:
"""Use a resolver to query for address records.