diff options
Diffstat (limited to 'project2/proj2_s4498062/dns/resolver.py')
-rw-r--r-- | project2/proj2_s4498062/dns/resolver.py | 42 |
1 files changed, 9 insertions, 33 deletions
diff --git a/project2/proj2_s4498062/dns/resolver.py b/project2/proj2_s4498062/dns/resolver.py index 2c22adb..4c09681 100644 --- a/project2/proj2_s4498062/dns/resolver.py +++ b/project2/proj2_s4498062/dns/resolver.py @@ -48,7 +48,7 @@ class Resolver(object): self.timeout = timeout if self.caching: - self.cache = RecordCache() + self.cache = RecordCache(ttl) def do_query(self, hint, hostname, type_, class_=Class.IN, caching=True): """Do a query to a hint""" @@ -98,9 +98,6 @@ class Resolver(object): Returns: (str, [str], [str]): (hostname, aliaslist, ipaddrlist) """ - domains = hostname.split('.') - hints = self.ROOT_SERVERS - if self.caching: addrs = self.cache.lookup(hostname, Type.A, Class.IN) cnames = self.cache.lookup(hostname, Type.CNAME, Class.IN) @@ -109,66 +106,45 @@ class Resolver(object): [r.rdata.data for r in cnames], \ [r.rdata.data for r in addrs] for cname in cnames: - print 'trying', cname.rdata.data cname, aliases, addrs = self.gethostbyname(cname.rdata.data) if addrs != []: return str(cname), aliases, addrs - if domains == []: + if hostname == '': return hostname, [], [] - domain = domains.pop(-1) + hints = self.ROOT_SERVERS[:] aliases = [] while hints != []: - hints, info = self.do_query_to_multiple(hints, domain, Type.A) + hints, info = self.do_query_to_multiple(hints, hostname, Type.A) aliases += [ r.rdata.data for r in info - if r.match(type_=Type.CNAME, class_=Class.IN, name=domain)] + if r.match(type_=Type.CNAME, class_=Class.IN, name=hostname)] # Case 1: answer ips = [ r.rdata.data for r in info - if r.match(type_=Type.A, class_=Class.IN, name=domain)] + if r.match(type_=Type.A, class_=Class.IN, name=hostname)] if ips != []: return hostname, aliases, ips - # Case 2: name servers for this domain + # Case 2: name servers auths = [ r.rdata.data for r in info - if r.match(type_=Type.NS, class_=Class.IN, name=domain)] + if r.match(type_=Type.NS, class_=Class.IN)] ips = [ add.rdata.data for ns in auths for add in info if add.match(name=ns, type_=Type.A)] if ips != []: hints += ips - if domain != hostname: - domain = domains.pop(-1) + '.' + domain continue if auths != []: auths = [h for a in auths for h in self.gethostbyname(a)[2]] hints += auths - if domain != hostname: - domain = domains.pop(-1) + '.' + domain - continue - - # Case 3: name servers for the same domain - parent = '.'.join(domain.split('.')[1:]) - auths = [ - r.rdata.data for r in info - if r.match(type_=Type.NS, class_=Class.IN, name=parent)] - ips = [ - add.rdata.data for ns in auths for add in info - if add.match(name=ns, type_=Type.A)] - if ips != []: - hints += ips - continue - if auths != []: - auths = [h for r in auths for h in self.gethostbyname(r)[2]] - hints += auths continue - # Case 4: aliases + # Case 3: aliases for alias in aliases: _, extra_aliases, alias_addresses = self.gethostbyname(alias) if alias_addresses != []: |