Skip to content

Commit 4afaa67

Browse files
author
Fastace
committed
Fix:修复了Restic S3云端恢复逻辑以及第二阶段恢复路径的问题,但是第二阶段恢复有点bug,待修复
1 parent 94d2f1b commit 4afaa67

6 files changed

Lines changed: 189 additions & 30 deletions

File tree

source/core/restic/src/main/kotlin/com/xayah/core/restic/ResticRepository.kt

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -182,13 +182,17 @@ class ResticRepository @Inject constructor(
182182
includePath: String? = null,
183183
progressCallback: ResticProgressCallback? = null
184184
): Boolean {
185+
Log.d(TAG, "=== 开始云端快照恢复 ===")
186+
Log.d(TAG, "快照ID: $snapshotId")
187+
Log.d(TAG, "目标路径: $targetPath")
188+
Log.d(TAG, "快照子路径: $snapshotSubPath")
189+
Log.d(TAG, "包含文件: $includePath")
185190
val extra = json.decodeFromString<S3Extra>(cloudEntity.extra) ?: return false
191+
Log.d(TAG, "S3配置: endpoint=${extra.endpoint}, bucket=${extra.bucket}, region=${extra.region}")
186192

187-
val s3Url = if (extra.endpoint.isNotEmpty()) {
188-
"s3:${extra.endpoint}/${extra.bucket}${cloudEntity.remote}"
189-
} else {
190-
"s3:s3.${extra.region}.amazonaws.com/${extra.bucket}${cloudEntity.remote}"
191-
}
193+
// 使用统一的 URL 构建方法
194+
val s3Url = buildS3ResticUrl(extra, cloudEntity.remote)
195+
Log.d(TAG, "构建的 S3 URL: $s3Url")
192196

193197
val env = mutableMapOf(
194198
"AWS_ACCESS_KEY_ID" to extra.accessKeyId,
@@ -219,8 +223,14 @@ class ResticRepository @Inject constructor(
219223
args.addAll(listOf("--include", "\"$includePath\""))
220224
}
221225

226+
Log.d(TAG, "即将执行恢复命令...")
222227
val result = executeRestic(*args.toTypedArray(), env = env)
223228

229+
Log.d(TAG, "恢复命令执行完成,退出码: ${result.code}")
230+
if (result.code != 0) {
231+
Log.e(TAG, "恢复失败,错误输出: ${result.err.joinToString("\n")}")
232+
}
233+
224234
// 处理进度回调
225235
result.out.forEach { line ->
226236
parseRestoreProgress(line)?.let { p ->

source/core/service/src/main/kotlin/com/xayah/core/service/packages/backup/BackupServiceCloudImpl.kt

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ import com.xayah.core.rootservice.service.RemoteRootService
3030
import com.xayah.core.service.util.CommonBackupUtil
3131
import com.xayah.core.service.util.PackagesBackupUtil
3232
import com.xayah.core.util.PathUtil
33+
import com.xayah.core.util.localBackupSaveDir
3334
import dagger.hilt.android.AndroidEntryPoint
3435
import kotlinx.coroutines.CoroutineScope
3536
import kotlinx.coroutines.delay
@@ -412,9 +413,9 @@ internal class BackupServiceCloudImpl @Inject constructor() : AbstractBackupServ
412413
@Inject
413414
override lateinit var mPackagesBackupUtil: PackagesBackupUtil
414415

415-
override val mRootDir by lazy { mPathUtil.getCloudTmpDir() }
416-
override val mAppsDir by lazy { mPathUtil.getCloudTmpAppsDir() }
417-
override val mConfigsDir by lazy { mPathUtil.getCloudTmpConfigsDir() }
416+
override val mRootDir by lazy { mContext.localBackupSaveDir() }
417+
override val mAppsDir by lazy { mPathUtil.getLocalBackupAppsDir() }
418+
override val mConfigsDir by lazy { mPathUtil.getLocalBackupConfigsDir() }
418419

419420
@Inject
420421
lateinit var mCloudRepo: CloudRepository

source/core/service/src/main/kotlin/com/xayah/core/service/packages/restore/RestoreServiceLocalImpl.kt

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,15 +56,30 @@ internal class RestoreServiceLocalImpl @Inject constructor() : AbstractRestoreSe
5656

5757
override fun onCreate() {
5858
super.onCreate()
59+
Log.d(mTAG, "=== RestoreServiceLocalImpl 创建 ===")
60+
Log.d(mTAG, "Root目录: $mRootDir")
61+
Log.d(mTAG, "Apps目录: $mAppsDir")
62+
Log.d(mTAG, "Configs目录: $mConfigsDir")
5963
}
6064

6165
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
6266
mTargetPackageName = intent?.getStringExtra("TARGET_PACKAGE_NAME") ?: ""
63-
Log.d(mTAG, "接收到目标包名: $mTargetPackageName")
67+
Log.d(mTAG, "=== 服务启动命令接收 ===")
68+
Log.d(mTAG, "目标包名: $mTargetPackageName")
69+
Log.d(mTAG, "Intent: $intent")
70+
Log.d(mTAG, "Flags: $flags, StartId: $startId")
71+
72+
// 检查restore目录
73+
val restoreDir = File("${mRootDir}/restore")
74+
Log.d(mTAG, "检查restore目录: ${restoreDir.path}")
75+
Log.d(mTAG, "restore目录存在: ${restoreDir.exists()}")
76+
6477
return super.onStartCommand(intent, flags, startId)
6578
}
6679

6780
override suspend fun getPackages(): List<PackageEntity> {
81+
Log.d(mTAG, "=== 开始获取恢复包列表 ===")
82+
6883
// 检查是否为 Restic 恢复场景
6984
val restoreDir = File("${mRootDir}/restore")
7085
val backupDir = if (restoreDir.exists()) {
@@ -77,15 +92,22 @@ internal class RestoreServiceLocalImpl @Inject constructor() : AbstractRestoreSe
7792

7893
Log.d(mTAG, "查询参数: cloud=, backupDir=$backupDir")
7994
val allPackages = mPackageRepo.queryActivated(OpType.RESTORE, "", backupDir)
95+
Log.d(mTAG, "查询到总应用数: ${allPackages.size}")
8096

8197
// 使用传递的包名进行筛选
8298
val packages = if (mTargetPackageName.isNotEmpty()) {
99+
Log.d(mTAG, "筛选目标包名: $mTargetPackageName")
83100
allPackages.filter { it.packageName == mTargetPackageName }
84101
} else {
102+
Log.d(mTAG, "无包名筛选,返回所有应用")
85103
allPackages
86104
}
87105

88106
Log.d(mTAG, "筛选后查询到 ${packages.size} 个应用")
107+
packages.forEach { pkg ->
108+
Log.d(mTAG, "应用: ${pkg.packageName}, 用户: ${pkg.userId}, 激活: ${pkg.extraInfo.activated}")
109+
}
110+
89111
return packages
90112
}
91113

source/feature/main/processing/src/main/kotlin/com/xayah/feature/main/processing/packages/restore/RestoreViewModelImpl.kt

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -65,10 +65,10 @@ class RestoreViewModelImpl @Inject constructor(
6565
val backupSaveDir: String
6666
if (uiState.value.cloudEntity == null) {
6767
cloud = ""
68-
backupSaveDir = mContext.localBackupSaveDir()
68+
backupSaveDir = "${mContext.localBackupSaveDir()}/restore/"
6969
} else {
70-
cloud = uiState.value.cloudEntity!!.name
71-
backupSaveDir = uiState.value.cloudEntity!!.remote
70+
cloud = "" // 修复:云端恢复也使用空字符串,与数据库记录匹配
71+
backupSaveDir = "${mContext.localBackupSaveDir()}/restore/"
7272
}
7373
val packages = mPkgRepo.queryActivated(OpType.RESTORE, cloud, backupSaveDir)
7474
LogUtil.log { "RestoreViewModelImpl.UpdateApps" to "Query activated apps, cloud: $cloud, backupDir: $backupSaveDir" }
@@ -91,8 +91,8 @@ class RestoreViewModelImpl @Inject constructor(
9191
cloud = ""
9292
backupSaveDir = "${mContext.localBackupSaveDir()}/restore/"
9393
} else {
94-
cloud = uiState.value.cloudEntity!!.name
95-
backupSaveDir = "${uiState.value.cloudEntity!!.remote}/restore/"
94+
cloud = ""
95+
backupSaveDir = "${mContext.localBackupSaveDir()}/restore/"
9696
}
9797

9898
Log.d("RestoreViewModelImpl", "查询参数: cloud=$cloud, backupDir=$backupSaveDir")
@@ -143,6 +143,7 @@ class RestoreViewModelImpl @Inject constructor(
143143
withMainContext {
144144
intent.navController.popBackStack()
145145
intent.navController.navigateSingle(MainRoutes.PackagesRestoreProcessing.route)
146+
mLocalService.startRestore(currentPackageNameFilter)
146147
}
147148
}.onFailure {
148149
emitEffect(IndexUiEffect.DismissSnackbar)
@@ -154,8 +155,8 @@ class RestoreViewModelImpl @Inject constructor(
154155
withMainContext {
155156
intent.navController.popBackStack()
156157
intent.navController.navigateSingle(MainRoutes.PackagesRestoreProcessing.route)
158+
mLocalService.startRestore(currentPackageNameFilter)
157159
}
158-
mLocalService.startRestore(currentPackageNameFilter)
159160
}
160161
}
161162

source/feature/main/restore/src/main/kotlin/com/xayah/feature/main/restore/CloudBackupDetailPage.kt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,11 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle
3333
import androidx.compose.runtime.rememberCoroutineScope
3434
import androidx.compose.material.icons.Icons
3535
import androidx.compose.material.icons.filled.Folder
36+
import androidx.compose.runtime.LaunchedEffect
3637
import com.xayah.core.ui.route.MainRoutes
3738
import com.xayah.core.model.OpType
3839
import com.xayah.core.util.navigateSingle
40+
import com.xayah.core.util.localBackupSaveDir
3941
import com.xayah.core.model.Target
4042
import com.xayah.core.ui.component.BodyMediumText
4143
import com.xayah.core.ui.component.PackageIconImage
@@ -61,6 +63,9 @@ fun CloudBackupDetailPage(
6163
viewModel: CloudRestoreViewModel = hiltViewModel()
6264
) {
6365
val resticProgress by viewModel.resticProgress.collectAsStateWithLifecycle()
66+
LaunchedEffect(accountName) {
67+
viewModel.setCloudEntity(accountName)
68+
}
6469
val isRestoring = resticProgress.totalDataTypes > 0 &&
6570
resticProgress.currentDataTypeIndex < resticProgress.totalDataTypes
6671
val isCompleted = resticProgress.isCompleted
@@ -128,7 +133,7 @@ fun CloudBackupDetailPage(
128133

129134
if (success) {
130135
Log.d("CloudRestore", "云端恢复成功,准备读取备份目录")
131-
val backupDir = "${context.readBackupDirectory()}/restore/"
136+
val backupDir = "${context.localBackupSaveDir()}/restore/"
132137
Log.d("CloudRestore", "导航到恢复页面,备份目录: $backupDir")
133138
viewModel.refreshLocalDatabase(backupDir)
134139

0 commit comments

Comments
 (0)