mirror of
https://github.com/farion1231/cc-switch.git
synced 2026-03-31 17:12:09 +08:00
fix(proxy): auto-recover live config after abnormal exit
When the app crashes or is force-killed while proxy mode is active, the live config files remain pointing to the dead proxy server with placeholder tokens, causing CLI tools to fail. This change adds startup detection: - Check `live_takeover_active` flag on app launch - If flag is true but proxy is not running → abnormal exit detected - Automatically restore live configs from database backup - Clear takeover flag and delete backups The recovery runs before auto-start, ensuring correct sequence even when proxy auto-start is enabled.
This commit is contained in:
@@ -522,10 +522,33 @@ pub fn run() {
|
||||
}
|
||||
}
|
||||
|
||||
// 自动启动代理服务器
|
||||
// 异常退出恢复 + 自动启动代理服务器
|
||||
let app_handle = app.handle().clone();
|
||||
tauri::async_runtime::spawn(async move {
|
||||
let state = app_handle.state::<AppState>();
|
||||
|
||||
// 1. 检测异常退出并恢复 Live 配置
|
||||
match state.db.is_live_takeover_active().await {
|
||||
Ok(true) => {
|
||||
// 接管标志为 true 但代理未运行 → 上次异常退出
|
||||
if !state.proxy_service.is_running().await {
|
||||
log::warn!("检测到上次异常退出,正在恢复 Live 配置...");
|
||||
if let Err(e) = state.proxy_service.recover_from_crash().await {
|
||||
log::error!("恢复 Live 配置失败: {e}");
|
||||
} else {
|
||||
log::info!("Live 配置已从异常退出中恢复");
|
||||
}
|
||||
}
|
||||
}
|
||||
Ok(false) => {
|
||||
// 正常状态,无需恢复
|
||||
}
|
||||
Err(e) => {
|
||||
log::error!("检查接管状态失败: {e}");
|
||||
}
|
||||
}
|
||||
|
||||
// 2. 自动启动代理服务器(如果配置为启用)
|
||||
match state.db.get_proxy_config().await {
|
||||
Ok(config) => {
|
||||
if config.enabled {
|
||||
|
||||
@@ -435,6 +435,30 @@ impl ProxyService {
|
||||
.map_err(|e| format!("检查接管状态失败: {e}"))
|
||||
}
|
||||
|
||||
/// 从异常退出中恢复(启动时调用)
|
||||
///
|
||||
/// 检测到 live_takeover_active=true 但代理未运行时调用此方法。
|
||||
/// 会恢复 Live 配置、清除接管标志、删除备份。
|
||||
pub async fn recover_from_crash(&self) -> Result<(), String> {
|
||||
// 1. 恢复 Live 配置
|
||||
self.restore_live_configs().await?;
|
||||
|
||||
// 2. 清除接管标志
|
||||
self.db
|
||||
.set_live_takeover_active(false)
|
||||
.await
|
||||
.map_err(|e| format!("清除接管状态失败: {e}"))?;
|
||||
|
||||
// 3. 删除备份
|
||||
self.db
|
||||
.delete_all_live_backups()
|
||||
.await
|
||||
.map_err(|e| format!("删除备份失败: {e}"))?;
|
||||
|
||||
log::info!("已从异常退出中恢复 Live 配置");
|
||||
Ok(())
|
||||
}
|
||||
|
||||
/// 从供应商配置更新 Live 备份(用于代理模式下的热切换)
|
||||
///
|
||||
/// 与 backup_live_configs() 不同,此方法从供应商的 settings_config 生成备份,
|
||||
|
||||
Reference in New Issue
Block a user