]>
git.ipfire.org Git - people/shoehn/ipfire.org.git/blob - webapp/handlers_tracker.py
6 from backend
.tracker
import bencode
, bdecode
, encode_hex
, decode_hex
7 from handlers_base
import *
10 class TrackerIndexHandler(BaseHandler
):
12 releases
= self
.releases
.get_all()
15 releases
= releases
[:limit
]
17 self
.render("tracker-torrents.html", releases
=releases
)
20 class TrackerDetailHandler(BaseHandler
):
21 def get(self
, torrent_hash
):
22 file = self
.releases
.get_file_for_torrent_hash(torrent_hash
)
25 raise tornado
.web
.HTTPError(404, "Could not find torrent file for hash: %s" % torrent_hash
)
27 peers
= self
.tracker
.get_peers(torrent_hash
)
28 seeds
= self
.tracker
.get_seeds(torrent_hash
)
30 self
.render("tracker-torrent-detail.html", release
=file.release
,
31 file=file, peers
=peers
, seeds
=seeds
)
34 class TrackerDownloadHandler(BaseHandler
):
35 def get(self
, torrent_hash
):
36 file = self
.releases
.get_file_for_torrent_hash(torrent_hash
)
39 raise tornado
.web
.HTTPError(404, "Could not find torrent file for hash: %s" % torrent_hash
)
41 # Redirect the user to the download redirector.
42 self
.redirect("http://downloads.ipfire.org/%s.torrent" % file.filename
)
45 class TrackerBaseHandler(BaseHandler
):
46 def get_hexencoded_argument(self
, name
, all
=False):
48 arguments
= self
.request
.arguments
[name
]
53 for argument
in arguments
:
54 arguments_new
.append(encode_hex(argument
))
56 arguments
= arguments_new
63 def send_tracker_error(self
, error_message
):
64 msg
= bencode({"failure reason" : error_message
})
68 class TrackerAnnounceHandler(TrackerBaseHandler
):
70 self
.set_header("Content-Type", "text/plain")
72 def get_ipv6_address(self
, default_port
):
73 # Get the external IP address of the client.
74 addr
= self
.get_remote_ip()
77 return addr
, default_port
80 ipv6
= self
.get_argument("ipv6", None)
84 m
= re
.match("^\[(.*)\]\:(\d)$", ipv6
)
86 ipv6
, port
= (m
.group(1), m
.group(2))
92 def get_ipv4_address(self
, default_port
):
93 # Get the external IP address of the client.
94 addr
= self
.get_remote_ip()
96 if addr
.startswith("172.28.1."):
97 addr
= "178.63.73.246"
100 return addr
, default_port
103 ipv4
= self
.get_argument("ipv4", None)
105 return ipv4
, default_port
107 ip
= self
.get_argument("ip", None)
109 return ip
, default_port
114 # Get the port and check it for sanity
115 port
= self
.get_argument("port", None)
120 if port
< 0 or port
> 65535:
122 except (TypeError, ValueError):
129 info_hash
= self
.get_hexencoded_argument("info_hash")
131 self
.send_tracker_error("Your client forgot to send your torrent's info_hash")
135 peer_id
= self
.get_hexencoded_argument("peer_id")
137 # Get the port and check it for sanity
138 port
= self
.get_port()
140 self
.send_tracker_error("Invalid port number or port number missing")
143 addr_ipv6
, port_ipv6
= self
.get_ipv6_address(port
)
144 addr_ipv4
, port_ipv4
= self
.get_ipv4_address(port
)
147 event
= self
.get_argument("event", None)
149 if not event
in ("started", "stopped", "completed"):
150 self
.send_tracker_error("Got unknown event")
153 self
.tracker
.handle_event(event
, peer_id
, info_hash
,
154 address6
=addr_ipv6
, port6
=port_ipv6
, address4
=addr_ipv4
, port4
=port_ipv4
)
157 "address6" : addr_ipv6
,
159 "address4" : addr_ipv4
,
161 "downloaded" : self
.get_argument("downloaded", 0),
162 "uploaded" : self
.get_argument("uploaded", 0),
163 "left_data" : self
.get_argument("left", 0),
166 self
.tracker
.update_peer(peer_id
, info_hash
, **peer_info
)
168 no_peer_id
= self
.get_argument("no_peer_id", False)
169 numwant
= self
.get_argument("numwant", self
.tracker
.numwant
)
171 peers
= self
.tracker
.get_peers(info_hash
, limit
=numwant
, no_peer_id
=no_peer_id
)
174 "tracker id" : self
.tracker
.tracker_id
,
175 "interval" : self
.tracker
.interval
,
176 "min interval" : self
.tracker
.min_interval
,
178 "complete" : self
.tracker
.complete(info_hash
),
179 "incomplete" : self
.tracker
.incomplete(info_hash
),
181 self
.finish(response
)
185 Cleanup after every request.
187 self
.tracker
.cleanup_peers()
190 class TrackerScrapeHandler(TrackerBaseHandler
):
192 info_hashes
= self
.get_hexencoded_argument("info_hash", all
=True)
194 response
= self
.tracker
.scrape(info_hashes
)
196 self
.finish(bencode(response
))