升级Updater成功
This commit is contained in:
@@ -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" {
|
||||||
|
|||||||
Reference in New Issue
Block a user