def input_cb (self, sock, cond): try: _, type, body = tc.receive_message (sock) except: self.__connected = False self.__resetCounters () self.__sock.close() self.__sock = socket.socket (socket.AF_INET, socket.SOCK_STREAM) self.__poll = timeout_add (self.__pollInterval, \ self.timer_cb) return False else: event = tc.unpack_event (body) eventType = tc.EVENT_TYPE.nameOf[event[0]] eventData = event[1] #Handle events and forward notifications to observers #TODO: monitor circuits and streams #TODO: (EVENT_TYPE.{CIRCUITSTATUS,STREAMSTATUS}) if event[0] == tc.EVENT_TYPE.BANDWIDTH: self.__bytesRecv += eventData[0] self.__bytesSent += eventData[1] elif event[0] > tc.EVENT_TYPE.NEWDESC: eventType = "LOG_MESSAGE" if event[0] == tc.EVENT_TYPE.WARN_MSG: self.__warningsCount += 1 elif event[0] == tc.EVENT_TYPE.ERR_MSG: self.__errorsCounts += 1 elif event[0] == tc.EVENT_TYPE.ORCONNSTATUS: status = eventData[0] nick = eventData[1] if status == tc.OR_CONN_STATUS.LAUNCHED: self.__orConnectionsCount['Launched'] += 1 self.__orConnections[nick] = 'Launched' elif status == tc.OR_CONN_STATUS.CONNECTED: if self.__orConnections.has_key (nick): self.__orConnectionsCount['Launched'] -= 1 self.__orConnectionsCount['Connected'] += 1 self.__orConnections[nick] = 'Connected' elif status == tc.OR_CONN_STATUS.FAILED: self.__orConnectionsCount['Failures'] += 1 if self.__orConnections.has_key(nick): status = self.__orConnections[nick] self.__orConnectionsCount[status] -= 1 del self.__orConnections[nick] elif status == tc.OR_CONN_STATUS.CLOSED: if self.__orConnections.has_key(nick): self.__orConnectionsCount['Connected'] -= 1 del self.__orConnections[nick] self.notifyObservers (Notification (eventType, eventData)) return True
def runControl(s): pendingEvents = [] #XXX This tric. should become standard TorControl._event_handler = pendingEvents.append TorControl.set_events(s, [TorControl.EVENT_TYPE.CIRCSTATUS, TorControl.EVENT_TYPE.STREAMSTATUS]) TorControl.set_option(s,"__LeaveStreamsUnattached 1") while 1: e = pendingEvents[:] del pendingEvents[:] for ev in e: handleEvent(s, ev) _, tp, body = TorControl.receive_message(s) if tp == TorControl.MSG_TYPE.EVENT: handleEvent(s, body)
def runControl(s): circs = {} s1, s2 = {}, {} _h = lambda body, circs=circs, s1=s1, s2=s2, s=s: handleEvent( s, body, circs, s1, s2) TorControl._event_handler = _h TorControl.set_events( s, [TorControl.EVENT_TYPE.CIRCSTATUS, TorControl.EVENT_TYPE.STREAMSTATUS]) TorControl.set_option(s, "__LeaveStreamsUnattached 1") global N_CIRCS_DONE while N_CIRCS_DONE < N_CIRCS_TO_TRY: while len(circs) < CIRCS_AT_A_TIME: c, p = launchCirc(s) print "launching circuit %s to %s" % (c, p) circs[c] = p _, tp, body = TorControl.receive_message(s) if tp == TorControl.MSG_TYPE.EVENT: handleEvent(s, body, circs, s1, s2) i = HOST_STATUS.items() i.sort() for n, (all, good) in i: print "%s in %s circuits; %s/%s ok" % (n, all, good, all)