def launchCirc(s): htw = HOSTS_THAT_WORK[:] random.shuffle(htw) path = htw[:CIRC_LEN-2] + \ [random.choice(HOSTS_TO_TEST)] + \ [random.choice(EXITS_THAT_WORK)] circid = TorControl.extend_circuit(s, 0, path) for name in path: lst = HOST_STATUS.setdefault(name, [0, 0]) lst[0] += 1 return circid, path
def handleEvent(s,body): event, args = TorControl.unpack_event(body) if event == TorControl.EVENT_TYPE.STREAMSTATUS: status, ident, target = args print "Got stream event:",TorControl.STREAM_STATUS.nameOf[status],\ ident,target if status in (TorControl.STREAM_STATUS.NEW_CONNECT, TorControl.STREAM_STATUS.NEW_RESOLVE): target,port=target.split(":") if not target.endswith(".path"): TorControl.attach_stream(s, ident, 0) else: path,host = parsePath(target) #XXXX Don't launch so many circuits! streams[ident] = path,host circid = TorControl.extend_circuit(s, 0, path) circuits[circid] = path elif status == TorControl.STREAM_STATUS.DETACHED: if not streams.has_key(ident): TorControl.attach_stream(s, ident, 0) else: TorControl.close_stream(s, ident, 1) elif event == TorControl.EVENT_TYPE.CIRCSTATUS: status, ident, path = args print "Got circuit event",TorControl.CIRC_STATUS.nameOf[status],\ ident,path if not circuits.has_key(ident): return if status in (TorControl.CIRC_STATUS.CLOSED, TorControl.CIRC_STATUS.FAILED): ok = 0 elif status == TorControl.CIRC_STATUS.BUILT: ok = 1 else: return ids = [ streamID for (streamID, (path,host)) in streams.items() if path == circuits[ident] ] for streamID in ids: if ok: _,host = streams[streamID] TorControl.redirect_stream(s, streamID, host) TorControl.attach_stream(s, streamID, ident) #XXXX Don't do this twice. else: TorControl.close_stream(s, streamID, 1) if not ok: del circuits[ident]