升级固件
This commit is contained in:
parent
463d2ce897
commit
faf88b1bfe
@ -192,7 +192,7 @@ Open:
|
|||||||
- `sql/`
|
- `sql/`
|
||||||
- `firmware/`
|
- `firmware/`
|
||||||
- `scripts/`
|
- `scripts/`
|
||||||
- `signature.sig` 需要能被设备密码卡使用“固件完整性密钥”完成验签
|
- `signature.sig` 需要能被配置的 PEM 公钥使用 `SM3withSM2` 软验签通过
|
||||||
- 服务端需要配置 `tms.upgrade.signature-public-key-pem-path`(公钥 PEM 文件路径)
|
- 服务端需要配置 `tms.upgrade.signature-public-key-pem-path`(公钥 PEM 文件路径)
|
||||||
- `manifest.json` 当前要求包含:
|
- `manifest.json` 当前要求包含:
|
||||||
- `packageId`
|
- `packageId`
|
||||||
@ -212,8 +212,9 @@ Open:
|
|||||||
- 不满足最小兼容版本时拒绝升级
|
- 不满足最小兼容版本时拒绝升级
|
||||||
- `execute.sh` 必填,`precheck.sh`、`verify.sh`、`rollback.sh` 可选
|
- `execute.sh` 必填,`precheck.sh`、`verify.sh`、`rollback.sh` 可选
|
||||||
- 执行顺序为:`precheck -> execute -> verify`
|
- 执行顺序为:`precheck -> execute -> verify`
|
||||||
|
- `FIRMWARE` 不增加额外后端流程,具体固件刷写、重启、恢复提示由包内脚本负责
|
||||||
- 回滚不自动触发,需要调用回滚接口
|
- 回滚不自动触发,需要调用回滚接口
|
||||||
- 升级成功后会更新 `tms_device_software_version`
|
- `TMS`、`RECEIVER` 升级成功后会更新 `tms_device_software_version`;`FIRMWARE` 暂不维护版本表
|
||||||
- 升级执行日志统一写入 `tms.upgrade.log-dir`
|
- 升级执行日志统一写入 `tms.upgrade.log-dir`
|
||||||
|
|
||||||
当前配置项:
|
当前配置项:
|
||||||
|
|||||||
@ -98,16 +98,8 @@ public class UpgradeTaskRunner {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 只有 execute 和 verify 都成功后,才认为升级成功并回写设备软件版本表。
|
// 只有软件类升级才回写设备软件版本表;固件版本第一版暂不在该表维护。
|
||||||
DeviceSoftwareVersionEntity versionEntity = new DeviceSoftwareVersionEntity();
|
updateSoftwareVersionIfRequired(task);
|
||||||
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);
|
|
||||||
|
|
||||||
upgradeTaskRepository.updateStatus(
|
upgradeTaskRepository.updateStatus(
|
||||||
task.getTaskId(),
|
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) {
|
private String componentCode(String taskType) {
|
||||||
return trim(taskType);
|
return trim(taskType);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -82,6 +82,30 @@ class UpgradeTaskRunnerTest {
|
|||||||
Assertions.assertEquals("标准收发器", versionRepository.store.get("RECEIVER").getComponentName());
|
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
|
@Test
|
||||||
void shouldMarkTaskFailedWhenExecuteScriptFails() throws Exception {
|
void shouldMarkTaskFailedWhenExecuteScriptFails() throws Exception {
|
||||||
Path tempDir = Files.createTempDirectory("upgrade-runner-test");
|
Path tempDir = Files.createTempDirectory("upgrade-runner-test");
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user