Index: third_party/twisted_8_1/twisted/names/root.py |
diff --git a/third_party/twisted_8_1/twisted/names/root.py b/third_party/twisted_8_1/twisted/names/root.py |
deleted file mode 100644 |
index b5b64b2375ce1ec06d65defcdb298b57cf6b52a6..0000000000000000000000000000000000000000 |
--- a/third_party/twisted_8_1/twisted/names/root.py |
+++ /dev/null |
@@ -1,208 +0,0 @@ |
-# -*- test-case-name: twisted.names.test.test_rootresolve -*- |
-# Copyright (c) 2001-2004 Twisted Matrix Laboratories. |
-# See LICENSE for details. |
- |
- |
-""" |
-Resolver implementation for querying successive authoritative servers to |
-lookup a record, starting from the root nameservers. |
- |
-@author: U{Jp Calderone<mailto:exarkun@twistedmatrix.com>} |
- |
-todo:: |
- robustify it |
- break discoverAuthority into several smaller functions |
- documentation |
-""" |
- |
-from __future__ import generators |
- |
-import sys |
- |
-from twisted.python import log |
-from twisted.internet import defer |
-from twisted.names import dns |
-from twisted.names import common |
- |
-def retry(t, p, *args): |
- assert t, "Timeout is required" |
- t = list(t) |
- def errback(failure): |
- failure.trap(defer.TimeoutError) |
- if not t: |
- return failure |
- return p.query(timeout=t.pop(0), *args |
- ).addErrback(errback |
- ) |
- return p.query(timeout=t.pop(0), *args |
- ).addErrback(errback |
- ) |
- |
-class _DummyController: |
- def messageReceived(self, *args): |
- pass |
- |
-class Resolver(common.ResolverBase): |
- def __init__(self, hints): |
- common.ResolverBase.__init__(self) |
- self.hints = hints |
- |
- def _lookup(self, name, cls, type, timeout): |
- d = discoverAuthority(name, self.hints |
- ).addCallback(self.discoveredAuthority, name, cls, type, timeout |
- ) |
- return d |
- |
- def discoveredAuthority(self, auth, name, cls, type, timeout): |
- from twisted.names import client |
- q = dns.Query(name, type, cls) |
- r = client.Resolver(servers=[(auth, dns.PORT)]) |
- d = r.queryUDP([q], timeout) |
- d.addCallback(r.filterAnswers) |
- return d |
- |
-def lookupNameservers(host, atServer, p=None): |
- # print 'Nameserver lookup for', host, 'at', atServer, 'with', p |
- if p is None: |
- p = dns.DNSDatagramProtocol(_DummyController()) |
- p.noisy = False |
- return retry( |
- (1, 3, 11, 45), # Timeouts |
- p, # Protocol instance |
- (atServer, dns.PORT), # Server to query |
- [dns.Query(host, dns.NS, dns.IN)] # Question to ask |
- ) |
- |
-def lookupAddress(host, atServer, p=None): |
- # print 'Address lookup for', host, 'at', atServer, 'with', p |
- if p is None: |
- p = dns.DNSDatagramProtocol(_DummyController()) |
- p.noisy = False |
- return retry( |
- (1, 3, 11, 45), # Timeouts |
- p, # Protocol instance |
- (atServer, dns.PORT), # Server to query |
- [dns.Query(host, dns.A, dns.IN)] # Question to ask |
- ) |
- |
-def extractAuthority(msg, cache): |
- records = msg.answers + msg.authority + msg.additional |
- nameservers = [r for r in records if r.type == dns.NS] |
- |
- # print 'Records for', soFar, ':', records |
- # print 'NS for', soFar, ':', nameservers |
- |
- if not nameservers: |
- return None, nameservers |
- if not records: |
- raise IOError("No records") |
- for r in records: |
- if r.type == dns.A: |
- cache[str(r.name)] = r.payload.dottedQuad() |
- for r in records: |
- if r.type == dns.NS: |
- if str(r.payload.name) in cache: |
- return cache[str(r.payload.name)], nameservers |
- for addr in records: |
- if addr.type == dns.A and addr.name == r.name: |
- return addr.payload.dottedQuad(), nameservers |
- return None, nameservers |
- |
-def discoverAuthority(host, roots, cache=None, p=None): |
- if cache is None: |
- cache = {} |
- |
- rootAuths = list(roots) |
- |
- parts = host.rstrip('.').split('.') |
- parts.reverse() |
- |
- authority = rootAuths.pop() |
- |
- soFar = '' |
- for part in parts: |
- soFar = part + '.' + soFar |
- # print '///////', soFar, authority, p |
- msg = defer.waitForDeferred(lookupNameservers(soFar, authority, p)) |
- yield msg |
- msg = msg.getResult() |
- |
- newAuth, nameservers = extractAuthority(msg, cache) |
- |
- if newAuth is not None: |
- # print "newAuth is not None" |
- authority = newAuth |
- else: |
- if nameservers: |
- r = str(nameservers[0].payload.name) |
- # print 'Recursively discovering authority for', r |
- authority = defer.waitForDeferred(discoverAuthority(r, roots, cache, p)) |
- yield authority |
- authority = authority.getResult() |
- # print 'Discovered to be', authority, 'for', r |
-## else: |
-## # print 'Doing address lookup for', soFar, 'at', authority |
-## msg = defer.waitForDeferred(lookupAddress(soFar, authority, p)) |
-## yield msg |
-## msg = msg.getResult() |
-## records = msg.answers + msg.authority + msg.additional |
-## addresses = [r for r in records if r.type == dns.A] |
-## if addresses: |
-## authority = addresses[0].payload.dottedQuad() |
-## else: |
-## raise IOError("Resolution error") |
- # print "Yielding authority", authority |
- yield authority |
- |
-discoverAuthority = defer.deferredGenerator(discoverAuthority) |
- |
-def makePlaceholder(deferred, name): |
- def placeholder(*args, **kw): |
- deferred.addCallback(lambda r: getattr(r, name)(*args, **kw)) |
- return deferred |
- return placeholder |
- |
-class DeferredResolver: |
- def __init__(self, resolverDeferred): |
- self.waiting = [] |
- resolverDeferred.addCallback(self.gotRealResolver) |
- |
- def gotRealResolver(self, resolver): |
- w = self.waiting |
- self.__dict__ = resolver.__dict__ |
- self.__class__ = resolver.__class__ |
- for d in w: |
- d.callback(resolver) |
- |
- def __getattr__(self, name): |
- if name.startswith('lookup') or name in ('getHostByName', 'query'): |
- self.waiting.append(defer.Deferred()) |
- return makePlaceholder(self.waiting[-1], name) |
- raise AttributeError(name) |
- |
-def bootstrap(resolver): |
- """Lookup the root nameserver addresses using the given resolver |
- |
- Return a Resolver which will eventually become a C{root.Resolver} |
- instance that has references to all the root servers that we were able |
- to look up. |
- """ |
- domains = [chr(ord('a') + i) for i in range(13)] |
- # f = lambda r: (log.msg('Root server address: ' + str(r)), r)[1] |
- f = lambda r: r |
- L = [resolver.getHostByName('%s.root-servers.net' % d).addCallback(f) for d in domains] |
- d = defer.DeferredList(L) |
- d.addCallback(lambda r: Resolver([e[1] for e in r if e[0]])) |
- return DeferredResolver(d) |
- |
-if __name__ == '__main__': |
- if len(sys.argv) < 2: |
- print 'Specify a domain' |
- else: |
- log.startLogging(sys.stdout) |
- from twisted.names.client import ThreadedResolver |
- r = bootstrap(ThreadedResolver()) |
- d = r.lookupAddress(sys.argv[1]) |
- d.addCallbacks(log.msg, log.err).addBoth(lambda _: reactor.stop()) |
- from twisted.internet import reactor |
- reactor.run() |