コード例 #1
0
ファイル: upnp.py プロジェクト: paul-axe/darknet
def getUPnP():
    "Returns a deferred, which returns a UPnP object"

    attempt = 0
    while True:
        try:
            server = UPnPClientServer(("", 1900+attempt), UPnPProtocol)

            i = socket.inet_aton(getLocalIPAddress())
            server.socket.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_IF, i)
            #mcast = reactor.listenMulticast(1900+attempt, self)
            break
        except socket.error:
            attempt = random.randint(0,500)
            log.msg("couldn't listen on UPnP port, trying %d"%(
                                attempt+1900), system='UPnP')
    if attempt != 0:
        log.msg("warning: couldn't listen on std upnp port", system='UPnP')

    #mcast.joinGroup('239.255.255.250', socket.INADDR_ANY)
    grpaddr = struct.unpack("I", socket.inet_aton(UPNP_MCAST))[0]

    mreq = struct.pack('II', socket.htonl(grpaddr), socket.htonl(socket.INADDR_ANY))
    try:
        server.socket.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)
    except socket.error:
        dsunittest.traceException("Failed doing IP_ADD_MEMBERSHIP for mreq %r" % mreq)
        # apparently on win32, even though this call fails, UPnP works just fine
        # so I'm commenting out this raise statement --eries
        # raise NoUPnPFound()

    return server.discoverUPnP()
コード例 #2
0
ファイル: kenosisdns.tac.py プロジェクト: paul-axe/darknet
 def lf():
     try:
         d2 = self._deferredLookup(name=name, cls=cls, type=type, timeout=timeout)
         d2.chainDeferred(d)
     except:
         dsunittest.traceException("error during _deferredLookup for name %s" % name)
         d.errback()
コード例 #3
0
ファイル: kwebd.py プロジェクト: paul-axe/darknet
    def do_GET(self):
        host = self.headers["Host"]
        realHost = host.replace(kwebSuffix, "")

        # fixme: remove once we're running as *.kweb.kenosisp2p.org
        if hostOverride:
            realHost = hostOverride

        self.headers["Host"] = realHost
        self.headers["Connection"] = "close"
        
        realUrl = "http://%s" % (realHost + self.path)
        addr = kenosis.randomNodeAddress()

        nodes = self.node_.findNearestNodes(nodeAddress=addr, serviceName="kweb")
        if not nodes:
            nodes = [(self.node_.nodeAddress(), "")]
        headersToSend = dict(self.headers.items())
        for nodeAddr, netAddr in nodes:
            try:
                response_code, headers, data = self.node_.rpc(nodeAddress=nodeAddr).kweb.fetchUrl(realUrl, headersToSend, 0)
            except kenosis.KenosisError, e:
                dsunittest.traceException("error with nodeAddress %s, netAddress %s" % (nodeAddr, netAddr))
                lastError = e
            else:
                break
コード例 #4
0
ファイル: Zeroconf.py プロジェクト: paul-axe/darknet
	def removeListener(self, listener):
		"""Removes a listener."""
		try:
			self.listeners.remove(listener)
			self.notifyAll()
		except:
                        dsunittest.traceException("uncaught error")
			pass
コード例 #5
0
ファイル: upnp_plugin.py プロジェクト: paul-axe/darknet
 def notifyNewStreamService(self, name, streamPort, streamType):
     try:
         publicNetAddress = self.mapper_.map(port=("", streamPort, streamType, "kenosis-%s" % name))
         print "upnp_plugin mapped internal stream port %s to public address %s" % (streamPort, publicNetAddress)
         return publicNetAddress[1]
     except upnp.NoUPnPFound:
         dsunittest.traceException(text="UpnpPlugin.notifyNewStreamService: no upnp found")
         return streamPort
コード例 #6
0
ファイル: upnp_plugin.py プロジェクト: paul-axe/darknet
 def __onListeningOnInternalPort(self, internalPort):
     try:
         publicNetAddress = self.mapper_.map(port=("", internalPort, "TCP", "kenosis"))
     except upnp.UPnPError:
         dsunittest.traceException(text="UPnP not supported")
         return
     print "upnp_plugin mapped internal port %s to public address %s" % (internalPort, publicNetAddress)
     self.__portMappingDone(publicNetAddress=publicNetAddress)
コード例 #7
0
ファイル: dsasyncore.py プロジェクト: paul-axe/darknet
def readwriteWrapper(obj, flags):
    global __somethingHappened
    __somethingHappened = True
    if __returnLiveSockets:
        __liveSockets.append(obj)
    #dsunittest.trace("%r is ready to readwrite" % obj)
    try:
        originalReadwrite(obj, flags)
    except:
        dsunittest.traceException("exception while reading or writing socket")
