Пример #1
0
 def _get_services(self):
     if not self.services or self.last_got_services + EXPIRE_CACHE < clock(
     ):
         self.services = []
         try:
             f = win32com.client.Dispatch("UPnP.UPnPDeviceFinder")
             for t in ("urn:schemas-upnp-org:service:WANIPConnection:1",
                       "urn:schemas-upnp-org:service:WANPPPConnection:1"):
                 try:
                     conns = f.FindByType(t, 0)
                     for c in xrange(len(conns)):
                         try:
                             svcs = conns[c].Services
                             for s in xrange(len(svcs)):
                                 try:
                                     self.services.append(svcs[s])
                                 except:
                                     if DEBUG:
                                         print_exc()
                         except:
                             if DEBUG:
                                 print_exc()
                 except:
                     if DEBUG:
                         print_exc()
         except:
             if DEBUG:
                 print_exc()
         self.last_got_services = clock()
     return self.services
Пример #2
0
 def _get_services(self):
     if not self.services or self.last_got_services + EXPIRE_CACHE < clock():
         self.services = []
         try:
             f=win32com.client.Dispatch("UPnP.UPnPDeviceFinder")
             for t in ( "urn:schemas-upnp-org:service:WANIPConnection:1",
                        "urn:schemas-upnp-org:service:WANPPPConnection:1" ):
                 try:
                     conns = f.FindByType(t, 0)
                     for c in xrange(len(conns)):
                         try:
                             svcs = conns[c].Services
                             for s in xrange(len(svcs)):
                                 try:
                                     self.services.append(svcs[s])
                                 except:
                                     if DEBUG:
                                         print_exc()
                         except:
                             if DEBUG:
                                 print_exc()
                 except:
                     if DEBUG:
                         print_exc()
         except:
             if DEBUG:
                 print_exc()
         self.last_got_services = clock()
     return self.services
Пример #3
0
 def _get_map(self):
     if self.last_got_map + EXPIRE_CACHE < clock():
         try:
             dispatcher = win32com.client.Dispatch("HNetCfg.NATUPnP")
             self.map = dispatcher.StaticPortMappingCollection
             self.last_got_map = clock()
         except:
             if DEBUG:
                 print_exc()
             self.map = None
     return self.map
Пример #4
0
 def _get_map(self):
     if self.last_got_map + EXPIRE_CACHE < clock():
         try:
             dispatcher = win32com.client.Dispatch("HNetCfg.NATUPnP")
             self.map = dispatcher.StaticPortMappingCollection
             self.last_got_map = clock()
         except:
             if DEBUG:
                 print_exc()
             self.map = None
     return self.map
Пример #5
0
    def __init__(self, socket_handler, sock, handler, ip=None):
        self.socket_handler = socket_handler
        self.socket = sock
        self.handler = handler
        self.buffer = []
        self.last_hit = clock()
        self.fileno = sock.fileno()
        self.connected = False
        self.skipped = 0
#        self.check = StreamCheck()
        self.myip = None
        self.myport = -1
        self.ip = None
        self.port = -1
        try:
            myname = self.socket.getsockname()
            self.myip = myname[0]
            self.myport = myname[1]
            peername = self.socket.getpeername()
            self.ip = peername[0]
            self.port = peername[1]
        except:
            # print_exc()
            if ip is None:
                self.ip = 'unknown'
            else:
                self.ip = ip
Пример #6
0
 def __init__(self, socket_handler, sock, handler, ip=None):
     self.socket_handler = socket_handler
     self.socket = sock
     self.handler = handler
     self.buffer = []
     self.last_hit = clock()
     self.fileno = sock.fileno()
     self.connected = False
     self.skipped = 0
     #        self.check = StreamCheck()
     self.myip = None
     self.myport = -1
     self.ip = None
     self.port = -1
     try:
         myname = self.socket.getsockname()
         self.myip = myname[0]
         self.myport = myname[1]
         peername = self.socket.getpeername()
         self.ip = peername[0]
         self.port = peername[1]
     except:
         # print_exc()
         if ip is None:
             self.ip = 'unknown'
         else:
             self.ip = ip
