ticketfrei3/kibicara/kibicara.py

84 lines
2.7 KiB
Python
Raw Permalink Normal View History

2020-07-01 19:39:13 +00:00
# Copyright (C) 2020 by Thomas Lindner <tom@dl6tom.de>
# Copyright (C) 2020 by Cathy Hu <cathy.hu@fau.de>
# Copyright (C) 2020 by Martin Rey <martin.rey@mailbox.org>
2020-07-01 19:39:13 +00:00
#
# SPDX-License-Identifier: 0BSD
"""Entrypoint of Kibicara."""
2020-07-11 10:54:07 +00:00
2020-07-01 19:39:13 +00:00
from asyncio import run as asyncio_run
2020-10-13 08:35:20 +00:00
from logging import DEBUG, INFO, WARNING, basicConfig, getLogger
2020-07-01 19:39:13 +00:00
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
2020-07-01 19:39:13 +00:00
from fastapi.staticfiles import StaticFiles
from hypercorn.asyncio import serve
2020-10-13 08:35:20 +00:00
from hypercorn.config import Config
2020-07-15 14:46:13 +00:00
from kibicara.config import args, config
2020-07-01 19:39:13 +00:00
from kibicara.model import Mapping
from kibicara.platformapi import Spawner
from kibicara.webapi import router
logger = getLogger(__name__)
class Main:
"""Entrypoint for Kibicara.
2020-07-11 10:54:07 +00:00
Initializes the platform bots and starts the hypercorn webserver serving the
Kibicara application and the specified frontend on port 8000.
"""
2020-07-01 19:39:13 +00:00
def __init__(self):
2020-07-11 10:54:07 +00:00
asyncio_run(self.__run())
2020-07-01 19:39:13 +00:00
2020-07-11 10:54:07 +00:00
async def __run(self):
2020-07-15 14:46:13 +00:00
LOGLEVELS = {
None: WARNING,
1: INFO,
2: DEBUG,
}
basicConfig(
level=LOGLEVELS.get(args.verbose, DEBUG),
2020-10-13 08:12:35 +00:00
format='%(asctime)s %(name)s %(message)s',
2020-07-15 14:46:13 +00:00
)
2020-07-06 12:50:52 +00:00
getLogger('aiosqlite').setLevel(WARNING)
2020-07-01 19:39:13 +00:00
Mapping.create_all()
await Spawner.init_all()
2020-07-11 10:54:07 +00:00
await self.__start_webserver()
2020-07-01 19:39:13 +00:00
2020-07-11 10:54:07 +00:00
async def __start_webserver(self):
2020-07-01 19:39:13 +00:00
class SinglePageApplication(StaticFiles):
async def get_response(self, path, scope):
response = await super().get_response(path, scope)
if response.status_code == 404:
response = await super().get_response('.', scope)
return response
2020-07-01 19:39:13 +00:00
app = FastAPI()
server_config = Config()
server_config.accesslog = '-'
server_config.behind_proxy = config['behind_proxy']
2020-09-11 16:21:24 +00:00
server_config.keyfile = config['keyfile']
server_config.certfile = config['certfile']
2020-09-10 17:29:57 +00:00
if config['production']:
server_config.bind = ['0.0.0.0:8000', '[::]:8000']
2020-09-10 20:57:05 +00:00
api = FastAPI()
api.include_router(router)
app.mount('/api', api)
if not config['production'] and config['cors_allow_origin']:
app.add_middleware(
CORSMiddleware,
allow_origins=config['cors_allow_origin'],
allow_credentials=True,
2020-10-13 08:12:35 +00:00
allow_methods=['*'],
allow_headers=['*'],
)
2020-07-01 19:39:13 +00:00
if config['frontend_path'] is not None:
app.mount(
'/',
app=SinglePageApplication(directory=config['frontend_path'], html=True),
)
2020-07-01 19:39:13 +00:00
await serve(app, server_config)