コード例 #8
0
ファイル: dsasyncore.py プロジェクト: paul-axe/darknet
def writeWrapper(obj):
    global __somethingHappened
    __somethingHappened = True
    if __returnLiveSockets:
        __liveSockets.append(obj)
    #dsunittest.trace("%r is ready to write" % obj)
    try:
        originalWrite(obj)
    except:
        dsunittest.traceException("exception while writing to socket")
コード例 #9
0
ファイル: dsasyncore.py プロジェクト: paul-axe/darknet
def readWrapper(obj):
    global __somethingHappened
    __somethingHappened = True
    if __returnLiveSockets:
        __liveSockets.append(obj)
    #dsunittest.trace("%r is ready to read" % obj)
    try:
        originalRead(obj)
    except:
        dsunittest.traceException("exception while reading from socket")
コード例 #10
0
ファイル: Zeroconf.py プロジェクト: paul-axe/darknet
	def send(self, out, addr = _MDNS_ADDR, port = _MDNS_PORT):
		"""Sends an outgoing packet."""
		# This is a quick test to see if we can parse the packets we generate
		#temp = DNSIncoming(out.packet())
		try:
                        printVerbose("sending data to %s,%s" % (addr, port))
			bytes_sent = self.socket.sendto(out.packet(), 0, (addr, port))
		except:
                        dsunittest.traceException("uncaught error")
			# Ignore this, it may be a temporary loss of network connection
			pass
コード例 #11
0
ファイル: Zeroconf.py プロジェクト: paul-axe/darknet
	def __init__(self, bindaddress=None):
		"""Creates an instance of the Zeroconf class, establishing
		multicast communications, listening and reaping threads."""
		globals()['_GLOBAL_DONE'] = 0
		if bindaddress is None:
                        #print "gethostname: %s" % socket.gethostname()
                        try:
                                self.intf = socket.gethostbyname(socket.gethostname())
                        except socket.error:
                                self.intf = "127.0.0.1"
		else:
			self.intf = bindaddress
		self.group = ('', _MDNS_PORT)
		self.socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
		try:
			self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
			self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)
		except:
			# SO_REUSEADDR should be equivalent to SO_REUSEPORT for
			# multicast UDP sockets (p 731, "TCP/IP Illustrated,
			# Volume 2"), but some BSD-derived systems require
			# SO_REUSEPORT to be specified explicity.  Also, not all
			# versions of Python have SO_REUSEPORT available.  So
			# if you're on a BSD-based system, and haven't upgraded
			# to Python 2.3 yet, you may find this library doesn't
			# work as expected.
			#
                        dsunittest.traceException("uncaught error")
			pass
		self.socket.setsockopt(socket.SOL_IP, socket.IP_MULTICAST_TTL, 255)
		self.socket.setsockopt(socket.SOL_IP, socket.IP_MULTICAST_LOOP, 1)
		try:
			self.socket.bind(self.group)
		except:
			# Some versions of linux raise an exception even though
			# the SO_REUSE* options have been set, so ignore it
			#
                        dsunittest.traceException("uncaught error")
			pass
		self.socket.setsockopt(socket.SOL_IP, socket.IP_MULTICAST_IF, socket.inet_aton(self.intf) + socket.inet_aton('0.0.0.0'))
		self.socket.setsockopt(socket.SOL_IP, socket.IP_ADD_MEMBERSHIP, socket.inet_aton(_MDNS_ADDR) + socket.inet_aton('0.0.0.0'))

		self.listeners = []
		self.browsers = []
		self.services = {}

		self.cache = DNSCache()

		self.condition = threading.Condition()

		self.engine = Engine(self)
		self.listener = Listener(self)
		self.reaper = Reaper(self)
コード例 #12
0
ファイル: Zeroconf.py プロジェクト: paul-axe/darknet
	def readQuestions(self):
		"""Reads questions section of packet"""
		format = '!HH'
		length = struct.calcsize(format)
		for i in range(0, self.numQuestions):
			name = self.readName()
			info = struct.unpack(format, self.data[self.offset:self.offset+length])
			self.offset += length

                        try:
                                question = DNSQuestion(name, info[0], info[1])
                        except NonLocalNameException:
                                dsunittest.traceException(text=name)
                                continue
			self.questions.append(question)
