def announce(self, event = 3, callback = lambda: None, specialurl = None):

        if specialurl is not None:
            s = self.url+'&uploaded=0&downloaded=0&left=1'   # don't add to statistics
            if self.howmany() >= self.maxpeers:
                s += '&numwant=0'
            else:
                s += '&no_peer_id=1&compact=1'
            self.last_failed = True         # force true, so will display an error
            self.special = specialurl
            self.rerequest(s, callback)
            return
        
        else:
            s = ('%s&uploaded=%s&downloaded=%s&left=%s' %
                (self.url, str(self.up()), str(self.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.maxpeers:
            s += '&numwant=0'
        else:
            s += '&no_peer_id=1&compact=1'
        if event != 3:
            s += '&event=' + ['started', 'completed', 'stopped'][event]
        if event == 2:
            self.stopped = True
        self.rerequest(s, callback)
Exemple #2
0
    def announce(self, event=3, callback=lambda: None, specialurl=None):

        if specialurl is not None:
            s = self.url + '&uploaded=0&downloaded=0&left=1'  # don't add to statistics
            if self.howmany() >= self.maxpeers:
                s += '&numwant=0'
            else:
                s += '&no_peer_id=1&compact=1'
            self.last_failed = True  # force true, so will display an error
            self.special = specialurl
            self.rerequest(s, callback)
            return

        else:
            s = ('%s&uploaded=%s&downloaded=%s&left=%s' %
                 (self.url, str(self.up()), str(
                     self.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.maxpeers:
            s += '&numwant=0'
        else:
            s += '&no_peer_id=1&compact=1'
        if event != 3:
            s += '&event=' + ['started', 'completed', 'stopped'][event]
        if event == 2:
            self.stopped = True
        self.rerequest(s, callback)
Exemple #3
0
    def announce(self, event=3, callback=lambda: None, specialurl=None):

        if specialurl is not None:
            s = self.url + "&uploaded=0&downloaded=0&left=1"  # don't add to statistics
            if self.howmany() >= self.maxpeers:
                s += "&numwant=0"
            else:
                s += "&no_peer_id=1&compact=1"
            self.last_failed = True  # force true, so will display an error
            self.special = specialurl
            self.rerequest(s, callback)
            return

        else:
            s = "%s&uploaded=%s&downloaded=%s&left=%s" % (
                self.url,
                str(self.up()),
                str(self.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.maxpeers:
            s += "&numwant=0"
        else:
            s += "&no_peer_id=1&compact=1"
        if event != 3:
            s += "&event=" + ["started", "completed", "stopped"][event]
        if event == 2:
            self.stopped = True
        self.rerequest(s, callback)
Exemple #4
0
    def __init__(self, trackerlist, interval, sched, howmany, minpeers, 
            connect, externalsched, amount_left, up, down,
            port, ip, myid, infohash, timeout, errorfunc, excfunc,
            maxpeers, doneflag, upratefunc, downratefunc,
            unpauseflag = fakeflag(True),
            seed_id = '', seededfunc = None, force_rapid_update = False ):

        self.excfunc = excfunc
        newtrackerlist = []        
        for tier in trackerlist:
            if len(tier)>1:
                shuffle(tier)
            newtrackerlist += [tier]
        self.trackerlist = newtrackerlist
        self.lastsuccessful = ''
        self.rejectedmessage = 'rejected by tracker - '
        
        self.url = ('?info_hash=%s&peer_id=%s&port=%s' %
            (quote(infohash), quote(myid), str(port)))
        self.ip = ip
        self.interval = interval
        self.last = None
        self.trackerid = None
        self.announce_interval = 30 * 60
        self.sched = sched
        self.howmany = howmany
        self.minpeers = minpeers
        self.connect = connect
        self.externalsched = externalsched
        self.amount_left = amount_left
        self.up = up
        self.down = down
        self.timeout = timeout
        self.errorfunc = errorfunc
        self.maxpeers = maxpeers
        self.doneflag = doneflag
        self.upratefunc = upratefunc
        self.downratefunc = downratefunc
        self.unpauseflag = unpauseflag
        if seed_id:
            self.url += '&seed_id='+quote(seed_id)
        self.seededfunc = seededfunc
        if seededfunc:
            self.url += '&check_seeded=1'
        self.force_rapid_update = force_rapid_update
        self.last_failed = True
        self.never_succeeded = True
        self.errorcodes = {}
        self.lock = SuccessLock()
        self.special = None
        self.stopped = False
        self.logger = logging.getLogger('{0}.{1}'.format(__name__, self.__class__.__name__))
    def __init__(self, trackerlist, interval, sched, howmany, minpeers, 
            connect, externalsched, amount_left, up, down,
            port, ip, myid, infohash, timeout, errorfunc, excfunc,
            maxpeers, doneflag, upratefunc, downratefunc,
            unpauseflag = fakeflag(True)):

        self.excfunc = excfunc
        newtrackerlist = []        
        for tier in trackerlist:
            if len(tier)>1:
                shuffle(tier)
            newtrackerlist += [tier]
        self.trackerlist = newtrackerlist
        self.lastsuccessful = ''
        self.rejectedmessage = 'rejected by tracker - '
        
        self.url = ('?info_hash=%s&peer_id=%s&port=%s' %
            (quote(infohash), quote(myid), str(port)))
        self.ip = ip
        self.interval = interval
        self.last = None
        self.trackerid = None
        self.announce_interval = 30 * 60
        self.sched = sched
        self.howmany = howmany
        self.minpeers = minpeers
        self.connect = connect
        self.externalsched = externalsched
        self.amount_left = amount_left
        self.up = up
        self.down = down
        self.timeout = timeout
        self.errorfunc = errorfunc
        self.maxpeers = maxpeers
        self.doneflag = doneflag
        self.upratefunc = upratefunc
        self.downratefunc = downratefunc
        self.unpauseflag = unpauseflag
        self.last_failed = True
        self.never_succeeded = True
        self.errorcodes = {}
        self.lock = SuccessLock()
        self.special = None
        self.stopped = False
Exemple #6
0
    def __init__(self,
                 trackerlist,
                 interval,
                 sched,
                 howmany,
                 minpeers,
                 connect,
                 externalsched,
                 amount_left,
                 up,
                 down,
                 port,
                 ip,
                 myid,
                 infohash,
                 timeout,
                 errorfunc,
                 excfunc,
                 maxpeers,
                 doneflag,
                 upratefunc,
                 downratefunc,
                 unpauseflag=fakeflag(True),
                 seed_id='',
                 seededfunc=None,
                 force_rapid_update=False):

        self.excfunc = excfunc
        newtrackerlist = []
        for tier in trackerlist:
            if len(tier) > 1:
                shuffle(tier)
            newtrackerlist += [tier]
        self.trackerlist = newtrackerlist
        self.lastsuccessful = ''
        self.rejectedmessage = 'rejected by tracker - '

        self.url = ('?info_hash=%s&peer_id=%s&port=%s' %
                    (quote(infohash), quote(myid), str(port)))
        self.ip = ip
        self.interval = interval
        self.last = None
        self.trackerid = None
        self.announce_interval = 30 * 60
        self.sched = sched
        self.howmany = howmany
        self.minpeers = minpeers
        self.connect = connect
        self.externalsched = externalsched
        self.amount_left = amount_left
        self.up = up
        self.down = down
        self.timeout = timeout
        self.errorfunc = errorfunc
        self.maxpeers = maxpeers
        self.doneflag = doneflag
        self.upratefunc = upratefunc
        self.downratefunc = downratefunc
        self.unpauseflag = unpauseflag
        if seed_id:
            self.url += '&seed_id=' + quote(seed_id)
        self.seededfunc = seededfunc
        if seededfunc:
            self.url += '&check_seeded=1'
        self.force_rapid_update = force_rapid_update
        self.last_failed = True
        self.never_succeeded = True
        self.errorcodes = {}
        self.lock = SuccessLock()
        self.special = None
        self.stopped = False
Exemple #7
0
    def __init__(
        self,
        port,
        myid,
        infohash,
        trackerlist,
        config,
        sched,
        externalsched,
        errorfunc,
        excfunc,
        connect,
        howmany,
        amount_left,
        up,
        down,
        upratefunc,
        downratefunc,
        doneflag,
        unpauseflag=fakeflag(True),
        seededfunc=None,
        force_rapid_update=False,
    ):

        self.sched = sched
        self.externalsched = externalsched
        self.errorfunc = errorfunc
        self.excfunc = excfunc
        self.connect = connect
        self.howmany = howmany
        self.amount_left = amount_left
        self.up = up
        self.down = down
        self.upratefunc = upratefunc
        self.downratefunc = downratefunc
        self.doneflag = doneflag
        self.unpauseflag = unpauseflag
        self.seededfunc = seededfunc
        self.force_rapid_update = force_rapid_update

        self.ip = config.get("ip", "")
        self.minpeers = config["min_peers"]
        self.maxpeers = config["max_initiate"]
        self.interval = config["rerequest_interval"]
        self.timeout = config["http_timeout"]

        newtrackerlist = []
        for tier in trackerlist:
            if len(tier) > 1:
                shuffle(tier)
            newtrackerlist += [tier]
        self.trackerlist = newtrackerlist

        self.lastsuccessful = ""
        self.rejectedmessage = "rejected by tracker - "

        self.url = "info_hash=%s&peer_id=%s" % (quote(infohash), quote(myid))
        if not config.get("crypto_allowed"):
            self.url += "&port="
        else:
            self.url += "&supportcrypto=1"
            if not config.get("crypto_only"):
                self.url += "&port="
            else:
                self.url += "&requirecrypto=1"
                if not config.get("crypto_stealth"):
                    self.url += "&port="
                else:
                    self.url += "&port=0&cryptoport="
        self.url += str(port)

        seed_id = config.get("dedicated_seed_id")
        if seed_id:
            self.url += "&seed_id=" + quote(seed_id)
        if self.seededfunc:
            self.url += "&check_seeded=1"

        self.last = None
        self.trackerid = None
        self.announce_interval = 30 * 60
        self.last_failed = True
        self.never_succeeded = True
        self.errorcodes = {}
        self.lock = SuccessLock()
        self.special = None
        self.stopped = False
Exemple #8
0
    def __init__(self,
                 port,
                 myid,
                 infohash,
                 trackerlist,
                 config,
                 sched,
                 externalsched,
                 errorfunc,
                 excfunc,
                 connect,
                 howmany,
                 amount_left,
                 up,
                 down,
                 upratefunc,
                 downratefunc,
                 doneflag,
                 unpauseflag=fakeflag(True),
                 seededfunc=None,
                 force_rapid_update=False):

        self.sched = sched
        self.externalsched = externalsched
        self.errorfunc = errorfunc
        self.excfunc = excfunc
        self.connect = connect
        self.howmany = howmany
        self.amount_left = amount_left
        self.up = up
        self.down = down
        self.upratefunc = upratefunc
        self.downratefunc = downratefunc
        self.doneflag = doneflag
        self.unpauseflag = unpauseflag
        self.seededfunc = seededfunc
        self.force_rapid_update = force_rapid_update

        self.ip = config.get('ip', '')
        self.minpeers = config['min_peers']
        self.maxpeers = config['max_initiate']
        self.interval = config['rerequest_interval']
        self.timeout = config['http_timeout']

        newtrackerlist = []
        for tier in trackerlist:
            if len(tier) > 1:
                shuffle(tier)
            newtrackerlist += [tier]
        self.trackerlist = newtrackerlist

        self.lastsuccessful = ''
        self.rejectedmessage = 'rejected by tracker - '

        self.url = ('info_hash=%s&peer_id=%s' % (quote(infohash), quote(myid)))
        if not config.get('crypto_allowed'):
            self.url += "&port="
        else:
            self.url += "&supportcrypto=1"
            if not config.get('crypto_only'):
                self.url += "&port="
            else:
                self.url += "&requirecrypto=1"
                if not config.get('crypto_stealth'):
                    self.url += "&port="
                else:
                    self.url += "&port=0&cryptoport="
        self.url += str(port)

        seed_id = config.get('dedicated_seed_id')
        if seed_id:
            self.url += '&seed_id=' + quote(seed_id)
        if self.seededfunc:
            self.url += '&check_seeded=1'

        self.last = None
        self.trackerid = None
        self.announce_interval = 30 * 60
        self.last_failed = True
        self.never_succeeded = True
        self.errorcodes = {}
        self.lock = SuccessLock()
        self.special = None
        self.stopped = False
Exemple #9
0
 def natchecklog(self, peerid, ip, port, result):
     year, month, day, hour, minute, second, a, b, c = localtime(time())
     print '%s - %s [%02d/%3s/%04d:%02d:%02d:%02d] "!natcheck-%s:%i" %i 0 - -' % (
         ip, quote(peerid), day, months[month], year, hour, minute, second,
         ip, port, result)
Exemple #10
0
    def get_infopage(self):
        try:
            if not self.config['show_infopage']:
                return (404, 'Not Found', {'Content-Type': 'text/plain', 'Pragma': 'no-cache'}, alas)
            red = self.config['infopage_redirect']
            if red != '':
                return (302, 'Found', {'Content-Type': 'text/html', 'Location': red},
                        '<A HREF="'+red+'">Click Here</A>')
            
            s = StringIO()
            s.write('<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">\n' \
                '<html><head><title>BitTorrent download info</title>\n')
            if self.favicon != None:
                s.write('<link rel="shortcut icon" href="/favicon.ico">\n')
            s.write('</head>\n<body>\n' \
                '<h3>BitTorrent download info</h3>\n'\
                '<ul>\n'
                '<li><strong>tracker version:</strong> %s</li>\n' \
                '<li><strong>server time:</strong> %s</li>\n' \
                '</ul>\n' % (version, isotime()))
            if self.allowed != None and self.show_names:
                names = [ (self.allowed[hash]['name'],hash)
                          for hash in self.downloads.keys() ]
            else:
                names = [ (None,hash) for hash in self.downloads.keys() ]
            if not names:
                s.write('<p>not tracking any files yet...</p>\n')
            else:
                names.sort()
                tn = 0
                tc = 0
                td = 0
                tt = 0  # Total transferred
                ts = 0  # Total size
                nf = 0  # Number of files displayed
                if self.allowed != None and self.show_names:
                    s.write('<table summary="files" border="1">\n' \
                        '<tr><th>info hash</th><th>torrent name</th><th align="right">size</th><th align="right">complete</th><th align="right">downloading</th><th align="right">downloaded</th><th align="right">transferred</th></tr>\n')
                else:
                    s.write('<table summary="files">\n' \
                        '<tr><th>info hash</th><th align="right">complete</th><th align="right">downloading</th><th align="right">downloaded</th></tr>\n')
                for name,hash in names:
                    l = self.downloads[hash]
                    n = self.completed.get(hash, 0)
                    tn = tn + n
                    c = self.seedcount[hash]
                    tc = tc + c
                    d = len(l) - c
                    td = td + d
                    if self.allowed != None and self.show_names:
                        if self.allowed.has_key(hash):
                            nf = nf + 1
                            sz = self.allowed[hash]['length']  # size
                            ts = ts + sz
                            szt = sz * n   # Transferred for this torrent
                            tt = tt + szt
                            if self.allow_get == 1:
                                linkname = '<a href="/file?info_hash=' + quote(hash) + '">' + name + '</a>'
                            else:
                                linkname = name
                            s.write('<tr><td><code>%s</code></td><td>%s</td><td align="right">%s</td><td align="right">%i</td><td align="right">%i</td><td align="right">%i</td><td align="right">%s</td></tr>\n' \
                                % (b2a_hex(hash), linkname, size_format(sz), c, d, n, size_format(szt)))
                    else:
                        s.write('<tr><td><code>%s</code></td><td align="right"><code>%i</code></td><td align="right"><code>%i</code></td><td align="right"><code>%i</code></td></tr>\n' \
                            % (b2a_hex(hash), c, d, n))
                ttn = 0
                for i in self.completed.values():
                    ttn = ttn + i
                if self.allowed != None and self.show_names:
                    s.write('<tr><td align="right" colspan="2">%i files</td><td align="right">%s</td><td align="right">%i</td><td align="right">%i</td><td align="right">%i/%i</td><td align="right">%s</td></tr>\n'
                            % (nf, size_format(ts), tc, td, tn, ttn, size_format(tt)))
                else:
                    s.write('<tr><td align="right">%i files</td><td align="right">%i</td><td align="right">%i</td><td align="right">%i/%i</td></tr>\n'
                            % (nf, tc, td, tn, ttn))
                s.write('</table>\n' \
                    '<ul>\n' \
                    '<li><em>info hash:</em> SHA1 hash of the "info" section of the metainfo (*.torrent)</li>\n' \
                    '<li><em>complete:</em> number of connected clients with the complete file</li>\n' \
                    '<li><em>downloading:</em> number of connected clients still downloading</li>\n' \
                    '<li><em>downloaded:</em> reported complete downloads (total: current/all)</li>\n' \
                    '<li><em>transferred:</em> torrent size * total downloaded (does not include partial transfers)</li>\n' \
                    '</ul>\n')

            s.write('</body>\n' \
                '</html>\n')
            return (200, 'OK', {'Content-Type': 'text/html; charset=iso-8859-1'}, s.getvalue())
        except:
            print_exc()
            return (500, 'Internal Server Error', {'Content-Type': 'text/html; charset=iso-8859-1'}, 'Server Error')