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)
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)
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)
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
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
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
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
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)
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')