42 lines
1.2 KiB
Python
42 lines
1.2 KiB
Python
from __future__ import annotations
|
|
|
|
import atexit
|
|
import logging
|
|
|
|
from flask import Flask
|
|
|
|
from .config import AppConfig, load_config
|
|
from .routes import register_routes
|
|
from .scheduler import StatusScheduler
|
|
from .storage import Storage
|
|
|
|
|
|
def create_app(config: AppConfig | None = None) -> Flask:
|
|
app_config = config or load_config()
|
|
storage = Storage(app_config.db_path, app_config.node_id_prefix)
|
|
scheduler = StatusScheduler(storage, app_config)
|
|
|
|
app = Flask(__name__)
|
|
app.config["APP_CONFIG"] = app_config
|
|
app.config["STORAGE"] = storage
|
|
app.config["SCHEDULER"] = scheduler
|
|
|
|
register_routes(app, storage, scheduler, app_config)
|
|
|
|
scheduler.start()
|
|
|
|
def _cleanup() -> None:
|
|
logging.getLogger("argus.master").info("Shutting down master app")
|
|
try:
|
|
scheduler.stop()
|
|
except Exception: # pragma: no cover - defensive
|
|
logging.getLogger("argus.master").exception("Failed to stop scheduler")
|
|
try:
|
|
storage.close()
|
|
except Exception: # pragma: no cover - defensive
|
|
logging.getLogger("argus.master").exception("Failed to close storage")
|
|
|
|
atexit.register(_cleanup)
|
|
|
|
return app
|