コード例 #1
0
ファイル: murder_client.py プロジェクト: Nathanator/Herd
                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, 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')
コード例 #2
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()
コード例 #3
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()
コード例 #4
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