#!/usr/bin/env python3 import argparse import importlib import sys from pathlib import Path ROOT = Path(__file__).resolve().parents[1] SERVICES_DIR = ROOT / "devplacepy_services" SERVICES = [ "web", "database", "pubsub", "gateway", "jobs", "devii", "bot", "backup", "containers", "telegram", "email", "news", "gitea", "audit", "xmlrpc", ] def list_services() -> int: for name in SERVICES: main_py = SERVICES_DIR / name / "main.py" status = "ok" if main_py.exists() else "missing" print(f"{name:12} {status}") return 0 def verify_stubs() -> int: sys.path.insert(0, str(ROOT)) errors: list[str] = [] for name in SERVICES: main_py = SERVICES_DIR / name / "main.py" if not main_py.exists(): errors.append(f"{name}: missing main.py") continue module_name = f"devplacepy_services.{name}.main" try: module = importlib.import_module(module_name) except Exception as exc: errors.append(f"{name}: import failed ({exc})") continue app = getattr(module, "app", None) if app is None: errors.append(f"{name}: no app export") continue try: from fastapi.testclient import TestClient client = TestClient(app) resp = client.get("/health") if resp.status_code != 200: errors.append(f"{name}: /health returned {resp.status_code}") continue data = resp.json() for key in ("service", "status", "uptime_s", "version", "deps", "stats"): if key not in data: errors.append(f"{name}: health missing key {key}") except Exception as exc: errors.append(f"{name}: health check failed ({exc})") if errors: print("verify: failed") for err in errors: print(f" {err}") return 1 print("verify: ok") return 0 def main() -> int: parser = argparse.ArgumentParser(prog="refactor_to_microservices.py") parser.add_argument("--list", action="store_true") parser.add_argument("--verify", action="store_true") args = parser.parse_args() if args.list: return list_services() if args.verify: return verify_stubs() parser.print_help() return 0 if __name__ == "__main__": raise SystemExit(main())