X-Git-Url: https://git.distorted.org.uk/~mdw/tripe/blobdiff_plain/6e5794efbe4bf46bfd69984236dc832b21617080..6f48da4ac71b5944d0464dd940ced3baf0d4311b:/peerdb/tripe-newpeers.in diff --git a/peerdb/tripe-newpeers.in b/peerdb/tripe-newpeers.in index e7f5d518..0ba9cb61 100644 --- a/peerdb/tripe-newpeers.in +++ b/peerdb/tripe-newpeers.in @@ -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,20 +320,19 @@ class ConfigSection (object): """ ## Initialize for a depth-first walk of the inheritance graph. - seen = {} - visited = {} + seen = { 'name': True } + visiting = { me.name: True } stack = [me] ## Visit nodes, collecting their keys. Don't believe the values: ## resolving inheritance is too hard to do like this. while stack: sec = stack.pop() - if sec.name in visited: continue - visited[sec.name] = True - stack += sec._parents() + for p in sec._parents(): + 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()