From: David Howells Date: Sat, 12 Apr 2014 13:33:46 +0000 (+0100) Subject: Use gethostbyname_ex() and gethostbyaddr() rather than the DNS resolver X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=6eb7066cc81051fbd007a85098265692b68c19f6;p=users%2Fdhowells%2Fkafs-utils.git Use gethostbyname_ex() and gethostbyaddr() rather than the DNS resolver Use gethostbyname_ex() and gethostbyaddr() for A and PTR record retrieval rather than using the DNS resolver directly so that /etc/hosts and suchlike are also used. Signed-off-by: David Howells --- diff --git a/suite/lib/addrcache.py b/suite/lib/addrcache.py index 926b38b..95b7bb4 100644 --- a/suite/lib/addrcache.py +++ b/suite/lib/addrcache.py @@ -22,9 +22,8 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA """ from afs import exception -from socket import inet_pton, inet_ntoa, AF_INET, AF_INET6; -import dns.reversename -import dns.resolver +from socket import gethostbyname_ex, gethostbyaddr, gaierror, herror, inet_pton, inet_ntoa, AF_INET, AF_INET6 +import sys cache_n2a = dict() cache_a2n = dict() @@ -40,6 +39,17 @@ def add(name, addr): cache_n2a[name].append(addr) cache_a2n[addr] = name +def add_ghb(name, addr, result): + hostname, aliaslist, ipaddrlist = result + if addr and addr not in ipaddrlist: + print("Inconsistent lookup of '", addr, "'", file=sys.stderr) + for i in ipaddrlist: + if name: + add(name, i) + add(hostname, i) + for j in aliaslist: + add(j, i) + ############################################################################### # # Convert a name to an array of addresses in string form (eg. "1.2.3.4"). @@ -65,10 +75,10 @@ def name2addrs(name): return cache_n2a[name] try: - for A in dns.resolver.query(name, 'A'): - add(name, A.address) - except dns.resolver.NoAnswer: - pass + result = gethostbyname_ex(name) + except gaierror as e: + raise NetAddressError("Couldn't resolve '" + name + "'") + add_ghb(name, None, result) return cache_n2a[name] @@ -143,12 +153,10 @@ def addrs2name(addrs): for addr in addrs: try: - revname = dns.reversename.from_address(addr) - for PTR in dns.resolver.query(revname, 'PTR'): - name = str(PTR).lower().rstrip(".") - add(name, addr) - return name - except (dns.resolver.NoAnswer, dns.resolver.NXDOMAIN): + result = gethostbyaddr(addr) + add_ghb(None, addr, result) + return cache_a2n[addr] + except herror: pass return None