rack:固件下载目录自动清理(每小时,FwStore.prune)
- 固件库里登记过的(界面上传)不自动删;没登记的(ota_push.py 直传、台架镜像)放满 7 天删; 上传中断的 .tmp 1 小时删;非 <16 hex>.bin / .tmp 的文件名一律不碰 - 板子下载一次几秒就完、回滚用的是板上另一个槽,删旧文件不影响任何板子 - main.py:有 --fw-dir 时起清理循环,出错只记日志;test_firmware.py 加 2 例,共 41 例(本机 + 服务器) - 已部署;本机模拟板实测放一个 8 天前的孤儿镜像,启动即被清掉 Co-Authored-By: Claude Opus 5.5 <[email protected]>
这个提交包含在:
+17
-1
@@ -28,6 +28,8 @@ from .simboard import HUNG, SimBoard
|
||||
|
||||
log = logging.getLogger("prrack")
|
||||
|
||||
FW_GC_S = 3600 # 固件目录多久清一次(firmware.FwStore.prune)
|
||||
|
||||
|
||||
def read_env(path: str) -> dict:
|
||||
out = {}
|
||||
@@ -77,7 +79,21 @@ def build(args):
|
||||
|
||||
static = args.static if args.static and os.path.isdir(args.static) else None
|
||||
fw = FwStore(db, args.fw_dir, args.fw_base) if args.fw_dir else None
|
||||
app = create_app(hub, rec, static, startup=[up], shutdown=[down], fw=fw)
|
||||
startup = [up]
|
||||
if fw is not None:
|
||||
async def fw_gc():
|
||||
async def loop():
|
||||
while True:
|
||||
try:
|
||||
gone = fw.prune()
|
||||
if gone:
|
||||
log.info("固件目录清理:删了 %d 个(%s)", len(gone), " ".join(gone))
|
||||
except Exception: # 清理出错不能拖垮后端
|
||||
log.exception("固件目录清理失败")
|
||||
await asyncio.sleep(FW_GC_S)
|
||||
asyncio.ensure_future(loop())
|
||||
startup.append(fw_gc)
|
||||
app = create_app(hub, rec, static, startup=startup, shutdown=[down], fw=fw)
|
||||
return app
|
||||
|
||||
|
||||
|
||||
在新工单中引用
屏蔽一个用户