update_priority.py 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. """Batch update backend auth file priority values."""
  2. from __future__ import annotations
  3. import argparse
  4. from .common import CpaClient, DEFAULT_MANAGEMENT_BASE_URL, now
  5. def read_cpa_file(name: str, client: object) -> dict | None:
  6. payload = getattr(client, "get_auth_file")(name)
  7. return payload if isinstance(payload, dict) else None
  8. def write_cpa_file(name: str, payload: dict, client: object) -> bool:
  9. return bool(getattr(client, "upload_auth_file")(name, payload))
  10. def update_priority_once(
  11. target_priority: int = 500,
  12. dry_run: bool = False,
  13. limit: int | None = None,
  14. *,
  15. client: object | None = None,
  16. management_base_url: str = DEFAULT_MANAGEMENT_BASE_URL,
  17. management_key: str | None = None,
  18. ) -> dict[str, int]:
  19. backend_client = client or CpaClient(management_base_url, management_key=management_key)
  20. if not getattr(backend_client, "health_check")():
  21. return {"total": 0, "need_modify": 0, "modified": 0, "skipped": 0}
  22. reg_files = sorted(
  23. str(entry.get("name") or "").strip()
  24. for entry in getattr(backend_client, "list_auth_files")()
  25. if "@" in str(entry.get("name") or "").strip() and str(entry.get("name") or "").strip().endswith(".json")
  26. )
  27. if limit is not None and limit >= 0:
  28. reg_files = reg_files[:limit]
  29. need_modify = 0
  30. modified = 0
  31. skipped = 0
  32. for name in reg_files:
  33. data = read_cpa_file(name, client=backend_client)
  34. if data is None:
  35. skipped += 1
  36. print(f"[{now()}] [priority] skip {name} read failed")
  37. continue
  38. current_priority = data.get("priority", "NOT SET")
  39. if current_priority == target_priority:
  40. skipped += 1
  41. continue
  42. need_modify += 1
  43. if dry_run:
  44. print(f"[{now()}] [priority] dry-run {name}: {current_priority} -> {target_priority}")
  45. continue
  46. data["priority"] = target_priority
  47. if write_cpa_file(name, data, client=backend_client):
  48. modified += 1
  49. print(f"[{now()}] [priority] updated {name}: {current_priority} -> {target_priority}")
  50. else:
  51. skipped += 1
  52. print(f"[{now()}] [priority] skip {name} write failed")
  53. return {
  54. "total": len(reg_files),
  55. "need_modify": need_modify,
  56. "modified": modified,
  57. "skipped": skipped,
  58. }
  59. def main() -> None:
  60. from core.settings import AppSettings
  61. env_settings = AppSettings.from_env()
  62. parser = argparse.ArgumentParser(description="Batch update backend auth file priorities for zhuce6")
  63. parser.add_argument("--dry-run", action="store_true", help="Report changes without writing")
  64. parser.add_argument("--management-base-url", default=env_settings.cpa_management_base_url or DEFAULT_MANAGEMENT_BASE_URL, help="CPA management base url")
  65. parser.add_argument("--management-key", default=env_settings.cpa_management_key, help="可选 CPA management key")
  66. parser.add_argument("--target-priority", type=int, default=500, help="Target priority value")
  67. parser.add_argument("--limit", type=int, default=None, help="Optional cap for scanned auth files")
  68. args = parser.parse_args()
  69. summary = update_priority_once(
  70. target_priority=args.target_priority,
  71. dry_run=args.dry_run,
  72. limit=args.limit,
  73. management_base_url=args.management_base_url,
  74. management_key=str(args.management_key or "").strip() or None,
  75. )
  76. print(
  77. f"[{now()}] [priority] total={summary['total']} need_modify={summary['need_modify']}"
  78. f" modified={summary['modified']} skipped={summary['skipped']} dry_run={args.dry_run}"
  79. )
  80. if __name__ == "__main__":
  81. main()