コード例 #13
0
ファイル: zeroconf_plugin.py プロジェクト: paul-axe/darknet
 def addService(self, server, type, name):
     # print "Service %r added" % name
     # Request more information about the service
     info = server.getServiceInfo(type, name)
     # print 'Additional info: %s' % info
     if not info:
         return
     # print 'pinging: %s' % info
     netAddress = "%s:%s" % (socket.inet_ntoa(info.getAddress()), info.port)
     if netAddress != self.advertizedNetAddress_:
         # print("my address is %s, his address is %s" % (self.advertizedNetAddress_, netAddress))
         try:
             self.node_.nodeKernel_.bootstrap(netAddress=netAddress, serviceName="kenosis")
         except NetworkErrorClasses:
             dsunittest.traceException("Failed pinging node found via Zeroconf: %s" % netAddress)
             return
コード例 #14
0
ファイル: Zeroconf.py プロジェクト: paul-axe/darknet
	def run(self):
		while not globals()['_GLOBAL_DONE']:
			rs = self.getReaders()
			if len(rs) == 0:
				# No sockets to manage, but we wait for the timeout
				# or addition of a socket
				#
				self.condition.acquire()
				self.condition.wait(self.timeout)
				self.condition.release()
			else:
				try:
					rr, wr, er = select.select(rs, [], [], self.timeout)
					for socket in rr:
						try:
							self.readers[socket].handle_read()
						except:
							traceback.print_exc()
				except:
                                        dsunittest.traceException("uncaught error")
					pass
コード例 #15
0
ファイル: upnp.py プロジェクト: paul-axe/darknet
 def err(self, text, system):
     dsunittest.traceException("err: %s" % text)
コード例 #16
0
ファイル: task.py プロジェクト: paul-axe/darknet
    def _worker(self):
        try:
            #Enable this for super tracing
            #sys.settrace(self.__traceFunc)

            threading.currentThread().task_taskList = weakref.ref(self)

            while 1:
                self.tasksSemaphore_.acquire()

                if self is None:
                    return

                self.tasksLock_.acquire()
                try:
                    if self.waiting_ and len(self.waitingTasks_) == 0:
                        return
                    if self.stopping_:
                        return
                    assert not len(self.waitingTasks_) == 0

                    (t,) = self.waitingTasks_[:1]
                    del self.waitingTasks_[:1]
                    assert self.taskInfosById_[t.id()]["active"] == 0
                    self.taskInfosById_[t.id()]["active"] = 1
                    self.activeTasks_ += 1
                    numReallyActive = 0
                    for (id, info) in self.taskInfosById_.items():
                        if info["active"]:
                            numReallyActive += 1
                    assert numReallyActive == self.activeTasks_
                    self._print(status="started", task=t)
                finally:
                    self.tasksLock_.release()

                t.taskThread_ = threading.currentThread()
                t.taskThread_.setName(str(t.id()))

                returnValueShouldBeSet = 0
                sleepTime = 0
                if not self.stopping_:
                    try:
                        t.taskThread_.task_startTime = time.time()
                        returnValue = t.run()
                        sleepTime = self._sleepTime(startTime=t.taskThread_.task_startTime)
                        returnValueShouldBeSet = 1
                    except dsthread.ThreadStoppingError:
                        pass
                    except:
                        type, value, traceback = sys.exc_info()
                        self.exceptionThreadPairs_.append(((type, value, traceback), t.taskThread_))
                        if self.waiting_:
                            self._stop()
                        else:
                            # If someone is waiting then I know that they will get the execptions
                            # so I don't need to log them here.
                            dsunittest.traceException(text="Execption while handling task %s" % repr(t))

                t.taskThread_ = None

                self.tasksLock_.acquire()
                try:
                    if returnValueShouldBeSet:
                        self.returnValues_.append(returnValue)
                    self.activeTasks_ -= 1
                    self.numTasksCompleted_ += 1
                    del self.taskInfosById_[t.id()]
                    self._print(status="finished", task=t)
                    self.anyComplete_.set()
                    if self.activeTasks_ == 0 and len(self.waitingTasks_) == 0:
                        if self.waiting_:
                            self._stop()
                            return

                        # This is an attempt to make the task list
                        # stop automatically when there are no
                        # outstanding references to it but it is
                        # flawed: we cannot call stop when
                        # self.waiting_ is false.
                        #elif len(gc.get_referrers(self)) == len(self.threads_):
                        #    self._stop()
                        #    return
                        else:
                            #print("num refs on inactive is: %s" % len(gc.get_referrers(self)))
                            pass
                finally:
                    if self.activeTasks_ == 0 and len(self.waitingTasks_) == 0:
                        self.allComplete_.set()
                    self.tasksLock_.release()
                self._sleep(sleepTime=sleepTime)
        except:
            dsunittest.traceException(text="Exception from task._worker")
コード例 #17
0
ファイル: dsasyncore.py プロジェクト: paul-axe/darknet
def handleErrorWrapper(self):
    dsunittest.traceException("exception while reading or writing socket")
    return origHandleError(self)