Пример #1
0
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
Пример #2
0
    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())
Пример #3
0
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
Пример #4
0
    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())
Пример #5
0
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)
Пример #6
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()
Пример #7
0
    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']))
Пример #8
0
    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())
Пример #9
0
    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']))
Пример #10
0
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
Пример #11
0
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
Пример #12
0
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()
Пример #13
0
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
Пример #14
0
                    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
Пример #16
0
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
Пример #17
0
    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)
Пример #18
0
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()
Пример #19
0
    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()
Пример #20
0
   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
Пример #21
0
   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
Пример #22
0
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
Пример #23
0
    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()
Пример #24
0
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
Пример #25
0
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
Пример #27
0
    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())