本卡屬 FR-167(母卡 CM-3241),卡 P3-2b,階段 P3 更新中心、批 3。只改 BE(主 repo,Repo 欄空著)。依賴:P3-2a。
更新中心的「發現與下載」:每天凌晨自動問更新站一次、也可以手動立即檢查;有新版通知管理員;按下載後背景下載、斷線續傳;下載完驗簽章與雜湊,驗不過就刪;離線客戶可以自己上傳包,走同一條驗證。
對外連線、續傳、驗章三件事都要嚴;清單過期(D31)與降版拒收在這裡擋
extend:排程照 scheduler_agent.py 形狀新檔、scheduler.py 一行;上傳 reuse vulndb 的 chunk 三端點做法;通知 reuse notification_service;驗章 reuse jedi-license-runtime public_keys 的 kid 查表+/etc/guidant/release-keys
repo:~/Projects/Billows/Audit-Manager/compliance-manager-be
改既有:core/scheduler.py 714(一行)
改既有:app/product_update/service/product_update_app_service.py
改既有:api/product_update/routes/product_update_route.py
新開:core/scheduler_update.py
新開:app/product_update/service/update_site_client.py
新開:app/product_update/service/package_downloader.py
新開:app/product_update/service/package_verifier.py
細節在 design.md §5 對應段(~/Projects/Billows/Audit-Manager/compliance-manager-be/docs/features/FR-167-2610-online-update-channel/design.md,開 design.html 看導覽);本段只列本卡要做到的點:
core/scheduler_update.py 照 scheduler_agent.py 的 add_job 形狀,cron 03:00;core/scheduler.py 714 只加一行註冊;關閉開關存系統設定(grep 既有 settings service reuse)。update_site_client.py:check() 帶授權檔原文、指紋、現行版;連不到安靜略過並記 last_check_error。package_downloader.py:背景下載到 <資料目錄>/upgrade/incoming/,Range 續傳,DELETE 取消刪檔。package_verifier.py:五道(公鑰表 /etc/guidant/release-keys 由 kid 查 → 簽章 → issued_at+90d → version>現行 → major 相同 → sha256),不過即刪。source_scan_vulndb 的 upload service),完成時走同一支 verifier。通知 reuse notification_service。wrangler dev(P2-1 的 repo);測試含突變:把 90 天判斷拿掉,過期清單測試要紅。DEV 指向本機 wrangler dev:每日 03:00 與「立即檢查」都寫 last_check、有新版發通知;下載中斷重啟續傳;改一位元組驗章失敗並刪檔;離線上傳同一條驗證路;過期清單(issued_at+90d)拒收;版號 ≤ 現行拒收
對照雛形:~/Projects/Billows/Audit-Manager/compliance-manager-be/docs/features/FR-167-2610-online-update-channel/prototype/index.html(上方「跟著走」)。