def updateAChannel(self, channel_id, publisher_id, peers = None, timeframe = None): if peers == None: peers = RemoteQueryMsgHandler.getInstance().get_connected_peers(OLPROTO_VER_THIRTEENTH) else: peers = list(peers) shuffle(peers) # Create separate task which does all the requesting self.overlay_bridge.add_task(lambda: self._sequentialQueryPeers(channel_id, publisher_id, peers, timeframe))
def updateAChannel(self, publisher_id, peers = None, timeframe = None): if peers == None: peers = RemoteQueryMsgHandler.getInstance().get_connected_peers(OLPROTO_VER_FOURTEENTH) else: #use the specified peers list, small problem we dont have the selversion #use oversion 14, eventually RemoteQueryMsgHandler will convert the query for oversion13 peers peers = [(permid, OLPROTO_VER_FOURTEENTH) for permid in peers] shuffle(peers) # Create separate thread which does all the requesting self.overlay_bridge.add_task(lambda: self._sequentialQueryPeers(publisher_id, peers, timeframe))
def __init__(self, parent): HomePanel.__init__(self, parent, 'Network info' , LIST_BLUE) self.torrentdb = TorrentDBHandler.getInstance() self.channelcastdb = ChannelCastDBHandler.getInstance() self.remotetorrenthandler = RemoteTorrentHandler.getInstance() self.remotequerymsghandler = RemoteQueryMsgHandler.getInstance() self.timer = None session = Session.get_instance() session.add_observer(self.OnNotify, NTFY_TORRENTS, [NTFY_INSERT]) self.UpdateStats()
def __init__(self, parent): HomePanel.__init__(self, parent, 'Network info', LIST_BLUE) self.torrentdb = TorrentDBHandler.getInstance() self.channelcastdb = ChannelCastDBHandler.getInstance() self.remotetorrenthandler = RemoteTorrentHandler.getInstance() self.remotequerymsghandler = RemoteQueryMsgHandler.getInstance() self.incompleteCounter = IncompleteCounter.getInstance() self.timer = None session = Session.get_instance() session.add_observer(self.OnNotify, NTFY_TORRENTS, [NTFY_INSERT]) self.UpdateStats()
def query_connected_peers(self, query, usercallback, max_peers_to_query=None): """ Ask all Tribler peers we're currently connected to resolve the specified query and return the hits. For each peer that returns hits the usercallback method is called with first parameter the permid of the peer, as second parameter the query string and as third parameter a dictionary of hits. The number of times the usercallback method will be called is undefined. At the moment we support one type of query, which is a query for torrent files that match a set of keywords. The format of the query string is "SIMPLE kw1 kw2 kw3". In the future we plan to support full SQL queries. For SIMPLE queries the dictionary of hits consists of (infohash,torrentrecord) pairs. The torrentrecord is a dictionary that contains the following keys: <pre> * 'content_name': The 'name' field of the torrent. * 'length': The total size of the content in the torrent. * 'leecher': The currently known number of downloaders. * 'seeder': The currently known number of seeders. * 'category': A list of category strings the torrent was classified into by the remote peer. </pre> @param query A Unicode query string adhering to the above spec. @param usercallback A function adhering to the above spec. """ self.sesslock.acquire() try: if self.sessconfig['overlay']: if not query.startswith('SIMPLE '): raise ValueError('Query does start with SIMPLE') kws = query[len('SIMPLE '):] rqmh = RemoteQueryMsgHandler.getInstance() rqmh.send_query(kws, usercallback, max_nqueries=max_peers_to_query) else: raise OperationNotEnabledByConfigurationException( "Overlay not enabled") finally: self.sesslock.release()
def updateAChannel(self, channel_id, publisher_id, peers=None, timeframe=None): if peers == None: peers = RemoteQueryMsgHandler.getInstance().get_connected_peers( OLPROTO_VER_THIRTEENTH) else: peers = list(peers) shuffle(peers) # Create separate task which does all the requesting self.overlay_bridge.add_task(lambda: self._sequentialQueryPeers( channel_id, publisher_id, peers, timeframe))
def query_peers(self,query,peers,usercallback): """ Equal to query_connected_peers only now for a limited subset of peers. If there is no active connnection to a peer in the list, a connection will be made. """ self.sesslock.acquire() try: if self.sessconfig['overlay']: if not (query.startswith('SIMPLE ') or query.startswith('SIMPLE+METADATA ')) and not query.startswith('CHANNEL '): raise ValueError('Query does not start with SIMPLE or SIMPLE+METADATA or CHANNEL') from Tribler.Core.SocialNetwork.RemoteQueryMsgHandler import RemoteQueryMsgHandler rqmh = RemoteQueryMsgHandler.getInstance() rqmh.send_query_to_peers(query,peers,usercallback) else: raise OperationNotEnabledByConfigurationException("Overlay not enabled") finally: self.sesslock.release()
def query_connected_peers(self,query,usercallback,max_peers_to_query=None): """ Ask all Tribler peers we're currently connected to resolve the specified query and return the hits. For each peer that returns hits the usercallback method is called with first parameter the permid of the peer, as second parameter the query string and as third parameter a dictionary of hits. The number of times the usercallback method will be called is undefined. At the moment we support one type of query, which is a query for torrent files that match a set of keywords. The format of the query string is "SIMPLE kw1 kw2 kw3". In the future we plan to support full SQL queries. For SIMPLE queries the dictionary of hits consists of (infohash,torrentrecord) pairs. The torrentrecord is a dictionary that contains the following keys: <pre> * 'content_name': The 'name' field of the torrent. * 'length': The total size of the content in the torrent. * 'leecher': The currently known number of downloaders. * 'seeder': The currently known number of seeders. * 'category': A list of category strings the torrent was classified into by the remote peer. </pre> @param query A Unicode query string adhering to the above spec. @param usercallback A function adhering to the above spec. """ self.sesslock.acquire() try: if self.sessconfig['overlay']: if not query.startswith('SIMPLE '): raise ValueError('Query does start with SIMPLE') kws = query[len('SIMPLE '):] rqmh = RemoteQueryMsgHandler.getInstance() rqmh.send_query(kws,usercallback,max_nqueries=max_peers_to_query) else: raise OperationNotEnabledByConfigurationException("Overlay not enabled") finally: self.sesslock.release()
def query_connected_peers(self,query,usercallback,max_peers_to_query=None): """ Ask all Tribler peers we're currently connected to resolve the specified query and return the hits. For each peer that returns hits the usercallback method is called with first parameter the permid of the peer, as second parameter the query string and as third parameter a dictionary of hits. The number of times the usercallback method will be called is undefined. The callback will be called by a popup thread which can be used indefinitely (within reason) by the higher level code. At the moment we support three types of query, which are all queries for torrent files that match a set of keywords. The format of the query string is "SIMPLE kw1 kw2 kw3" (type 1) or "SIMPLE+METADATA kw1 kw2 kw3" (type 3). In the future we plan to support full SQL queries. For SIMPLE queries the dictionary of hits consists of (infohash,torrentrecord) pairs. The torrentrecord is a dictionary that contains the following keys: <pre> * 'content_name': The 'name' field of the torrent as Unicode string. * 'length': The total size of the content in the torrent. * 'leecher': The currently known number of downloaders. * 'seeder': The currently known number of seeders. * 'category': A list of category strings the torrent was classified into by the remote peer. </pre> From Session API version 1.0.2 the following keys were added to the torrentrecord: <pre> * 'torrent_size': The size of the .torrent file. </pre> From Session API version 1.0.4 the following keys were added to the torrentrecord: <pre> * 'channel_permid': PermID of the channel this torrent belongs to (or '') * 'channel_name': channel name as Unicode string (or ''). For SIMPLE+METADATA queries there is an extra field <pre> * 'torrent_file': Bencoded contents of the .torrent file. </pre> The torrents *not* be automatically added to the TorrentDBHandler (if enabled) at the time of the call. The third type of query: search for channels. It is used to query for channels: either a particular channel matching the permid in the query, or a list of channels whose names match the keywords in the query by sending the query to connected peers. The format of the query in the corresponding scenarios should be: a. keyword-based query: "CHANNEL k bbc" ('k' stands for keyword-based and ' '{space} is a separator followed by the keywords) b. permid-based query: "CHANNEL p f34wrf2345wfer2345wefd3r34r54" ('p' stands for permid-based and ' '{space} is a separator followed by the permid) In each of the above 2 cases, the format of the hits that is returned by the queried peer is a dictionary of hits of (signature,channelrecord). The channelrecord is a dictionary the contains following keys: <pre> * 'publisher_id': a PermID * 'publisher_name': as Unicode string * 'infohash': 20-byte SHA1 hash * 'torrenthash': 20-byte SHA1 hash * 'torrentname': as Unicode string * 'time_stamp': as integer </pre> @param query A Unicode query string adhering to the above spec. @param usercallback A function adhering to the above spec. @return currently connected peers with olversion 6 or higher """ self.sesslock.acquire() try: if self.sessconfig['overlay']: if not (query.startswith('SIMPLE ') or query.startswith('SIMPLE+METADATA ')) and not query.startswith('CHANNEL '): raise ValueError("Query does not start with SIMPLE or SIMPLE+METADATA or CHANNEL (%s)"%query) from Tribler.Core.SocialNetwork.RemoteQueryMsgHandler import RemoteQueryMsgHandler rqmh = RemoteQueryMsgHandler.getInstance() rqmh.send_query(query,usercallback,max_peers_to_query=max_peers_to_query) return len(rqmh.get_connected_peers(OLPROTO_VER_SIXTH)) else: raise OperationNotEnabledByConfigurationException("Overlay not enabled") finally: self.sesslock.release() return 0
def query_connected_peers(self,query,usercallback,max_peers_to_query=None): """ Ask all Tribler peers we're currently connected to resolve the specified query and return the hits. For each peer that returns hits the usercallback method is called with first parameter the permid of the peer, as second parameter the query string and as third parameter a dictionary of hits. The number of times the usercallback method will be called is undefined. The callback will be called by a popup thread which can be used indefinitely (within reason) by the higher level code. At the moment we support three types of query, which are all queries for torrent files that match a set of keywords. The format of the query string is "SIMPLE kw1 kw2 kw3" (type 1) or "SIMPLE+METADATA kw1 kw2 kw3" (type 3). In the future we plan to support full SQL queries. For SIMPLE queries the dictionary of hits consists of (infohash,torrentrecord) pairs. The torrentrecord is a dictionary that contains the following keys: <pre> * 'content_name': The 'name' field of the torrent. * 'length': The total size of the content in the torrent. * 'leecher': The currently known number of downloaders. * 'seeder': The currently known number of seeders. * 'category': A list of category strings the torrent was classified into by the remote peer. </pre> From Session API version 1.0.2 the following keys were added to the torrentrecord: <pre> * 'torrent_size': The size of the .torrent file. </pre> For SIMPLE+METADATA queries there is an extra field <pre> * 'torrent_file': Bencoded contents of the .torrent file. </pre> The torrents *not* be automatically added to the TorrentDBHandler (if enabled) at the time of the call. The third type of query: search for channels. It is used to query for channels: either a particular channel matching the permid in the query, or a list of channels whose names match the keywords in the query by sending the query to connected peers. The format of the query in the corresponding scenarios should be: a. keyword-based query: "CHANNEL k:bbc" ('k' stands for keyword-based and ':' is a separator followed by the keywords) b. permid-based query: "CHANNEL p:f34wrf2345wfer2345wefd3r34r54" ('p' stands for permid-based and ':' is a separator followed by the permid) In each of the above 2 cases, the format of the hits that is returned by the queried peer is a dictionary of hits of (signature,channelrecord). The channelrecord is a dictionary the contains following keys: {publisher_id, publisher_name, infohash, torrenthash, torrentname, time_stamp} @param query A Unicode query string adhering to the above spec. @param usercallback A function adhering to the above spec. """ self.sesslock.acquire() try: if self.sessconfig['overlay']: if not (query.startswith('SIMPLE ') or query.startswith('SIMPLE+METADATA ')) and not query.startswith('CHANNEL '): raise ValueError('Query does not start with SIMPLE or SIMPLE+METADATA or CHANNEL') from Tribler.Core.SocialNetwork.RemoteQueryMsgHandler import RemoteQueryMsgHandler rqmh = RemoteQueryMsgHandler.getInstance() rqmh.send_query(query,usercallback,max_peers_to_query=max_peers_to_query) else: raise OperationNotEnabledByConfigurationException("Overlay not enabled") finally: self.sesslock.release()
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 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 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()