commit 3fcbb971d84dc634846fb7808e95b25c471c8e25 Author: Damian Johnson atagar@torproject.org Date: Wed Jun 18 09:49:16 2014 -0700
Adding support for ignored authorities
Adding a config option to the consensus health checker to exclude particular authorities from notifications. --- consensus_health_checker.py | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-)
diff --git a/consensus_health_checker.py b/consensus_health_checker.py index cc2b4ab..18ea748 100755 --- a/consensus_health_checker.py +++ b/consensus_health_checker.py @@ -29,9 +29,10 @@ Runlevel = stem.util.enum.UppercaseEnum("NOTICE", "WARNING", "ERROR") DIRECTORY_AUTHORITIES = stem.descriptor.remote.get_authorities() EMAIL_SUBJECT = 'Consensus issues'
-CONFIG = stem.util.conf.config_dict("consensus_health", { +CONFIG = stem.util.conf.config_dict('consensus_health', { 'msg': {}, 'suppression': {}, + 'ignored_authorities': [], 'bandwidth_authorities': [], 'known_params': [], }) @@ -121,7 +122,7 @@ def rate_limit_notice(key, hours = 0, days = 0): if hours == 0 and days == 0: return True
- config = stem.util.conf.get_config("last_notified") + config = stem.util.conf.get_config('last_notified') config_path = util.get_path('data', 'last_notified.cfg')
try: @@ -145,6 +146,11 @@ def rate_limit_notice(key, hours = 0, days = 0): return False
+@lru_cache() +def directory_authorities(): + return dict((k, v) for (k, v) in DIRECTORY_AUTHORITIES.items() if k not in CONFIG['ignored_authorities']) + + def main(): start_time = time.time()
@@ -416,7 +422,7 @@ def has_all_signatures(latest_consensus, consensuses, votes):
missing_authority = missing_signature
- for authority in DIRECTORY_AUTHORITIES.values(): + for authority in directory_authorities().values(): if authority.v3ident == missing_signature: missing_authority = authority.nickname break @@ -466,9 +472,9 @@ def has_authority_flag(latest_consensus, consensuses, votes): if Flag.AUTHORITY in desc.flags: seen_authorities.add(desc.nickname)
- known_authorities = set(DIRECTORY_AUTHORITIES.keys()) + known_authorities = set(directory_authorities().keys()) missing_authorities = known_authorities.difference(seen_authorities) - extra_authorities = seen_authorities.difference(known_authorities) + extra_authorities = seen_authorities.difference(known_authorities - set(CONFIG['ignored_authorities']))
issues = []
@@ -486,8 +492,8 @@ def has_expected_fingerprints(latest_consensus, consensuses, votes):
issues = [] for desc in latest_consensus.routers.values(): - if desc.nickname in DIRECTORY_AUTHORITIES and Flag.NAMED in desc.flags: - expected_fingerprint = DIRECTORY_AUTHORITIES[desc.nickname].fingerprint + if desc.nickname in directory_authorities() and Flag.NAMED in desc.flags: + expected_fingerprint = directory_authorities()[desc.nickname].fingerprint
if desc.fingerprint != expected_fingerprint: issues.append(Issue(Runlevel.ERROR, 'FINGERPRINT_MISMATCH', authority = desc.nickname, expected = desc.fingerprint, actual = expected_fingerprint)) @@ -501,7 +507,7 @@ def is_recommended_versions(latest_consensus, consensuses, votes): outdated_authorities = {} min_version = min(latest_consensus.server_versions)
- for authority in DIRECTORY_AUTHORITIES.values(): + for authority in directory_authorities().values(): desc = latest_consensus.routers.get(authority.fingerprint)
if desc and desc.version and desc.version < min_version: @@ -582,7 +588,7 @@ def get_votes(): def _get_documents(label, resource): queries, documents, issues = {}, {}, []
- for authority in DIRECTORY_AUTHORITIES.values(): + for authority in directory_authorities().values(): if authority.v3ident is None: continue # not a voting authority
@@ -599,7 +605,7 @@ def _get_documents(label, resource): if label == 'vote': # try to download the vote via the other authorities
- v3ident = DIRECTORY_AUTHORITIES[authority].v3ident + v3ident = directory_authorities()[authority].v3ident
query = downloader.query( '/tor/status-vote/current/%s' % v3ident,
tor-commits@lists.torproject.org