#!/usr/bin/python
-import datetime
-import httplib
-import mimetypes
-import operator
+#import httplib
+#import logging
+#import markdown2
import os
-import simplejson
-import stat
-import sqlite3
-import time
-import urlparse
-
-import tornado.httpclient
-import tornado.locale
+#import random
+#import re
+#import socket
+#import time
+#import tornado.database
+#import tornado.locale
import tornado.web
+#import unicodedata
-from banners import banners
-from helpers import size, Item
-from info import info
-from mirrors import mirrors
-from news import news
-from releases import releases
-
-import builds
-import cluster
-import menu
-import translations
-#import uriel
-
-class BaseHandler(tornado.web.RequestHandler):
- def get_user_locale(self):
- uri = self.request.uri.split("/")
- if len(uri) > 1:
- for lang in tornado.locale.get_supported_locales(None):
- if lang[:2] == uri[1]:
- return tornado.locale.get(lang)
-
- @property
- def render_args(self):
- return {
- "banner" : banners.get(),
- "lang" : self.locale.code[:2],
- "langs" : [l[:2] for l in tornado.locale.get_supported_locales(None)],
- "lang_link" : self.lang_link,
- "link" : self.link,
- "title" : "no title given",
- "server" : self.request.host.replace("ipfire", "<span>ipfire</span>"),
- "uri" : self.request.uri,
- "year" : time.strftime("%Y"),
- }
-
- def render(self, *args, **kwargs):
- nargs = self.render_args
- nargs.update(kwargs)
- nargs["title"] = "%s - %s" % (self.request.host, nargs["title"])
- tornado.web.RequestHandler.render(self, *args, **nargs)
-
- def link(self, s):
- return "/%s/%s" % (self.locale.code[:2], s)
-
- def lang_link(self, lang):
- return "/%s/%s" % (lang, self.request.uri[4:])
-
- def get_error_html(self, status_code, **kwargs):
- if status_code in (404, 500):
- render_args = self.render_args
- render_args.update({
- "code" : status_code,
- "exception" : kwargs.get("exception", None),
- "message" : httplib.responses[status_code],
- })
- return self.render_string("error-%s.html" % status_code, **render_args)
- else:
- return tornado.web.RequestHandler.get_error_html(self, status_code, **kwargs)
-
- @property
- def hash_db(self):
- return self.application.hash_db
-
-class MainHandler(BaseHandler):
- def get(self):
- lang = self.locale.code[:2]
- self.redirect("/%s/index" % (lang))
+import backend
+from handlers_admin import *
+from handlers_base import *
+from handlers_download import *
+from handlers_mirrors import *
+from handlers_news import *
+from handlers_planet import *
+from handlers_stasy import *
+from handlers_tracker import *
-class DownloadHandler(BaseHandler):
- def get(self):
- self.render("downloads.html", release=releases.latest)
+class RootHandler(BaseHandler):
+ """
+ This handler redirects any request directly to /.
-class DownloadAllHandler(BaseHandler):
- def get(self):
- self.render("downloads-all.html", releases=releases)
+ It can be used to be compatible with some ancient index urls.
+ """
+ def get(self, *args):
+ self.redirect("/")
-class DownloadDevelopmentHandler(BaseHandler):
- def get(self):
- self.render("downloads-development.html", releases=releases)
+class LangCompatHandler(BaseHandler):
+ """
+ Redirect links in the old format to current site:
+ E.g. /en/index -> /index
+ """
+ def get(self, lang, page):
+ self.redirect("/%s" % page)
-class DownloadTorrentHandler(BaseHandler):
- tracker_url = "http://tracker.ipfire.org:6969/stats?format=txt&mode=tpbs"
- @tornado.web.asynchronous
+class IndexHandler(BaseHandler):
+ """
+ This handler displays the welcome page.
+ """
def get(self):
- http = tornado.httpclient.AsyncHTTPClient()
- http.fetch(self.tracker_url, callback=self.async_callback(self.on_response))
-
- def on_response(self, response):
- torrents = releases.torrents
- hashes = {}
- if response.code == 200:
- for line in response.body.split("\n"):
- if not line: continue
- hash, seeds, peers = line.split(":")
- hash.lower()
- hashes[hash] = {
- "peers" : peers,
- "seeds" : seeds,
- }
+ # Get a list of the most recent news items and put them on the page.
+ latest_news = self.news.get_latest(limit=1, locale=self.locale)
+ recent_news = self.news.get_latest(limit=2, locale=self.locale, offset=1)
- self.render("downloads-torrents.html",
- hashes=hashes,
- releases=torrents,
- request_time=response.request_time,
- tracker=urlparse.urlparse(response.request.url).netloc)
-
-
-class DownloadMirrorHandler(BaseHandler):
- def get(self):
- self.render("downloads-mirrors.html", mirrors=mirrors)
+ return self.render("index.html",
+ latest_news=latest_news, recent_news=recent_news)
class StaticHandler(BaseHandler):
+ """
+ This handler shows the files that are in plain html format.
+ """
@property
def static_path(self):
return os.path.join(self.application.settings["template_path"], "static")
if not name in self.static_files:
raise tornado.web.HTTPError(404)
- self.render("static/%s" % name)
-
-
-class IndexHandler(BaseHandler):
- def get(self):
- self.render("index.html", news=news)
-
-
-class NewsHandler(BaseHandler):
- def get(self):
- self.render("news.html", news=news)
-
-
-class BuildHandler(BaseHandler):
- def prepare(self):
- self.builds = {
- "<12h" : [],
- ">12h" : [],
- ">24h" : [],
- }
-
- for build in builds.find():
- if (time.time() - float(build.get("date"))) < 12*60*60:
- self.builds["<12h"].append(build)
- elif (time.time() - float(build.get("date"))) < 24*60*60:
- self.builds[">12h"].append(build)
- else:
- self.builds[">24h"].append(build)
-
- for l in self.builds.values():
- l.sort()
-
- def get(self):
- self.render("builds.html", builds=self.builds)
-
-
-class UrielBaseHandler(BaseHandler):
- #db = uriel.Database()
- pass
-
-class UrielHandler(UrielBaseHandler):
- def get(self):
- 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"
- fileobjects = []
-
- for dir, subdirs, files in os.walk(source_path):
- if not files:
- continue
- for file in files:
- if file in [f["name"] for f in fileobjects]:
- continue
-
- hash = self.hash_db.get_hash(os.path.join(dir, file))
-
- if not hash:
- hash = "0000000000000000000000000000000000000000"
-
- fileobjects.append({
- "dir" : dir[len(source_path)+1:],
- "name" : file,
- "hash" : hash,
- "size" : size(os.path.getsize(os.path.join(source_path, dir, file))),
- })
-
- fileobjects.sort(key=operator.itemgetter("name"))
-
- self.render("sources.html", files=fileobjects)
-
-
-class SourceDownloadHandler(BaseHandler):
- def head(self, path):
- self.get(path, include_body=False)
-
- def get(self, path, include_body=True):
- source_path = "/srv/sources"
-
- path = os.path.abspath(os.path.join(source_path, path[1:]))
-
- if not path.startswith(source_path):
- raise tornado.web.HTTPError(403)
- if not os.path.exists(path):
- raise tornado.web.HTTPError(404)
-
- stat_result = os.stat(path)
- modified = datetime.datetime.fromtimestamp(stat_result[stat.ST_MTIME])
-
- self.set_header("Last-Modified", modified)
- self.set_header("Content-Length", stat_result[stat.ST_SIZE])
-
- mime_type, encoding = mimetypes.guess_type(path)
- if mime_type:
- self.set_header("Content-Type", mime_type)
-
- hash = self.hash_db.get_hash(path)
- if hash:
- self.set_header("X-Hash-Sha1", "%s" % hash)
-
- if not include_body:
- return
- file = open(path, "r")
- try:
- self.write(file.read())
- finally:
- file.close()
-
-
-class DownloadFileHandler(BaseHandler):
- def get(self, path):
- for mirror in mirrors.with_file(path):
- if not mirror.reachable:
- continue
-
- self.redirect(mirror.url + path)
- return
-
- raise tornado.web.HTTPError(404)
-
- def get_error_html(self, status_code, **kwargs):
- return tornado.web.RequestHandler.get_error_html(self, status_code, **kwargs)
-
+ self.render("static/%s" % name, lang=self.locale.code[:2])
-class RSSHandler(BaseHandler):
- def get(self, lang):
- items = []
- for item in news.get(15):
- item = Item(**item.args.copy())
- for attr in ("subject", "content"):
- if type(item[attr]) == type({}):
- item[attr] = item[attr][lang]
- items.append(item)
- self.set_header("Content-Type", "application/rss+xml")
- self.render("rss.xml", items=items, lang=lang)