summaryrefslogtreecommitdiff
path: root/server/src/leap/soledad/server/application.py
diff options
context:
space:
mode:
Diffstat (limited to 'server/src/leap/soledad/server/application.py')
-rw-r--r--server/src/leap/soledad/server/application.py42
1 files changed, 34 insertions, 8 deletions
diff --git a/server/src/leap/soledad/server/application.py b/server/src/leap/soledad/server/application.py
index a9ebcaf6..17296425 100644
--- a/server/src/leap/soledad/server/application.py
+++ b/server/src/leap/soledad/server/application.py
@@ -1,6 +1,6 @@
# -*- coding: utf-8 -*-
# application.py
-# Copyright (C) 2013 LEAP
+# Copyright (C) 2016 LEAP
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@@ -14,6 +14,14 @@
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
+"""
+A WSGI application to serve as the root resource of the webserver.
+
+Use it like this:
+
+ twistd web --wsgi=leap.soledad.server.application.wsgi_application
+"""
+from twisted.internet import reactor
from leap.soledad.server import SoledadApp
from leap.soledad.server.auth import SoledadTokenAuthMiddleware
@@ -21,11 +29,11 @@ from leap.soledad.server.gzip_middleware import GzipMiddleware
from leap.soledad.server.config import load_configuration
from leap.soledad.common.backend import SoledadBackend
from leap.soledad.common.couch.state import CouchServerState
+from leap.soledad.common.log import getLogger
-# ----------------------------------------------------------------------------
-# Run as Twisted WSGI Resource
-# ----------------------------------------------------------------------------
+__all__ = ['wsgi_application']
+
def _load_config():
conf = load_configuration('/etc/soledad/soledad-server.conf')
@@ -40,8 +48,26 @@ def _get_couch_state():
return state
-_couch_state = _get_couch_state()
+_app = SoledadTokenAuthMiddleware(SoledadApp(None)) # delay state init
+wsgi_application = GzipMiddleware(_app)
+
+
+# During its initialization, the couch state verifies if all user databases
+# contain a config document with the correct couch schema version stored, and
+# will log an error and raise an exception if that is not the case.
+#
+# If this verification made too early (i.e. before the reactor has started and
+# the twistd web logging facilities have been setup), the logging will not
+# work. Because of that, we delay couch state initialization until the reactor
+# is running.
+
+def _init_couch_state(_app):
+ try:
+ _app.state = _get_couch_state()
+ except Exception as e:
+ logger = getLogger()
+ logger.error(str(e))
+ reactor.stop()
+
-# a WSGI application that may be used by `twistd -web`
-wsgi_application = GzipMiddleware(
- SoledadTokenAuthMiddleware(SoledadApp(_couch_state)))
+reactor.callWhenRunning(_init_couch_state, _app)