From faf88b1bfe8072539225b0c0fd1a9c119f810bdf Mon Sep 17 00:00:00 2001 From: waner Date: Fri, 10 Apr 2026 10:31:04 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8D=87=E7=BA=A7=E5=9B=BA=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 5 ++-- .../upgrade/executor/UpgradeTaskRunner.java | 27 ++++++++++++------- .../executor/UpgradeTaskRunnerTest.java | 24 +++++++++++++++++ 3 files changed, 44 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 9f22efe..443dfbc 100644 --- a/README.md +++ b/README.md @@ -192,7 +192,7 @@ Open: - `sql/` - `firmware/` - `scripts/` -- `signature.sig` 需要能被设备密码卡使用“固件完整性密钥”完成验签 +- `signature.sig` 需要能被配置的 PEM 公钥使用 `SM3withSM2` 软验签通过 - 服务端需要配置 `tms.upgrade.signature-public-key-pem-path`(公钥 PEM 文件路径) - `manifest.json` 当前要求包含: - `packageId` @@ -212,8 +212,9 @@ Open: - 不满足最小兼容版本时拒绝升级 - `execute.sh` 必填,`precheck.sh`、`verify.sh`、`rollback.sh` 可选 - 执行顺序为:`precheck -> execute -> verify` +- `FIRMWARE` 不增加额外后端流程,具体固件刷写、重启、恢复提示由包内脚本负责 - 回滚不自动触发,需要调用回滚接口 -- 升级成功后会更新 `tms_device_software_version` +- `TMS`、`RECEIVER` 升级成功后会更新 `tms_device_software_version`;`FIRMWARE` 暂不维护版本表 - 升级执行日志统一写入 `tms.upgrade.log-dir` 当前配置项: diff --git a/src/main/java/com/cisd/tms/modules/upgrade/executor/UpgradeTaskRunner.java b/src/main/java/com/cisd/tms/modules/upgrade/executor/UpgradeTaskRunner.java index 9728b90..07213e6 100644 --- a/src/main/java/com/cisd/tms/modules/upgrade/executor/UpgradeTaskRunner.java +++ b/src/main/java/com/cisd/tms/modules/upgrade/executor/UpgradeTaskRunner.java @@ -98,16 +98,8 @@ public class UpgradeTaskRunner { return; } - // 只有 execute 和 verify 都成功后,才认为升级成功并回写设备软件版本表。 - DeviceSoftwareVersionEntity versionEntity = new DeviceSoftwareVersionEntity(); - String componentCode = componentCode(task.getTaskType()); - versionEntity.setComponentCode(componentCode); - versionEntity.setComponentName(componentName(componentCode)); - versionEntity.setCurrentVersion(task.getTargetVersion()); - versionEntity.setSourceType("UPGRADE"); - versionEntity.setDetectedAt(LocalDateTime.now()); - versionEntity.setRemarks("updated by offline upgrade task " + task.getTaskId()); - deviceSoftwareVersionRepository.saveOrUpdate(versionEntity); + // 只有软件类升级才回写设备软件版本表;固件版本第一版暂不在该表维护。 + updateSoftwareVersionIfRequired(task); upgradeTaskRepository.updateStatus( task.getTaskId(), @@ -221,6 +213,21 @@ public class UpgradeTaskRunner { }; } + private void updateSoftwareVersionIfRequired(UpgradeTaskEntity task) { + String componentCode = componentCode(task.getTaskType()); + if (!"TMS".equals(componentCode) && !"RECEIVER".equals(componentCode)) { + return; + } + DeviceSoftwareVersionEntity versionEntity = new DeviceSoftwareVersionEntity(); + versionEntity.setComponentCode(componentCode); + versionEntity.setComponentName(componentName(componentCode)); + versionEntity.setCurrentVersion(task.getTargetVersion()); + versionEntity.setSourceType("UPGRADE"); + versionEntity.setDetectedAt(LocalDateTime.now()); + versionEntity.setRemarks("updated by offline upgrade task " + task.getTaskId()); + deviceSoftwareVersionRepository.saveOrUpdate(versionEntity); + } + private String componentCode(String taskType) { return trim(taskType); } diff --git a/src/test/java/com/cisd/tms/modules/upgrade/executor/UpgradeTaskRunnerTest.java b/src/test/java/com/cisd/tms/modules/upgrade/executor/UpgradeTaskRunnerTest.java index ef6b92c..744a9fe 100644 --- a/src/test/java/com/cisd/tms/modules/upgrade/executor/UpgradeTaskRunnerTest.java +++ b/src/test/java/com/cisd/tms/modules/upgrade/executor/UpgradeTaskRunnerTest.java @@ -82,6 +82,30 @@ class UpgradeTaskRunnerTest { Assertions.assertEquals("标准收发器", versionRepository.store.get("RECEIVER").getComponentName()); } + @Test + void shouldNotUpdateSoftwareVersionWhenFirmwareUpgradeSucceeds() throws Exception { + Path tempDir = Files.createTempDirectory("upgrade-runner-test"); + FileRecordEntity fileRecord = buildPackage(tempDir, false, "#!/bin/sh\necho execute\nexit 0\n", false); + InMemoryFileRecordRepository fileRepository = new InMemoryFileRecordRepository(); + fileRepository.save(fileRecord); + InMemoryUpgradeTaskRepository taskRepository = new InMemoryUpgradeTaskRepository(); + InMemoryDeviceSoftwareVersionRepository versionRepository = new InMemoryDeviceSoftwareVersionRepository(); + + UpgradeTaskRunner runner = new UpgradeTaskRunner( + taskRepository, + fileRepository, + versionRepository, + stagingService(tempDir.resolve("staging"), tempDir.resolve("logs")), + properties(tempDir.resolve("staging"), tempDir.resolve("logs")), + objectMapper + ); + + runner.run(task("UPG-001-F", fileRecord.getFileId(), "FIRMWARE", "V3.0.0")); + + Assertions.assertEquals("SUCCESS", taskRepository.status); + Assertions.assertTrue(versionRepository.store.isEmpty()); + } + @Test void shouldMarkTaskFailedWhenExecuteScriptFails() throws Exception { Path tempDir = Files.createTempDirectory("upgrade-runner-test");