From c36736997b7c0a0e6cc2cbb426f49b486b78a171 Mon Sep 17 00:00:00 2001 From: RaNaN Date: Fri, 14 Dec 2012 18:43:03 +0100 Subject: cleaned setup --- module/web/ServerThread.py | 84 +++++++++++++++++++++++++++++----------------- module/web/setup_app.py | 13 ++++++- module/web/utils.py | 7 +++- 3 files changed, 72 insertions(+), 32 deletions(-) (limited to 'module/web') diff --git a/module/web/ServerThread.py b/module/web/ServerThread.py index bf5ba8373..b4854e1f4 100644 --- a/module/web/ServerThread.py +++ b/module/web/ServerThread.py @@ -1,32 +1,43 @@ #!/usr/bin/env python from __future__ import with_statement -from os.path import exists +from time import time, sleep -import os import threading import logging +from module.utils.fs import exists + core = None setup = None log = logging.getLogger("log") class WebServer(threading.Thread): - def __init__(self, pycore): - global core + def __init__(self, pycore=None, pysetup=None): + global core, setup threading.Thread.__init__(self) - self.core = pycore - core = pycore - self.running = True - self.server = pycore.config['webinterface']['server'] - self.https = pycore.config['webinterface']['https'] - self.cert = pycore.config["ssl"]["cert"] - self.key = pycore.config["ssl"]["key"] - self.host = pycore.config['webinterface']['host'] - self.port = pycore.config['webinterface']['port'] + + if pycore: + core = pycore + config = pycore.config + elif pysetup: + setup = pysetup + config = pysetup.config + else: + raise Exception("No config context provided") + + self.server = config['webinterface']['server'] + self.https = config['webinterface']['https'] + self.cert = config["ssl"]["cert"] + self.key = config["ssl"]["key"] + self.host = config['webinterface']['host'] + self.port = config['webinterface']['port'] + self.error = None self.setDaemon(True) def run(self): + self.running = True + import webinterface global webinterface @@ -56,42 +67,47 @@ class WebServer(threading.Thread): if self.server == "builtin": self.server = "threaded" - if self.server == "fastcgi": - self.start_fcgi() - elif self.server == "threaded": - self.start_threaded() - elif self.server == "lightweight": - self.start_lightweight() - else: - self.start_fallback() + try: + if self.server == "fastcgi": + self.start_fcgi() + elif self.server == "threaded": + self.start_threaded() + elif self.server == "lightweight": + self.start_lightweight() + else: + self.start_fallback() + except Exception, e: + log.error(_("Failed starting webserver: " + e.message)) + self.error = e + if core: + core.print_exc() def start_fallback(self): - if self.https: log.warning(_("This server offers no SSL, please consider using threaded instead")) - self.core.log.info(_("Starting builtin webserver: %(host)s:%(port)d") % {"host": self.host, "port": self.port}) + log.info(_("Starting builtin webserver: %(host)s:%(port)d") % {"host": self.host, "port": self.port}) webinterface.run_simple(host=self.host, port=self.port) def start_threaded(self): if self.https: - self.core.log.info(_("Starting threaded SSL webserver: %(host)s:%(port)d") % {"host": self.host, "port": self.port}) + log.info(_("Starting threaded SSL webserver: %(host)s:%(port)d") % {"host": self.host, "port": self.port}) else: self.cert = "" self.key = "" - self.core.log.info(_("Starting threaded webserver: %(host)s:%(port)d") % {"host": self.host, "port": self.port}) + log.info(_("Starting threaded webserver: %(host)s:%(port)d") % {"host": self.host, "port": self.port}) webinterface.run_threaded(host=self.host, port=self.port, cert=self.cert, key=self.key) def start_fcgi(self): - from flup.server.threadedserver import ThreadedServer + def noop(*args, **kwargs): pass ThreadedServer._installSignalHandlers = noop - self.core.log.info(_("Starting fastcgi server: %(host)s:%(port)d") % {"host": self.host, "port": self.port}) + log.info(_("Starting fastcgi server: %(host)s:%(port)d") % {"host": self.host, "port": self.port}) webinterface.run_fcgi(host=self.host, port=self.port) @@ -99,8 +115,16 @@ class WebServer(threading.Thread): if self.https: log.warning(_("This server offers no SSL, please consider using threaded instead")) - self.core.log.info(_("Starting lightweight webserver (bjoern): %(host)s:%(port)d") % {"host": self.host, "port": self.port}) + log.info( + _("Starting lightweight webserver (bjoern): %(host)s:%(port)d") % {"host": self.host, "port": self.port}) webinterface.run_lightweight(host=self.host, port=self.port) - def quit(self): - self.running = False + + # check if an error was raised for n seconds + def check_error(self, n=1): + t = time() + n + while time() < t: + if self.error: + return self.error + sleep(0.1) + diff --git a/module/web/setup_app.py b/module/web/setup_app.py index 055cb2a81..68da474bb 100644 --- a/module/web/setup_app.py +++ b/module/web/setup_app.py @@ -1,13 +1,24 @@ #!/usr/bin/env python # -*- coding: utf-8 -*- -from bottle import route, request, response, HTTPError +from bottle import route, request, response, HTTPError, redirect from webinterface import PROJECT_DIR, SETUP, env from utils import render_to_response +def setup_required(func): + def _view(*args, **kwargs): + + # setup needs to be running + if SETUP is None: + redirect("/nopermission") + + return func(*args, **kwargs) + return _view + @route("/setup") +@setup_required def setup(): return render_to_response('setup.html') diff --git a/module/web/utils.py b/module/web/utils.py index ba6a6a59e..236a9244e 100644 --- a/module/web/utils.py +++ b/module/web/utils.py @@ -19,7 +19,7 @@ import re from bottle import request, HTTPError, redirect, ServerAdapter -from webinterface import env, TEMPLATE, PYLOAD +from webinterface import env, TEMPLATE, PYLOAD, SETUP # TODO: useful but needs a rewrite, too def render_to_response(name, args={}, proc=[]): @@ -75,6 +75,11 @@ def is_mobile(): def login_required(perm=None): def _dec(func): def _view(*args, **kwargs): + + # In case of setup, no login methods can be accessed + if SETUP is not None: + redirect("/setup") + s = request.environ.get('beaker.session') api = get_user_api(s) if api is not None: -- cgit v1.2.3