升级Updater成功

This commit is contained in:
zqm
2026-04-08 16:23:57 +08:00
parent 1f9a6bbe0f
commit 708a7c8bf0

View File

@@ -151,81 +151,6 @@ fn has_updater_new_exe() -> bool {
updater_new_path.exists() updater_new_path.exists()
} }
/// 发送获取 Updater.exe 版本的请求
fn request_updater_version(sender: &cube_lib::websocket::MessageSender, device_number: &str, debug: bool) {
let msg_str = format!(
r#"{{"Type":"GetFileVer","Data":{{"DeviceNumber":"{}","file_list":["Updater.exe"]}}}}"#,
device_number
);
if debug {
let ts = chrono::Local::now().format("%Y-%m-%d %H:%M:%S%.3f");
println!("{} [版本] 请求 Updater.exe 版本: {}", ts, msg_str);
}
sender.send(msg_str);
}
/// 检查并下载 Updater.exe
/// 当 BootLoader 下载完成后调用此函数
/// 返回 true 表示需要继续等待下载false 表示流程结束
fn check_and_download_updater(sender: &cube_lib::websocket::MessageSender, device_number: &str, debug: bool) -> bool {
let ts = chrono::Local::now().format("%Y-%m-%d %H:%M:%S%.3f");
// 获取服务端 Updater.exe 版本号
let server_version = SERVER_UPDATER_VERSION.lock().unwrap().clone();
if let Some(sv) = server_version {
let local_version = get_local_file_version("Updater.exe");
if debug {
println!("{} [版本] Updater.exe: 服务端={}, 本地={}", ts, sv, local_version);
}
// 比较版本:需要下载的条件
let need_update = local_version == "0.0.0" || version_less_than(&local_version, &sv);
if need_update {
// 需要下载 Updater.exe
let tmp_size = get_tmp_file_size("Updater.exe");
if tmp_size > 0 {
if debug {
println!("{} [续传] Updater.exe 发现未完成下载,请求 hash 校验...", ts);
}
request_file_md5(sender, "Updater.exe", tmp_size, debug);
} else {
if debug {
println!("{} [升级] Updater.exe 需要更新,开始下载...", ts);
}
request_download(sender, "Updater.exe", 0, debug);
}
true // 需要继续等待下载
} else {
// 版本已是最新,检查是否有 Updater.new.exe
if debug {
println!("{} [版本] Updater.exe 版本已是最新,无需下载", ts);
}
// 删除可能存在的旧 Updater.new.exe
if has_updater_new_exe() {
let updater_new_path = get_updater_data_dir().join("Updater.new.exe");
let _ = fs::remove_file(&updater_new_path);
if debug {
println!("{} [清理] 删除旧的 Updater.new.exe", ts);
}
}
// 返回 false 表示 Updater 不需要更新,调用者负责输出日志并退出
false
}
} else {
// 没有收到服务端 Updater 版本 → 重新请求 Updater 版本
if debug {
println!("{} [警告] 未收到 Updater.exe 版本信息,重新请求...", ts);
}
request_updater_version(sender, device_number, debug);
true // 需要继续等待版本响应
}
}
/// 安排启动 BootLoader.exe延迟执行等待所有下载完成 /// 安排启动 BootLoader.exe延迟执行等待所有下载完成
/// 通过 shutdown_tx 发送断连信号,通知主循环优雅退出 /// 通过 shutdown_tx 发送断连信号,通知主循环优雅退出
fn schedule_bootloader_launch( fn schedule_bootloader_launch(
@@ -712,6 +637,7 @@ async fn run_updater(debug_mode: bool) -> bool {
} }
// 第二步:再遍历处理每个文件 // 第二步:再遍历处理每个文件
let mut download_initiated = false;
for (filename, server_ver) in file_versions { for (filename, server_ver) in file_versions {
let server_version = server_ver.as_str().unwrap_or("0.0.0"); let server_version = server_ver.as_str().unwrap_or("0.0.0");
let local_version = get_local_file_version(filename); let local_version = get_local_file_version(filename);
@@ -734,6 +660,7 @@ async fn run_updater(debug_mode: bool) -> bool {
} }
request_file_md5(&sender, filename, tmp_size, debug_msg); request_file_md5(&sender, filename, tmp_size, debug_msg);
*UPDATE_PERFORMED.lock().unwrap() = true; *UPDATE_PERFORMED.lock().unwrap() = true;
download_initiated = true;
} else { } else {
// 无临时文件,从头下载 // 无临时文件,从头下载
if debug_msg { if debug_msg {
@@ -742,6 +669,7 @@ async fn run_updater(debug_mode: bool) -> bool {
} }
request_download(&sender, filename, 0, debug_msg); request_download(&sender, filename, 0, debug_msg);
*UPDATE_PERFORMED.lock().unwrap() = true; *UPDATE_PERFORMED.lock().unwrap() = true;
download_initiated = true;
} }
} else { } else {
// 不需要更新 // 不需要更新
@@ -770,20 +698,12 @@ async fn run_updater(debug_mode: bool) -> bool {
let ts = chrono::Local::now().format("%Y-%m-%d %H:%M:%S%.3f"); let ts = chrono::Local::now().format("%Y-%m-%d %H:%M:%S%.3f");
println!("{} [升级] BootLoader.exe 版本已是最新", ts); println!("{} [升级] BootLoader.exe 版本已是最新", ts);
} }
// BootLoader 无需下载,检查 Updater
if !check_and_download_updater(&sender, &device_number, debug_msg) {
// Updater 也不需要更新 → 检查是否有正在下载的临时文件
let tmp_size = get_tmp_file_size("Updater.exe");
if tmp_size > 0 {
// 有正在下载的 Updater.tmp等待下载完成
if debug_msg {
let ts = chrono::Local::now().format("%Y-%m-%d %H:%M:%S%.3f");
println!("{} [升级] 发现未完成下载,等待 Updater.exe 下载完成...", ts);
} }
// 请求 hash 校验,继续等待 }
request_file_md5(&sender, "Updater.exe", tmp_size, debug_msg); }
} else {
// 真的不需要更新,也没有临时文件 → 标记检查完成 // 循环结束后:没有发起下载 → 全部已是最新
if !download_initiated {
*UPDATE_CHECK_DONE.lock().unwrap() = true; *UPDATE_CHECK_DONE.lock().unwrap() = true;
if debug_msg { if debug_msg {
let ts = chrono::Local::now().format("%Y-%m-%d %H:%M:%S%.3f"); let ts = chrono::Local::now().format("%Y-%m-%d %H:%M:%S%.3f");
@@ -792,10 +712,6 @@ async fn run_updater(debug_mode: bool) -> bool {
} }
} }
} }
}
}
}
}
// 处理 Md5 响应 // 处理 Md5 响应
if msg_type == "Md5" { if msg_type == "Md5" {