rotate_promote.py 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. """Deletion helpers for rotate single-pool mode."""
  2. from __future__ import annotations
  3. from pathlib import Path
  4. from typing import Any
  5. def _compact_text(value: str, limit: int = 240) -> str:
  6. return " ".join(str(value or "").split())[:limit]
  7. def _delete_from_cpa(name: str, client: object | None = None) -> bool:
  8. if client is None or not hasattr(client, "delete_auth_file"):
  9. return False
  10. return bool(getattr(client, "delete_auth_file")(name))
  11. def handle_unhealthy_entries(
  12. *,
  13. result: Any,
  14. reg_entries: list[dict],
  15. probe_results: dict[str, tuple[int, str, bool]],
  16. pool_dir: Path,
  17. backend_client: object | None,
  18. now_func: Any,
  19. classify_status_message_func: Any,
  20. is_deactivated_status_message_func: Any,
  21. ) -> set[str]:
  22. removed_from_main: set[str] = set()
  23. pool_dir.mkdir(parents=True, exist_ok=True)
  24. for entry in reg_entries:
  25. name = str(entry.get("name", "")).strip()
  26. if not name:
  27. continue
  28. status_message = str(entry.get("status_message", ""))
  29. code = classify_status_message_func(status_message)
  30. deactivated = is_deactivated_status_message_func(status_message)
  31. if name in probe_results:
  32. probe_code, probe_detail, probe_deactivated = probe_results[name]
  33. if probe_code in {401, 429}:
  34. code = probe_code
  35. status_message = probe_detail
  36. deactivated = probe_deactivated
  37. if probe_code == 401:
  38. probe_label = "deactivated" if deactivated else "401 invalidated"
  39. print(f"[{now_func()}] [rotate] 🔎 {name} quota probe → {probe_label}")
  40. else:
  41. print(f"[{now_func()}] [rotate] 🔎 {name} quota probe → 429")
  42. if code == 401 or deactivated:
  43. deleted = _delete_from_cpa(name, client=backend_client)
  44. if not deleted:
  45. print(f"[{now_func()}] [rotate] ⚠️ {name} 401 删除失败")
  46. continue
  47. (pool_dir / name).unlink(missing_ok=True)
  48. result.deleted_401 += 1
  49. removed_from_main.add(name)
  50. print(f"[{now_func()}] [rotate] ❌ {name} 401删除")
  51. continue
  52. if code == 429:
  53. print(f"[{now_func()}] [rotate] ↺ {name} 429保留")
  54. return removed_from_main