summaryrefslogtreecommitdiff
path: root/qvisqve/app.py
blob: a1f19103c2760520cbb22440fe803c0fb6e9e77a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
# Copyright (C) 2017-2018  Lars Wirzenius
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero 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 Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.


import os


import apifw
import slog
import yaml


import qvisqve


DEFAULT_CONFIG_FILE = '/dev/null'


def dict_logger(log, stack_info=None):
    qvisqve.log.log(exc_info=stack_info, **log)


def read_config(filename):
    with open(filename) as f:
        return yaml.safe_load(f)


def check_config(cfg):
    for key in cfg:
        if cfg[key] is None:
            raise Exception('Configuration %s should not be None' % key)


_counter = slog.Counter()


def counter():
    new_context = 'HTTP transaction {}'.format(_counter.increment())
    qvisqve.log.set_context(new_context)


default_config = {
    'log': [],
    'token-issuer': None,
    'token-public-key': None,
    'token-private-key': None,
    'token-lifetime': None,
    'clients': None,
    'applications': None,
}


def create_app():
    config_filename = os.environ.get('QVISQVE_CONFIG', DEFAULT_CONFIG_FILE)
    actual_config = read_config(config_filename)
    config = dict(default_config)
    config.update(actual_config or {})
    if 'token-audience' not in config:
        config['token-audience'] = config.get('token-issuer')
    check_config(config)
    qvisqve.setup_logging(config)
    qvisqve.log.log('info', msg_text='Qvisqve starting')

    api = qvisqve.API(config)
    return apifw.create_bottle_application(api, counter, dict_logger, config)