Пример #7
0
 def scan_for_timeouts(self):
     t = clock() - self.timeout
     tokill = []
     for s in self.single_sockets.values():
         # Only SingleSockets can be closed because of timeouts
         if isinstance(s, SingleSocket) and s.last_hit < t:
             tokill.append(s)
     for k in tokill:
         if k.socket is not None:
             if DEBUG:
                 print >> sys.stderr, "SocketHandler: scan_timeout closing connection", k.get_ip()
             self._close_socket(k)
Пример #8
0
 def get_ip(self):
     if self.last_got_ip + EXPIRE_CACHE < clock():
         if self.local_ip is None:
             local_ips = IP_List()
             local_ips.set_intranet_addresses()
             try:
                 for info in socket.getaddrinfo(socket.gethostname(), 0, socket.AF_INET):
                             # exception if socket library isn't recent
                     self.local_ip = info[4][0]
                     if local_ips.includes(self.local_ip):
                         self.last_got_ip = clock()
                         if DEBUG:
                             print >>sys.stderr,'upnpX: Local IP found: '+self.local_ip
                         break
                 else:
                     raise ValueError('upnpX: couldn\'t find intranet IP')
             except:
                 self.local_ip = None
                 if DEBUG:
                     print >>sys.stderr,'upnpX: Error finding local IP'
                     print_exc()
     return self.local_ip
Пример #9
0
 def scan_for_timeouts(self):
     t = clock() - self.timeout
     tokill = []
     for s in self.single_sockets.values():
         # Only SingleSockets can be closed because of timeouts
         if isinstance(s, SingleSocket) and s.last_hit < t:
             tokill.append(s)
     for k in tokill:
         if k.socket is not None:
             if DEBUG:
                 print >> sys.stderr, "SocketHandler: scan_timeout closing connection", k.get_ip(
                 )
             self._close_socket(k)
Пример #10
0
 def get_ip(self):
     if self.last_got_ip + EXPIRE_CACHE < clock():
         if self.local_ip is None:
             local_ips = IP_List()
             local_ips.set_intranet_addresses()
             try:
                 for info in socket.getaddrinfo(socket.gethostname(), 0,
                                                socket.AF_INET):
                     # exception if socket library isn't recent
                     self.local_ip = info[4][0]
                     if local_ips.includes(self.local_ip):
                         self.last_got_ip = clock()
                         if DEBUG:
                             print >> sys.stderr, 'upnpX: Local IP found: ' + self.local_ip
                         break
                 else:
                     raise ValueError('upnpX: couldn\'t find intranet IP')
             except:
                 self.local_ip = None
                 if DEBUG:
                     print >> sys.stderr, 'upnpX: Error finding local IP'
                     print_exc()
     return self.local_ip
