]>
git.ipfire.org Git - people/shoehn/ipfire.org.git/blob - www/webapp/handlers_tracker.py
5 from backend
.tracker
import bencode
, bdecode
, decode_hex
6 from handlers_base
import *
9 class TrackerIndexHandler(BaseHandler
):
11 hashes
= self
.tracker
.hashes
14 for release
in self
.releases
.list():
15 if not release
.torrent_hash
:
18 if release
.torrent_hash
in hashes
:
19 torrents
.append(tornado
.database
.Row({
20 "name" : release
.name
,
21 "hash" : release
.torrent_hash
.lower(),
22 "peers" : self
.tracker
.incomplete(release
.torrent_hash
),
23 "seeds" : self
.tracker
.complete(release
.torrent_hash
),
26 self
.render("tracker-torrents.html", torrents
=torrents
)
29 class TrackerDetailHandler(BaseHandler
):
32 for r
in self
.releases
.list():
33 if not r
.torrent_hash
:
36 if r
.torrent_hash
.lower() == hash.lower():
41 raise tornado
.web
.HTTPError(404)
43 torrent
= tornado
.database
.Row({
44 "peers" : self
.tracker
.get_peers(hash),
45 "seeds" : self
.tracker
.get_seeds(hash),
48 self
.render("tracker-torrent-detail.html", release
=release
, torrent
=torrent
)
51 #class TrackerTorrentsHandler(BaseHandler):
59 # for release in self.releases.get_all():
60 # if not release.torrent_hash:
63 # release.torrent_hash = release.torrent_hash.lower()
65 # release.torrent_peers = self.tracker.incomplete(release.torrent_hash)
66 # release.torrent_seeds = self.tracker.complete(release.torrent_hash)
68 # releases.append(release)
70 # self.render("tracker-torrents.html", releases=releases)
73 class TrackerBaseHandler(tornado
.web
.RequestHandler
):
76 return backend
.Tracker()
78 def get_hexencoded_argument(self
, name
, all
=False):
80 arguments
= self
.request
.arguments
[name
]
85 for argument
in arguments
:
86 arguments_new
.append(decode_hex(argument
))
88 arguments
= arguments_new
95 def send_tracker_error(self
, error_message
):
96 self
.write(bencode({"failure reason" : error_message
}))
100 class TrackerAnnounceHandler(TrackerBaseHandler
):
102 self
.set_header("Content-Type", "text/plain")
104 info_hash
= self
.get_hexencoded_argument("info_hash")
106 self
.send_tracker_error("Your client forgot to send your torrent's info_hash.")
110 "id" : self
.get_hexencoded_argument("peer_id"),
111 "ip" : self
.request
.remote_ip
,
112 "port" : self
.get_argument("port", None),
113 "downloaded" : self
.get_argument("downloaded", 0),
114 "uploaded" : self
.get_argument("uploaded", 0),
115 "left" : self
.get_argument("left", 0),
118 event
= self
.get_argument("event", "")
119 if not event
in ("started", "stopped", "completed", ""):
120 self
.send_tracker_error("Got unknown event")
124 peer
["port"] = int(peer
["port"])
126 if peer
["port"] < 0 or peer
["port"] > 65535:
127 self
.send_tracker_error("Port number is not in valid range")
131 "started" : self
.tracker
.event_started
,
132 "stopped" : self
.tracker
.event_stopped
,
133 "completed" : self
.tracker
.event_completed
,
137 eventhandlers
[event
](info_hash
, peer
["id"])
139 self
.tracker
.update(hash=info_hash
, **peer
)
141 no_peer_id
= self
.get_argument("no_peer_id", False)
142 numwant
= self
.get_argument("numwant", self
.tracker
.numwant
)
145 "tracker id" : self
.tracker
.id,
146 "interval" : self
.tracker
.interval
,
147 "min interval" : self
.tracker
.min_interval
,
148 "peers" : self
.tracker
.get_peers(info_hash
, limit
=numwant
,
149 random
=True, no_peer_id
=no_peer_id
),
150 "complete" : self
.tracker
.complete(info_hash
),
151 "incomplete" : self
.tracker
.incomplete(info_hash
),
156 class TrackerScrapeHandler(TrackerBaseHandler
):
158 info_hashes
= self
.get_hexencoded_argument("info_hash", all
=True)
160 self
.write(bencode(self
.tracker
.scrape(hashes
=info_hashes
)))