#!/usr/bin/env python # Generate a fallback directory whitelist/blacklist line for every fingerprint # passed as an argument. # # Usage: # generateFallbackDirLine.py fingerprint ... import sys import stem.descriptor.remote as remote if len(sys.argv) <= 1: print "Usage: {} fingerprint ...".format(sys.argv[0]) sys.exit(-1) # we need the full consensus, because it has IPv6 ORPorts # and we want a fingerprint to router mapping in routers # # stem returns document_handler='DOCUMENT' as a list of consensuses # with one entry consensus = remote.get_consensus(document_handler='DOCUMENT').run()[0] for fingerprint in sys.argv[1:]: if fingerprint in consensus.routers: r = consensus.routers[fingerprint] # Tor clients don't use DirPorts, but old code requires one for fallbacks if r.dir_port is not None: # IPv4:DirPort orport=ORPort id=Fingerprint ipv6=[IPv6]:IPv6ORPort # nick ipv6_or_ap_list = [ apv for apv in r.or_addresses if apv[2] ] ipv6_str = "" if len(ipv6_or_ap_list) > 0: ipv6_or_ap = ipv6_or_ap_list[0] ipv6_str = " ipv6=[{}]:{}".format(ipv6_or_ap[0], ipv6_or_ap[1]) print ("{}:{} orport={} id={}{} # {}" .format(r.address, r.dir_port, r.or_port, r.fingerprint, ipv6_str, r.nickname)) else: print "# {} needs a DirPort".format(fingerprint) else: print "# {} not found in current consensus".format(fingerprint)