Пример #11
0
    def handle_events(self, events):
        for sock, event in events:
            # print >>sys.stderr,"SocketHandler: event on sock#",sock
            s = self.servers.get(sock)    # socket.socket
            if s:
                if event & (POLLHUP | POLLERR) != 0:
                    if DEBUG:
                        print >> sys.stderr, "SocketHandler: Got event, close server socket"
                    self.poll.unregister(s)
                    del self.servers[sock]
                else:
                    try:
                        newsock, addr = s.accept()
                        if DEBUG:
                            print >> sys.stderr, "SocketHandler: Got connection from", newsock.getpeername()
                        if not self.btengine_said_reachable:
                            try:
                                from Tribler.Core.NATFirewall.DialbackMsgHandler import DialbackMsgHandler
                                dmh = DialbackMsgHandler.getInstance()
                                dmh.network_btengine_reachable_callback()
                            except ImportError:
                                if DEBUG:
                                    print_exc()
                                pass
                            self.btengine_said_reachable = True

                        # Only use the new socket if we can spare the
                        # connections. Otherwise we will silently drop
                        # the connection.
                        if len(self.single_sockets) < self.max_connects:
                            newsock.setblocking(0)
                            nss = SingleSocket(self, newsock, self.handler)    # create socket for incoming peers and tracker
                            self.single_sockets[newsock.fileno()] = nss
                            self.poll.register(newsock, POLLIN)
                            self.handler.external_connection_made(nss)
                        else:
                            print >> sys.stderr, "SocketHandler: too many connects"
                            newsock.close()

                    except socket.error as e:
                        if DEBUG:
                            print >> sys.stderr, "SocketHandler: SocketError while accepting new connection", str(e)
                        self._sleep()
                continue

            s = self.udp_sockets.get(sock)
            if s:
                packets = []
                try:
                    try:
                        while True:
                            (data, addr) = s.socket.recvfrom(65535)
                            if not data:
                                if DEBUG:
                                    print >> sys.stderr, "SocketHandler: UDP no-data", addr
                                break
                            else:
                                if DEBUG:
                                    print >> sys.stderr, "SocketHandler: Got UDP data", addr, "len", len(data)
                                packets.append((addr, data))

                    except socket.error as e:
                        if DEBUG:
                            print >> sys.stderr, "SocketHandler: UDP Socket error", str(e)

                finally:
                    s.handler.data_came_in(packets)

                continue

            s = self.single_sockets.get(sock)
            if s:
                if (event & (POLLHUP | POLLERR)):
                    if DEBUG:
                        print >> sys.stderr, "SocketHandler: Got event, connect socket got error", sock
                        print >> sys.stderr, "SocketHandler: Got event, connect socket got error", s.ip, s.port
                    self._close_socket(s)
                    continue
                if (event & POLLIN):
                    try:
                        s.last_hit = clock()
                        data = s.socket.recv(100000)
                        if not data:
                            if DEBUG:
                                print >> sys.stderr, "SocketHandler: no-data closing connection", s.get_ip(), s.get_port()
                            self._close_socket(s)
                        else:
                            # if DEBUG:
                            #    print >> sys.stderr,"SocketHandler: Got data",s.get_ip(),s.get_port(),"len",len(data)

                            # btlaunchmany: NewSocketHandler, btdownloadheadless: Encrypter.Connection
                            s.handler.data_came_in(s, data)
                    except socket.error as e:
                        if DEBUG:
                            print >> sys.stderr, "SocketHandler: Socket error", str(e)
                        code, msg = e
                        if code != SOCKET_BLOCK_ERRORCODE:
                            if DEBUG:
                                print >> sys.stderr, "SocketHandler: closing connection because not WOULDBLOCK", s.get_ip(), "error", code
                            self._close_socket(s)
                            continue
                if (event & POLLOUT) and s.socket and not s.is_flushed():
                    s.connected = True
                    s.try_write()
                    if s.is_flushed():
                        s.handler.connection_flushed(s)
            else:
                # Arno, 2012-08-1: Extra protection.
                print >>sys.stderr, "SocketHandler: got event on unregistered sock", sock
                try:
                    self.poll.unregister(sock)
                except:
                    pass
Пример #12
0
 def _add_task(self, func, delay, id=None):
     if delay < 0:
         delay = 0
     insort(self.funcs, (clock() + delay, func, id))
Пример #13
0
    def listen_forever(self, handler):
        if DEBUG:
            print >> sys.stderr, "rawserver: listen forever()"
        # handler=btlanuchmany: MultiHandler, btdownloadheadless: Encoder
        self.thread_ident = get_ident()
        self.sockethandler.set_handler(handler)
        try:
            while not self.doneflag.isSet():
                try:
                    self.pop_external()
                    self._kill_tasks()
                    if self.funcs:
                        period = self.funcs[0][0] + 0.001 - clock()
                    else:
                        period = 2**30
                    if period < 0:
                        period = 0

                    #if DEBUG:
                    #    print >>sys.stderr,"rawserver: do_poll",period
                    events = self.sockethandler.do_poll(period)

                    if self.doneflag.isSet():
                        if DEBUG:
                            print >> sys.stderr, "rawserver: stopping because done flag set"
                        return

                    #print >>sys.stderr,"RawServer: funcs is",`self.funcs`

                    while self.funcs and self.funcs[0][0] <= clock(
                    ) and not self.doneflag.isSet():
                        garbage1, func, id = self.funcs.pop(0)
                        if id in self.tasks_to_kill:
                            pass
                        try:
                            #                            print func.func_name
                            if DEBUG:
                                if func.func_name != "_bgalloc":
                                    print >> sys.stderr, "RawServer:f", func.func_name
                            #st = time.time()
                            func()
                            #et = time.time()
                            #diff = et - st
                            #print >>sys.stderr,func,"took %.5f" % (diff)

                        except (SystemError, MemoryError), e:
                            self.failfunc(e)
                            return
                        except KeyboardInterrupt, e:
                            #                            self.exception(e)
                            return
                        except error:
                            if DEBUG:
                                print >> sys.stderr, "rawserver: func: ERROR exception"
                                print_exc()
                            pass
                        except Exception, e:
                            # # boudewijn: someone made a big mistake,
                            # # the code will not function as expected.
                            # # notify someone for *uck sake!  instead
                            # # of silently hiding the problem and
                            # # continuing...
                            # raise
                            if DEBUG:
                                print >> sys.stderr, "rawserver: func: any exception"
                                print_exc()
                            if self.noisy:
                                self.exception(e)
Пример #14
0
    def handle_events(self, events):
        for sock, event in events:
            # print >>sys.stderr,"SocketHandler: event on sock#",sock
            s = self.servers.get(sock)  # socket.socket
            if s:
                if event & (POLLHUP | POLLERR) != 0:
                    if DEBUG:
                        print >> sys.stderr, "SocketHandler: Got event, close server socket"
                    self.poll.unregister(s)
                    del self.servers[sock]
                else:
                    try:
                        newsock, addr = s.accept()
                        if DEBUG:
                            print >> sys.stderr, "SocketHandler: Got connection from", newsock.getpeername(
                            )
                        if not self.btengine_said_reachable:
                            try:
                                from Tribler.Core.NATFirewall.DialbackMsgHandler import DialbackMsgHandler
                                dmh = DialbackMsgHandler.getInstance()
                                dmh.network_btengine_reachable_callback()
                            except ImportError:
                                if DEBUG:
                                    print_exc()
                                pass
                            self.btengine_said_reachable = True

                        # Only use the new socket if we can spare the
                        # connections. Otherwise we will silently drop
                        # the connection.
                        if len(self.single_sockets) < self.max_connects:
                            newsock.setblocking(0)
                            nss = SingleSocket(
                                self, newsock, self.handler
                            )  # create socket for incoming peers and tracker
                            self.single_sockets[newsock.fileno()] = nss
                            self.poll.register(newsock, POLLIN)
                            self.handler.external_connection_made(nss)
                        else:
                            print >> sys.stderr, "SocketHandler: too many connects"
                            newsock.close()

                    except socket.error as e:
                        if DEBUG:
                            print >> sys.stderr, "SocketHandler: SocketError while accepting new connection", str(
                                e)
                        self._sleep()
                continue

            s = self.udp_sockets.get(sock)
            if s:
                packets = []
                try:
                    try:
                        while True:
                            (data, addr) = s.socket.recvfrom(65535)
                            if not data:
                                if DEBUG:
                                    print >> sys.stderr, "SocketHandler: UDP no-data", addr
                                break
                            else:
                                if DEBUG:
                                    print >> sys.stderr, "SocketHandler: Got UDP data", addr, "len", len(
                                        data)
                                packets.append((addr, data))

                    except socket.error as e:
                        if DEBUG:
                            print >> sys.stderr, "SocketHandler: UDP Socket error", str(
                                e)

                finally:
                    s.handler.data_came_in(packets)

                continue

            s = self.single_sockets.get(sock)
            if s:
                if (event & (POLLHUP | POLLERR)):
                    if DEBUG:
                        print >> sys.stderr, "SocketHandler: Got event, connect socket got error", sock
                        print >> sys.stderr, "SocketHandler: Got event, connect socket got error", s.ip, s.port
                    self._close_socket(s)
                    continue
                if (event & POLLIN):
                    try:
                        s.last_hit = clock()
                        data = s.socket.recv(100000)
                        if not data:
                            if DEBUG:
                                print >> sys.stderr, "SocketHandler: no-data closing connection", s.get_ip(
                                ), s.get_port()
                            self._close_socket(s)
                        else:
                            # if DEBUG:
                            #    print >> sys.stderr,"SocketHandler: Got data",s.get_ip(),s.get_port(),"len",len(data)

                            # btlaunchmany: NewSocketHandler, btdownloadheadless: Encrypter.Connection
                            s.handler.data_came_in(s, data)
                    except socket.error as e:
                        if DEBUG:
                            print >> sys.stderr, "SocketHandler: Socket error", str(
                                e)
                        code, msg = e
                        if code != SOCKET_BLOCK_ERRORCODE:
                            if DEBUG:
                                print >> sys.stderr, "SocketHandler: closing connection because not WOULDBLOCK", s.get_ip(
                                ), "error", code
                            self._close_socket(s)
                            continue
                if (event & POLLOUT) and s.socket and not s.is_flushed():
                    s.connected = True
                    s.try_write()
                    if s.is_flushed():
                        s.handler.connection_flushed(s)
            else:
                # Arno, 2012-08-1: Extra protection.
                print >> sys.stderr, "SocketHandler: got event on unregistered sock", sock
                try:
                    self.poll.unregister(sock)
                except:
                    pass
