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
Exemple #2
0
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)
Exemple #3
0
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)