main_sentinel.py 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. import time
  2. import json
  3. import argparse
  4. from vs_types import GroupConfig
  5. from gco_wrapper import GCOWrapper
  6. from sentinel import SentinelGCO
  7. from logger_setup import setup_app_logger
  8. def load_config(path: str):
  9. with open(path, "r", encoding="utf-8") as f:
  10. return json.load(f)
  11. def main():
  12. # ===== 1️⃣ 命令行参数 =====
  13. parser = argparse.ArgumentParser(description="Sentinel Runner")
  14. parser.add_argument(
  15. "-c", "--config",
  16. type=str,
  17. required=True,
  18. help="Path to config.json"
  19. )
  20. args = parser.parse_args()
  21. # ===== 2️⃣ logger =====
  22. app_logger = setup_app_logger("Sentinel")
  23. app_logger.info("Sentinel Logger is ready! All VSC macros are hooked.")
  24. # ===== 3️⃣ 读取配置 =====
  25. cfg_data = load_config(args.config)
  26. redis_conf = cfg_data.get('redis')
  27. groups_conf = cfg_data.get('group_list')
  28. wrappers = []
  29. # ===== 4️⃣ 启动 groups =====
  30. for item in groups_conf:
  31. cfg = GroupConfig.from_json(item)
  32. if not cfg.enable:
  33. app_logger.info(f"Group [{cfg.identifier}] is disabled. Skipping.")
  34. continue
  35. app_logger.info(f"Starting wrapper for group [{cfg.identifier}]...")
  36. wrapper = GCOWrapper(
  37. gco_class=SentinelGCO,
  38. gco_cfg=cfg,
  39. redis_conf=redis_conf
  40. )
  41. wrapper.load()
  42. wrapper.start()
  43. wrappers.append(wrapper)
  44. app_logger.info(
  45. f"Successfully started {len(wrappers)} Sentinel groups. Press Ctrl+C to stop."
  46. )
  47. # ===== 5️⃣ keep alive =====
  48. try:
  49. while True:
  50. time.sleep(1)
  51. except KeyboardInterrupt:
  52. app_logger.info("Shutting down Sentinels...")
  53. for wrapper in wrappers:
  54. wrapper.stop()
  55. if __name__ == "__main__":
  56. main()