# By default, Authorities are not configured as exits Authority = Node(tag="a", authority=1, relay=1, torrc="authority.tmpl") ExitRelay = Node(tag="r", relay=1, exit=1, torrc="relay.tmpl") Client = Node(tag="c", client=1, torrc="client.tmpl") BridgeAuthority = Node(tag="ba", authority=1, bridgeauthority=1, relay=1, torrc="bridgeauthority.tmpl") Bridge = Node(tag="br", bridge=1, pt_bridge=1, relay=1, pt_transport="obfs4", torrc="bridge-obfs4.tmpl") def obfs4_extra_args(env): import os, re # find the obfs4_bridgeline file. location = os.path.join(env['dir'], "pt_state", "obfs4_bridgeline.txt") if not os.path.exists(location): return "" # read the file and find the actual line with open(location, 'r') as f: for line in f: if line.startswith("#"): continue if line.isspace(): continue m = re.match(r'(.*) (cert.*)', line) if m: return m.group(2) return "" Bridge.set_runtime("pt_extra", obfs4_extra_args) BridgeClient = Node(tag="bc", client=1, bridgeclient=1, torrc="bridgeclient-obfs4.tmpl", config_phase=2, launch_phase=2) NODES = Authority.getN(3) + BridgeAuthority.getN(1) + ExitRelay.getN(4) + \ Bridge.getN(1) + Client.getN(1) + BridgeClient.getN(1) ConfigureNodes(NODES)