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()