chiark / gitweb /
peerdb/tripe-newpeers.in: Split out a resolver base class.
authorMark Wooding <mdw@distorted.org.uk>
Wed, 27 Sep 2017 08:51:04 +0000 (09:51 +0100)
committerMark Wooding <mdw@distorted.org.uk>
Sat, 16 Jun 2018 18:14:10 +0000 (19:14 +0100)
Now we can add different kinds of resolvers a bit more easily, and
choose which one we want to use.

peerdb/tripe-newpeers.in

index 5f33f5bdda8cf6f3d806bf212df220b04f43f447..202cea8c54eca58ce2549bb6e953bd5b8187fa42 100644 (file)
@@ -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.