summaryrefslogtreecommitdiff
path: root/project2/proj2_s4498062/dns/resolver.py
diff options
context:
space:
mode:
Diffstat (limited to 'project2/proj2_s4498062/dns/resolver.py')
-rw-r--r--project2/proj2_s4498062/dns/resolver.py42
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 != []: