def _dht_rerequest(self): if DEBUG: print >>sys.stderr,"Rerequester: _dht_rerequest",`self.infohash` if 'dialback' in self.config and self.config['dialback']: if DialbackMsgHandler.getInstance().isConnectable(): self.dht.getPeersAndAnnounce(self.infohash, self.port, self._dht_got_peers) else: self.dht.getPeers(self.infohash, self._dht_got_peers)
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) if not is_udp_socket(s): s.close() del self.servers[sock] elif is_udp_socket(s): try: (data, addr) = s.recvfrom(8192) if not data: if DEBUG: print >> sys.stderr, "SocketHandler: UDP no-data", addr pass else: if DEBUG: print >> sys.stderr, "SocketHandler: Got UDP data", addr, "len", len( data) self.handlerudp.data_came_in(addr, data) except socket.error, e: if DEBUG: print >> sys.stderr, "SocketHandler: UDP Socket error", str( e) pass elif len(self.single_sockets) < self.max_connects: try: newsock, addr = s.accept() if DEBUG: print >> sys.stderr, "SocketHandler: Got connection from", newsock.getpeername( ) if not self.btengine_said_reachable: dmh = DialbackMsgHandler.getInstance() dmh.network_btengine_reachable_callback() self.btengine_said_reachable = True 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) except socket.error, e: if DEBUG: print >> sys.stderr, "SocketHandler: SocketError while accepting new connection", str( e) self._sleep() # 2fastbt_ else: print >> sys.stderr, "SocketHandler: too many connects"
def _dht_rerequest(self): if DEBUG: print >> sys.stderr, "Rerequester: _dht_rerequest", ` self.infohash ` if 'dialback' in self.config and self.config['dialback']: if DialbackMsgHandler.getInstance().isConnectable(): self.dht.getPeersAndAnnounce(self.infohash, self.port, self._dht_got_peers) else: self.dht.getPeers(self.infohash, self._dht_got_peers)
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) if not is_udp_socket(s): s.close() del self.servers[sock] elif is_udp_socket(s): try: (data,addr) = s.recvfrom(8192) if not data: if DEBUG: print >> sys.stderr,"SocketHandler: UDP no-data",addr pass else: if DEBUG: print >> sys.stderr,"SocketHandler: Got UDP data",addr,"len",len(data) self.handlerudp.data_came_in(addr, data) except socket.error, e: if DEBUG: print >> sys.stderr,"SocketHandler: UDP Socket error",str(e) pass elif len(self.single_sockets) < self.max_connects: try: newsock, addr = s.accept() if DEBUG: print >> sys.stderr,"SocketHandler: Got connection from",newsock.getpeername() if not self.btengine_said_reachable: dmh = DialbackMsgHandler.getInstance() dmh.network_btengine_reachable_callback() self.btengine_said_reachable = True 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) except socket.error,e: if DEBUG: print >> sys.stderr,"SocketHandler: SocketError while accepting new connection",str(e) self._sleep() # 2fastbt_ else: print >> sys.stderr,"SocketHandler: too many connects"
def get_externally_reachable(self): """ Returns whether the Session is externally reachable, i.e., its listen port is not firewalled. Use add_observer() with NTFY_REACHABLE to register to the event of detecting reachablility. Note that due to the use of UPnP a Session may become reachable some time after startup and due to the Dialback mechanism, this method may return False while the Session is actually already reachable. Note that True doesn't mean the Session is reachable from the open Internet, could just be from the local (otherwise firewalled) LAN. @return A boolean. """ # Arno, LICHT: make it throw exception when used in LITE versie. from Tribler.Core.NATFirewall.DialbackMsgHandler import DialbackMsgHandler return DialbackMsgHandler.getInstance().isConnectable()
def _dht_rerequest(self): if DEBUG_DHT: print >>sys.stderr,time.asctime(),'-', "Rerequester: _dht_rerequest",`self.infohash` try: info_hash_id = Id(self.infohash) except (IdError): print >>sys.stderr,time.asctime(),'-', "Rerequester: _dht_rerequest: self.info_hash is not a valid identifier" return if 'dialback' in self.config and self.config['dialback']: from Tribler.Core.NATFirewall.DialbackMsgHandler import DialbackMsgHandler if DialbackMsgHandler.getInstance().isConnectable(): print >>sys.stderr,time.asctime(),'-', "Rerequester: _dht_rerequest: get_peers AND announce" self.dht.get_peers(info_hash_id, self._dht_got_peers, self.port) return #raul: I added this return so when the peer is NOT connectable # it does a get_peers lookup but it does not announce print >>sys.stderr,time.asctime(),'-', "Rerequester: _dht_rerequest: JUST get_peers, DO NOT announce" self.dht.get_peers(info_hash_id, self._dht_got_peers)
def register(self, overlay_bridge, session, launchmany, config, requestPolicy): self.overlay_bridge = overlay_bridge self.launchmany = launchmany self.requestPolicy = requestPolicy self.text_mode = config.has_key('text_mode') # OverlayApps gets all messages, and demultiplexes overlay_bridge.register_recv_callback(self.handleMessage) overlay_bridge.register_conns_callback(self.handleConnection) # Create handler for metadata messages in two parts, as # download help needs to know the metadata_handler and we need # to know the download helper handler. # Part 1: self.metadata_handler = MetadataHandler.getInstance() if config['download_help']: # Create handler for messages to dlhelp coordinator self.coord_handler = CoordinatorMessageHandler(launchmany) self.register_msg_handler(HelpHelperMessages, self.coord_handler.handleMessage) # Create handler for messages to dlhelp helper self.help_handler = HelperMessageHandler() self.help_handler.register(session,self.metadata_handler,config['download_help_dir'],config.get('coopdlconfig', False)) self.register_msg_handler(HelpCoordinatorMessages, self.help_handler.handleMessage) # Part 2: self.metadata_handler.register(overlay_bridge, self.help_handler, launchmany, config) self.register_msg_handler(MetadataMessages, self.metadata_handler.handleMessage) if not config['torrent_collecting']: self.torrent_collecting_solution = 0 else: self.torrent_collecting_solution = config['buddycast_collecting_solution'] if config['buddycast']: # Create handler for Buddycast messages self.buddycast = BuddyCastFactory.getInstance(superpeer=config['superpeer'], log=config['overlay_log']) # Using buddycast to handle torrent collecting since they are dependent self.buddycast.register(overlay_bridge, launchmany, launchmany.rawserver_fatalerrorfunc, self.metadata_handler, self.torrent_collecting_solution, config['start_recommender'],config['buddycast_max_peers']) self.register_msg_handler(BuddyCastMessages, self.buddycast.handleMessage) self.register_connection_handler(self.buddycast.handleConnection) if config['dialback']: self.dialback_handler = DialbackMsgHandler.getInstance() # The Dialback mechanism needs the real rawserver, not the overlay_bridge self.dialback_handler.register(overlay_bridge, launchmany, launchmany.rawserver, config) self.register_msg_handler([DIALBACK_REQUEST], self.dialback_handler.olthread_handleSecOverlayMessage) self.register_connection_handler(self.dialback_handler.olthread_handleSecOverlayConnection) else: self.register_msg_handler([DIALBACK_REQUEST], self.handleDisabledMessage) if config['socnet']: self.socnet_handler = SocialNetworkMsgHandler.getInstance() self.socnet_handler.register(overlay_bridge, launchmany, config) self.register_msg_handler(SocialNetworkMessages,self.socnet_handler.handleMessage) self.register_connection_handler(self.socnet_handler.handleConnection) self.friendship_handler = FriendshipMsgHandler.getInstance() self.friendship_handler.register(overlay_bridge, launchmany.session) self.register_msg_handler(FriendshipMessages,self.friendship_handler.handleMessage) self.register_connection_handler(self.friendship_handler.handleConnection) if config['rquery']: self.rquery_handler = RemoteQueryMsgHandler.getInstance() self.rquery_handler.register(overlay_bridge,launchmany,config,self.buddycast,log=config['overlay_log']) self.register_msg_handler(RemoteQueryMessages,self.rquery_handler.handleMessage) self.register_connection_handler(self.rquery_handler.handleConnection) if config['crawler']: crawler = Crawler.get_instance(session) self.register_msg_handler([CRAWLER_REQUEST], crawler.handle_request) database_crawler = DatabaseCrawler.get_instance() crawler.register_message_handler(CRAWLER_DATABASE_QUERY, database_crawler.handle_crawler_request, database_crawler.handle_crawler_reply) seeding_stats_crawler = SeedingStatsCrawler.get_instance() crawler.register_message_handler(CRAWLER_SEEDINGSTATS_QUERY, seeding_stats_crawler.handle_crawler_request, seeding_stats_crawler.handle_crawler_reply) friendship_crawler = FriendshipCrawler.get_instance(session) crawler.register_message_handler(CRAWLER_FRIENDSHIP_STATS, friendship_crawler.handle_crawler_request, friendship_crawler.handle_crawler_reply) natcheck_handler = NatCheckMsgHandler.getInstance() natcheck_handler.register(launchmany) crawler.register_message_handler(CRAWLER_NATCHECK, natcheck_handler.gotDoNatCheckMessage, natcheck_handler.gotNatCheckReplyMessage) crawler.register_message_handler(CRAWLER_NATTRAVERSAL, natcheck_handler.gotUdpConnectRequest, natcheck_handler.gotUdpConnectReply) videoplayback_crawler = VideoPlaybackCrawler.get_instance() crawler.register_message_handler(CRAWLER_VIDEOPLAYBACK_EVENT_QUERY, videoplayback_crawler.handle_event_crawler_request, videoplayback_crawler.handle_event_crawler_reply) repex_crawler = RepexCrawler.get_instance() crawler.register_message_handler(CRAWLER_REPEX_QUERY, repex_crawler.handle_crawler_request, repex_crawler.handle_crawler_reply) if crawler.am_crawler(): # we will only accept CRAWLER_REPLY messages when we are actully a crawler self.register_msg_handler([CRAWLER_REPLY], crawler.handle_reply) self.register_connection_handler(crawler.handle_connection) if "database" in sys.argv: # allows access to tribler database (boudewijn) crawler.register_crawl_initiator(database_crawler.query_initiator) if "videoplayback" in sys.argv: # allows access to video-playback statistics (boudewijn) crawler.register_crawl_initiator(videoplayback_crawler.query_initiator) if "seedingstats" in sys.argv: # allows access to seeding statistics (Boxun) crawler.register_crawl_initiator(seeding_stats_crawler.query_initiator, frequency=60*30) if "friendship" in sys.argv: # allows access to friendship statistics (Ali) crawler.register_crawl_initiator(friendship_crawler.query_initiator) if "natcheck" in sys.argv: # allows access to nat-check statistics (Lucia) crawler.register_crawl_initiator(natcheck_handler.doNatCheck, 3600) if "repex" in sys.argv: # allows access to RePEX log statistics (Raynor Vliegendhart) crawler.register_crawl_initiator(repex_crawler.query_initiator) else: self.register_msg_handler([CRAWLER_REQUEST, CRAWLER_REPLY], self.handleDisabledMessage) self.rtorrent_handler = RemoteTorrentHandler.getInstance() self.rtorrent_handler.register(overlay_bridge,self.metadata_handler,session) self.metadata_handler.register2(self.rtorrent_handler) # Add notifier as connection handler self.register_connection_handler(self.notifier_handles_connection) if config['buddycast']: # Arno: to prevent concurrency between mainthread and overlay # thread where BuddyCast schedules tasks self.buddycast.register2()
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
def register(self, overlay_bridge, session, launchmany, config, requestPolicy): self.overlay_bridge = overlay_bridge self.launchmany = launchmany self.requestPolicy = requestPolicy self.text_mode = config.has_key('text_mode') # OverlayApps gets all messages, and demultiplexes overlay_bridge.register_recv_callback(self.handleMessage) overlay_bridge.register_conns_callback(self.handleConnection) # Arno, 2010-01-28: Start with crawler support, other mods depend on # that, e.g. BuddyCast i_am_crawler = False if config['crawler']: crawler = Crawler.get_instance(session) self.register_msg_handler([CRAWLER_REQUEST], crawler.handle_request) database_crawler = DatabaseCrawler.get_instance() crawler.register_message_handler(CRAWLER_DATABASE_QUERY, database_crawler.handle_crawler_request, database_crawler.handle_crawler_reply) # seeding_stats_crawler = SeedingStatsCrawler.get_instance() # crawler.register_message_handler(CRAWLER_SEEDINGSTATS_QUERY, seeding_stats_crawler.handle_crawler_request, seeding_stats_crawler.handle_crawler_reply) friendship_crawler = FriendshipCrawler.get_instance(session) crawler.register_message_handler(CRAWLER_FRIENDSHIP_STATS, friendship_crawler.handle_crawler_request, friendship_crawler.handle_crawler_reply) natcheck_handler = NatCheckMsgHandler.getInstance() natcheck_handler.register(launchmany) crawler.register_message_handler(CRAWLER_NATCHECK, natcheck_handler.gotDoNatCheckMessage, natcheck_handler.gotNatCheckReplyMessage) crawler.register_message_handler(CRAWLER_NATTRAVERSAL, natcheck_handler.gotUdpConnectRequest, natcheck_handler.gotUdpConnectReply) # videoplayback_crawler = VideoPlaybackCrawler.get_instance() # crawler.register_message_handler(CRAWLER_VIDEOPLAYBACK_EVENT_QUERY, videoplayback_crawler.handle_event_crawler_request, videoplayback_crawler.handle_event_crawler_reply) # crawler.register_message_handler(CRAWLER_VIDEOPLAYBACK_INFO_QUERY, videoplayback_crawler.handle_info_crawler_request, videoplayback_crawler.handle_info_crawler_reply) repex_crawler = RepexCrawler.get_instance(session) crawler.register_message_handler(CRAWLER_REPEX_QUERY, repex_crawler.handle_crawler_request, repex_crawler.handle_crawler_reply) puncture_crawler = PunctureCrawler.get_instance() crawler.register_message_handler(CRAWLER_PUNCTURE_QUERY, puncture_crawler.handle_crawler_request, puncture_crawler.handle_crawler_reply) channel_crawler = ChannelCrawler.get_instance() crawler.register_message_handler(CRAWLER_CHANNEL_QUERY, channel_crawler.handle_crawler_request, channel_crawler.handle_crawler_reply) usereventlog_crawler = UserEventLogCrawler.get_instance() crawler.register_message_handler(CRAWLER_USEREVENTLOG_QUERY, usereventlog_crawler.handle_crawler_request, usereventlog_crawler.handle_crawler_reply) if crawler.am_crawler(): i_am_crawler = True # we will only accept CRAWLER_REPLY messages when we are actully a crawler self.register_msg_handler([CRAWLER_REPLY], crawler.handle_reply) self.register_connection_handler(crawler.handle_connection) if "database" in sys.argv: # allows access to tribler database (boudewijn) crawler.register_crawl_initiator(database_crawler.query_initiator) # if "videoplayback" in sys.argv: # # allows access to video-playback statistics (boudewijn) # crawler.register_crawl_initiator(videoplayback_crawler.query_initiator) # if "seedingstats" in sys.argv: # # allows access to seeding statistics (Boxun) # crawler.register_crawl_initiator(seeding_stats_crawler.query_initiator, frequency=60*30) if "friendship" in sys.argv: # allows access to friendship statistics (Ali) crawler.register_crawl_initiator(friendship_crawler.query_initiator) if "natcheck" in sys.argv: # allows access to nat-check statistics (Lucia) crawler.register_crawl_initiator(natcheck_handler.doNatCheck, 3600) if "repex" in sys.argv: # allows access to RePEX log statistics (Raynor Vliegendhart) crawler.register_crawl_initiator(repex_crawler.query_initiator) if "puncture" in sys.argv: # allows access to UDPPuncture log statistics (Gertjan) crawler.register_crawl_initiator(puncture_crawler.query_initiator) if "channel" in sys.argv: # allows access to tribler channels' database (nitin) crawler.register_crawl_initiator(channel_crawler.query_initiator) if "usereventlog" in sys.argv: # allows access to usereventlog database (Niels) crawler.register_crawl_initiator(usereventlog_crawler.query_initiator) else: self.register_msg_handler([CRAWLER_REQUEST, CRAWLER_REPLY], self.handleDisabledMessage) # ProxyService_ # # Create handler for metadata messages in two parts, as # ProxyService needs to know the metadata_handler and we need # to know the proxy message handler. # Part 1: self.metadata_handler = MetadataHandler.getInstance() # Create handler for messages to doe self.doe_handler = DoeMessageHandler(launchmany) self.register_msg_handler(ProxyMessages, self.doe_handler.handleMessage) # Create handler for messages to proxy self.proxy_handler = ProxyMessageHandler() self.proxy_handler.register(session, self.metadata_handler, config['proxyservice_dir'], config.get('proxy_default_dlcfg', False)) self.register_msg_handler(DoeMessages, self.proxy_handler.handleMessage) # Part 2: # Register the ProxyHandler to be called when a .torrent is in self.metadata_handler.register(overlay_bridge, self.proxy_handler, launchmany, config) self.register_msg_handler(MetadataMessages, self.metadata_handler.handleMessage) # Create the ProxyPeerManager self.proxy_peer_manager = ProxyPeerManager(launchmany) # # _ProxyService # 13-04-2010 Andrea: subtitles collecting if not config['subtitles_collecting'] : self.subtitles_handler = None else: self.subtitles_handler = SubtitlesHandler.getInstance() self.subtitles_handler.register(self.overlay_bridge, self.launchmany.richmetadataDbHandler, self.launchmany.session) self.peersHaveManger = PeersHaveManager.getInstance() if not self.peersHaveManger.isRegistered(): self.peersHaveManger.register(self.launchmany.richmetadataDbHandler, self.overlay_bridge) # I'm not sure if this is the best place to init this self.subtitle_support = SubtitlesSupport.getInstance() keypair = self.launchmany.session.keypair permid = self.launchmany.session.get_permid() self.subtitle_support._register(self.launchmany.richmetadataDbHandler, self.subtitles_handler, self.launchmany.channelcast_db, permid, keypair, self.peersHaveManger, self.overlay_bridge) # cleanup the subtitles database at the first launch self.subtitle_support.runDBConsinstencyRoutine() if not config['torrent_collecting']: self.torrent_collecting_solution = 0 else: self.torrent_collecting_solution = config['buddycast_collecting_solution'] if config['buddycast']: # Create handler for Buddycast messages self.buddycast = BuddyCastFactory.getInstance(superpeer=config['superpeer'], log=config['overlay_log']) # Using buddycast to handle torrent collecting since they are dependent self.buddycast.register(overlay_bridge, launchmany, launchmany.rawserver_fatalerrorfunc, self.metadata_handler, self.torrent_collecting_solution, config['start_recommender'],config['buddycast_max_peers'],i_am_crawler) self.register_msg_handler(BuddyCastMessages, self.buddycast.handleMessage) self.register_connection_handler(self.buddycast.handleConnection) if config['dialback']: self.dialback_handler = DialbackMsgHandler.getInstance() # The Dialback mechanism needs the real rawserver, not the overlay_bridge self.dialback_handler.register(overlay_bridge, launchmany, launchmany.rawserver, config) self.register_msg_handler([DIALBACK_REQUEST], self.dialback_handler.olthread_handleSecOverlayMessage) self.register_connection_handler(self.dialback_handler.olthread_handleSecOverlayConnection) else: self.register_msg_handler([DIALBACK_REQUEST], self.handleDisabledMessage) if config['socnet']: self.socnet_handler = SocialNetworkMsgHandler.getInstance() self.socnet_handler.register(overlay_bridge, launchmany, config) self.register_msg_handler(SocialNetworkMessages,self.socnet_handler.handleMessage) self.register_connection_handler(self.socnet_handler.handleConnection) self.friendship_handler = FriendshipMsgHandler.getInstance() self.friendship_handler.register(overlay_bridge, launchmany.session) self.register_msg_handler(FriendshipMessages,self.friendship_handler.handleMessage) self.register_connection_handler(self.friendship_handler.handleConnection) if config['rquery']: self.rquery_handler = RemoteQueryMsgHandler.getInstance() self.rquery_handler.register(overlay_bridge,launchmany,config,self.buddycast,log=config['overlay_log']) self.register_msg_handler(RemoteQueryMessages,self.rquery_handler.handleMessage) self.register_connection_handler(self.rquery_handler.handleConnection) if config['subtitles_collecting']: hndl = self.subtitles_handler.getMessageHandler() self.register_msg_handler(SubtitleMessages, hndl) if config['torrent_collecting']: self.rtorrent_handler = RemoteTorrentHandler.getInstance() self.rtorrent_handler.register(overlay_bridge,self.metadata_handler,session) self.metadata_handler.register2(self.rtorrent_handler) # Add notifier as connection handler self.register_connection_handler(self.notifier_handles_connection) if config['buddycast']: # Arno: to prevent concurrency between mainthread and overlay # thread where BuddyCast schedules tasks self.buddycast.register2() # ProxyService_ # # Register the ProxyPeerManager with BuddyCast # The ProxyPeerManager has to register after the BuddyCastCore object is created by the BuddyCastFactory. # The BuddyCastCore object is created in a method scheduled by the overlay_bridge. # If the ProxyPeerManager.register is also scheduled by the overlay_bridge, it will be executed after the # BuddyCastCore is created (overlay_bridge executes the scheduled tasks in the order of their execution) if self.proxy_peer_manager: self.overlay_bridge.add_task(self.proxy_peer_manager.register, 0)
def register(self, overlay_bridge, session, launchmany, config, requestPolicy): self.overlay_bridge = overlay_bridge self.launchmany = launchmany self.requestPolicy = requestPolicy self.text_mode = config.has_key('text_mode') # OverlayApps gets all messages, and demultiplexes overlay_bridge.register_recv_callback(self.handleMessage) overlay_bridge.register_conns_callback(self.handleConnection) # Create handler for metadata messages in two parts, as # download help needs to know the metadata_handler and we need # to know the download helper handler. # Part 1: self.metadata_handler = MetadataHandler.getInstance() if config['download_help']: # Create handler for messages to dlhelp coordinator self.coord_handler = CoordinatorMessageHandler(launchmany) self.register_msg_handler(HelpHelperMessages, self.coord_handler.handleMessage) # Create handler for messages to dlhelp helper self.help_handler = HelperMessageHandler() self.help_handler.register(session, self.metadata_handler, config['download_help_dir'], config.get('coopdlconfig', False)) self.register_msg_handler(HelpCoordinatorMessages, self.help_handler.handleMessage) # Part 2: self.metadata_handler.register(overlay_bridge, self.help_handler, launchmany, config) self.register_msg_handler(MetadataMessages, self.metadata_handler.handleMessage) if not config['torrent_collecting']: self.torrent_collecting_solution = 0 if config['buddycast']: # Create handler for Buddycast messages self.buddycast = BuddyCastFactory.getInstance( superpeer=config['superpeer'], log=config['overlay_log']) # Using buddycast to handle torrent collecting since they are dependent self.buddycast.register(overlay_bridge, launchmany, launchmany.rawserver_fatalerrorfunc, self.metadata_handler, config['buddycast_collecting_solution'], config['start_recommender'], config['buddycast_max_peers']) self.register_msg_handler(BuddyCastMessages, self.buddycast.handleMessage) self.register_connection_handler(self.buddycast.handleConnection) if config['dialback']: self.dialback_handler = DialbackMsgHandler.getInstance() # The Dialback mechanism needs the real rawserver, not the overlay_bridge self.dialback_handler.register(overlay_bridge, launchmany, launchmany.rawserver, config) self.register_msg_handler( [DIALBACK_REQUEST], self.dialback_handler.olthread_handleSecOverlayMessage) self.register_connection_handler( self.dialback_handler.olthread_handleSecOverlayConnection) if config['socnet']: self.socnet_handler = SocialNetworkMsgHandler.getInstance() self.socnet_handler.register(overlay_bridge, launchmany, config) self.register_msg_handler(SocialNetworkMessages, self.socnet_handler.handleMessage) self.register_connection_handler( self.socnet_handler.handleConnection) if config['rquery']: self.rquery_handler = RemoteQueryMsgHandler.getInstance() self.rquery_handler.register(overlay_bridge, launchmany, config, self.buddycast, log=config['overlay_log']) self.register_msg_handler(RemoteQueryMessages, self.rquery_handler.handleMessage) self.register_connection_handler( self.rquery_handler.handleConnection) self.rtorrent_handler = RemoteTorrentHandler.getInstance() self.rtorrent_handler.register(overlay_bridge, self.metadata_handler, session) self.metadata_handler.register2(self.rtorrent_handler) # Add notifier as connection handler self.register_connection_handler(self.notifier_handles_connection) if config['buddycast']: # Arno: to prevent concurrency between mainthread and overlay # thread where BuddyCast schedules tasks self.buddycast.register2()
def register(self, overlay_bridge, session, launchmany, config, requestPolicy): self.overlay_bridge = overlay_bridge self.launchmany = launchmany self.requestPolicy = requestPolicy self.text_mode = config.has_key('text_mode') # OverlayApps gets all messages, and demultiplexes overlay_bridge.register_recv_callback(self.handleMessage) overlay_bridge.register_conns_callback(self.handleConnection) # Arno, 2010-01-28: Start with crawler support, other mods depend on # that, e.g. BuddyCast i_am_crawler = False if config['crawler']: crawler = Crawler.get_instance(session) self.register_msg_handler([CRAWLER_REQUEST], crawler.handle_request) database_crawler = DatabaseCrawler.get_instance() crawler.register_message_handler(CRAWLER_DATABASE_QUERY, database_crawler.handle_crawler_request, database_crawler.handle_crawler_reply) # seeding_stats_crawler = SeedingStatsCrawler.get_instance() # crawler.register_message_handler(CRAWLER_SEEDINGSTATS_QUERY, seeding_stats_crawler.handle_crawler_request, seeding_stats_crawler.handle_crawler_reply) friendship_crawler = FriendshipCrawler.get_instance(session) crawler.register_message_handler(CRAWLER_FRIENDSHIP_STATS, friendship_crawler.handle_crawler_request, friendship_crawler.handle_crawler_reply) natcheck_handler = NatCheckMsgHandler.getInstance() natcheck_handler.register(launchmany) crawler.register_message_handler(CRAWLER_NATCHECK, natcheck_handler.gotDoNatCheckMessage, natcheck_handler.gotNatCheckReplyMessage) crawler.register_message_handler(CRAWLER_NATTRAVERSAL, natcheck_handler.gotUdpConnectRequest, natcheck_handler.gotUdpConnectReply) # videoplayback_crawler = VideoPlaybackCrawler.get_instance() # crawler.register_message_handler(CRAWLER_VIDEOPLAYBACK_EVENT_QUERY, videoplayback_crawler.handle_event_crawler_request, videoplayback_crawler.handle_event_crawler_reply) # crawler.register_message_handler(CRAWLER_VIDEOPLAYBACK_INFO_QUERY, videoplayback_crawler.handle_info_crawler_request, videoplayback_crawler.handle_info_crawler_reply) repex_crawler = RepexCrawler.get_instance(session) crawler.register_message_handler(CRAWLER_REPEX_QUERY, repex_crawler.handle_crawler_request, repex_crawler.handle_crawler_reply) puncture_crawler = PunctureCrawler.get_instance() crawler.register_message_handler(CRAWLER_PUNCTURE_QUERY, puncture_crawler.handle_crawler_request, puncture_crawler.handle_crawler_reply) channel_crawler = ChannelCrawler.get_instance() crawler.register_message_handler(CRAWLER_CHANNEL_QUERY, channel_crawler.handle_crawler_request, channel_crawler.handle_crawler_reply) usereventlog_crawler = UserEventLogCrawler.get_instance() crawler.register_message_handler(CRAWLER_USEREVENTLOG_QUERY, usereventlog_crawler.handle_crawler_request, usereventlog_crawler.handle_crawler_reply) if crawler.am_crawler(): i_am_crawler = True # we will only accept CRAWLER_REPLY messages when we are actully a crawler self.register_msg_handler([CRAWLER_REPLY], crawler.handle_reply) self.register_connection_handler(crawler.handle_connection) if "database" in sys.argv: # allows access to tribler database (boudewijn) crawler.register_crawl_initiator(database_crawler.query_initiator) # if "videoplayback" in sys.argv: # # allows access to video-playback statistics (boudewijn) # crawler.register_crawl_initiator(videoplayback_crawler.query_initiator) # if "seedingstats" in sys.argv: # # allows access to seeding statistics (Boxun) # crawler.register_crawl_initiator(seeding_stats_crawler.query_initiator, frequency=60*30) if "friendship" in sys.argv: # allows access to friendship statistics (Ali) crawler.register_crawl_initiator(friendship_crawler.query_initiator) if "natcheck" in sys.argv: # allows access to nat-check statistics (Lucia) crawler.register_crawl_initiator(natcheck_handler.doNatCheck, 3600) if "repex" in sys.argv: # allows access to RePEX log statistics (Raynor Vliegendhart) crawler.register_crawl_initiator(repex_crawler.query_initiator) if "puncture" in sys.argv: # allows access to UDPPuncture log statistics (Gertjan) crawler.register_crawl_initiator(puncture_crawler.query_initiator) if "channel" in sys.argv: # allows access to tribler channels' database (nitin) crawler.register_crawl_initiator(channel_crawler.query_initiator) if "usereventlog" in sys.argv: # allows access to usereventlog database (Niels) crawler.register_crawl_initiator(usereventlog_crawler.query_initiator) else: self.register_msg_handler([CRAWLER_REQUEST, CRAWLER_REPLY], self.handleDisabledMessage) # ProxyService_ # # Create handler for metadata messages in two parts, as # ProxyService needs to know the metadata_handler and we need # to know the proxy message handler. # Part 1: self.metadata_handler = MetadataHandler.getInstance() # Create handler for messages to doe self.doe_handler = DoeMessageHandler(launchmany) self.register_msg_handler(ProxyMessages, self.doe_handler.handleMessage) # Create handler for messages to proxy self.proxy_handler = ProxyMessageHandler() self.proxy_handler.register(session, self.metadata_handler, config['proxyservice_dir'], config.get('proxy_default_dlcfg', False)) self.register_msg_handler(DoeMessages, self.proxy_handler.handleMessage) # Part 2: # Register the ProxyHandler to be called when a .torrent is in self.metadata_handler.register(overlay_bridge, self.proxy_handler, launchmany, config) self.register_msg_handler(MetadataMessages, self.metadata_handler.handleMessage) # Create the ProxyPeerManager self.proxy_peer_manager = ProxyPeerManager(launchmany) # # _ProxyService # 09-02-2011 Niels: disabling subtitles (no more channelcast config['subtitles_collecting'] = False # 13-04-2010 Andrea: subtitles collecting if not config['subtitles_collecting'] : self.subtitles_handler = None else: self.subtitles_handler = SubtitlesHandler.getInstance() self.subtitles_handler.register(self.overlay_bridge, self.launchmany.richmetadataDbHandler, self.launchmany.session) self.peersHaveManger = PeersHaveManager.getInstance() if not self.peersHaveManger.isRegistered(): self.peersHaveManger.register(self.launchmany.richmetadataDbHandler, self.overlay_bridge) # I'm not sure if this is the best place to init this self.subtitle_support = SubtitlesSupport.getInstance() keypair = self.launchmany.session.keypair permid = self.launchmany.session.get_permid() self.subtitle_support._register(self.launchmany.richmetadataDbHandler, self.subtitles_handler, self.launchmany.channelcast_db, permid, keypair, self.peersHaveManger, self.overlay_bridge) # cleanup the subtitles database at the first launch self.subtitle_support.runDBConsinstencyRoutine() if not config['torrent_collecting']: self.torrent_collecting_solution = 0 else: self.torrent_collecting_solution = config['buddycast_collecting_solution'] if config['buddycast']: # Create handler for Buddycast messages self.buddycast = BuddyCastFactory.getInstance(superpeer=config['superpeer'], log=config['overlay_log']) # Using buddycast to handle torrent collecting since they are dependent self.buddycast.register(overlay_bridge, launchmany, launchmany.rawserver_fatalerrorfunc, self.metadata_handler, self.torrent_collecting_solution, config['start_recommender'],config['buddycast_max_peers'],i_am_crawler) self.register_msg_handler(BuddyCastMessages, self.buddycast.handleMessage) self.register_connection_handler(self.buddycast.handleConnection) if config['dialback']: self.dialback_handler = DialbackMsgHandler.getInstance() # The Dialback mechanism needs the real rawserver, not the overlay_bridge self.dialback_handler.register(overlay_bridge, launchmany, launchmany.rawserver, config) self.register_msg_handler([DIALBACK_REQUEST], self.dialback_handler.olthread_handleSecOverlayMessage) self.register_connection_handler(self.dialback_handler.olthread_handleSecOverlayConnection) else: self.register_msg_handler([DIALBACK_REQUEST], self.handleDisabledMessage) if config['socnet']: self.socnet_handler = SocialNetworkMsgHandler.getInstance() self.socnet_handler.register(overlay_bridge, launchmany, config) self.register_msg_handler(SocialNetworkMessages,self.socnet_handler.handleMessage) self.register_connection_handler(self.socnet_handler.handleConnection) self.friendship_handler = FriendshipMsgHandler.getInstance() self.friendship_handler.register(overlay_bridge, launchmany.session) self.register_msg_handler(FriendshipMessages,self.friendship_handler.handleMessage) self.register_connection_handler(self.friendship_handler.handleConnection) if config['rquery']: self.rquery_handler = RemoteQueryMsgHandler.getInstance() self.rquery_handler.register(overlay_bridge,launchmany,config,self.buddycast,log=config['overlay_log']) self.register_msg_handler(RemoteQueryMessages,self.rquery_handler.handleMessage) self.register_connection_handler(self.rquery_handler.handleConnection) if config['subtitles_collecting']: hndl = self.subtitles_handler.getMessageHandler() self.register_msg_handler(SubtitleMessages, hndl) if config['torrent_collecting']: self.rtorrent_handler = RemoteTorrentHandler.getInstance() self.rtorrent_handler.register(overlay_bridge,self.metadata_handler,session) self.metadata_handler.register2(self.rtorrent_handler) # Add notifier as connection handler self.register_connection_handler(self.notifier_handles_connection) if config['buddycast']: # Arno: to prevent concurrency between mainthread and overlay # thread where BuddyCast schedules tasks self.buddycast.register2() # ProxyService_ # # Register the ProxyPeerManager with BuddyCast # The ProxyPeerManager has to register after the BuddyCastCore object is created by the BuddyCastFactory. # The BuddyCastCore object is created in a method scheduled by the overlay_bridge. # If the ProxyPeerManager.register is also scheduled by the overlay_bridge, it will be executed after the # BuddyCastCore is created (overlay_bridge executes the scheduled tasks in the order of their execution) if self.proxy_peer_manager: self.overlay_bridge.add_task(self.proxy_peer_manager.register, 0)
def isReachable(self): #reachability flag / port forwarding enabled / accessible from the internet return DialbackMsgHandler.getInstance().isConnectable()
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
def register(self, overlay_bridge, session, launchmany, config, requestPolicy): self.overlay_bridge = overlay_bridge self.launchmany = launchmany self.requestPolicy = requestPolicy self.text_mode = config.has_key('text_mode') # OverlayApps gets all messages, and demultiplexes overlay_bridge.register_recv_callback(self.handleMessage) overlay_bridge.register_conns_callback(self.handleConnection) # Create handler for metadata messages in two parts, as # download help needs to know the metadata_handler and we need # to know the download helper handler. # Part 1: self.metadata_handler = MetadataHandler.getInstance() if config['download_help']: # Create handler for messages to dlhelp coordinator self.coord_handler = CoordinatorMessageHandler(launchmany) self.register_msg_handler(HelpHelperMessages, self.coord_handler.handleMessage) # Create handler for messages to dlhelp helper self.help_handler = HelperMessageHandler() self.help_handler.register(session,self.metadata_handler,config['download_help_dir'],config.get('coopdlconfig', False)) self.register_msg_handler(HelpCoordinatorMessages, self.help_handler.handleMessage) # Part 2: self.metadata_handler.register(overlay_bridge, self.help_handler, launchmany, config) self.register_msg_handler(MetadataMessages, self.metadata_handler.handleMessage) if not config['torrent_collecting']: self.torrent_collecting_solution = 0 if config['buddycast']: # Create handler for Buddycast messages self.buddycast = BuddyCastFactory.getInstance(superpeer=config['superpeer'], log=config['overlay_log']) # Using buddycast to handle torrent collecting since they are dependent self.buddycast.register(overlay_bridge, launchmany, launchmany.rawserver_fatalerrorfunc, self.metadata_handler, config['buddycast_collecting_solution'], config['start_recommender'],config['buddycast_max_peers']) self.register_msg_handler(BuddyCastMessages, self.buddycast.handleMessage) self.register_connection_handler(self.buddycast.handleConnection) if config['dialback']: self.dialback_handler = DialbackMsgHandler.getInstance() # The Dialback mechanism needs the real rawserver, not the overlay_bridge self.dialback_handler.register(overlay_bridge, launchmany, launchmany.rawserver, config) self.register_msg_handler([DIALBACK_REQUEST], self.dialback_handler.olthread_handleSecOverlayMessage) self.register_connection_handler(self.dialback_handler.olthread_handleSecOverlayConnection) if config['socnet']: self.socnet_handler = SocialNetworkMsgHandler.getInstance() self.socnet_handler.register(overlay_bridge, launchmany, config) self.register_msg_handler(SocialNetworkMessages,self.socnet_handler.handleMessage) self.register_connection_handler(self.socnet_handler.handleConnection) if config['rquery']: self.rquery_handler = RemoteQueryMsgHandler.getInstance() self.rquery_handler.register(overlay_bridge,launchmany,config,self.buddycast,log=config['overlay_log']) self.register_msg_handler(RemoteQueryMessages,self.rquery_handler.handleMessage) self.register_connection_handler(self.rquery_handler.handleConnection) self.rtorrent_handler = RemoteTorrentHandler.getInstance() self.rtorrent_handler.register(overlay_bridge,self.metadata_handler,session) self.metadata_handler.register2(self.rtorrent_handler) # Add notifier as connection handler self.register_connection_handler(self.notifier_handles_connection) if config['buddycast']: # Arno: to prevent concurrency between mainthread and overlay # thread where BuddyCast schedules tasks self.buddycast.register2()