def __init__(self, config, rawserver): self.config = config self.response_size = config['tracker_response_size'] self.dfile = config['tracker_dfile'] self.natcheck = config['tracker_nat_check'] favicon = config['tracker_favicon'] self.parse_dir_interval = config['tracker_parse_dir_interval'] self.favicon = None if favicon: try: h = open(favicon, 'rb') self.favicon = h.read() h.close() except: print '**warning** specified favicon file -- %s -- does not exist.' % favicon self.rawserver = rawserver self.cached = {} self.cached_t = {} self.times = {} self.state = {} self.seedcount = {} self.allowed_IPs = None self.banned_IPs = None if config['tracker_allowed_ips'] or config['tracker_banned_ips']: self.allowed_ip_mtime = 0 self.banned_ip_mtime = 0 self.read_ip_lists() self.only_local_override_ip = config['tracker_only_local_override_ip'] if self.only_local_override_ip == 2: self.only_local_override_ip = not config['tracker_nat_check'] if exists(self.dfile): try: h = open(self.dfile, 'rb') if self.config['tracker_dfile_format'] == ITRACKDBFORMAT_BENCODE: ds = h.read() tempstate = bdecode(ds) else: tempstate = pickle.load(h) h.close() if not tempstate.has_key('peers'): tempstate = {'peers': tempstate} statefiletemplate(tempstate) self.state = tempstate except: print '**warning** statefile ' + self.dfile + ' corrupt; resetting' self.downloads = self.state.setdefault('peers', {}) self.completed = self.state.setdefault('completed', {}) self.becache = {} for infohash, ds in self.downloads.items(): self.seedcount[infohash] = 0 for x, y in ds.items(): ip = y['ip'] if self.allowed_IPs and not self.allowed_IPs.includes(ip) or self.banned_IPs and self.banned_IPs.includes(ip): del ds[x] continue if not y['left']: self.seedcount[infohash] += 1 if y.get('nat', -1): continue gip = y.get('given_ip') if is_valid_ip(gip) and (not self.only_local_override_ip or local_IPs.includes(ip)): ip = gip self.natcheckOK(infohash, x, ip, y['port'], y['left']) for x in self.downloads.keys(): self.times[x] = {} for y in self.downloads[x].keys(): self.times[x][y] = 0 self.trackerid = createPeerID('-T-') seed(self.trackerid) self.reannounce_interval = config['tracker_reannounce_interval'] self.save_dfile_interval = config['tracker_save_dfile_interval'] self.show_names = config['tracker_show_names'] rawserver.add_task(self.save_state, self.save_dfile_interval) self.prevtime = clock() self.timeout_downloaders_interval = config['tracker_timeout_downloaders_interval'] rawserver.add_task(self.expire_downloaders, self.timeout_downloaders_interval) self.logfile = None self.log = None if config['tracker_logfile'] and config['tracker_logfile'] != '-': try: self.logfile = config['tracker_logfile'] self.log = open(self.logfile, 'a') sys.stdout = self.log print '# Log Started: ', isotime() except: print '**warning** could not redirect stdout to log file: ', sys.exc_info()[0] if config['tracker_hupmonitor']: def huphandler(signum, frame, self = self): try: self.log.close() self.log = open(self.logfile, 'a') sys.stdout = self.log print '# Log reopened: ', isotime() except: print '**warning** could not reopen logfile' signal.signal(signal.SIGHUP, huphandler) self.allow_get = config['tracker_allow_get'] self.t2tlist = T2TList(config['tracker_multitracker_enabled'], self.trackerid, config['tracker_multitracker_reannounce_interval'], config['tracker_multitracker_maxpeers'], config['tracker_multitracker_http_timeout'], self.rawserver) if config['tracker_allowed_list']: if config['tracker_allowed_dir']: print '**warning** allowed_dir and allowed_list options cannot be used together' print '**warning** disregarding allowed_dir' config['tracker_allowed_dir'] = '' self.allowed = self.state.setdefault('allowed_list', {}) self.allowed_list_mtime = 0 self.parse_allowed() self.remove_from_state('allowed', 'allowed_dir_files') if config['tracker_multitracker_allowed'] == ITRACKMULTI_ALLOW_AUTODETECT: config['tracker_multitracker_allowed'] = ITRACKMULTI_ALLOW_NONE config['tracker_allowed_controls'] = 0 elif config['tracker_allowed_dir']: self.allowed = self.state.setdefault('allowed', {}) self.allowed_dir_files = self.state.setdefault('allowed_dir_files', {}) self.allowed_dir_blocked = {} self.parse_allowed() self.remove_from_state('allowed_list') else: self.allowed = None self.remove_from_state('allowed', 'allowed_dir_files', 'allowed_list') if config['tracker_multitracker_allowed'] == ITRACKMULTI_ALLOW_AUTODETECT: config['tracker_multitracker_allowed'] = ITRACKMULTI_ALLOW_NONE config['tracker_allowed_controls'] = 0 self.uq_broken = unquote('+') != ' ' self.keep_dead = config['tracker_keep_dead'] self.Filter = Filter(rawserver.add_task) aggregator = config['tracker_aggregator'] if aggregator == 0: self.is_aggregator = False self.aggregator_key = None else: self.is_aggregator = True if aggregator == 1: self.aggregator_key = None else: self.aggregator_key = aggregator self.natcheck = False send = config['tracker_aggregate_forward'] if not send: self.aggregate_forward = None else: try: self.aggregate_forward, self.aggregate_password = send except: self.aggregate_forward = send self.aggregate_password = None self.cachetime = 0 self.track_cachetimeupdate()
def __init__(self, infohash, metainfo, kvconfig, multihandler, get_extip_func, listenport, videoanalyserpath, vodfileindex, extra_vodfileindex, set_error_func, pstate, lmvodeventcallback, lmhashcheckcompletecallback): self.dow = None self.set_error_func = set_error_func self.videoinfo = None self.videostatus = None self.metainfo = metainfo self.dlmode = kvconfig['mode'] self.extra_vodfileindex = extra_vodfileindex self.lmvodeventcallback = lmvodeventcallback self.lmhashcheckcompletecallback = lmhashcheckcompletecallback self.logmsgs = [] self._hashcheckfunc = None self._getstatsfunc = None self.infohash = infohash self.b64_infohash = b64encode(infohash) self.repexer = None self.log_prefix = 'sd::' + binascii.hexlify(self.infohash) + ':' self.lock = Lock() self.download_id = binascii.hexlify(self.infohash) + '-' + str(long(time.time())) + '-' + str(random.randint(0, 100000)) try: self.dldoneflag = Event() self.dlrawserver = multihandler.newRawServer(infohash, self.dldoneflag) self.lmvodeventcallback = lmvodeventcallback if pstate is not None: self.hashcheckfrac = pstate['dlstate']['progress'] else: self.hashcheckfrac = 0.0 self.peerid = createPeerID() self.dow = BT1Download(self.hashcheckprogressfunc, self.finishedfunc, self.fatalerrorfunc, self.nonfatalerrorfunc, self.logerrorfunc, self.dldoneflag, kvconfig, metainfo, infohash, self.peerid, self.dlrawserver, get_extip_func, listenport, videoanalyserpath) file = self.dow.saveAs(self.save_as) if vodfileindex is not None: index = vodfileindex['index'] if index == -1: index = 0 outpathindex = self.dow.get_dest(index) vodfileindex['outpath'] = outpathindex self.videoinfo = vodfileindex if 'live' in metainfo['info']: authparams = metainfo['info']['live'] else: authparams = None self.videostatus = VideoStatus(metainfo['info']['piece length'], self.dow.files, vodfileindex, authparams) self.videoinfo['status'] = self.videostatus self.dow.set_videoinfo(vodfileindex, self.videostatus) if DEBUG: log(self.log_prefix + '__init__: setting vodfileindex', vodfileindex) if kvconfig['initialdlstatus'] == DLSTATUS_REPEXING: if pstate is not None and pstate.has_key('dlstate'): swarmcache = pstate['dlstate'].get('swarmcache', {}) else: swarmcache = {} self.repexer = RePEXer(self.infohash, swarmcache) else: self.repexer = None if pstate is None: resumedata = None else: resumedata = pstate['engineresumedata'] self._hashcheckfunc = self.dow.initFiles(resumedata=resumedata) except Exception as e: self.fatalerrorfunc(e)
def create_my_peer_id(my_listen_port): myid = createPeerID() myid = myid[:14] + pack('<H', my_listen_port) + myid[16:] return myid
def __init__(self, config, rawserver): self.config = config self.response_size = config['tracker_response_size'] self.dfile = config['tracker_dfile'] self.natcheck = config['tracker_nat_check'] favicon = config['tracker_favicon'] self.parse_dir_interval = config['tracker_parse_dir_interval'] self.favicon = None if favicon: try: h = open(favicon, 'rb') self.favicon = h.read() h.close() except: print '**warning** specified favicon file -- %s -- does not exist.' % favicon self.rawserver = rawserver self.cached = {} self.cached_t = {} self.times = {} self.state = {} self.seedcount = {} self.allowed_IPs = None self.banned_IPs = None if config['tracker_allowed_ips'] or config['tracker_banned_ips']: self.allowed_ip_mtime = 0 self.banned_ip_mtime = 0 self.read_ip_lists() self.only_local_override_ip = config['tracker_only_local_override_ip'] if self.only_local_override_ip == 2: self.only_local_override_ip = not config['tracker_nat_check'] if exists(self.dfile): try: h = open(self.dfile, 'rb') if self.config[ 'tracker_dfile_format'] == ITRACKDBFORMAT_BENCODE: ds = h.read() tempstate = bdecode(ds) else: tempstate = pickle.load(h) h.close() if not tempstate.has_key('peers'): tempstate = {'peers': tempstate} statefiletemplate(tempstate) self.state = tempstate except: print '**warning** statefile ' + self.dfile + ' corrupt; resetting' self.downloads = self.state.setdefault('peers', {}) self.completed = self.state.setdefault('completed', {}) self.becache = {} for infohash, ds in self.downloads.items(): self.seedcount[infohash] = 0 for x, y in ds.items(): ip = y['ip'] if self.allowed_IPs and not self.allowed_IPs.includes( ip) or self.banned_IPs and self.banned_IPs.includes( ip): del ds[x] continue if not y['left']: self.seedcount[infohash] += 1 if y.get('nat', -1): continue gip = y.get('given_ip') if is_valid_ip(gip) and (not self.only_local_override_ip or local_IPs.includes(ip)): ip = gip self.natcheckOK(infohash, x, ip, y['port'], y['left']) for x in self.downloads.keys(): self.times[x] = {} for y in self.downloads[x].keys(): self.times[x][y] = 0 self.trackerid = createPeerID('-T-') seed(self.trackerid) self.reannounce_interval = config['tracker_reannounce_interval'] self.save_dfile_interval = config['tracker_save_dfile_interval'] self.show_names = config['tracker_show_names'] rawserver.add_task(self.save_state, self.save_dfile_interval) self.prevtime = clock() self.timeout_downloaders_interval = config[ 'tracker_timeout_downloaders_interval'] rawserver.add_task(self.expire_downloaders, self.timeout_downloaders_interval) self.logfile = None self.log = None if config['tracker_logfile'] and config['tracker_logfile'] != '-': try: self.logfile = config['tracker_logfile'] self.log = open(self.logfile, 'a') sys.stdout = self.log print '# Log Started: ', isotime() except: print '**warning** could not redirect stdout to log file: ', sys.exc_info( )[0] if config['tracker_hupmonitor']: def huphandler(signum, frame, self=self): try: self.log.close() self.log = open(self.logfile, 'a') sys.stdout = self.log print '# Log reopened: ', isotime() except: print '**warning** could not reopen logfile' signal.signal(signal.SIGHUP, huphandler) self.allow_get = config['tracker_allow_get'] self.t2tlist = T2TList( config['tracker_multitracker_enabled'], self.trackerid, config['tracker_multitracker_reannounce_interval'], config['tracker_multitracker_maxpeers'], config['tracker_multitracker_http_timeout'], self.rawserver) if config['tracker_allowed_list']: if config['tracker_allowed_dir']: print '**warning** allowed_dir and allowed_list options cannot be used together' print '**warning** disregarding allowed_dir' config['tracker_allowed_dir'] = '' self.allowed = self.state.setdefault('allowed_list', {}) self.allowed_list_mtime = 0 self.parse_allowed() self.remove_from_state('allowed', 'allowed_dir_files') if config[ 'tracker_multitracker_allowed'] == ITRACKMULTI_ALLOW_AUTODETECT: config['tracker_multitracker_allowed'] = ITRACKMULTI_ALLOW_NONE config['tracker_allowed_controls'] = 0 elif config['tracker_allowed_dir']: self.allowed = self.state.setdefault('allowed', {}) self.allowed_dir_files = self.state.setdefault( 'allowed_dir_files', {}) self.allowed_dir_blocked = {} self.parse_allowed() self.remove_from_state('allowed_list') else: self.allowed = None self.remove_from_state('allowed', 'allowed_dir_files', 'allowed_list') if config[ 'tracker_multitracker_allowed'] == ITRACKMULTI_ALLOW_AUTODETECT: config['tracker_multitracker_allowed'] = ITRACKMULTI_ALLOW_NONE config['tracker_allowed_controls'] = 0 self.uq_broken = unquote('+') != ' ' self.keep_dead = config['tracker_keep_dead'] self.Filter = Filter(rawserver.add_task) aggregator = config['tracker_aggregator'] if aggregator == 0: self.is_aggregator = False self.aggregator_key = None else: self.is_aggregator = True if aggregator == 1: self.aggregator_key = None else: self.aggregator_key = aggregator self.natcheck = False send = config['tracker_aggregate_forward'] if not send: self.aggregate_forward = None else: try: self.aggregate_forward, self.aggregate_password = send except: self.aggregate_forward = send self.aggregate_password = None self.cachetime = 0 self.track_cachetimeupdate()
def create_my_peer_id(my_listen_port): myid = createPeerID() myid = myid[:16] + pack('<H', OLPROTO_VER_LOWEST) + pack('<H', OLPROTO_VER_CURRENT) myid = myid[:14] + pack('<H', my_listen_port) + myid[16:] return myid