Files
nosys_libs/app/main.py
2026-01-25 13:55:46 +10:00

117 lines
3.9 KiB
Python

import os, sys
import time
import logging
import traceback
import webbrowser
import webview
import threading
from common.paths import ROOT_DIR
sys.path.insert(0, str(ROOT_DIR))
from libs.app.common.logging import get_logger, get_logger_buffer, list_loggers
from libs.app.common.args import read_kargs, kargs_to_array
from libs.app.common.config import Config
from libs.app.common.network_utils import check_url
from libs.app.updater import Updater
from libs.app.ui.ui_server import UIServer
logger = get_logger(buffer=True)
logging.getLogger("urllib3.connectionpool").setLevel(logging.WARNING)
class App:
def __init__(self):
self.config = Config()
self.nosys_api_host = self.config.get("api", "server", "host")
self.nosys_api_port = self.config.get("api", "server", "port")
self.ui_server = UIServer()
self.ui_server.start()
self.updater = Updater(self.config)
self.updater.register_listener(self.on_updater_event)
get_logger_buffer("app").register_listener(self.on_log)
get_logger_buffer("app.updater").register_listener(self.on_log)
def start_frontend(self):
url = "http://127.0.0.1:5000/"
logger.debug("Opening browser...")
webbrowser.open(url)
# logger.debug("Starting webview ...")
# webview.create_window(
# "NoSys",
# url,
# width=800,
# height=800,
# resizable=True,
# confirm_close=False,
# text_select=True,
# frameless=False,
# background_color="#000000",
# )
# webview.start(debug=True)
def update_libraries(self):
"""Update libs and restart if app itself was updated."""
updated = self.updater.update_libs()
if updated.get("app") == "Success updated":
logger.warning("App updated, restarting...")
self.ui_server.emit_event("restarting")
self.ui_server.stop()
os.execv(sys.executable, [sys.executable] + sys.argv)
def start_nosys(self):
url = f"https://{self.nosys_api_host}:{self.nosys_api_port}/api/api/health"
logger.debug(f"Checking NoSys Server {url} ...")
if check_url(url, 3, 1, verify_ssl=True):
logger.debug("NoSys already running")
self.ui_server.emit_event("redirect", {"url": f"https://{self.nosys_api_host}:{self.nosys_api_port}"})
return
logger.debug("Starting NoSys")
self.ui_server.emit_event("nosys_starting")
from libs.noSys.noSysCore import NoSysCore
from libs.noSys.events import Events
self.nosys_core = NoSysCore()
get_logger_buffer("noSys").register_listener(self.on_log)
get_logger_buffer("noSys").register_listener(self.on_log)
get_logger_buffer("noSys.moduleManager").register_listener(self.on_log)
self.nosys_core.subscribe_event(Events.READY, self.on_nosys_ready)
self.nosys_core.start()
def start(self):
self.start_frontend()
self.update_libraries()
self.config.load_libs_config()
self.start_nosys()
def on_updater_event(self, event):
if event.name == "status_lib":
self.ui_server.emit_event(event.name, {"lib":event.lib, "status": event.status})
def on_log(self, record):
self.ui_server.emit_event("log", {"levelname":record.levelname, "message":record.message})
def on_nosys_ready(self, event):
logger.debug(f"Stoping startup frontend server and redirecting to nosys server {self.nosys_api_host}:{self.nosys_api_port} ...")
self.ui_server.emit_event("redirect", {"url": f"https://{self.nosys_api_host}:{self.nosys_api_port}"})
self.ui_server.stop()
def main():
try:
app = App()
app.start()
input("Done\nPress any key to close\n")
except Exception:
logger.exception("Error")
input("Error\nPress any key to close\n")
if __name__ == '__main__':
main()