1
0
mirror of https://github.com/0O0o0oOoO00/Alas.git synced 2026-05-14 07:49:25 +08:00

add: check alas prev status

This commit is contained in:
0O0o0oOoO00
2025-10-11 18:43:55 +08:00
parent 22adbb92b8
commit f9dffbaaa1
4 changed files with 72 additions and 1 deletions

4
.gitignore vendored
View File

@@ -281,4 +281,6 @@ blcrack/cracker/webui/.vscode/
blcrack/cracker/webui/.idea/ blcrack/cracker/webui/.idea/
3rdparty/build/ 3rdparty/build/
3rdparty/pkgs/ 3rdparty/pkgs/
bin/status/

View File

@@ -1,4 +1,5 @@
import datetime import datetime
import pathlib
import threading import threading
import time import time
from dataclasses import dataclass from dataclasses import dataclass
@@ -7,6 +8,7 @@ from typing import Dict
from module.config.config import AzurLaneConfig from module.config.config import AzurLaneConfig
from module.counter import MaxCounter from module.counter import MaxCounter
from module.notify import handle_notify from module.notify import handle_notify
from module.submodule.utils import has_config_mod
from module.webui.process_manager import ProcessManager from module.webui.process_manager import ProcessManager
@@ -18,6 +20,7 @@ class InstanceSetting:
class InstanceWatcher: class InstanceWatcher:
STATUS_DIR = "./bin/status"
instance = None instance = None
def __init__(self): def __init__(self):
@@ -66,6 +69,28 @@ class InstanceWatcher:
for i in ins_has_triggered: for i in ins_has_triggered:
self.remove_instance(i) 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): def try_add_instance(self, name):
if name in self.instances: if name in self.instances:
return return
@@ -78,10 +103,22 @@ class InstanceWatcher:
notify_config=full_config.Alas_Error_OnePushConfig notify_config=full_config.Alas_Error_OnePushConfig
) )
self.instances[name] = setting 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): def remove_instance(self, name):
try: try:
self.instances.pop(name) self.instances.pop(name)
self.remove_status_file(name)
except Exception: except Exception:
... ...
@@ -91,6 +128,7 @@ class InstanceWatcher:
try: try:
self.check_counter() self.check_counter()
self.check_instances() self.check_instances()
self.check_instance_status()
except Exception: except Exception:
... ...

View File

@@ -86,3 +86,6 @@ def get_config_mod(config_name):
return MOD_CONFIG_DICT[config_name] return MOD_CONFIG_DICT[config_name]
except KeyError: except KeyError:
return 'alas' return 'alas'
def has_config_mod(config_name):
return os.path.exists(f"./config/{config_name}.json")

View File

@@ -237,6 +237,14 @@ from module.instance_watcher import InstanceWatcher
class ProcessManager(ProcessManager): class ProcessManager(ProcessManager):
class DetailInstanceStatus:
Alive = 1
NoRenderables = 2
ManualStop = 3
Finish = 4
Update = 5
Error = 6
def start(self, *args, **kwargs): def start(self, *args, **kwargs):
super().start(*args, **kwargs) super().start(*args, **kwargs)
InstanceWatcher.get_instance().try_add_instance(self.config_name) InstanceWatcher.get_instance().try_add_instance(self.config_name)
@@ -244,3 +252,23 @@ class ProcessManager(ProcessManager):
def stop(self, *args, **kwargs): def stop(self, *args, **kwargs):
InstanceWatcher.get_instance().remove_instance(self.config_name) InstanceWatcher.get_instance().remove_instance(self.config_name)
super().stop(*args, **kwargs) 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