diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/leap/soledad/server/app.py | 122 | ||||
| -rw-r--r-- | src/leap/soledad/server/server.tac | 100 | 
2 files changed, 123 insertions, 99 deletions
| diff --git a/src/leap/soledad/server/app.py b/src/leap/soledad/server/app.py new file mode 100644 index 00000000..4129ec95 --- /dev/null +++ b/src/leap/soledad/server/app.py @@ -0,0 +1,122 @@ +# -*- coding: utf-8 -*- +# app.py +# Copyright (C) 2017 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 +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. +""" +Soledad Server, as a Twisted Application. +""" +import sys +import os + +from twisted.application import service, strports +from twisted.web import server + +from leap.soledad.common.couch.check import check_schema_versions +from leap.soledad.common.log import getLogger +from leap.soledad.server import entrypoints +from leap.soledad.server import get_config + + +logger = getLogger(__name__) + + +# +# necessary checks +# + +def check_env(local_port, public_port): +    if local_port == public_port: +        logger.error("LOCAL_SERVICES_PORT and HTTPS_PORT can't be the same!") +        sys.exit(20) + +    if public_port is None and not os.getenv('DEBUG_SERVER'): +        logger.error("HTTPS_PORT env var is required to be set!") +        sys.exit(20) + + +def check_conf(conf): +    path = conf['blobs_path'] +    blobs_not_empty = bool(os.path.exists(path) and os.listdir(path)) +    if not conf['blobs'] and blobs_not_empty: +        message = """ +**  WARNING: Blobs is disabled, but blobs directory isn't empty.          ** +**  If it was previously enabled, disabling can cause data loss due blobs ** +**  documents not being accessible to users.                              ** +**  Blobs directory: %s +**  REFUSING TO START. Please double check your configuration.            ** +    """ +        logger.error(message % path) +        sys.exit(20) + + +# +# service creation functions +# + +def create_local_service(port, application): +    logger.info('Starting local Services HTTP API') +    desc = 'tcp:%s:interface=127.0.0.1' % port +    site = server.Site(entrypoints.ServicesEntrypoint()) +    service = strports.service(desc, site) +    service.setServiceParent(application) + + +def get_tls_service_description(port): +    privateKey = os.getenv('PRIVKEY_PATH', '/etc/soledad/soledad-server.key') +    certKey = os.getenv('CERT_PATH', '/etc/soledad/soledad-server.pem') +    sslmethod = os.getenv('SSL_METHOD', 'SSLv23_METHOD') +    desc = ':'.join([ +        'ssl', +        'port=' + str(port), +        'privateKey=' + privateKey, +        'certKey=' + certKey, +        'sslmethod=' + sslmethod]) +    return desc + + +def create_public_service(port, application): +    logger.info('Starting public Users HTTP API') +    if port: +        desc = get_tls_service_description(port) +    else: +        logger.warn('Using plain HTTP on public Users API.') +        desc = 'tcp:port=2424:interface=0.0.0.0' + +    site = server.Site(entrypoints.UsersEntrypoint()) +    service = strports.service(desc, site) +    service.setServiceParent(application) + + +def create_services(local_port, public_port, application): +    create_local_service(local_port, application) +    create_public_service(public_port, application) + + +# +# the application +# + +def run(application): +    local_port = os.getenv('LOCAL_SERVICES_PORT', 2525) +    public_port = os.getenv('HTTPS_PORT', None) +    conf = get_config() +    check_env(local_port, public_port) +    check_conf(conf) +    d = check_schema_versions(conf['couch_url']) +    d.addCallback(lambda _: create_services(local_port, public_port, +                                            application)) + + +application = service.Application('soledad-server') diff --git a/src/leap/soledad/server/server.tac b/src/leap/soledad/server/server.tac index 5ab4d6b6..8bf6642e 100644 --- a/src/leap/soledad/server/server.tac +++ b/src/leap/soledad/server/server.tac @@ -14,107 +14,9 @@  #  # You should have received a copy of the GNU General Public License  # along with this program. If not, see <http://www.gnu.org/licenses/>. -import sys -import os - -from twisted.application import service, strports -from twisted.web import server - -from leap.soledad.common.couch.check import check_schema_versions -from leap.soledad.common.log import getLogger -from leap.soledad.server import entrypoints -from leap.soledad.server import get_config - - -logger = getLogger(__name__) - - -# -# necessary checks -# - -def check_env(local_port, public_port): -    if local_port == public_port: -        logger.error("LOCAL_SERVICES_PORT and HTTPS_PORT can't be the same!") -        sys.exit(20) - -    if public_port is None and not os.getenv('DEBUG_SERVER'): -        logger.error("HTTPS_PORT env var is required to be set!") -        sys.exit(20) - - -def check_conf(conf): -    path = conf['blobs_path'] -    blobs_not_empty = bool(os.path.exists(path) and os.listdir(path)) -    if not conf['blobs'] and blobs_not_empty: -        message = """ -**  WARNING: Blobs is disabled, but blobs directory isn't empty.          ** -**  If it was previously enabled, disabling can cause data loss due blobs ** -**  documents not being accessible to users.                              ** -**  Blobs directory: %s -**  REFUSING TO START. Please double check your configuration.            ** -    """ -        logger.error(message % path) -        sys.exit(20) - -  # -# service creation functions  # -def create_local_service(port, application): -    logger.info('Starting local Services HTTP API') -    desc = 'tcp:%s:interface=127.0.0.1' % port -    site = server.Site(entrypoints.ServicesEntrypoint()) -    service = strports.service(desc, site) -    service.setServiceParent(application) - - -def get_tls_service_description(port): -    privateKey = os.getenv('PRIVKEY_PATH', '/etc/soledad/soledad-server.key') -    certKey = os.getenv('CERT_PATH', '/etc/soledad/soledad-server.pem') -    sslmethod = os.getenv('SSL_METHOD', 'SSLv23_METHOD') -    desc = ':'.join([ -        'ssl', -        'port=' + str(port), -        'privateKey=' + privateKey, -        'certKey=' + certKey, -        'sslmethod=' + sslmethod]) -    return desc - - -def create_public_service(port, application): -    logger.info('Starting public Users HTTP API') -    if port: -        desc = get_tls_service_description(port) -    else: -        logger.warn('Using plain HTTP on public Users API.') -        desc = 'tcp:port=2424:interface=0.0.0.0' - -    site = server.Site(entrypoints.UsersEntrypoint()) -    service = strports.service(desc, site) -    service.setServiceParent(application) - - -def create_services(local_port, public_port, application): -    create_local_service(local_port, application) -    create_public_service(public_port, application) - - -# -# the application -# - -def run(application): -    local_port = os.getenv('LOCAL_SERVICES_PORT', 2525) -    public_port = os.getenv('HTTPS_PORT', None) -    conf = get_config() -    check_env(local_port, public_port) -    check_conf(conf) -    d = check_schema_versions(conf['couch_url']) -    d.addCallback(lambda _: create_services(local_port, public_port, -                                            application)) - +from leap.soledad.server.app import run, application -application = service.Application('soledad-server')  run(application) | 
