From f9dffbaaa1fee5f62aeb459f36cd2b696a9bf16b Mon Sep 17 00:00:00 2001 From: 0O0o0oOoO00 <11174151+0O0o0oOoO00@users.noreply.github.com> Date: Sat, 11 Oct 2025 18:43:55 +0800 Subject: [PATCH] add: check alas prev status --- .gitignore | 4 +++- module/instance_watcher.py | 38 +++++++++++++++++++++++++++++++++ module/submodule/utils.py | 3 +++ module/webui/process_manager.py | 28 ++++++++++++++++++++++++ 4 files changed, 72 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 30859666e..958cf5496 100644 --- a/.gitignore +++ b/.gitignore @@ -281,4 +281,6 @@ blcrack/cracker/webui/.vscode/ blcrack/cracker/webui/.idea/ 3rdparty/build/ -3rdparty/pkgs/ \ No newline at end of file +3rdparty/pkgs/ + +bin/status/ \ No newline at end of file diff --git a/module/instance_watcher.py b/module/instance_watcher.py index 5f1aed930..9636c7a5e 100644 --- a/module/instance_watcher.py +++ b/module/instance_watcher.py @@ -1,4 +1,5 @@ import datetime +import pathlib import threading import time from dataclasses import dataclass @@ -7,6 +8,7 @@ from typing import Dict from module.config.config import AzurLaneConfig from module.counter import MaxCounter from module.notify import handle_notify +from module.submodule.utils import has_config_mod from module.webui.process_manager import ProcessManager @@ -18,6 +20,7 @@ class InstanceSetting: class InstanceWatcher: + STATUS_DIR = "./bin/status" instance = None def __init__(self): @@ -66,6 +69,28 @@ class InstanceWatcher: for i in ins_has_triggered: self.remove_instance(i) + def add_status_file(self, name): + f = pathlib.Path(InstanceWatcher.STATUS_DIR) / f"{name}.status" + if not f.exists(): + f.parent.mkdir(parents=True, exist_ok=True) + f.touch() + + def remove_status_file(self, name): + f = pathlib.Path(InstanceWatcher.STATUS_DIR) / f"{name}.status" + if f.exists(): + f.parent.mkdir(parents=True, exist_ok=True) + f.unlink() + + def get_all_prev_instance(self): + f = pathlib.Path(InstanceWatcher.STATUS_DIR) + if not f.exists(): + f.mkdir(parents=True, exist_ok=True) + return [i.stem for i in f.glob("*.status")] + + def has_status_file(self, name): + f = pathlib.Path(InstanceWatcher.STATUS_DIR) / f"{name}.status" + return f.exists() + def try_add_instance(self, name): if name in self.instances: return @@ -78,10 +103,22 @@ class InstanceWatcher: notify_config=full_config.Alas_Error_OnePushConfig ) self.instances[name] = setting + self.add_status_file(name) + + def check_instance_status(self): + for config_name in self.get_all_prev_instance(): + if not has_config_mod(config_name): + continue + ins = ProcessManager.get_manager(config_name) + if ins.alive: + continue + if ins.detailed_instance_status == ProcessManager.DetailInstanceStatus.NoRenderables: + ins.start("alas") def remove_instance(self, name): try: self.instances.pop(name) + self.remove_status_file(name) except Exception: ... @@ -91,6 +128,7 @@ class InstanceWatcher: try: self.check_counter() self.check_instances() + self.check_instance_status() except Exception: ... diff --git a/module/submodule/utils.py b/module/submodule/utils.py index 5fdda4c93..fec05125a 100644 --- a/module/submodule/utils.py +++ b/module/submodule/utils.py @@ -86,3 +86,6 @@ def get_config_mod(config_name): return MOD_CONFIG_DICT[config_name] except KeyError: return 'alas' + +def has_config_mod(config_name): + return os.path.exists(f"./config/{config_name}.json") \ No newline at end of file diff --git a/module/webui/process_manager.py b/module/webui/process_manager.py index e37ba198c..c9d1d86db 100644 --- a/module/webui/process_manager.py +++ b/module/webui/process_manager.py @@ -237,6 +237,14 @@ from module.instance_watcher import InstanceWatcher class ProcessManager(ProcessManager): + class DetailInstanceStatus: + Alive = 1 + NoRenderables = 2 + ManualStop = 3 + Finish = 4 + Update = 5 + Error = 6 + def start(self, *args, **kwargs): super().start(*args, **kwargs) InstanceWatcher.get_instance().try_add_instance(self.config_name) @@ -244,3 +252,23 @@ class ProcessManager(ProcessManager): def stop(self, *args, **kwargs): InstanceWatcher.get_instance().remove_instance(self.config_name) super().stop(*args, **kwargs) + + @property + def detailed_instance_status(self) -> int: + if self.alive: + return ProcessManager.DetailInstanceStatus.Alive + elif len(self.renderables) == 0: + return ProcessManager.DetailInstanceStatus.NoRenderables + else: + console = Console(no_color=True) + with console.capture() as capture: + console.print(self.renderables[-1]) + s = capture.get().strip() + if s.endswith("Reason: Manual stop"): + return ProcessManager.DetailInstanceStatus.ManualStop + elif s.endswith("Reason: Finish"): + return ProcessManager.DetailInstanceStatus.Finish + elif s.endswith("Reason: Update"): + return ProcessManager.DetailInstanceStatus.Update + else: + return ProcessManager.DetailInstanceStatus.Error