75 lines
2.2 KiB
Python
75 lines
2.2 KiB
Python
# -*- coding: utf-8 -*-
|
|
|
|
from __future__ import annotations
|
|
|
|
import logging as lg
|
|
from typing import TYPE_CHECKING
|
|
|
|
from flask import Flask
|
|
from flask_login import LoginManager
|
|
from flask_socketio import SocketIO
|
|
|
|
from judas_server.web.user import load_user
|
|
|
|
if TYPE_CHECKING:
|
|
from judas_server.backend import BackendServer
|
|
|
|
|
|
class JudasWebServer:
|
|
def __init__(self, backend: BackendServer, secret_key: str) -> None:
|
|
self.logger: lg.Logger = lg.getLogger(
|
|
f"{__name__}.{self.__class__.__name__}"
|
|
)
|
|
self.logger.debug("Initializing JudasWebServer...")
|
|
|
|
self.backend: BackendServer = backend
|
|
|
|
self.app: Flask = Flask(
|
|
__name__, static_folder="static", template_folder="templates"
|
|
)
|
|
self.app.secret_key = secret_key
|
|
|
|
self.app.config["WEB_SERVER"] = self
|
|
self.app.config["BACKEND"] = self.backend
|
|
|
|
# hard-code password
|
|
self.app.config["PASSWORD"] = "123"
|
|
|
|
# extensions
|
|
self.login_manager: LoginManager = LoginManager()
|
|
|
|
self.socketio: SocketIO = SocketIO(self.app, cors_allowed_origins="*")
|
|
|
|
self.configure_extensions()
|
|
self.init_routes()
|
|
|
|
def configure_extensions(self) -> None:
|
|
self.logger.debug("Configuring extensions...")
|
|
self.login_manager.init_app(self.app)
|
|
self.login_manager.user_loader(load_user)
|
|
self.login_manager.login_view = "auth.login"
|
|
|
|
# TODO: add login page
|
|
|
|
def init_routes(self) -> None:
|
|
self.logger.debug("Initializing routes...")
|
|
from judas_server.web.routes import (
|
|
api,
|
|
auth_bp,
|
|
index_bp,
|
|
panel_bp,
|
|
client_details,
|
|
)
|
|
|
|
self.app.register_blueprint(index_bp)
|
|
self.app.register_blueprint(auth_bp)
|
|
self.app.register_blueprint(panel_bp)
|
|
self.app.register_blueprint(api.bp)
|
|
self.app.register_blueprint(client_details.bp)
|
|
api.emit_polled_data(self.app, self.socketio)
|
|
|
|
def run(self, host: str = "0.0.0.0", port: int = 5000) -> None:
|
|
self.logger.info(f"Starting web server on {host}:{port}...")
|
|
self.socketio.run(app=self.app, host=host, port=port)
|
|
self.logger.info("Server stopped.")
|