]> git.ipfire.org Git - ipfire.org.git/blobdiff - www/webapp/handlers.py
Merge branch 'planet' into next
[ipfire.org.git] / www / webapp / handlers.py
index 71d8508810ce1b5165b42b2a8361273a7c80f755..1eb5b55be18b8080daa433f31b55073731b78fb5 100644 (file)
@@ -24,11 +24,12 @@ from info import info
 from mirrors import mirrors
 from news import news
 from releases import releases
+from torrent import tracker, bencode, bdecode, decode_hex
 
 import builds
+import menu
 import cluster
 import markdown
-import translations
 #import uriel
 
 class BaseHandler(tornado.web.RequestHandler):
@@ -56,7 +57,7 @@ class BaseHandler(tornado.web.RequestHandler):
        def render(self, *args, **kwargs):
                nargs = self.render_args
                nargs.update(kwargs)
-               nargs["title"] = "%s - %s" % (self.request.host, nargs["title"])
+               nargs["hostname"] = self.request.host
                tornado.web.RequestHandler.render(self, *args, **nargs)
 
        def link(self, s):
@@ -208,25 +209,6 @@ class UrielHandler(UrielBaseHandler):
                pass
 
 
-class ApiClusterInfoHandler(BaseHandler):
-       def get(self):
-               id = self.get_argument("id", "null")
-
-               c = cluster.Cluster(info["cluster"]["hostname"])
-
-               self.write(simplejson.dumps({
-                       "version": "1.1",
-                       "id": id,
-                       "result" : c.json,
-                       "error" : "null", }))
-               self.finish()
-
-
-class TranslationHandler(BaseHandler):
-       def get(self):
-               self.render("translations.html", projects=translations.projects)
-
-
 class SourceHandler(BaseHandler):
        def get(self):
                source_path = "/srv/sources"
@@ -322,6 +304,98 @@ class RSSHandler(BaseHandler):
                self.render("rss.xml", items=items, lang=lang)
 
 
+<<<<<<< HEAD
+class TrackerBaseHandler(tornado.web.RequestHandler):
+       def get_hexencoded_argument(self, name, all=False):
+               try:
+                       arguments = self.request.arguments[name]
+               except KeyError:
+                       return None
+
+               arguments_new = []
+               for argument in arguments:
+                       arguments_new.append(decode_hex(argument))
+
+               arguments = arguments_new
+
+               if all:
+                       return arguments
+
+               return arguments[0]
+
+       def send_tracker_error(self, error_message):
+               self.write(bencode({"failure reason" : error_message }))
+               self.finish()
+
+class TrackerAnnounceHandler(TrackerBaseHandler):
+       def get(self):
+               self.set_header("Content-Type", "text/plain")
+
+               info_hash = self.get_hexencoded_argument("info_hash")
+               if not info_hash:
+                       self.send_tracker_error("Your client forgot to send your torrent's info_hash.")
+                       return
+
+               peer = {
+                       "id" : self.get_hexencoded_argument("peer_id"),
+                       "ip" : self.get_argument("ip", None),
+                       "port" : self.get_argument("port", None),
+                       "downloaded" : self.get_argument("downloaded", 0),
+                       "uploaded" : self.get_argument("uploaded", 0),
+                       "left" : self.get_argument("left", 0),
+               }
+
+               event = self.get_argument("event", "")
+               if not event in ("started", "stopped", "completed", ""):
+                       self.send_tracker_error("Got unknown event")
+                       return
+
+               if peer["ip"]:
+                       if peer["ip"].startswith("10.") or \
+                               peer["ip"].startswith("172.") or \
+                               peer["ip"].startswith("192.168."):
+                               peer["ip"] = self.request.remote_ip
+
+               if peer["port"]:
+                       peer["port"] = int(peer["port"])
+
+                       if peer["port"] < 0 or peer["port"] > 65535:
+                               self.send_tracker_error("Port number is not in valid range")
+                               return
+
+               eventhandlers = {
+                       "started" : tracker.event_started,
+                       "stopped" : tracker.event_stopped,
+                       "completed" : tracker.event_completed,
+               }
+
+               if event:
+                       eventhandlers[event](info_hash, peer["id"])
+
+               tracker.update(hash=info_hash, **peer)
+
+               no_peer_id = self.get_argument("no_peer_id", False)
+               numwant = self.get_argument("numwant", tracker.numwant)
+
+               self.write(bencode({
+                       "tracker id" : tracker.id,
+                       "interval" : tracker.interval,
+                       "min interval" : tracker.min_interval,
+                       "peers" : tracker.get_peers(info_hash, limit=numwant,
+                               random=True, no_peer_id=no_peer_id),
+                       "complete" : tracker.complete(info_hash),
+                       "incomplete" : tracker.incomplete(info_hash),
+               }))
+               self.finish()
+
+
+class TrackerScrapeHandler(TrackerBaseHandler):
+       def get(self):
+               info_hashes = self.get_hexencoded_argument("info_hash", all=True)
+
+               self.write(bencode(tracker.scrape(hashes=info_hashes)))
+               self.finish()
+=======
 class PlanetBaseHandler(BaseHandler):
        @property
        def db(self):
@@ -371,3 +445,4 @@ class PlanetPostingHandler(PlanetBaseHandler):
                entry.author = user
 
                self.render("planet-posting.html", entry=entry, user=user)
+>>>>>>> planet