diff options
Diffstat (limited to 'module/web')
| -rw-r--r-- | module/web/ServerThread.py | 84 | ||||
| -rw-r--r-- | module/web/setup_app.py | 13 | ||||
| -rw-r--r-- | module/web/utils.py | 7 | 
3 files changed, 72 insertions, 32 deletions
| 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: | 
