src/web/blog.py \
src/web/download.py \
src/web/handlers.py \
- src/web/handlers_admin.py \
src/web/handlers_base.py \
src/web/handlers_boot.py \
src/web/handlers_fireinfo.py \
+++ /dev/null
-{% extends "admin-base.html" %}
-
-{% block content %}
- <div id="post">
- <h3>{{ _("Account Administrator") }}</h3>
-
- {{ user.realname }}
- </div>
-{% end %}
+++ /dev/null
-{% extends "admin-base.html" %}
-
-{% block content %}
- <div id="post">
- <h3>{{ _("Account Administrator") }}</h3>
-
- <p>
- <a href="/accounts/create">{{ _("Create new account") }}</a>
- </p>
-
- <table>
- <tr>
- <th>{{ _("Name (Nickname)") }}</th>
- <th> </th>
- </tr>
- {% for account in accounts %}
- <tr>
- <td>{{ account.cn }} ({{ account.uid }})</td>
- <td>
- <a href="/accounts/edit/{{ account.uid }}">{{ _("Edit") }}</a>
- <a href="/accounts/delete/{{ account.uid }}">{{ _("Delete") }}</a>
- </td>
- </tr>
- {% end %}
- </table>
- </div>
-{% end %}
+++ /dev/null
-{% extends "admin-downloads-base.html" %}
-
-{% block content %}
- <div id="post">
- <h3>{{ _("Download statistics") }}</h3>
-
- <h4>{{ _("Mirror load from today") }}</h4>
- {% module FireinfoTable(mirror_load_today, sortby="percentage") %}
-
- <h4>{{ _("Mirror load") }}</h4>
- {% module FireinfoTable(mirror_load_total, sortby="percentage") %}
- </div>
-{% end %}
+++ /dev/null
-{% extends "base.html" %}
-
-{% block body %}
- <div id="post">
- <h3>{{ _("Download statistics") }}</h3>
-
- <h4>{{ _("Download counters") }}</h4>
- <table>
- <tr>
- <td>{{ _("Today") }}</td>
- <td>{{ downloads_today }}</td>
- </tr>
- <tr>
- <td>{{ _("Yesterday") }}</td>
- <td>{{ downloads_yesterday }}</td>
- </tr>
- <tr>
- <td>{{ _("Total") }}</td>
- <td>{{ downloads_total }}</td>
- </tr>
- </table>
-
- <h4>{{ _("Downloads by country") }}</h4>
- {% module FireinfoGeoTable(downloads_locations_today) %}
- {% module FireinfoGeoTable(downloads_locations_total) %}
- </div>
-{% end %}
+++ /dev/null
-{% extends "base.html" %}
-
-{% block body %}
- <div id="post">
- <h3>{{ _("Admin Area") }}</h3>
- </div>
-{% end %}
+++ /dev/null
-{% extends "admin-base.html" %}
-
-{% block content %}
- <div class="post">
- <h3>{{ _("Create new mirror") }}</h3>
- <form name="mirror" method="post">
- {% raw xsrf_form_html() %}
- <input type="hidden" name="id" value="{{ mirror.id }}">
-
- <table>
- <tr>
- <td>{{ _("Hostname") }}</td>
- <td><input type="text" name="hostname" value="{{ mirror.hostname }}" /></td>
- </tr>
- <tr>
- <td>{{ _("Path") }}</td>
- <td><input type="text" name="path" value="{{ mirror.path }}" /></td>
- </tr>
- <tr>
- <td>{{ _("Owner") }}</td>
- <td><input type="text" name="owner" value="{{ mirror.owner }}" /></td>
- </tr>
- <tr>
- <td>{{ _("Location") }}</td>
- <td><input type="text" name="location" value="{{ mirror.location }}" /></td>
- </tr>
- <tr>
- <td>{{ _("File mirror") }}</td>
- <td>
- <select name="releases">
- <option value="Y" {% if mirror.releases == "Y" %}selected{% end %}>{{ _("yes") }}</option>
- <option value="N" {% if mirror.releases == "N" %}selected{% end %}>{{ _("no") }}</option>
- </select>
- </td>
- </tr>
- <tr>
- <td>{{ _("Pakfire 2 mirror") }}</td>
- <td>
- <select name="pakfire2">
- <option value="Y" {% if mirror.pakfire2 == "Y" %}selected{% end %}>{{ _("yes") }}</option>
- <option value="N" {% if mirror.pakfire2 == "N" %}selected{% end %}>{{ _("no") }}</option>
- </select>
- </td>
- </tr>
- <tr>
- <td>{{ _("Pakfire 3 mirror") }}</td>
- <td>
- <select name="pakfire3">
- <option value="Y" {% if mirror.pakfire3 == "Y" %}selected{% end %}>{{ _("yes") }}</option>
- <option value="N" {% if mirror.pakfire3 == "N" %}selected{% end %}>{{ _("no") }}</option>
- </select>
- </td>
- </tr>
- <tr>
- <td>{{ _("Disabled?") }}</td>
- <td>
- <select name="disabled">
- <option value="Y" {% if mirror.disabled == "Y" %}selected{% end %}>{{ _("yes") }}</option>
- <option value="N" {% if mirror.disabled == "N" %}selected{% end %}>{{ _("no") }}</option>
- </select>
- </td>
- </tr>
- <tr>
- <td colspan="2">
- <input type="submit" value="{{ _("Save") }}" />
- </td>
- </tr>
- </table>
- </form>
- </div>
-{% end block %}
+++ /dev/null
-{% extends "admin-base.html" %}
-
-{% block content %}
- <div class="post">
- <h3>{{ mirror.hostname }} - {{ _("Details") }}</h3>
-
- <p>
- <a href="/mirrors">{{ _("All mirrors") }}</a>
- </p>
-
- <table>
- <tr>
- <td>{{ _("Hostname") }}</td>
- <td><a href="{{ mirror.url }}" target="_blank">{{ mirror.url }}</a></td>
- </tr>
- <tr>
- <td>{{ _("Status") }}</td>
- <td>{{ mirror.state }}</td>
- </tr>
- <tr>
- <td>{{ _("Owner") }}</td>
- <td>{{ mirror.owner }}</td>
- </tr>
- <tr>
- <td>{{ _("Location") }}</td>
- <td>{{ mirror.location }}</td>
- </tr>
- <tr>
- <td>{{ _("GeoIP Location") }}</td>
- <td>{{ mirror.country_code }}</td>
- </tr>
- <tr>
- <td>{{ _("File mirror") }}</td>
- <td>{{ mirror.releases }}</td>
- </tr>
- <tr>
- <td>{{ _("Pakfire 2 mirror") }}</td>
- <td>{{ mirror.pakfire2 }}</td>
- </tr>
- <tr>
- <td>{{ _("Pakfire 3 mirror") }}</td>
- <td>{{ mirror.pakfire3 }}</td>
- </tr>
- <tr>
- <td>{{ _("Disabled?") }}</td>
- <td>{{ mirror.disabled }}</td>
- </tr>
- </table>
-
- {% if mirror.releases == "Y" %}
- <h4>{{ _("Filelist") }}</h4>
- <table class="filelist">
- {% for file in mirror.filelist %}
- <tr>
- <td>{{ file }}</td>
- </tr>
- {% end %}
- </table>
- {% end %}
- </div>
-{% end block %}
+++ /dev/null
-{% extends "admin-base.html" %}
-
-{% block content %}
- <div id="post">
- <h3>{{ _("Mirror Administrator") }}</h3>
-
- <p>
- <a href="/mirrors/create">{{ _("Create new mirror") }}</a> |
- <a href="/mirrors/update">{{ _("Re-check now") }}</a>
- </p>
-
- <table>
- <tr>
- <th>{{ _("Hostname") }}</th>
- <th>{{ _("Last update") }}</th>
- <th> </th>
- </tr>
- {% for mirror in mirrors %}
- <tr class="mirror-{{ mirror.state.lower() }}">
- <td>{{ mirror.hostname }}</td>
- <td>{{ locale.format_date(mirror.last_update) }}</td>
- <td>
- <a href="/mirrors/details/{{ mirror.id }}">{{ _("Details") }}</a>
- <a href="/mirrors/edit/{{ mirror.id }}">{{ _("Edit") }}</a>
- <a href="/mirrors/delete/{{ mirror.id }}">{{ _("Delete") }}</a>
- </td>
- </tr>
- {% end %}
- </table>
- </div>
-{% end %}
+++ /dev/null
-{% extends "base.html" %}
-
-{% block body %}
- <div class="page-header">
- <h2>{{ _("Compose new entry") }}</h2>
- </div>
-
- <form class="form-horizontal" action="" method="POST" name="entry">
- {% raw xsrf_form_html() %}
-
- {% if entry %}
- <input type="hidden" name="id" value="{{ entry.id }}">
- {% end %}
-
- <div class="form-group">
- <label class="control-label col-sm-2" for="inputTitle">{{ _("Title") }}</label>
- <div class="col-sm-10">
- <input class="form-control" type="text" name="title" id="inputTitle"
- {% if entry %}value="{{ entry.title }}"{% end %} placeholder="{{ _("Title") }}">
- </div>
- </div>
-
- <div class="form-group">
- <div class="col-sm-10 col-sm-offset-2">
- <textarea class="form-control" name="markdown" rows="12" id="inputMarkdown"
- placeholder="{{ _("Content") }}">{% if entry %}{{ entry.markdown }}{% end %}</textarea>
- </div>
- </div>
-
- <hr>
-
- <div class="form-group">
- <label class="control-label col-sm-2">{{ _("Status") }}</label>
- <div class="col-sm-10">
- <label class="radio inline">
- <input type="radio" name="status" value="draft" {% if not entry or not entry.is_published() %}checked{% end %}>
- {{ _("Draft") }}
- </label>
- <label class="radio inline">
- <input type="radio" name="status" value="published" {% if entry and entry.is_published() %}checked{% end %}>
- {{ _("Published") }}
- </label>
- </div>
- </div>
-
- <hr>
-
- <div class="col-sm-10 col-sm-offset-2">
- <button type="submit" class="btn btn-primary">{{ _("Save") }}</button>
- <a class="btn btn-default" href="javascript:preview();">{{ _("Preview") }}</a>
- <a class="btn btn-default" href="/planet">{{ _("Cancel") }}</a>
- </div>
- </form>
-
- <br class="separator">
-
- <div id="preview"></div>
-
- <script type="text/javascript">
- preview = function() {
- $.postJSON("/api/planet/render", { text : $("#inputMarkdown").val() },
- function(data) {
- $("#preview").html(data.html);
- }
- );
- }
- </script>
-{% end block %}
+++ /dev/null
-{% extends "base.html" %}
-
-{% block body %}
- <div id="post">
- <h3>{{ _("Planet Administrator") }}</h3>
-
- <p>
- <a href="/planet/compose">{{ _("Compose new entry") }}</a>
- </p>
-
- <table>
- <tr>
- <th>{{ _("Author") }}</th>
- <th>{{ _("Title") }}</th>
- <th> </th>
- </tr>
- {% for entry in entries %}
- <tr>
- <td>
- {{ entry.author.name }}
- </td>
- <td>
- <a href="https://planet.ipfire.org/post/{{ entry.slug }}" target="_blank">{{ entry.title }}</a>
- {% if entry.is_draft() %}
- <span class="label label-warning">{{ _("Draft") }}</span>
- {% end %}
- </td>
- <td>
- <a href="/planet/edit/{{ entry.slug }}">{{ _("Edit") }}</a>
- {% if entry.is_draft() %}
- • <a href="/planet/publish/{{ entry.slug }}">{{ _("Publish") }}</a>
- {% end %}
- </td>
- </tr>
- {% end %}
- </table>
- </div>
-{% end %}
<li class="nav-item">
<a class="nav-link {% if request.path == "/get-involved" %}active{% end %}" href="/get-involved">{{ _("Community") }}</a>
</li>
-
- {% elif hostname == "admin.ipfire.org" %}
- <li class="nav-item">
- <a class="nav-link" href="/fireinfo">{{ _("Fireinfo") }}</a>
- </li>
- <li class="nav-item">
- <a class="nav-link" href="/downloads">{{ _("Downloads") }}</a>
- </li>
{% elif hostname in ("downloads.ipfire.org", "download.ipfire.org") %}
<li class="nav-item">
<a class="nav-link" href="https://mirrors.ipfire.org">{{ _("Mirrors") }}</a>
</a>
</li>
</ul>
-{% elif hostname in ("admin.ipfire.org", "nopaste.ipfire.org", "talk.ipfire.org") %}
+{% elif hostname in ("nopaste.ipfire.org", "talk.ipfire.org") %}
<ul class="nav navbar-nav navbar-right">
<li class="nav-item">
<a class="nav-link" href="/login">
(r"/avatar/(\w+)\.jpg", accounts.AvatarHandler),
])
- # admin.ipfire.org
- self.add_handlers(r"admin(\.dev)?\.ipfire\.org", [
- (r"/", AdminIndexHandler),
- # Accounts
- (r"/accounts", AdminAccountsHandler),
- #(r"/accounts/delete/([0-9]+)", AdminAccountsDeleteHandler),
- #(r"/accounts/edit/([0-9]+)", AdminAccountsEditHandler),
- # Planet
- (r"/planet", AdminPlanetHandler),
- (r"/planet/compose", AdminPlanetComposeHandler),
- (r"/planet/edit/(.*)", AdminPlanetEditHandler),
- (r"/planet/publish/(.*)", AdminPlanetPublishHandler),
- # Mirrors
- (r"/mirrors", AdminMirrorsHandler),
- (r"/mirrors/create", AdminMirrorsCreateHandler),
- (r"/mirrors/delete/([0-9]+)", AdminMirrorsDeleteHandler),
- (r"/mirrors/edit/([0-9]+)", AdminMirrorsEditHandler),
- (r"/mirrors/details/([0-9]+)", AdminMirrorsDetailsHandler),
- (r"/mirrors/update", AdminMirrorsUpdateHandler),
- # Fireinfo
- (r"/fireinfo", AdminFireinfoHandler),
- # Downloads
- (r"/downloads", AdminDownloadsHandler),
- (r"/downloads/mirrors", AdminDownloadsMirrorsHandler),
- # API
- (r"/api/planet/render", AdminApiPlanetRenderMarkupHandler)
- ] + authentication_handlers)
-
# ipfire.org
self.add_handlers(r"ipfire\.org", [
(r".*", tornado.web.RedirectHandler, { "url" : "https://www.ipfire.org" })
import tornado.web
#import unicodedata
-from .handlers_admin import *
from .handlers_base import *
from .handlers_boot import *
from .handlers_fireinfo import *
+++ /dev/null
-#!/usr/bin/python
-
-import datetime
-import tornado.web
-
-from .handlers_base import *
-
-class AdminBaseHandler(BaseHandler):
- pass
-
-
-class AdminIndexHandler(AdminBaseHandler):
- @tornado.web.authenticated
- def get(self):
- self.render("admin-index.html")
-
-
-class AdminApiPlanetRenderMarkupHandler(AdminBaseHandler):
- @tornado.web.authenticated
- def post(self):
- text = self.get_argument("text", "")
-
- # Render markup
- output = {
- "html" : self.planet.render(text),
- }
- self.finish(output)
-
-
-class AdminPlanetHandler(AdminBaseHandler):
- @tornado.web.authenticated
- def get(self):
- entries = self.planet.get_entries(status=None, limit=50)
-
- self.render("admin-planet.html", entries=entries)
-
-
-class AdminPlanetComposeHandler(AdminBaseHandler):
- @tornado.web.authenticated
- def get(self, slug=None):
- entry = None
-
- if slug:
- entry = self.planet.get_entry_by_slug(slug)
- if not entry:
- raise tornado.web.HTTPError(404)
-
- self.render("admin-planet-compose.html", entry=entry)
-
- @tornado.web.authenticated
- def post(self):
- title = self.get_argument("title")
- markdown = self.get_argument("markdown")
-
- status = self.get_argument("status", "draft")
- assert status in ("draft", "published")
-
- entry = self.planet.create(title=title, markdown=markdown,
- author=self.current_user, status=status)
-
- self.redirect("/planet")
-
-
-class AdminPlanetEditHandler(AdminPlanetComposeHandler):
- @tornado.web.authenticated
- def post(self, slug):
- entry = self.planet.get_entry_by_slug(slug)
- if not entry:
- raise tornado.web.HTTPError(404)
-
- entry.title = self.get_argument("title")
- entry.markdown = self.get_argument("markdown")
-
- entry.status = self.get_argument("status", "draft")
-
- self.redirect("/planet")
-
-
-class AdminPlanetPublishHandler(AdminBaseHandler):
- @tornado.web.authenticated
- def get(self, slug):
- entry = self.planet.get_entry_by_slug(slug)
- if not entry:
- raise tornado.web.HTTPError(404)
-
- entry.status = "published"
- entry.published = datetime.datetime.utcnow()
-
- self.redirect("/planet")
-
-
-class AdminAccountsBaseHandler(AdminBaseHandler):
- pass
-
-
-class AdminAccountsHandler(AdminAccountsBaseHandler):
- @tornado.web.authenticated
- def get(self):
- accounts = self.accounts.list()
- self.render("admin-accounts.html", accounts=accounts)
-
-
-class AdminAccountsEditHandler(AdminAccountsBaseHandler):
- @tornado.web.authenticated
- def get(self, id):
- account = self.accounts.search(id)
- if not account:
- raise tornado.web.HTTPError(404)
-
- self.render("admin-accounts-edit.html", account=account)
-
-
-class AdminAccountsDeleteHandler(AdminAccountsBaseHandler):
- @tornado.web.authenticated
- def get(self, id):
- account = self.accounts.search(id)
- if not account:
- raise tornado.web.HTTPError(404)
-
- self.accounts.delete(id)
- self.redirect("/accounts")
-
-
-class AdminMirrorsBaseHandler(AdminBaseHandler):
- pass
-
-
-class AdminMirrorsHandler(AdminMirrorsBaseHandler):
- @tornado.web.authenticated
- def get(self):
- mirrors = self.mirrors.get_all()
-
- self.render("admin-mirrors.html", mirrors=mirrors)
-
-
-class AdminMirrorsUpdateHandler(AdminMirrorsBaseHandler):
- @tornado.web.authenticated
- def get(self):
- self.mirrors.check_all()
- self.redirect("/mirrors")
-
-
-class AdminMirrorsCreateHandler(AdminMirrorsBaseHandler):
- @tornado.web.authenticated
- def get(self, id=None):
- if id:
- mirror = self.db.get("SELECT * FROM mirrors WHERE id = %s", id)
- else:
- mirror = tornado.database.Row(
- id="",
- hostname="",
- owner="",
- location="",
- path="/",
- releases="Y",
- pakfire2="Y",
- pakfire3="Y",
- disabled="N"
- )
-
- self.render("admin-mirrors-create.html", mirror=mirror)
-
- @tornado.web.authenticated
- def post(self, id=None):
- args = tornado.database.Row()
- for key in ("id", "hostname", "owner", "location", "path", "releases",
- "pakfire2", "pakfire3", "disabled"):
- args[key] = self.get_argument(key, "")
-
- if args.id:
- if not self.mirrors.get(args.id):
- raise tornado.web.HTTPError(404)
-
- #self.db.execute("""UPDATE mirrors SET
- # hostname = %s, owner = %s, location = %s, path = %s, mirror = %s,
- # pakfire2 = %s, pakfire3 = %s, disabled = %s
- # WHERE id = %s""", args.hostname, args.owner, args.location,
- # args.path, args.mirror, args.pakfire2, args.pakfire3, args.disabled,
- # args.id)
- self.db.update("mirrors", args.id, **args)
-
- else:
- #self.db.execute("""INSERT INTO
- # mirrors(hostname, owner, location, path, mirror, pakfire2, pakfire3, disabled)
- # VALUES(%s, %s, %s, %s, %s, %s, %s, %s)""", args.hostname, args.owner,
- # args.location, args.path, args.mirror, args.pakfire2, args.pakfire3, args.disabled)
- self.db.insert("mirrors", **args)
-
- # Update database information
- self.mirrors.check_all()
-
- self.redirect("/mirrors")
-
-
-class AdminMirrorsEditHandler(AdminMirrorsCreateHandler):
- pass
-
-
-class AdminMirrorsDeleteHandler(AdminMirrorsBaseHandler):
- @tornado.web.authenticated
- def get(self, id):
- self.db.execute("DELETE FROM mirrors WHERE id=%s", id)
- self.db.execute("DELETE FROM mirror_files WHERE mirror=%s", id)
- self.redirect("/mirrors")
-
-
-class AdminMirrorsDetailsHandler(AdminMirrorsBaseHandler):
- @tornado.web.authenticated
- def get(self, id):
- mirror = self.mirrors.get(id)
- if not mirror:
- raise tornado.web.HTTPError(404)
-
- self.render("admin-mirrors-details.html", mirror=mirror)
-
-
-class AdminDownloadsHandler(AdminBaseHandler):
- @tornado.web.authenticated
- def get(self):
- self.render("admin-downloads.html",
- downloads_total = self.downloads.total,
- downloads_today = self.downloads.today,
- downloads_yesterday = self.downloads.yesterday,
- downloads_locations_today = self.downloads.get_countries("today"),
- downloads_locations_total = self.downloads.get_countries(),
- )
-
-
-class AdminDownloadsMirrorsHandler(AdminBaseHandler):
- @tornado.web.authenticated
- def get(self):
- self.render("admin-downloads-mirrors.html",
- mirror_load_total = self.downloads.get_mirror_load(),
- mirror_load_today = self.downloads.get_mirror_load("today"),
- )