Switch branches/tags
Nothing to show
Find file Copy path
Fetching contributors…
Cannot retrieve contributors at this time
executable file 101 lines (80 sloc) 3.92 KB
#! /usr/bin/env python-pyrocore
# -*- coding: utf-8 -*-
from pyrocore import config
from pyrocore.scripts import base
class StuckTrackers(base.ScriptBaseWithConfig):
List started items whose announces are stuck, i.e. where
last activity is older than the normal announce interval.
# argument description for the usage information
def add_options(self):
""" Add program options.
super(StuckTrackers, self).add_options()
# basic options
self.add_bool_option("-a", "--all",
help="list ALL items, not just stuck ones")
self.add_bool_option("-s", "--stuck-only",
help="list just stuck items / skip 'no enabled trackers' check")
self.add_bool_option("-t", "--to-tagged",
help="add stuck items to 'tagged' view")
def mainloop(self):
import time
from urlparse import urlparse
from collections import namedtuple, Counter
from pyrobase import fmt
from pyrocore.util import xmlrpc
proxy =
now = int(time.time())
fields = ('is_enabled is_busy url min_interval normal_interval'
' activity_time_last success_counter failed_counter scrape_counter').split()
t_multicall = namedtuple('multicall', fields)
rows = proxy.d.multicall('started', 'd.hash=', 't.multicall=,{}'.format(
','.join(['t.{}='.format(i) for i in fields])))
stuck = Counter()
view = 'tagged'
if self.options.to_tagged and view not in proxy.view.list():
proxy.view.add(xmlrpc.NOHASH, view)
print('{:>5s} {:>2s} {:>5s} {:>5s} {:>6s} {:>13s} {:40s} {}'
.format('S#', 'T#', 'OK', 'Error', 'Scrape', 'Last Announce',
'Infohash', 'Tracker Domain'))
for idx, (infohash, trackers) in enumerate(rows, 1):
trackers = [t_multicall(*t) for t in trackers]
if not any(t.is_enabled for t in trackers):
if self.options.stuck_only:
if self.options.to_tagged:
proxy.d.views.push_back_unique(infohash, view)
proxy.view.set_visible(infohash, view)
domain = 'ALL TRACKERS DISABLED' if trackers else 'NO TRACKERS'
stuck[domain] += 1
print('{i:5d} {n:>2s} {n:>5s} {n:>5s} {n:>5s} {delta:>13s} {hash} {domain}'
.format(i=idx, n='-', hash=infohash, delta='N/A', domain=domain))
for num, t in enumerate(trackers, 1):
if not t.is_enabled:
delta = now - t.activity_time_last
if self.options.all or delta > t.normal_interval:
if self.options.to_tagged:
proxy.d.views.push_back_unique(infohash, view)
proxy.view.set_visible(infohash, view)
domain = urlparse(t.url).netloc.split(':')[0]
stuck[domain] += 1
print('{i:5d} {n:2d} '
'{t.success_counter:5d} {t.scrape_counter:5d} {t.failed_counter:5d} '
'{delta} {hash} {domain}'
.format(t=t, i=idx, n=num, hash=infohash, domain=domain,
precision=2, short=True)))
if sum(stuck.values()):
if self.options.to_tagged:
proxy.ui.current_view.set(view)"Stuck items: TOTAL={}, {}".format(sum(stuck.values()),
', '.join(['{}={}'.format(*i) for i in stuck.most_common()])))
self.LOG.debug("XMLRPC stats: %s" % proxy)
if __name__ == "__main__":