def main(self): """\ Start the Mainline client and block forever listening for connectons """ uiname = "bittorrent-console" defaults = get_defaults(uiname) config, args = configfile.parse_configuration_and_args( defaults, uiname) config = Preferences().initWithDict(config) data_dir = config['data_dir'] self.core_doneflag = DeferredEvent() self.rawserver_doneflag = DeferredEvent() rawserver = RawServer(config) #event and I/O scheduler self.multitorrent = MultiTorrent( config, rawserver, data_dir) #class used to add, control and remove torrents self.tick() #add periodic function call rawserver.add_task(0, self.core_doneflag.addCallback, lambda r: rawserver.external_add_task(0, shutdown)) rawserver.listen_forever( self.rawserver_doneflag) # runs until the component terminates self.send(producerFinished(self), "signal") print "TorrentClient has shutdown"
class InitTableTest: def __init__(self): self.config, self.metainfo = self._load_settings() self.rawserver = RawServer(self.config) self.dht = UTKhashmir(self.config['bind'], self.config['port'], self.config['dumpDir'], self.rawserver) def _load_settings(self): f = open('config/MyNodes.json') settings = json.load(f) return settings["config"], settings["metainfo"] def start_init(self): if self.dht: infohash = sha(bencode(self.metainfo['value'])).digest() # infohash = 0x0d0d7a9ef71434d31b893cec305264579b7cf262 nodes = self.dht.table.findNodes(infohash) if len(nodes) < const.K: for node in self.metainfo['nodes']: host = node['host'] port = node['port'] self.dht.addContact(host, port) # self.rawserver.add_task(30,self.show_table) self.rawserver.add_task(10, self.dht.getPeersAndAnnounce, infohash, self.metainfo['value'], self.show_value) # self.rawserver.add_task(10, self.dht.pingQuery, '207.134.242.20', 59464) # self.rawserver.add_task(10, self.dht.getPeerQuery,infohash,'176.31.225.184',8999) # self.rawserver.add_task(20,self.dht.announcePeer,infohash,self.metainfo['value']) # self.rawserver.add_task(10,self.dht.getPeers,infohash,self.show_value) def show_value(self, *arg): print "here!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" try: result = arg[0][0] # print len(result) # ip_hex = result[:4] ip_int = struct.unpack(">L", result[:4])[0] ip = socket.inet_ntoa(struct.pack('L', socket.htonl(ip_int))) port = struct.unpack(">H", result[4:])[0] print "ip:port", ip, port except IndexError: print "not found" def show_table(self): for bucket in self.dht.table.buckets: for node in bucket.l: print node.host, node.port, node.num
def main(self): """\ Start the Mainline client and block indefinitely, listening for connectons. """ uiname = "bittorrent-console" defaults = get_defaults(uiname) config, args = configfile.parse_configuration_and_args(defaults, uiname) config = Preferences().initWithDict(config) data_dir = config['data_dir'] self.core_doneflag = DeferredEvent() self.rawserver_doneflag = DeferredEvent() rawserver = RawServer(config) #event and I/O scheduler self.multitorrent = MultiTorrent(config, rawserver, data_dir) #class used to add, control and remove torrents self.tick() #add periodic function call rawserver.add_task(0, self.core_doneflag.addCallback, lambda r: rawserver.external_add_task(0, shutdown)) rawserver.listen_forever(self.rawserver_doneflag) # runs until the component terminates self.send(producerFinished(self), "signal")
class KhashmirBase: _Node = KNodeBase def __init__(self, host, port, data_dir, rawserver=None, max_ul_rate=1024, checkpoint=True, errfunc=None, rlcount=foo, config={ 'pause': False, 'max_rate_period': 20 }): if rawserver: self.rawserver = rawserver else: self.flag = Event() d = dict([(x[0], x[1]) for x in common_options + rare_options]) self.rawserver = RawServer(self.flag, d) self.max_ul_rate = max_ul_rate self.socket = None self.config = config self.setup(host, port, data_dir, rlcount, checkpoint) def setup(self, host, port, data_dir, rlcount, checkpoint=True): self.host = host self.port = port self.ddir = data_dir self.store = KStore() self.pingcache = {} self.socket = self.rawserver.create_udpsocket(self.port, self.host) self.udp = krpc.hostbroker(self, (self.host, self.port), self.socket, self.rawserver.add_task, self.max_ul_rate, self.config, rlcount) self._load() self.rawserver.start_listening_udp(self.socket, self.udp) self.last = time() KeyExpirer(self.store, self.rawserver.add_task) self.refreshTable(force=1) if checkpoint: self.rawserver.add_task(30, self.findCloseNodes, lambda a: a, True) self.rawserver.add_task(60, self.checkpoint, 1) def Node(self): n = self._Node(self.udp.connectionForAddr) n.table = self return n def __del__(self): if self.socket is not None: self.rawserver.stop_listening_udp(self.socket) self.socket.close() def _load(self): do_load = False try: s = open(os.path.join(self.ddir, "routing_table"), 'r').read() dict = bdecode(s) except: id = newID() else: id = dict['id'] do_load = True self.node = self._Node(self.udp.connectionForAddr).init( id, self.host, self.port) self.table = KTable(self.node) if do_load: self._loadRoutingTable(dict['rt']) def checkpoint(self, auto=0): d = {} d['id'] = self.node.id d['rt'] = self._dumpRoutingTable() try: f = open(os.path.join(self.ddir, "routing_table"), 'wb') f.write(bencode(d)) f.close() except Exception, e: #XXX real error here print ">>> unable to dump routing table!", str(e) pass if auto: self.rawserver.add_task( randrange(int(const.CHECKPOINT_INTERVAL * .9), int(const.CHECKPOINT_INTERVAL * 1.1)), self.checkpoint, 1)
class LaunchMany(object): def __init__(self, config, display, configfile_key): """Starts torrents for all .torrent files in a directory tree. All errors are logged using Python logging to 'configfile_key' logger. @param config: Preferences object storing config. @param display: output function for stats. """ # 4.4.x version of LaunchMany output exceptions to a displayer. # This version only outputs stats to the displayer. We do not use # the logger to output stats so that a caller-provided object # can provide stats formatting as opposed to using the # logger Formatter, which is specific to exceptions, warnings, and # info messages. self.logger = logging.getLogger(configfile_key) try: self.multitorrent = None self.rawserver = None self.config = config self.configfile_key = configfile_key self.display = display self.torrent_dir = config['torrent_dir'] # Ex: torrent_cache = infohash -> (path,metainfo) self.torrent_cache = {} # maps path -> [(modification time, size), infohash] self.file_cache = {} # used as set containing paths of files that do not have separate # entries in torrent_cache either because torrent_cache already # contains the torrent or because the torrent file is corrupt. self.blocked_files = {} #self.torrent_list = [] #self.downloads = {} self.hashcheck_queue = [] #self.hashcheck_store = {} self.hashcheck_current = None self.core_doneflag = DeferredEvent() self.rawserver = RawServer(self.config) try: # set up shut-down procedure before we begin doing things that # can throw exceptions. def shutdown(): self.logger.critical(_("shutting down")) if self.multitorrent: if len(self.multitorrent.get_torrents()) > 0: for t in self.multitorrent.get_torrents(): self.logger.info( _('dropped "%s"') % self.torrent_cache[t.infohash][0]) def after_mt(r): self.logger.critical( "multitorrent shutdown completed. Calling rawserver.stop" ) self.rawserver.stop() self.logger.critical("calling multitorrent shutdown") df = self.multitorrent.shutdown() #set_flag = lambda *a : self.rawserver.stop() df.addCallbacks(after_mt, after_mt) else: self.rawserver.stop() ### PROFILER POSTPROCESSING. #self.logger.critical( "Disabling profiles" ) #prof.disable() #self.logger.critical( "Running profiler post-processing" ) #stats = Stats(prof.getstats()) #stats.sort("inlinetime") #self.logger.info( "Calling stats.pprint") #stats.pprint() #self.logger.info( "After stats.pprint") ### PROFILER POSTPROCESSING # It is safe to addCallback here, because there is only one thread, # but even if the code were multi-threaded, core_doneflag has not # been passed to anyone. There is no chance of a race condition # between the DeferredEvent's callback and addCallback. self.core_doneflag.addCallback( lambda r: self.rawserver.external_add_task(0, shutdown)) self.rawserver.install_sigint_handler(self.core_doneflag) data_dir = config['data_dir'] self.multitorrent = MultiTorrent( config, self.rawserver, data_dir, resume_from_torrent_config=False) # first time sleep_time is 0 so that it will startup fast. On # subsequent scans, the scan is slowed down to not affect performance. self.rawserver.add_task(0, self.scan, sleep_time=0) self.rawserver.add_task(0.5, self.periodic_check_hashcheck_queue) self.rawserver.add_task(self.config['display_interval'], self.periodic_stats) try: import signal def handler(signum, frame): self.rawserver.external_add_task(0, self.read_config) if hasattr(signal, 'SIGHUP'): signal.signal(signal.SIGHUP, handler) except Exception, e: self.logger.error( _("Could not set signal handler: ") + str_exc(e)) self.rawserver.add_task(0, self.core_doneflag.set) except UserFailure, e: self.logger.error(str_exc(e)) self.rawserver.add_task(0, self.core_doneflag.set) except: #data = StringIO() #print_exc(file = data) #self.logger.error(data.getvalue()) self.logger.exception( "Exception raised while initializing LaunchMany") self.rawserver.add_task(0, self.core_doneflag.set) # always make sure events get processed even if only for # shutting down. self.rawserver.listen_forever() self.logger.info("After rawserver.listen_forever") except:
def removeService(self, server, type, name): discovery_logger.info("Service %s removed", repr(name)) def _got_peer(self, addr, infohash): if self.got_peer: self.got_peer(addr, infohash) def stop(self): self.port = None self.got_peer = None for service in self.services: self.unannounce(service) if __name__ == '__main__': import string from BitTorrent.RawServer_twisted import RawServer from BitTorrent.PeerID import make_id rawserver = RawServer() def run_task_and_exit(): l = LocalDiscovery(rawserver, 6881, lambda *a: sys.stdout.write("GOT: %s\n" % str(a))) l.announce("63f27f5023d7e49840ce89fc1ff988336c514b64", make_id().encode('hex')) rawserver.add_task(0, run_task_and_exit) rawserver.listen_forever()
class LaunchMany(object): def __init__(self, config, display, configfile_key): """Starts torrents for all .torrent files in a directory tree. All errors are logged using Python logging to 'configfile_key' logger. @param config: Preferences object storing config. @param display: output function for stats. """ # 4.4.x version of LaunchMany output exceptions to a displayer. # This version only outputs stats to the displayer. We do not use # the logger to output stats so that a caller-provided object # can provide stats formatting as opposed to using the # logger Formatter, which is specific to exceptions, warnings, and # info messages. self.logger = logging.getLogger(configfile_key) try: self.multitorrent = None self.rawserver = None self.config = config self.configfile_key = configfile_key self.display = display self.torrent_dir = config['torrent_dir'] # Ex: torrent_cache = infohash -> (path,metainfo) self.torrent_cache = {} # maps path -> [(modification time, size), infohash] self.file_cache = {} # used as set containing paths of files that do not have separate # entries in torrent_cache either because torrent_cache already # contains the torrent or because the torrent file is corrupt. self.blocked_files = {} #self.torrent_list = [] #self.downloads = {} self.hashcheck_queue = [] #self.hashcheck_store = {} self.hashcheck_current = None self.core_doneflag = DeferredEvent() self.rawserver = RawServer(self.config) try: # set up shut-down procedure before we begin doing things that # can throw exceptions. def shutdown(): self.logger.critical(_("shutting down")) for t in self.multitorrent.get_torrents(): self.logger.info(_('dropped "%s"') % self.torrent_cache[t.infohash][0]) if self.multitorrent: df = self.multitorrent.shutdown() set_flag = lambda *a : self.rawserver.stop() df.addCallbacks(set_flag, set_flag) else: self.rawserver.stop() # It is safe to addCallback here, because there is only one thread, # but even if the code were multi-threaded, core_doneflag has not # been passed to anyone. There is no chance of a race condition # between the DeferredEvent's callback and addCallback. self.core_doneflag.addCallback( lambda r: self.rawserver.external_add_task(0, shutdown)) self.rawserver.install_sigint_handler(self.core_doneflag) data_dir = config['data_dir'] self.multitorrent = MultiTorrent(config, self.rawserver, data_dir, resume_from_torrent_config=False) self.rawserver.add_task(0, self.scan) self.rawserver.add_task(0.5, self.periodic_check_hashcheck_queue) self.rawserver.add_task(self.config['display_interval'], self.periodic_stats) try: import signal def handler(signum, frame): self.rawserver.external_add_task(0, self.read_config) signal.signal(signal.SIGHUP, handler) except Exception, e: self.logger.error(_("Could not set signal handler: ") + str_exc(e)) self.rawserver.add_task(0,self.core_doneflag.set()) except UserFailure, e: self.logger.error(str_exc(e)) self.rawserver.add_task(0,self.core_doneflag.set()) except: data = StringIO() print_exc(file = data) self.logger.error(data.getvalue()) self.rawserver.add_task(0,self.core_doneflag.set()) # always make sure events get processed even if only for # shutting down. self.rawserver.listen_forever() except:
class KhashmirBase: _Node = KNodeBase def __init__(self, host, port, data_dir, rawserver=None, max_ul_rate=1024, checkpoint=True, errfunc=None, rlcount=foo, config={'pause':False, 'max_rate_period':20}): if rawserver: self.rawserver = rawserver else: self.flag = Event() d = dict([(x[0],x[1]) for x in common_options + rare_options]) self.rawserver = RawServer(self.flag, d) self.max_ul_rate = max_ul_rate self.socket = None self.config = config self.setup(host, port, data_dir, rlcount, checkpoint) def setup(self, host, port, data_dir, rlcount, checkpoint=True): self.host = host self.port = port self.ddir = data_dir self.store = KStore() self.pingcache = {} self.socket = self.rawserver.create_udpsocket(self.port, self.host, False) self.udp = krpc.hostbroker(self, (self.host, self.port), self.socket, self.rawserver.add_task, self.max_ul_rate, self.config, rlcount) self._load() self.rawserver.start_listening_udp(self.socket, self.udp) self.last = time() KeyExpirer(self.store, self.rawserver.add_task) self.refreshTable(force=1) if checkpoint: self.rawserver.add_task(30, self.findCloseNodes, lambda a: a, True) self.rawserver.add_task(60, self.checkpoint, 1) def Node(self): n = self._Node(self.udp.connectionForAddr) n.table = self return n def __del__(self): if self.socket is not None: self.rawserver.stop_listening_udp(self.socket) self.socket.close() def _load(self): do_load = False try: s = open(os.path.join(self.ddir, "routing_table"), 'r').read() dict = bdecode(s) except: id = newID() else: id = dict['id'] do_load = True self.node = self._Node(self.udp.connectionForAddr).init(id, self.host, self.port) self.table = KTable(self.node) if do_load: self._loadRoutingTable(dict['rt']) def checkpoint(self, auto=0): d = {} d['id'] = self.node.id d['rt'] = self._dumpRoutingTable() try: f = open(os.path.join(self.ddir, "routing_table"), 'wb') f.write(bencode(d)) f.close() except Exception, e: #XXX real error here print ">>> unable to dump routing table!", str(e) pass if auto: self.rawserver.add_task(randrange(int(const.CHECKPOINT_INTERVAL * .9), int(const.CHECKPOINT_INTERVAL * 1.1)), self.checkpoint, 1)
def _got_peer(self, addr, infohash): if self.got_peer: self.got_peer(addr, infohash) def stop(self): self.port = None self.got_peer = None for service in self.services: self.server.unregisterService(service) del self.services[:] if __name__ == '__main__': import string import threading from BitTorrent.RawServer_twisted import RawServer rawserver = RawServer() def run_task_and_exit(): l = LocalDiscovery(rawserver, 6881, lambda *a:sys.stdout.write("GOT: %s\n" % str(a))) l.announce("63f27f5023d7e49840ce89fc1ff988336c514b64", ''.join(random.sample(string.letters, 5))) rawserver.add_task(0, run_task_and_exit) rawserver.listen_forever()