119 lines
4.0 KiB
Python
119 lines
4.0 KiB
Python
#!/usr/bin/env python3
|
|
import argparse
|
|
import yaml
|
|
from os import path, environ
|
|
import uvicorn
|
|
import logging
|
|
import asyncio
|
|
|
|
from core.config import CoreConfig
|
|
from core.aimedb import AimedbServlette
|
|
|
|
async def launch_main(cfg: CoreConfig, ssl: bool) -> None:
|
|
if ssl:
|
|
server_cfg = uvicorn.Config(
|
|
"core.app:app",
|
|
host=cfg.server.listen_address,
|
|
port=cfg.server.port if args.port == 0 else args.port,
|
|
reload=cfg.server.is_develop,
|
|
log_level="info" if cfg.server.is_develop else "critical",
|
|
ssl_version=3,
|
|
ssl_certfile=cfg.server.ssl_cert,
|
|
ssl_keyfile=cfg.server.ssl_key
|
|
)
|
|
else:
|
|
server_cfg = uvicorn.Config(
|
|
"core.app:app",
|
|
host=cfg.server.listen_address,
|
|
port=cfg.server.port if args.port == 0 else args.port,
|
|
reload=cfg.server.is_develop,
|
|
log_level="info" if cfg.server.is_develop else "critical"
|
|
)
|
|
server = uvicorn.Server(server_cfg)
|
|
await server.serve()
|
|
|
|
async def launch_billing(cfg: CoreConfig) -> None:
|
|
server_cfg = uvicorn.Config(
|
|
"core.allnet:app_billing",
|
|
host=cfg.server.listen_address,
|
|
port=cfg.billing.port,
|
|
reload=cfg.server.is_develop,
|
|
log_level="info" if cfg.server.is_develop else "critical",
|
|
ssl_version=3,
|
|
ssl_certfile=cfg.billing.ssl_cert,
|
|
ssl_keyfile=cfg.billing.ssl_key,
|
|
ssl_ciphers="DEFAULT:!aNULL:!eNULL:!MD5:!3DES:!DES:!RC4:!IDEA:!SEED:!aDSS:!SRP:!PSK",
|
|
)
|
|
server = uvicorn.Server(server_cfg)
|
|
await server.serve()
|
|
|
|
async def launch_frontend(cfg: CoreConfig) -> None:
|
|
server_cfg = uvicorn.Config(
|
|
"core.frontend:app",
|
|
host=cfg.server.listen_address,
|
|
port=cfg.frontend.port,
|
|
reload=cfg.server.is_develop,
|
|
log_level="info" if cfg.server.is_develop else "critical",
|
|
)
|
|
server = uvicorn.Server(server_cfg)
|
|
await server.serve()
|
|
|
|
async def launch_allnet(cfg: CoreConfig) -> None:
|
|
server_cfg = uvicorn.Config(
|
|
"core.allnet:app_allnet",
|
|
host=cfg.server.listen_address,
|
|
port=cfg.allnet.port,
|
|
reload=cfg.server.is_develop,
|
|
log_level="info" if cfg.server.is_develop else "critical",
|
|
)
|
|
server = uvicorn.Server(server_cfg)
|
|
await server.serve()
|
|
|
|
|
|
async def launcher(cfg: CoreConfig, ssl: bool) -> None:
|
|
task_list = [asyncio.create_task(launch_main(cfg, ssl))]
|
|
|
|
if cfg.billing.standalone:
|
|
task_list.append(asyncio.create_task(launch_billing(cfg)))
|
|
if cfg.frontend.enable:
|
|
task_list.append(asyncio.create_task(launch_frontend(cfg)))
|
|
if cfg.allnet.standalone:
|
|
task_list.append(asyncio.create_task(launch_allnet(cfg)))
|
|
if cfg.aimedb.enable:
|
|
AimedbServlette(cfg).start()
|
|
|
|
done, pending = await asyncio.wait(
|
|
task_list,
|
|
return_when=asyncio.FIRST_COMPLETED,
|
|
)
|
|
|
|
logging.getLogger("core").info("Shutdown")
|
|
for pending_task in pending:
|
|
pending_task.cancel("Another service died, server is shutting down")
|
|
|
|
if __name__ == "__main__":
|
|
parser = argparse.ArgumentParser(description="Artemis main entry point")
|
|
parser.add_argument(
|
|
"--config", "-c", type=str, default="config", help="Configuration folder"
|
|
)
|
|
parser.add_argument(
|
|
"--port", "-p", type=int, default=0, help="Port override"
|
|
)
|
|
parser.add_argument(
|
|
"--ssl", "-s", type=bool, help="Launch with SSL"
|
|
)
|
|
args = parser.parse_args()
|
|
|
|
if not path.exists(f"{args.config}/core.yaml"):
|
|
print(
|
|
f"The config folder you specified ({args.config}) does not exist or does not contain core.yaml. Defaults will be used.\nDid you copy the example folder?"
|
|
)
|
|
|
|
cfg: CoreConfig = CoreConfig()
|
|
if path.exists(f"{args.config}/core.yaml"):
|
|
cfg.update(yaml.safe_load(open(f"{args.config}/core.yaml")))
|
|
|
|
environ["ARTEMIS_CFG_DIR"] = args.config
|
|
|
|
asyncio.run(launcher(cfg, args.ssl))
|