"""定时同步所有已配凭证账号的云端资产(供 systemd timer 调用) 用法:python scripts/sync_all_assets.py 依赖 .env 中的 MASTER_KEY(解密各账号 API 配置)。 排程须早于 vps-renewal-check(09:00):续费提醒读的是本地库的 expiry_date, 若同步在其之后跑,提醒就会用上一天的旧到期日。 """ import sys from pathlib import Path # 确保能导入 app 包(脚本位于 scripts/ 子目录) sys.path.insert(0, str(Path(__file__).resolve().parent.parent)) from sqlmodel import Session from app.database import assets_engine, init_db from app.services import sync_service def main() -> int: init_db() with Session(assets_engine) as session: result = sync_service.sync_all_assets(session) print( f"[云资产同步] 账号 {result['total']} | 成功 {result['success']} | 失败 {result['failed']} " f"| 新增 {result['created']} | 更新 {result['updated']} " f"| 跳过(无凭证) {result['skipped_no_config']} | 跳过(无适配器) {result['skipped_no_adapter']} " f"| 跳过(面板核对) {result.get('skipped_panel', 0)}" ) for err in result["errors"]: print(f" - {err}") # 有账号同步失败时返回非 0,让 systemd 记为 failed 便于告警 return 1 if result["failed"] else 0 if __name__ == "__main__": sys.exit(main())