peerdb/tripe-newpeers.in (BulkResolver): Add exception for resolution failure.
[tripe] / peerdb / tripe-newpeers.in
index fdb9170..0ba9cb6 100644 (file)
@@ -51,6 +51,13 @@ class CDBFake (object):
 ###--------------------------------------------------------------------------
 ### A bulk DNS resolver.
 
+class ResolverFailure (Exception):
+  def __init__(me, host, msg):
+    me.host = host
+    me.msg = msg
+  def __str__(me):
+    return "failed to resolve `%s': %s" % (me.host, me.msg)
+
 class BulkResolver (object):
   """
   Resolve a number of DNS names in parallel.
@@ -92,7 +99,7 @@ class BulkResolver (object):
     """
     addr = me._namemap[host]
     if addr is None:
-      raise KeyError(host)
+      raise ResolverFailure(host, '(unknown failure)')
     return addr
 
   def _resolved(me, host, addr):
@@ -296,6 +303,9 @@ class ConfigSection (object):
     ## Special handling for the `name' key.
     if key == 'name':
       value = me._itemmap.get('name', me.name)
+    elif key == '@inherits':
+      try: return me._itemmap['@inherits']
+      except KeyError: raise MissingKeyException(me.name, key)
     else:
       value, _ = me._get(key)
       if value is None:
@@ -310,7 +320,7 @@ class ConfigSection (object):
     """
 
     ## Initialize for a depth-first walk of the inheritance graph.
-    seen = {}
+    seen = { 'name': True }
     visiting = { me.name: True }
     stack = [me]
 
@@ -322,8 +332,7 @@ class ConfigSection (object):
         if p.name not in visiting:
           stack.append(p); visiting[p.name] = True
 
-      for key in sec._itemmap.iterkeys():
-        if key != '@inherit': seen[key] = None
+      for key in sec._itemmap.iterkeys(): seen[key] = None
 
     ## And we're done.
     return seen.iterkeys()