def run(params): cols = 80 h = HeadlessDisplayer() while 1: configdir = ConfigDir('downloadheadless') defaultsToIgnore = ['responsefile', 'url', 'priority'] configdir.setDefaults(defaults, defaultsToIgnore) configdefaults = configdir.loadConfig() defaults.append(( 'save_options', 0, "whether to save the current options as the new default configuration " + "(only for btdownloadheadless.py)")) try: config = parse_params(params, configdefaults) except ValueError, e: print 'error: ' + str( e) + '\nrun with no args for parameter explanations' break if not config: print get_usage(defaults, 80, configdefaults) break if config['save_options']: configdir.saveConfig(config) configdir.deleteOldCacheData(config['expire_cache_data']) myid = createPeerID() seed(myid) global doneFlag doneFlag = Event() def disp_exception(text): print text rawserver = RawServer(doneFlag, config['timeout_check_interval'], config['timeout'], ipv6_enable=config['ipv6_enabled'], failfunc=h.failed, errorfunc=disp_exception) upnp_type = UPnP_test(config['upnp_nat_access']) while True: try: listen_port = rawserver.find_and_bind( config['minport'], config['maxport'], config['bind'], ipv6_socket_style=config['ipv6_binds_v4'], upnp=upnp_type, randomizer=config['random_port']) break except socketerror, e: if upnp_type and e == UPnP_ERROR: print 'WARNING: COULD NOT FORWARD VIA UPnP' upnp_type = 0 continue print "error: Couldn't listen - " + str(e) h.failed() return
def __init__(self, utility): Thread.__init__(self) try: self.utility = utility self.Output = Output() btconfig = self.utility.getBTParams() self.stats_period = btconfig['display_interval'] self.counter = 0 self.doneflag = Event() self.hashcheck_queue = [] self.hashcheck_current = None self.rawserver = RawServer(self.doneflag, btconfig['timeout_check_interval'], btconfig['timeout'], ipv6_enable=btconfig['ipv6_enabled'], failfunc=self.failed, errorfunc=self.exchandler) self.listen_port = self.getPort() self.handler = MultiHandler(self.rawserver, self.doneflag) seed(createPeerID()) self.rawserver.add_task(self.stats, 0) except: data = StringIO() print_exc(file=data) self.Output.exception(data.getvalue())
def run(params): #cols = 80 def disp_exception(text): print text h = HeadlessDisplayer() while 1: configdir = ConfigDir('downloadheadless') defaultsToIgnore = ['responsefile', 'url', 'priority'] configdir.setDefaults(defaults, defaultsToIgnore) configdefaults = configdir.loadConfig() defaults.append(('save_options', 0, "whether to save the current " "options as the new default configuration " "(only for btdownloadheadless.py)")) try: config = parse_params(params, configdefaults) except ValueError, e: print 'error: %s \nrun with no args for parameter explanations' % e break if not config: print get_usage(defaults, 80, configdefaults) break if config['save_options']: configdir.saveConfig(config) configdir.deleteOldCacheData(config['expire_cache_data']) myid = createPeerID() seed(myid) global doneFlag doneFlag = Event() rawserver = RawServer(doneFlag, config['timeout_check_interval'], config['timeout'], ipv6_enable=config['ipv6_enabled'], failfunc=h.failed, errorfunc=disp_exception) upnp_type = UPnP_test(config['upnp_nat_access']) while True: try: listen_port = rawserver.find_and_bind( config['minport'], config['maxport'], config['bind'], ipv6_socket_style=config['ipv6_binds_v4'], upnp=upnp_type, randomizer=config['random_port']) break except socketerror, e: if upnp_type and e == UPnP_ERROR: print 'WARNING: COULD NOT FORWARD VIA UPnP' upnp_type = 0 continue print "error: Couldn't listen - " + str(e) h.failed() return
def __init__(self, utility): Thread.__init__(self) try: self.utility = utility self.Output = Output() btconfig = self.utility.getBTParams() self.stats_period = btconfig['display_interval'] self.counter = 0 self.doneflag = Event() self.hashcheck_queue = [] self.hashcheck_current = None self.rawserver = RawServer(self.doneflag, btconfig['timeout_check_interval'], btconfig['timeout'], ipv6_enable = btconfig['ipv6_enabled'], failfunc = self.failed, errorfunc = self.exchandler) self.listen_port = self.getPort() self.handler = MultiHandler(self.rawserver, self.doneflag) seed(createPeerID()) self.rawserver.add_task(self.stats, 0) except: data = StringIO() print_exc(file = data) self.Output.exception(data.getvalue())
class LaunchManyThread(Thread): def __init__(self,output,args=[],banfunc=None): Thread.__init__(self) self.output = output config,args = parseargs(args,defaults,0,0) self.config = config self.banfunc = banfunc self.policy = policy.get_policy() #self.torrent_dir = config['torrent_dir'] #self.torrent_cache = {} #self.file_cache = {} #self.blocked_files = {} #self.scan_period = config['parse_dir_interval'] self.stats_period = config['display_interval'] self.torrent_list = [] self.downloads = {} self.counter = 0 self.doneflag = Event() self.hashcheck_queue = [] self.hashcheck_current = None self.rawserver = RawServer(self.doneflag, config['timeout_check_interval'], config['timeout'], ipv6_enable = config['ipv6_enabled'], failfunc = self.failed, errorfunc = self.exchandler) self.upnp = UPnP_test(self.policy(policy.UPNP_NAT_ACCESS)) while True: try: if self.policy(policy.USE_SINGLE_PORT): self.listen_port = self.rawserver.find_and_bind( config['minport'], config['maxport'], config['bind'], ipv6_socket_style = config['ipv6_binds_v4'], upnp = self.upnp, randomizer = self.policy(policy.RANDOM_PORT)) else: self.listen_port = None break except socketerror, e: if self.upnp and e == UPnP_ERROR: self.output.message('WARNING: COULD NOT FORWARD VIA UPnP') self.upnp = 0 continue self.failed("Couldn't listen - " + str(e)) return #self.ratelimiter = RateLimiter(self.rawserver.add_task, # config['upload_unit_size']) #self.ratelimiter.set_upload_rate(config['max_upload_rate']) self.ratelimiter = None self.handler = MultiHandler(self.rawserver, self.doneflag) seed(createPeerID()) # self.rawserver.add_task(self.scan, 0) self.rawserver.add_task(self.stats, 0)
def track(args): if len(args) == 0: print formatDefinitions(defaults, 80) return try: config, files = parseargs(args, defaults, 0, 0) except ValueError as e: print 'error: ' + str(e) print 'run with no arguments for parameter explanations' return r = RawServer(threading.Event(), config['timeout_check_interval'], config['socket_timeout'], ipv6_enable=config['ipv6_enabled']) t = Tracker(config, r) r.bind(config['port'], config['bind'], reuse=True, ipv6_socket_style=config['ipv6_binds_v4']) r.listen_forever( HTTPHandler(t.get, config['min_time_between_log_flushes'])) t.save_state() print '# Shutting down: ' + isotime()
def start(self): config = {k: v for k, v, _ in defaults} config['dfile'] = tempfile.mktemp() # Use temporary file since it won't be reused. config['port'] = self.port rawserver = RawServer( doneflag=Event(), timeout_check_interval=config['timeout_check_interval'], timeout=config['socket_timeout'], ipv6_enable=config['ipv6_enabled']) rawserver.bind( port=config['port'], bind=config['bind'], reuse=True, ipv6_socket_style=config['ipv6_binds_v4']) self._tracker = _Tracker(config, rawserver) # Spawn in separate thread. spawn(rawserver.listen_forever, HTTPHandler(self._tracker.get, config['min_time_between_log_flushes']))
def __init__(self): Thread.__init__(self, name = "LaunchMany") try: self.Output = Output() btconfig = utility.getBTParams() if not _natpmp_supported: btconfig["natpmp"] = 0 self.stats_period = btconfig['display_interval'] self.counter = 0 self.doneflag = Event() self.hashcheck_queue = [] self.hashcheck_current = None # BT RawServer self.rawserver = RawServer(self.doneflag, btconfig['timeout_check_interval'], btconfig['timeout'], ipv6_enable = btconfig['ipv6_enabled'], failfunc = self.failed, errorfunc = self.exchandler) self.upnp_type = 0 self.listen_port = self.getPort(btconfig) if self.listen_port and utility.config.Write('useport', self.listen_port, "int"): utility.config.Flush() self.handler = MultiHandler(self.rawserver, self.doneflag, btconfig) self.rawserver.add_task(self.stats, 0) # DHT if btconfig["dht"] and self.listen_port: utility.dht = Khashmir(btconfig['bind'], self.listen_port, utility.getDatabaseDir(), ipv6_enable = btconfig['ipv6_enabled'], upnp = self.upnp_type, natpmp = btconfig['natpmp']) else: utility.dht = None OPTION_PATTERN[63] = False # Tracker self.tracker = None if btconfig["tracker"] and self.listen_port: self.enableTracker() except IOError: data = StringIO() print_exc(file = data) self.Output.exception(data.getvalue())
def start(self): config = {k: v for k, v, _ in defaults} config['dfile'] = tempfile.mktemp( ) # Use temporary file since it won't be reused. config['port'] = self.port rawserver = RawServer( doneflag=Event(), timeout_check_interval=config['timeout_check_interval'], timeout=config['socket_timeout'], ipv6_enable=config['ipv6_enabled']) rawserver.bind(port=config['port'], bind=config['bind'], reuse=True, ipv6_socket_style=config['ipv6_binds_v4']) self._tracker = _Tracker(config, rawserver) # Spawn in separate thread. spawn( rawserver.listen_forever, HTTPHandler(self._tracker.get, config['min_time_between_log_flushes']))
def run(params): cols = 80 h = HeadlessDisplayer() while 1: configdir = ConfigDir("downloadheadless") defaultsToIgnore = ["responsefile", "url", "priority"] configdir.setDefaults(defaults, defaultsToIgnore) configdefaults = configdir.loadConfig() defaults.append( ( "save_options", 0, "whether to save the current options as the new default configuration " + "(only for btdownloadheadless.py)", ) ) try: config = parse_params(params, configdefaults) except ValueError, e: print "error: " + str(e) + "\nrun with no args for parameter explanations" break if not config: print get_usage(defaults, 80, configdefaults) break if config["save_options"]: configdir.saveConfig(config) configdir.deleteOldCacheData(config["expire_cache_data"]) myid = createPeerID() seed(myid) global doneFlag doneFlag = Event() def disp_exception(text): print text rawserver = RawServer( doneFlag, config["timeout_check_interval"], config["timeout"], ipv6_enable=config["ipv6_enabled"], failfunc=h.failed, errorfunc=disp_exception, ) upnp_type = UPnP_test(config["upnp_nat_access"]) while True: try: listen_port = rawserver.find_and_bind( config["minport"], config["maxport"], config["bind"], ipv6_socket_style=config["ipv6_binds_v4"], upnp=upnp_type, randomizer=config["random_port"], ) break except socketerror, e: if upnp_type and e == UPnP_ERROR: print "WARNING: COULD NOT FORWARD VIA UPnP" upnp_type = 0 continue print "error: Couldn't listen - " + str(e) h.failed() return
class LaunchMany(Thread): def __init__(self, utility): Thread.__init__(self) try: self.utility = utility self.Output = Output() btconfig = self.utility.getBTParams() self.stats_period = btconfig['display_interval'] self.counter = 0 self.doneflag = Event() self.hashcheck_queue = [] self.hashcheck_current = None self.rawserver = RawServer(self.doneflag, btconfig['timeout_check_interval'], btconfig['timeout'], ipv6_enable = btconfig['ipv6_enabled'], failfunc = self.failed, errorfunc = self.exchandler) self.listen_port = self.getPort() self.handler = MultiHandler(self.rawserver, self.doneflag) seed(createPeerID()) self.rawserver.add_task(self.stats, 0) except: data = StringIO() print_exc(file = data) self.Output.exception(data.getvalue()) def getPort(self): listen_port = None btconfig = self.utility.getBTParams() upnp_type = UPnP_test(btconfig['upnp_nat_access']) while 1: try: listen_port = self.rawserver.find_and_bind(btconfig['minport'], btconfig['maxport'], btconfig['bind'], ipv6_socket_style = btconfig['ipv6_binds_v4'], upnp = upnp_type, randomizer = False) self.utility.listen_port = listen_port break except socketerror, e: if upnp_type and e == UPnP_ERROR: message = "WARNING: COULD NOT FORWARD VIA UPnP" dialog = wx.MessageDialog(None, message, self.utility.lang.get('error'), wx.ICON_ERROR) dialog.ShowModal() dialog.Destroy() self.Output.message('WARNING: COULD NOT FORWARD VIA UPnP') upnp_type = 0 continue else: message = self.utility.lang.get('noportavailable') + \ "\n" + \ self.utility.lang.get('tryotherport') dialog = wx.MessageDialog(None, message, self.utility.lang.get('error'), wx.YES_NO|wx.ICON_ERROR) result = dialog.ShowModal() dialog.Destroy() if(result == wx.ID_NO): self.failed(self.utility.lang.get('noportavailable')) break btconfig['minport'] = btconfig['minport'] + 1 btconfig['maxport'] = btconfig['maxport'] + 1 return listen_port
def run(params): h = HeadlessDisplayer() while 1: configdir = ConfigDir('downloadheadless') defaultsToIgnore = ['responsefile', 'url', 'priority'] configdir.setDefaults(defaults, defaultsToIgnore) configdefaults = configdir.loadConfig() defaults.append( ('save_options', 0, 'whether to save the current options as the ' 'new default configuration (only for btdownloadheadless.py)')) try: config = parse_params(params, configdefaults) except ValueError as e: print 'error: {}\nrun with no args for parameter explanations' \ ''.format(e) break if not config: print get_usage(defaults, 80, configdefaults) break if config['save_options']: configdir.saveConfig(config) configdir.deleteOldCacheData(config['expire_cache_data']) myid = createPeerID() random.seed(myid) doneflag = threading.Event() def disp_exception(text): print text rawserver = RawServer( doneflag, config['timeout_check_interval'], config['timeout'], ipv6_enable=config['ipv6_enabled'], failfunc=h.failed, errorfunc=disp_exception) upnp_type = UPnP_test(config['upnp_nat_access']) while True: try: listen_port = rawserver.find_and_bind( config['minport'], config['maxport'], config['bind'], ipv6_socket_style=config['ipv6_binds_v4'], upnp=upnp_type, randomizer=config['random_port']) break except socket.error as e: if upnp_type and e == UPnP_ERROR: print 'WARNING: COULD NOT FORWARD VIA UPnP' upnp_type = 0 continue print "error: Couldn't listen - " + str(e) h.failed() return response = get_response(config['responsefile'], config['url'], h.error) if not response: break infohash = hashlib.sha1(bencode(response['info'])).digest() dow = BT1Download( h.display, h.finished, h.error, disp_exception, doneflag, config, response, infohash, myid, rawserver, listen_port, configdir) if not dow.saveAs(h.chooseFile, h.newpath): break if not dow.initFiles(old_style=True): break if not dow.startEngine(): dow.shutdown() break dow.startRerequester() dow.autoStats() if not dow.am_I_finished(): h.display(activity='connecting to peers') rawserver.listen_forever(dow.getPortHandler()) h.display(activity='shutting down') dow.shutdown() break try: rawserver.shutdown() except: pass if not h.done: h.failed()
class LaunchMany(Thread): def __init__(self): Thread.__init__(self, name = "LaunchMany") try: self.Output = Output() btconfig = utility.getBTParams() if not _natpmp_supported: btconfig["natpmp"] = 0 self.stats_period = btconfig['display_interval'] self.counter = 0 self.doneflag = Event() self.hashcheck_queue = [] self.hashcheck_current = None # BT RawServer self.rawserver = RawServer(self.doneflag, btconfig['timeout_check_interval'], btconfig['timeout'], ipv6_enable = btconfig['ipv6_enabled'], failfunc = self.failed, errorfunc = self.exchandler) self.upnp_type = 0 self.listen_port = self.getPort(btconfig) if self.listen_port and utility.config.Write('useport', self.listen_port, "int"): utility.config.Flush() self.handler = MultiHandler(self.rawserver, self.doneflag, btconfig) self.rawserver.add_task(self.stats, 0) # DHT if btconfig["dht"] and self.listen_port: utility.dht = Khashmir(btconfig['bind'], self.listen_port, utility.getDatabaseDir(), ipv6_enable = btconfig['ipv6_enabled'], upnp = self.upnp_type, natpmp = btconfig['natpmp']) else: utility.dht = None OPTION_PATTERN[63] = False # Tracker self.tracker = None if btconfig["tracker"] and self.listen_port: self.enableTracker() except IOError: data = StringIO() print_exc(file = data) self.Output.exception(data.getvalue()) def enableTracker(self): if self.tracker is None and self.listen_port: presets = {'port': self.listen_port, 'allowed_dir': os.path.join(utility.configdir.dir_root, 'tracker'), 'dfile': os.path.join(utility.getDatabaseDir(), 'tracker.db'), } trackconfig, args = parseargs('', defaults, presets = presets) self.tracker = Tracker(trackconfig, self.rawserver) self.handler.http = HTTPHandler(self.tracker.get, trackconfig['min_time_between_log_flushes']) def disableTracker(self): if self.tracker is not None: self.handler.http.shutdown() self.handler.http = None self.tracker.save_state() self.tracker = None def getPort(self, btconfig): listen_port = None self.upnp_type = UPnP_test(btconfig['upnp_nat_access']) while True: try: listen_port = self.rawserver.find_and_bind(btconfig['minport'], btconfig['maxport'], btconfig['bind'], ipv6_socket_style = btconfig['ipv6_binds_v4'], upnp = self.upnp_type, randomizer = False, natpmp = btconfig['natpmp']) utility.listen_port = listen_port break except socketerror, e: message = _('listening port not available') + \ "\n" + \ _('would you like to try another port?') #+ \ #"\n\n" + _('Details:') + forceunicode(e.strerror) dialog = wx.MessageDialog(None, message, _('Error'), wx.YES_NO|wx.ICON_ERROR) result = dialog.ShowModal() dialog.Destroy() if(result == wx.ID_NO): self.failed(_('listening port not available')) break btconfig['minport'] = btconfig['minport'] + 1 btconfig['maxport'] = btconfig['maxport'] + 1 return listen_port
del self.downloads[key] del self.seedcount[key] self.rawserver.add_task(self.expire_downloaders, self.timeout_downloaders_interval) def track(args): if len(args) == 0: print formatDefinitions(defaults, 80) return try: config, files = parseargs(args, defaults, 0, 0) except ValueError, e: print 'error: ' + str(e) print 'run with no arguments for parameter explanations' return r = RawServer(Event(), config['timeout_check_interval'], config['socket_timeout'], ipv6_enable = config['ipv6_enabled']) t = Tracker(config, r) r.bind(config['port'], config['bind'], reuse = True, ipv6_socket_style = config['ipv6_binds_v4']) r.listen_forever(HTTPHandler(t.get, config['min_time_between_log_flushes'])) t.save_dfile() print '# Shutting down: ' + isotime() def size_format(s): if (s < 1024): r = str(s) + 'B' elif (s < 1048576): r = str(int(s/1024)) + 'KiB' elif (s < 1073741824L): r = str(int(s/1048576)) + 'MiB' elif (s < 1099511627776L):
def doTheDownloadThing(self): """ This was copied and modified directly from btdownloadheadless.py """ if self.disabled: LOGERROR("Attempted to start DL but DISABLE_TORRENT is True") return while 1: # Use this var to identify if we've started downloading self.startTime = RightNow() configdir = ConfigDir(self.cacheDir) defaultsToIgnore = ["responsefile", "url", "priority"] configdir.setDefaults(defaults, defaultsToIgnore) config = configdir.loadConfig() config["responsefile"] = self.torrent config["url"] = "" config["priority"] = "" config["saveas"] = self.savePath_temp config["save_options"] = 0 config["max_uploads"] = 0 config["max_files_open"] = 25 configdir.deleteOldCacheData(config["expire_cache_data"]) myid = createPeerID() seed(myid) rawserver = RawServer( self.doneObj, config["timeout_check_interval"], config["timeout"], ipv6_enable=config["ipv6_enabled"], failfunc=self.failedFunc, errorfunc=self.errorFunc, ) upnp_type = UPnP_test(config["upnp_nat_access"]) while True: try: listen_port = rawserver.find_and_bind( config["minport"], config["maxport"], config["bind"], ipv6_socket_style=config["ipv6_binds_v4"], upnp=upnp_type, randomizer=config["random_port"], ) break except socketerror, e: if upnp_type and e == UPnP_ERROR: LOGWARN("WARNING: COULD NOT FORWARD VIA UPnP") upnp_type = 0 continue LOGERROR("error: Couldn't listen - " + str(e)) self.failedFunc() return if not self.response: break infohash = sha(bencode(self.response["info"])).digest() LOGINFO("Downloading: %s", self.torrentName) curr, tot = [float(a) / MEGABYTE for a in self.fileProgress()] if curr == 0: LOGINFO("Starting new download") elif curr == tot: LOGINFO("Torrent already finished!") return else: LOGINFO("Picking up where left off at %0.0f of %0.0f MB" % (curr, tot)) self.bt1dow = BT1Download( self.statusFunc, self.finishedFunc, self.errorFunc, self.excFunc, self.doneObj, config, self.response, infohash, myid, rawserver, listen_port, configdir, ) if not self.bt1dow.saveAs(self.chooseFileFunc): break if not self.bt1dow.initFiles(old_style=True): break if not self.bt1dow.startEngine(): self.bt1dow.shutdown() break if self.nHashFailures >= self.killAfterNHashFails: self.bt1dow.shutdown() self.customCallbacks["errorFunc"]("hashFail") break self.bt1dow.startRerequester() self.bt1dow.autoStats() if not self.bt1dow.am_I_finished(): self.statusFunc(activity="Connecting to peers") rawserver.listen_forever(self.bt1dow.getPortHandler()) self.statusFunc(activity="Shutting down") self.bt1dow.shutdown() break
class LaunchMany(Thread): def __init__(self, utility): Thread.__init__(self) try: self.utility = utility self.Output = Output() btconfig = self.utility.getBTParams() self.stats_period = btconfig['display_interval'] self.counter = 0 self.doneflag = Event() self.hashcheck_queue = [] self.hashcheck_current = None self.rawserver = RawServer(self.doneflag, btconfig['timeout_check_interval'], btconfig['timeout'], ipv6_enable=btconfig['ipv6_enabled'], failfunc=self.failed, errorfunc=self.exchandler) self.listen_port = self.getPort() self.handler = MultiHandler(self.rawserver, self.doneflag) seed(createPeerID()) self.rawserver.add_task(self.stats, 0) except: data = StringIO() print_exc(file=data) self.Output.exception(data.getvalue()) def getPort(self): listen_port = None btconfig = self.utility.getBTParams() upnp_type = UPnP_test(btconfig['upnp_nat_access']) while 1: try: listen_port = self.rawserver.find_and_bind( btconfig['minport'], btconfig['maxport'], btconfig['bind'], ipv6_socket_style=btconfig['ipv6_binds_v4'], upnp=upnp_type, randomizer=False) self.utility.listen_port = listen_port break except socketerror, e: if upnp_type and e == UPnP_ERROR: message = "WARNING: COULD NOT FORWARD VIA UPnP" dialog = wx.MessageDialog(None, message, self.utility.lang.get('error'), wx.ICON_ERROR) dialog.ShowModal() dialog.Destroy() self.Output.message('WARNING: COULD NOT FORWARD VIA UPnP') upnp_type = 0 continue else: message = self.utility.lang.get('noportavailable') + \ "\n" + \ self.utility.lang.get('tryotherport') dialog = wx.MessageDialog(None, message, self.utility.lang.get('error'), wx.YES_NO | wx.ICON_ERROR) result = dialog.ShowModal() dialog.Destroy() if (result == wx.ID_NO): self.failed(self.utility.lang.get('noportavailable')) break btconfig['minport'] = btconfig['minport'] + 1 btconfig['maxport'] = btconfig['maxport'] + 1 return listen_port
def download(self, params): role = params[0] if role == 'download': self.isDownloader = True self.logger = logging.getLogger(role) params.remove(role) while True: configdir = ConfigDir('downloadheadless') defaultsToIgnore = ['responsefile', 'url', 'priority'] configdir.setDefaults(defaults,defaultsToIgnore) configdefaults = configdir.loadConfig() defaults.append(('save_options',0, "whether to save the current options as the new default configuration " + "(only for btdownloadheadless.py)")) try: config = parse_params(params, configdefaults) except ValueError, e: print 'error: ' + str(e) + '\nrun with no args for parameter explanations' break if not config: print get_usage(defaults, 80, configdefaults) break if config['save_options']: configdir.saveConfig(config) configdir.deleteOldCacheData(config['expire_cache_data']) if config['url']: self.torrent = config['url'] elif config['responsefile']: self.torrent = config['responsefile'] for k in adjustDownloader: config[k] = adjustDownloader[k] myid = createPeerID() seed(myid) def disp_exception(text): self.logger.info( text) rawserver = RawServer(self.doneflag, config['timeout_check_interval'], config['timeout'], ipv6_enable = config['ipv6_enabled'], failfunc = self.failed, errorfunc = disp_exception) upnp_type = UPnP_test(config['upnp_nat_access']) while True: try: listen_port = rawserver.find_and_bind(config['minport'], config['maxport'], config['bind'], ipv6_socket_style = config['ipv6_binds_v4'], upnp = upnp_type, randomizer = config['random_port']) break except socketerror, e: if upnp_type and e == UPnP_ERROR: self.logger.info( 'WARNING: COULD NOT FORWARD VIA UPnP') upnp_type = 0 continue self.logger.info( "error: Couldn't listen - " + str(e)) self.failed() return "error: Couldn't listen - " + str(e)
def run(scrwin, errlist, params): doneflag = threading.Event() d = CursesDisplayer(scrwin, errlist, doneflag) try: while 1: configdir = ConfigDir('downloadcurses') defaultsToIgnore = ['responsefile', 'url', 'priority'] configdir.setDefaults(defaults, defaultsToIgnore) configdefaults = configdir.loadConfig() defaults.append( ('save_options', 0, 'whether to save the current options as ' 'the new default configuration (only for btdownloadcurses.py)' )) try: config = parse_params(params, configdefaults) except ValueError as e: d.error('error: {}\nrun with no args for parameter ' 'explanations'.format(e)) break if not config: d.error(get_usage(defaults, d.fieldw, configdefaults)) break if config['save_options']: configdir.saveConfig(config) configdir.deleteOldCacheData(config['expire_cache_data']) myid = createPeerID() random.seed(myid) rawserver = RawServer(doneflag, config['timeout_check_interval'], config['timeout'], ipv6_enable=config['ipv6_enabled'], failfunc=d.failed, errorfunc=d.error) upnp_type = UPnP_test(config['upnp_nat_access']) while True: try: listen_port = rawserver.find_and_bind( config['minport'], config['maxport'], config['bind'], ipv6_socket_style=config['ipv6_binds_v4'], upnp=upnp_type, randomizer=config['random_port']) break except socket.error as e: if upnp_type and e == UPnP_ERROR: d.error('WARNING: COULD NOT FORWARD VIA UPnP') upnp_type = 0 continue d.error("Couldn't listen - " + str(e)) d.failed() return response = get_response(config['responsefile'], config['url'], d.error) if not response: break infohash = hashlib.sha1(bencode(response['info'])).digest() dow = BT1Download(d.display, d.finished, d.error, d.error, doneflag, config, response, infohash, myid, rawserver, listen_port, configdir) if not dow.saveAs(d.chooseFile): break if not dow.initFiles(old_style=True): break if not dow.startEngine(): dow.shutdown() break dow.startRerequester() dow.autoStats() if not dow.am_I_finished(): d.display(activity='connecting to peers') rawserver.listen_forever(dow.getPortHandler()) d.display(activity='shutting down') dow.shutdown() break except KeyboardInterrupt: # ^C to exit... pass try: rawserver.shutdown() except: pass if not d.done: d.failed()
def start(self): rawserver = None try: config = dict([(v[0], v[1]) for v in defaults]) config['ip'] = self.ip config['responsefile'] = self.torrent_file config['saveas'] = self.destination_file random.seed(self.id) rawserver = RawServer( doneflag=self.done_flag, timeout_check_interval=config['timeout_check_interval'], timeout=config['timeout'], ipv6_enable=config['ipv6_enabled'], failfunc=self.on_fail, errorfunc=self.on_exception) rawserver.bind( port=self.port, bind=config['bind'], reuse=True, ipv6_socket_style=config['ipv6_binds_v4']) # Download torrent metadata. response = get_response( file=config['responsefile'], url=config['url'], errorfunc=self.on_error) # Bail if tracker is done. if not response: return dow = BT1Download( statusfunc=self.on_status, finfunc=self.on_finish, errorfunc=self.on_error, excfunc=self.on_exception, doneflag=self.done_flag, config=config, response=response, infohash=hashlib.sha1(bencode(response['info'])).digest(), id=self.id, rawserver=rawserver, port=self.port) if not dow.saveAs(lambda default, size, saveas, dir: saveas if saveas else default): return if not dow.initFiles(old_style=True): return if not dow.startEngine(): dow.shutdown() return dow.startRerequester() dow.autoStats() if not dow.am_I_finished(): self.on_status(activity='connecting to peers') rawserver.listen_forever(dow.getPortHandler()) self.on_status(activity='shutting down') dow.shutdown() finally: if rawserver: rawserver.shutdown() if not self.finished_at: self.on_fail()
def doTheDownloadThing(self): """ This was copied and modified directly from btdownloadheadless.py """ if self.disabled: LOGERROR('Attempted to start DL but DISABLE_TORRENT is True') return while 1: # Use this var to identify if we've started downloading self.startTime = RightNow() configdir = ConfigDir(self.cacheDir) defaultsToIgnore = ['responsefile', 'url', 'priority'] configdir.setDefaults(defaults, defaultsToIgnore) config = configdir.loadConfig() config['responsefile'] = self.torrent config['url'] = '' config['priority'] = '' config['saveas'] = self.savePath_temp config['save_options'] = 0 config['max_uploads'] = 0 config['max_files_open'] = 25 configdir.deleteOldCacheData(config['expire_cache_data']) myid = createPeerID() seed(myid) rawserver = RawServer( self.doneObj, config['timeout_check_interval'], config['timeout'], ipv6_enable = config['ipv6_enabled'], failfunc = self.failedFunc, errorfunc = self.errorFunc) upnp_type = UPnP_test(config['upnp_nat_access']) while True: try: listen_port = rawserver.find_and_bind( \ config['minport'], config['maxport'], config['bind'], ipv6_socket_style = config['ipv6_binds_v4'], upnp = upnp_type, randomizer = config['random_port']) break except socketerror, e: if upnp_type and e == UPnP_ERROR: LOGWARN('WARNING: COULD NOT FORWARD VIA UPnP') upnp_type = 0 continue LOGERROR("error: Couldn't listen - " + str(e)) self.failedFunc() return if not self.response: break infohash = sha(bencode(self.response['info'])).digest() LOGINFO('Downloading: %s', self.torrentName) curr,tot = [float(a)/MEGABYTE for a in self.fileProgress()] if curr == 0: LOGINFO('Starting new download') elif curr==tot: LOGINFO('Torrent already finished!') return else: LOGINFO('Picking up where left off at %0.0f of %0.0f MB' % (curr,tot)) self.bt1dow = BT1Download( self.statusFunc, self.finishedFunc, self.errorFunc, self.excFunc, self.doneObj, config, self.response, infohash, myid, rawserver, listen_port, configdir) if not self.bt1dow.saveAs(self.chooseFileFunc): break if not self.bt1dow.initFiles(old_style = True): break if not self.bt1dow.startEngine(): self.bt1dow.shutdown() break if self.nHashFailures >= self.killAfterNHashFails: self.bt1dow.shutdown() self.customCallbacks['errorFunc']('hashFail') break self.bt1dow.startRerequester() self.bt1dow.autoStats() if not self.bt1dow.am_I_finished(): self.statusFunc(activity = 'Connecting to peers') rawserver.listen_forever(self.bt1dow.getPortHandler()) self.statusFunc(activity = 'Shutting down') self.bt1dow.shutdown() break
def doTheDownloadThing(self): """ This was copied and modified directly from btdownloadheadless.py """ if self.disabled: LOGERROR('Attempted to start DL but DISABLE_TORRENT is True') return while 1: # Use this var to identify if we've started downloading self.startTime = RightNow() configdir = ConfigDir(self.cacheDir) defaultsToIgnore = ['responsefile', 'url', 'priority'] configdir.setDefaults(defaults, defaultsToIgnore) config = configdir.loadConfig() config['responsefile'] = self.torrent config['url'] = '' config['priority'] = '' config['saveas'] = self.savePath_temp config['save_options'] = 0 config['max_uploads'] = 0 config['max_files_open'] = 25 configdir.deleteOldCacheData(config['expire_cache_data']) myid = createPeerID() seed(myid) rawserver = RawServer( self.doneObj, config['timeout_check_interval'], config['timeout'], ipv6_enable = config['ipv6_enabled'], failfunc = self.failedFunc, errorfunc = self.errorFunc) upnp_type = UPnP_test(config['upnp_nat_access']) while True: try: listen_port = rawserver.find_and_bind( \ config['minport'], config['maxport'], config['bind'], ipv6_socket_style = config['ipv6_binds_v4'], upnp = upnp_type, randomizer = config['random_port']) break except socketerror, e: if upnp_type and e == UPnP_ERROR: LOGWARN('WARNING: COULD NOT FORWARD VIA UPnP') upnp_type = 0 continue LOGERROR("error: Couldn't listen - " + str(e)) self.failedFunc() return if not self.response: break infohash = sha(bencode(self.response['info'])).digest() LOGINFO('Downloading: %s', self.torrentName) curr,tot = [float(a)/MEGABYTE for a in self.fileProgress()] if curr == 0: LOGINFO('Starting new download') elif curr==tot: LOGINFO('Torrent already finished!') return else: LOGINFO('Picking up where left off at %0.0f of %0.0f MB' % (curr,tot)) self.bt1dow = BT1Download( self.statusFunc, self.finishedFunc, self.errorFunc, self.excFunc, self.doneObj, config, self.response, infohash, myid, rawserver, listen_port, configdir) if not self.bt1dow.saveAs(self.chooseFileFunc): break if not self.bt1dow.initFiles(old_style = True): break if not self.bt1dow.startEngine(): self.bt1dow.shutdown() break self.bt1dow.startRerequester() self.bt1dow.autoStats() if not self.bt1dow.am_I_finished(): self.statusFunc(activity = 'Connecting to peers') rawserver.listen_forever(self.bt1dow.getPortHandler()) self.statusFunc(activity = 'Shutting down') self.bt1dow.shutdown() break
def run(autoDie,shareKill,statusFile,userName,params): if __debug__: traceMsg('run - begin') try: f=open(statusFile+".pid",'w') f.write(str(getpid()).strip() + "\n") f.flush() f.close() except: if __debug__: traceMsg('run - Failed to Create PID file') pass try: h = HeadlessDisplayer() h.statFile = statusFile h.autoShutdown = autoDie h.shareKill = shareKill h.user = userName while 1: try: config = parse_params(params) except ValueError, e: print 'error: ' + str(e) + '\nrun with no args for parameter explanations' break if not config: print get_usage() break myid = createPeerID() seed(myid) doneflag = Event() def disp_exception(text): print text rawserver = RawServer(doneflag, config['timeout_check_interval'], config['timeout'], ipv6_enable = config['ipv6_enabled'], failfunc = h.failed, errorfunc = disp_exception) upnp_type = UPnP_test(config['upnp_nat_access']) while True: try: listen_port = rawserver.find_and_bind(config['minport'], config['maxport'], config['bind'], ipv6_socket_style = config['ipv6_binds_v4'], upnp = upnp_type, randomizer = config['random_port']) break except socketerror, e: if upnp_type and e == UPnP_ERROR: print 'WARNING: COULD NOT FORWARD VIA UPnP' upnp_type = 0 continue print "error: Couldn't listen - " + str(e) h.failed() return response = get_response(config['responsefile'], config['url'], h.error) if not response: break infohash = sha(bencode(response['info'])).digest() dow = BT1Download(h.display, h.finished, h.error, disp_exception, doneflag, config, response, infohash, myid, rawserver, listen_port) if not dow.saveAs(h.chooseFile, h.newpath): break if not dow.initFiles(old_style = True): break if not dow.startEngine(): dow.shutdown() break dow.startRerequester() dow.autoStats() if not dow.am_I_finished(): h.display(activity = 'connecting to peers') rawserver.listen_forever(dow.getPortHandler()) h.display(activity = 'shutting down') dow.shutdown() break
def start(self): rawserver = None try: config = dict([(v[0], v[1]) for v in defaults]) config['ip'] = self.ip config['responsefile'] = self.torrent_file config['saveas'] = self.destination_file random.seed(self.id) rawserver = RawServer( doneflag=self.done_flag, timeout_check_interval=config['timeout_check_interval'], timeout=config['timeout'], ipv6_enable=config['ipv6_enabled'], failfunc=self.on_fail, errorfunc=self.on_exception) rawserver.bind(port=self.port, bind=config['bind'], reuse=True, ipv6_socket_style=config['ipv6_binds_v4']) # Download torrent metadata. response = get_response(file=config['responsefile'], url=config['url'], errorfunc=self.on_error) # Bail if tracker is done. if not response: return dow = BT1Download(statusfunc=self.on_status, finfunc=self.on_finish, errorfunc=self.on_error, excfunc=self.on_exception, doneflag=self.done_flag, config=config, response=response, infohash=hashlib.sha1(bencode( response['info'])).digest(), id=self.id, rawserver=rawserver, port=self.port) if not dow.saveAs(lambda default, size, saveas, dir: saveas if saveas else default): return if not dow.initFiles(old_style=True): return if not dow.startEngine(): dow.shutdown() return dow.startRerequester() dow.autoStats() if not dow.am_I_finished(): self.on_status(activity='connecting to peers') rawserver.listen_forever(dow.getPortHandler()) self.on_status(activity='shutting down') dow.shutdown() finally: if rawserver: rawserver.shutdown() if not self.finished_at: self.on_fail()
def run(autoDie, shareKill, userName, params): try: h = HeadlessDisplayer() h.autoShutdown = autoDie h.shareKill = shareKill h.user = userName while 1: try: config = parse_params(params) except ValueError, e: print 'error: ' + str(e) + '\nrun with no args for parameter explanations' break if not config: print get_usage() break # log what we are starting up transferLog("tornado starting up :\n", True) transferLog(" - torrentfile : " + config['responsefile'] + "\n", True) transferLog(" - userName : "******"\n", True) transferLog(" - transferStatFile : " + transferStatFile + "\n", True) transferLog(" - transferCommandFile : " + transferCommandFile + "\n", True) transferLog(" - transferLogFile : " + transferLogFile + "\n", True) transferLog(" - transferPidFile : " + transferPidFile + "\n", True) transferLog(" - autoDie : " + autoDie + "\n", True) transferLog(" - shareKill : " + shareKill + "\n", True) transferLog(" - minport : " + str(config['minport']) + "\n", True) transferLog(" - maxport : " + str(config['maxport']) + "\n", True) transferLog(" - max_upload_rate : " + str(config['max_upload_rate']) + "\n", True) transferLog(" - max_download_rate : " + str(config['max_download_rate']) + "\n", True) transferLog(" - min_uploads : " + str(config['min_uploads']) + "\n", True) transferLog(" - max_uploads : " + str(config['max_uploads']) + "\n", True) transferLog(" - min_peers : " + str(config['min_peers']) + "\n", True) transferLog(" - max_initiate : " + str(config['max_initiate']) + "\n", True) transferLog(" - max_connections : " + str(config['max_connections']) + "\n", True) transferLog(" - super_seeder : " + str(config['super_seeder']) + "\n", True) transferLog(" - security : " + str(config['security']) + "\n", True) transferLog(" - auto_kick : " + str(config['auto_kick']) + "\n", True) if 'crypto_allowed' in config: transferLog(" - crypto_allowed : " + str(config['crypto_allowed']) + "\n", True) if 'crypto_only' in config: transferLog(" - crypto_only : " + str(config['crypto_only']) + "\n", True) if 'crypto_stealth' in config: transferLog(" - crypto_stealth : " + str(config['crypto_stealth']) + "\n", True) transferLog(" - priority : " + str(config['priority']) + "\n", True) transferLog(" - alloc_type : " + str(config['alloc_type']) + "\n", True) transferLog(" - alloc_rate : " + str(config['alloc_rate']) + "\n", True) transferLog(" - buffer_reads : " + str(config['buffer_reads']) + "\n", True) transferLog(" - write_buffer_size : " + str(config['write_buffer_size']) + "\n", True) transferLog(" - check_hashes : " + str(config['check_hashes']) + "\n", True) transferLog(" - max_files_open : " + str(config['max_files_open']) + "\n", True) transferLog(" - upnp_nat_access : " + str(config['upnp_nat_access']) + "\n", True) # remove command-file if exists if isfile(transferCommandFile): try: transferLog("removing command-file " + transferCommandFile + "...\n", True) remove(transferCommandFile) except: pass # write pid-file currentPid = (str(getpid())).strip() transferLog("writing pid-file : " + transferPidFile + " (" + currentPid + ")\n", True) try: pidFile = open(transferPidFile, 'w') pidFile.write(currentPid + "\n") pidFile.flush() pidFile.close() except Exception, e: transferLog("Failed to write pid-file, shutting down : " + transferPidFile + " (" + currentPid + ")" + "\n", True) break myid = createPeerID() seed(myid) doneflag = Event() def disp_exception(text): print text rawserver = RawServer(doneflag, config['timeout_check_interval'], config['timeout'], ipv6_enable = config['ipv6_enabled'], failfunc = h.failed, errorfunc = disp_exception) upnp_type = UPnP_test(config['upnp_nat_access']) while True: try: listen_port = rawserver.find_and_bind(config['minport'], config['maxport'], config['bind'], ipv6_socket_style = config['ipv6_binds_v4'], upnp = upnp_type, randomizer = config['random_port']) break except socketerror, e: if upnp_type and e == UPnP_ERROR: print 'WARNING: COULD NOT FORWARD VIA UPnP' upnp_type = 0 continue print "error: Couldn't listen - " + str(e) h.failed() return
def run(autoDie, shareKill, userName, params): try: h = HeadlessDisplayer() h.autoShutdown = autoDie h.shareKill = shareKill h.user = userName while 1: try: config = parse_params(params) except ValueError, e: print 'error: ' + str( e) + '\nrun with no args for parameter explanations' break if not config: print get_usage() break # log what we are starting up transferLog("tornado starting up :\n", True) transferLog(" - torrentfile : " + config['responsefile'] + "\n", True) transferLog(" - userName : "******"\n", True) transferLog(" - transferStatFile : " + transferStatFile + "\n", True) transferLog( " - transferCommandFile : " + transferCommandFile + "\n", True) transferLog(" - transferLogFile : " + transferLogFile + "\n", True) transferLog(" - transferPidFile : " + transferPidFile + "\n", True) transferLog(" - autoDie : " + autoDie + "\n", True) transferLog(" - shareKill : " + shareKill + "\n", True) transferLog(" - minport : " + str(config['minport']) + "\n", True) transferLog(" - maxport : " + str(config['maxport']) + "\n", True) transferLog( " - max_upload_rate : " + str(config['max_upload_rate']) + "\n", True) transferLog( " - max_download_rate : " + str(config['max_download_rate']) + "\n", True) transferLog( " - min_uploads : " + str(config['min_uploads']) + "\n", True) transferLog( " - max_uploads : " + str(config['max_uploads']) + "\n", True) transferLog(" - min_peers : " + str(config['min_peers']) + "\n", True) transferLog( " - max_initiate : " + str(config['max_initiate']) + "\n", True) transferLog( " - max_connections : " + str(config['max_connections']) + "\n", True) transferLog( " - super_seeder : " + str(config['super_seeder']) + "\n", True) transferLog(" - security : " + str(config['security']) + "\n", True) transferLog(" - auto_kick : " + str(config['auto_kick']) + "\n", True) if 'crypto_allowed' in config: transferLog( " - crypto_allowed : " + str(config['crypto_allowed']) + "\n", True) if 'crypto_only' in config: transferLog( " - crypto_only : " + str(config['crypto_only']) + "\n", True) if 'crypto_stealth' in config: transferLog( " - crypto_stealth : " + str(config['crypto_stealth']) + "\n", True) transferLog(" - priority : " + str(config['priority']) + "\n", True) transferLog(" - alloc_type : " + str(config['alloc_type']) + "\n", True) transferLog(" - alloc_rate : " + str(config['alloc_rate']) + "\n", True) transferLog( " - buffer_reads : " + str(config['buffer_reads']) + "\n", True) transferLog( " - write_buffer_size : " + str(config['write_buffer_size']) + "\n", True) transferLog( " - check_hashes : " + str(config['check_hashes']) + "\n", True) transferLog( " - max_files_open : " + str(config['max_files_open']) + "\n", True) transferLog( " - upnp_nat_access : " + str(config['upnp_nat_access']) + "\n", True) # remove command-file if exists if isfile(transferCommandFile): try: transferLog( "removing command-file " + transferCommandFile + "...\n", True) remove(transferCommandFile) except: pass # write pid-file currentPid = (str(getpid())).strip() transferLog( "writing pid-file : " + transferPidFile + " (" + currentPid + ")\n", True) try: pidFile = open(transferPidFile, 'w') pidFile.write(currentPid + "\n") pidFile.flush() pidFile.close() except Exception, e: transferLog( "Failed to write pid-file, shutting down : " + transferPidFile + " (" + currentPid + ")" + "\n", True) break myid = createPeerID() seed(myid) doneflag = Event() def disp_exception(text): print text rawserver = RawServer(doneflag, config['timeout_check_interval'], config['timeout'], ipv6_enable=config['ipv6_enabled'], failfunc=h.failed, errorfunc=disp_exception) upnp_type = UPnP_test(config['upnp_nat_access']) while True: try: listen_port = rawserver.find_and_bind( config['minport'], config['maxport'], config['bind'], ipv6_socket_style=config['ipv6_binds_v4'], upnp=upnp_type, randomizer=config['random_port']) break except socketerror, e: if upnp_type and e == UPnP_ERROR: print 'WARNING: COULD NOT FORWARD VIA UPnP' upnp_type = 0 continue print "error: Couldn't listen - " + str(e) h.failed() return
def run(scrwin, errlist, params): doneflag = Event() d = CursesDisplayer(scrwin, errlist, doneflag) try: while 1: configdir = ConfigDir('downloadcurses') defaultsToIgnore = ['responsefile', 'url', 'priority'] configdir.setDefaults(defaults,defaultsToIgnore) configdefaults = configdir.loadConfig() defaults.append(('save_options',0, "whether to save the current options as the new default configuration " + "(only for btdownloadcurses.py)")) try: config = parse_params(params, configdefaults) except ValueError, e: d.error('error: ' + str(e) + '\nrun with no args for parameter explanations') break if not config: d.error(get_usage(defaults, d.fieldw, configdefaults)) break if config['save_options']: configdir.saveConfig(config) configdir.deleteOldCacheData(config['expire_cache_data']) myid = createPeerID() seed(myid) rawserver = RawServer(doneflag, config['timeout_check_interval'], config['timeout'], ipv6_enable = config['ipv6_enabled'], failfunc = d.failed, errorfunc = d.error) upnp_type = UPnP_test(config['upnp_nat_access']) while True: try: listen_port = rawserver.find_and_bind(config['minport'], config['maxport'], config['bind'], ipv6_socket_style = config['ipv6_binds_v4'], upnp = upnp_type, randomizer = config['random_port']) break except socketerror, e: if upnp_type and e == UPnP_ERROR: d.error('WARNING: COULD NOT FORWARD VIA UPnP') upnp_type = 0 continue d.error("Couldn't listen - " + str(e)) d.failed() return response = get_response(config['responsefile'], config['url'], d.error) if not response: break infohash = sha(bencode(response['info'])).digest() dow = BT1Download(d.display, d.finished, d.error, d.error, doneflag, config, response, infohash, myid, rawserver, listen_port, configdir) if not dow.saveAs(d.chooseFile): break if not dow.initFiles(old_style = True): break if not dow.startEngine(): dow.shutdown() break dow.startRerequester() dow.autoStats() if not dow.am_I_finished(): d.display(activity = 'connecting to peers') rawserver.listen_forever(dow.getPortHandler()) d.display(activity = 'shutting down') dow.shutdown() break
def __init__(self, configdir, config, Output): try: self.configdir = configdir self.config = config self.Output = Output self.torrent_dir = config['torrent_dir'] self.torrent_cache = {} self.file_cache = {} self.blocked_files = {} self.scan_period = config['parse_dir_interval'] self.stats_period = config['display_interval'] if not _natpmp_supported: config["natpmp"] = 0 self.torrent_list = [] self.downloads = {} self.counter = 0 self.doneflag = Event() self.hashcheck_queue = [] self.hashcheck_current = None # BT RawServer self.rawserver = RawServer(self.doneflag, config['timeout_check_interval'], config['timeout'], ipv6_enable = config['ipv6_enabled'], failfunc = self.failed, errorfunc = self.exchandler) self.upnp_type = 0 self.listen_port = self.getPort(config) # Rate limiter self.ratelimiter = RateLimiter(self.rawserver.add_task, config['upload_unit_size'], config['average_ping']) self.ratelimiter.set_upload_rate(config['max_upload_rate']) # Multi Handler self.handler = MultiHandler(self.rawserver, self.doneflag, config) self.rawserver.add_task(self.scan, 0) self.rawserver.add_task(self.stats, 0) # DHT if config["dht"] and self.listen_port: self.dht = Khashmir(config['bind'], self.listen_port, self.configdir.getDatabaseDir(), ipv6_enable = config['ipv6_enabled'], upnp = self.upnp_type, natpmp = config['natpmp']) self.dht.start() else: self.dht = None OPTION_PATTERN[63] = False # Run self.handler.listen_forever() # Shutdown self.Output.message('shutting down') self.hashcheck_queue = [] for hash in self.torrent_list: self.Output.message('dropped "'+self.torrent_cache[hash]['path']+'"') self.downloads[hash].shutdown() self.rawserver.shutdown() if self.dht: self.dht.close() except IOError: data = StringIO() print_exc(file = data) self.Output.exception(data.getvalue())