From: Mark Wooding Date: Wed, 27 Sep 2017 08:51:04 +0000 (+0100) Subject: peerdb/tripe-newpeers.in: Split out a resolver base class. X-Git-Tag: 1.5.0~41^2~57 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~mdw/git/tripe/commitdiff_plain/ad36789130f4756ba2a27ed9bb8b5ab62a21ce7d peerdb/tripe-newpeers.in: Split out a resolver base class. Now we can add different kinds of resolvers a bit more easily, and choose which one we want to use. --- diff --git a/peerdb/tripe-newpeers.in b/peerdb/tripe-newpeers.in index 5f33f5bd..202cea8c 100644 --- a/peerdb/tripe-newpeers.in +++ b/peerdb/tripe-newpeers.in @@ -106,7 +106,7 @@ class ResolvingHost (object): if not all: aa = [aa[0]] return aa -class BulkResolver (object): +class BaseBulkResolver (object): """ Resolve a number of DNS names in parallel. @@ -125,15 +125,6 @@ class BulkResolver (object): def __init__(me): """Initialize the resolver.""" me._namemap = {} - me._noutstand = 0 - - def _prepare(me, host, name): - """Arrange to resolve a NAME, reporting the results to HOST.""" - host._resolv = M.SelResolveByName( - name, - lambda cname, alias, addr: me._resolved(host, cname, addr), - lambda: me._resolved(host, None, [])) - me._noutstand += 1 def prepare(me, name): """Prime the resolver to resolve the given host NAME.""" @@ -149,14 +140,34 @@ class BulkResolver (object): if af == S.AF_INET: host.addaddr('INET', sa[0]) elif af == S.AF_INET6: host.addaddr('INET6', sa[0]) - def run(me): - """Run the background DNS resolver until it's finished.""" - while me._noutstand: M.select() - def lookup(me, name, flags): """Fetch the address corresponding to the host NAME.""" return me._namemap[name].get(flags) +class BresBulkResolver (BaseBulkResolver): + """ + A BulkResolver using mLib's `bres' background resolver. + + This is always available (and might use ADNS), but only does IPv4. + """ + + def __init__(me): + super(BresBulkResolver, me).__init__() + """Initialize the resolver.""" + me._noutstand = 0 + + def _prepare(me, host, name): + """Arrange to resolve a NAME, reporting the results to HOST.""" + host._resolv = M.SelResolveByName( + name, + lambda cname, alias, addr: me._resolved(host, cname, addr), + lambda: me._resolved(host, None, [])) + me._noutstand += 1 + + def run(me): + """Run the background DNS resolver until it's finished.""" + while me._noutstand: M.select() + def _resolved(me, host, cname, addr): """Callback function: remember that ADDRs are the addresses for HOST.""" if not addr: @@ -167,6 +178,9 @@ class BulkResolver (object): host._resolv = None me._noutstand -= 1 +## Select a bulk resolver. Currently, there's only one choice. +BulkResolver = BresBulkResolver + ###-------------------------------------------------------------------------- ### The configuration parser.