summaryrefslogtreecommitdiffstats
path: root/module/web
diff options
context:
space:
mode:
authorGravatar RaNaN <Mast3rRaNaN@hotmail.de> 2012-12-14 18:43:03 +0100
committerGravatar RaNaN <Mast3rRaNaN@hotmail.de> 2012-12-14 18:43:03 +0100
commitc36736997b7c0a0e6cc2cbb426f49b486b78a171 (patch)
treef9588cac0b9f931dfbe733d49eb68ded9f602587 /module/web
parentmerge setup to default (diff)
downloadpyload-c36736997b7c0a0e6cc2cbb426f49b486b78a171.tar.xz
cleaned setup
Diffstat (limited to 'module/web')
-rw-r--r--module/web/ServerThread.py84
-rw-r--r--module/web/setup_app.py13
-rw-r--r--module/web/utils.py7
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: