def _rerequest(self, url, peerid):
     if self.config['ip']:
         try:
             url += '&ip=' + socket.gethostbyname(self.config['ip'])
         except:
             self.errorfunc(logging.WARNING,
                            _("Problem resolving config ip (%s), gethostbyname failed") % self.config['ip'],
                            exc_info=sys.exc_info())
     request = Request(url)
     request.add_header('User-Agent', 'BitTorrent/' + version)
     if self.config['tracker_proxy']:
         request.set_proxy(self.config['tracker_proxy'], 'http')
     try:
         h = urlopen(request)
         data = h.read()
         h.close()
     # urllib2 can raise various crap that doesn't have a common base
     # exception class especially when proxies are used, at least
     # ValueError and stuff from httplib
     except Exception, e:
         try:
             s = unicode(e.args[0])
         except:
             s = unicode(e)
         r = _("Problem connecting to tracker - %s: %s") % (e.__class__, s)
         def f():
             self._postrequest(errormsg=r, exc=e, peerid=peerid)
 def _rerequest(self, url, peerid):
     if self.config['ip']:
         url += '&ip=' + gethostbyname(self.config['ip'])
     request = Request(url)
     if self.config['tracker_proxy']:
         request.set_proxy(self.config['tracker_proxy'], 'http')
     try:
         h = urlopen(request)
         data = h.read()
         h.close()
     # urllib2 can raise various crap that doesn't have a common base
     # exception class especially when proxies are used, at least
     # ValueError and stuff from httplib
     except Exception, e:
         def f(r='Problem connecting to tracker - ' + str(e)):
             self._postrequest(errormsg=r, peerid=peerid)
Exemple #3
0
 def _rerequest(self, url, peerid):
     if self.config['ip']:
         url += '&ip=' + gethostbyname(self.config['ip'])
     request = Request(url)
     request.add_header('User-Agent', 'BitTorrent/' + version)
     if self.config['tracker_proxy']:
         request.set_proxy(self.config['tracker_proxy'], 'http')
     try:
         h = urlopen(request)
         data = h.read()
         h.close()
     # urllib2 can raise various crap that doesn't have a common base
     # exception class especially when proxies are used, at least
     # ValueError and stuff from httplib
     except Exception, e:
         def f(r='Problem connecting to tracker - ' + str(e)):
             self._postrequest(errormsg=r, peerid=peerid)
Exemple #4
0
class Rerequester(object):
    def __init__(self, url, config, sched, howmany, connect, externalsched,
                 amount_left, up, down, port, myid, infohash, errorfunc,
                 doneflag, upratefunc, downratefunc, ever_got_incoming,
                 diefunc, sfunc):
        self.baseurl = url
        self.infohash = infohash
        self.peerid = None
        self.wanted_peerid = myid
        self.port = port
        self.url = None
        self.config = config
        self.last = None
        self.trackerid = None
        self.announce_interval = 30 * 60
        self.sched = sched
        self.howmany = howmany
        self.connect = connect
        self.externalsched = externalsched
        self.amount_left = amount_left
        self.up = up
        self.down = down
        self.errorfunc = errorfunc
        self.doneflag = doneflag
        self.upratefunc = upratefunc
        self.downratefunc = downratefunc
        self.ever_got_incoming = ever_got_incoming
        self.diefunc = diefunc
        self.successfunc = sfunc
        self.finish = False
        self.current_started = None
        self.fail_wait = None
        self.last_time = None
        self.previous_down = 0
        self.previous_up = 0
        self.tracker_num_peers = None
        self.tracker_num_seeds = None

    def _makeurl(self, peerid, port):
        return ('%s?info_hash=%s&peer_id=%s&port=%s&key=%s' %
                (self.baseurl, quote(self.infohash), quote(peerid), str(port),
                 b2a_hex(''.join([chr(randrange(256)) for i in xrange(4)]))))

    def change_port(self, peerid, port):
        self.wanted_peerid = peerid
        self.port = port
        self.last = None
        self.trackerid = None
        self._check()

    def begin(self):
        if self.sched:
            self.sched(self.begin, 60)
            self._check()

    def announce_finish(self):
        self.finish = True
        self._check()

    def announce_stop(self):
        self._announce(2)

    def _check(self):
        if self.current_started is not None:
            if self.current_started <= bttime() - 58:
                self.errorfunc(
                    WARNING,
                    _("Tracker announce still not complete "
                      "%d seconds after starting it") %
                    int(bttime() - self.current_started))
            return
        if self.peerid is None:
            self.peerid = self.wanted_peerid
            self.url = self._makeurl(self.peerid, self.port)
            self._announce(0)
            return
        if self.peerid != self.wanted_peerid:
            self._announce(2)
            self.peerid = None
            self.previous_up = self.up()
            self.previous_down = self.down()
            return
        if self.finish:
            self.finish = False
            self._announce(1)
            return
        if self.fail_wait is not None:
            if self.last_time + self.fail_wait <= bttime():
                self._announce()
            return
        if self.last_time > bttime() - self.config['rerequest_interval']:
            return
        if self.ever_got_incoming():
            getmore = self.howmany() <= self.config['min_peers'] / 3
        else:
            getmore = self.howmany() < self.config['min_peers']
        if getmore or bttime() - self.last_time > self.announce_interval:
            self._announce()

    def _announce(self, event=None):
        self.current_started = bttime()
        s = ('%s&uploaded=%s&downloaded=%s&left=%s' %
             (self.url, str(self.up() - self.previous_up),
              str(self.down() - self.previous_down), str(self.amount_left())))
        if self.last is not None:
            s += '&last=' + quote(str(self.last))
        if self.trackerid is not None:
            s += '&trackerid=' + quote(str(self.trackerid))
        if self.howmany() >= self.config['max_initiate']:
            s += '&numwant=0'
        else:
            s += '&compact=1'
        if event is not None:
            s += '&event=' + ['started', 'completed', 'stopped'][event]
        t = Thread(target=self._rerequest, args=[s, self.peerid])
        t.setDaemon(True)
        t.start()

    # Must destroy all references that could cause reference circles
    def cleanup(self):
        self.sched = None
        self.howmany = None
        self.connect = None
        self.externalsched = lambda *args: None
        self.amount_left = None
        self.up = None
        self.down = None
        self.errorfunc = None
        self.upratefunc = None
        self.downratefunc = None
        self.ever_got_incoming = None
        self.diefunc = None
        self.successfunc = None

    def _rerequest(self, url, peerid):
        if self.config['ip']:
            try:
                url += '&ip=' + gethostbyname(self.config['ip'])
            except Exception, e:
                self.errorfunc(
                    WARNING,
                    _("Problem connecting to tracker, gethostbyname failed - ")
                    + str(e))
        request = Request(url)
        request.add_header('User-Agent', 'BitTorrent/' + version)
        if self.config['tracker_proxy']:
            request.set_proxy(self.config['tracker_proxy'], 'http')
        try:
            h = urlopen(request)
            data = h.read()
            h.close()

        # urllib2 can raise various crap that doesn't have a common base
        # exception class especially when proxies are used, at least
        # ValueError and stuff from httplib
        except Exception, e:

            def f(r=_("Problem connecting to tracker - ") + str(e)):
                self._postrequest(errormsg=r, peerid=peerid)