コード例 #1
0
	def timer_cb (self):
		self.__sock = socket.socket ( socket.AF_INET, \
					      socket.SOCK_STREAM)

	        while not self.__connected:
			try:
				self.__sock.connect((self.__host, self.__port))
			except:
				if self.__torStatus != 'Stopped':
					self.__torStatus = 'Stopped'
					self.notifyObservers ( \
					     Notification('TorStatusChanged',\
					         'Stopped'))
					self.__resetCounters ()
				return True
			else:
				tc.authenticate (self.__sock)
				self.__connected   = True
				self.__torStatus   = 'Started'
				self.__timeStarted = datetime.now ()
				self.__torVersion  = tc.get_info \
					(self.__sock, 'version')['version']

				self.notifyObservers (Notification \
					('TorStatusChanged', 'Started'))
				
				tc.set_events(self.__sock, self.__events)
				self.__iocb = io_add_watch (self.__sock, \
							    IO_IN, \
							    self.input_cb)

				return False
コード例 #2
0
	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
コード例 #3
0
ファイル: PathDemo.py プロジェクト: qurat231/legacy
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)
コード例 #4
0
ファイル: ExerciseServer.py プロジェクト: qurat231/legacy
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
コード例 #5
0
ファイル: ExerciseServer.py プロジェクト: qurat231/legacy
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)
コード例 #6
0
ファイル: ExerciseServer.py プロジェクト: qurat231/legacy
def handleEvent(s, body, circs, streamsByNonce, streamsByIdent):
    global N_CIRCS_DONE
    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,
                      TorControl.STREAM_STATUS.DETACHED):
            target, port = target.split(":")
            if not target.endswith(".exnonce"):
                TorControl.attach_stream(s, ident, 0)
            else:
                circid, (host, url) = streamsByNonce[target]
                streamsByIdent[ident] = circid, (host, url)
                print "Redirecting circuit", circid, "to", host
                TorControl.redirect_stream(s, ident, host)
                TorControl.attach_stream(s, ident, circid)
        elif status in (TorControl.STREAM_STATUS.CLOSED,
                        TorControl.STREAM_STATUS.FAILED):
            circid, (host, url) = streamsByIdent[ident]
            if circs.has_key(circid):
                for name in circs[circid]:
                    HOST_STATUS[name][1] += 1
                del circs[circid]
                N_CIRCS_DONE += 1
                print N_CIRCS_DONE, "circuit attempts done"
            del streamsByIdent[ident]
    elif event == TorControl.EVENT_TYPE.CIRCSTATUS:
        status, ident, path = args
        print "Got circuit event",TorControl.CIRC_STATUS.nameOf[status],\
              ident,path
        if status in (TorControl.CIRC_STATUS.CLOSED,
                      TorControl.CIRC_STATUS.FAILED):
            if circs.has_key(ident):
                print "Circuit failed."
                del circs[ident]
                N_CIRCS_DONE += 1
                print N_CIRCS_DONE, "circuit attempts done"
        elif status == TorControl.CIRC_STATUS.BUILT:
            nonce = random.randint(1, 100000000)
            nonce = "%s.exnonce" % nonce
            host, url = random.choice(TARGETS)
            streamsByNonce[nonce] = ident, (host, url)
            print "Launching socks4a connection"
            t = threading.Thread(target=runSocks4A,
                                 args=(nonce, host, 80, url))
            t.setDaemon(1)
            t.start()
コード例 #7
0
ファイル: ExerciseServer.py プロジェクト: qurat231/legacy
def run():
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect(("127.0.0.1", CONTROL_PORT))
    TorControl.authenticate(s)
    runControl(s)
コード例 #8
0
ファイル: PathDemo.py プロジェクト: qurat231/legacy
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]