|  | @@ -0,0 +1,41 @@
 | 
	
		
			
				|  |  | +#!/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)
 |