Пример #15
0
 def _add_task(self, func, delay, id=None):
     if delay < 0:
         delay = 0
     insort(self.funcs, (clock() + delay, func, id))
Пример #16
0
    def listen_forever(self, handler):
        if DEBUG:
            print >>sys.stderr, "rawserver: listen forever()"
        # handler=btlanuchmany: MultiHandler, btdownloadheadless: Encoder
        self.thread_ident = get_ident()
        self.sockethandler.set_handler(handler)
        try:
            while not self.doneflag.isSet():
                try:
                    self.pop_external()
                    self._kill_tasks()
                    if self.funcs:
                        period = self.funcs[0][0] + 0.001 - clock()
                    else:
                        period = 2 ** 30
                    if period < 0:
                        period = 0

                    # if DEBUG:
                    #    print >>sys.stderr,"rawserver: do_poll",period
                    events = self.sockethandler.do_poll(period)

                    if self.doneflag.isSet():
                        if DEBUG:
                            print >> sys.stderr, "rawserver: stopping because done flag set"
                        return

                    # print >>sys.stderr,"RawServer: funcs is",`self.funcs`

                    while self.funcs and self.funcs[0][0] <= clock() and not self.doneflag.isSet():
                        garbage1, func, id = self.funcs.pop(0)
                        if id in self.tasks_to_kill:
                            pass
                        try:
#                            print func.func_name
                            if DEBUG:
                                if func.func_name != "_bgalloc":
                                    print >> sys.stderr, "RawServer:f", func.func_name
                            # st = time.time()
                            func()
                            # et = time.time()
                            # diff = et - st
                            # print >>sys.stderr,func,"took %.5f" % (diff)

                        except (SystemError, MemoryError) as e:
                            self.failfunc(e)
                            return
                        except KeyboardInterrupt as e:
#                            self.exception(e)
                            return
                        except error:
                            if DEBUG:
                                print >> sys.stderr, "rawserver: func: ERROR exception"
                                print_exc()
                            pass
                        except Exception as e:
                            # boudewijn: someone made a big mistake,
                            # the code will not function as expected.
                            # notify someone for *uck sake!  instead
                            # of silently hiding the problem and
                            # continuing...
                            # raise
                            if DEBUG:
                                print >> sys.stderr, "rawserver: func: any exception"
                                print_exc()
                            if self.noisy:
                                self.exception(e)

                    self.sockethandler.close_dead()
                    self.sockethandler.handle_events(events)

                except (SystemError, MemoryError) as e:
                    if DEBUG:
                        print >> sys.stderr, "rawserver: SYS/MEM exception", e
                    self.failfunc(e)
                    return

                except error:
                    if DEBUG:
                        print >> sys.stderr, "rawserver: ERROR exception"
                        print_exc()

                except KeyboardInterrupt as e:
                    self.failfunc(e)
                    return

                except Exception as e:
                    # boudewijn: someone made a big mistake, the code
                    # will not function as expected.  notify someone
                    # for *uck sake!  instead of silently hiding the
                    # problem and continuing...
                    # raise
                    if DEBUG:
                        print >> sys.stderr, "rawserver: other exception"
                    print_exc()
                    self.exception(e)
                # Arno: Don't stop till we drop
                # if self.exccount > 10:
                # print >> sys.stderr,"rawserver: stopping because exccount > 10"
                # return
        finally:
#            self.sockethandler.shutdown()
            self.finished.set()