From 0e4f82c43401df623bfc2a2c05318bb2591a5411 Mon Sep 17 00:00:00 2001 From: ssongliu <73214554+ssongliu@users.noreply.github.com> Date: Tue, 30 Jan 2024 16:11:49 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E8=A7=A3=E5=86=B3=E5=BF=AB=E7=85=A7?= =?UTF-8?q?=E6=81=A2=E5=A4=8D=E5=A4=B1=E8=B4=A5=E7=9A=84=E9=97=AE=E9=A2=98?= =?UTF-8?q?=20(#3750)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/app/service/snapshot.go | 2 +- backend/app/service/snapshot_create.go | 4 +- backend/init/hook/hook.go | 51 ++++++++++++------- backend/utils/cloud_storage/client/local.go | 29 ++++++++++- .../utils/cloud_storage/client/onedrive.go | 2 +- .../views/setting/snapshot/status/index.vue | 2 +- 6 files changed, 66 insertions(+), 24 deletions(-) diff --git a/backend/app/service/snapshot.go b/backend/app/service/snapshot.go index 3116f919e..bedc5e07e 100644 --- a/backend/app/service/snapshot.go +++ b/backend/app/service/snapshot.go @@ -153,7 +153,7 @@ func (u *SnapshotService) SnapshotRecover(req dto.SnapshotRecover) error { if len(snap.InterruptStep) != 0 && !req.IsNew { isReTry = true } - backup, err := backupRepo.Get(commonRepo.WithByType(snap.From)) + backup, err := backupRepo.Get(commonRepo.WithByType(snap.DefaultDownload)) if err != nil { return err } diff --git a/backend/app/service/snapshot_create.go b/backend/app/service/snapshot_create.go index 0be1fd4fd..1ba4c6994 100644 --- a/backend/app/service/snapshot_create.go +++ b/backend/app/service/snapshot_create.go @@ -191,12 +191,14 @@ func snapUpload(snap snapHelper, accounts string, file string) { } targetAccounts := strings.Split(accounts, ",") for _, item := range targetAccounts { - global.LOG.Debugf("start upload snapshot to %s, dir: %s", item, path.Join(accountMap[item].backupPath, "system_snapshot", path.Base(file))) + global.LOG.Debugf("start upload snapshot to %s, path: %s", item, path.Join(accountMap[item].backupPath, "system_snapshot", path.Base(file))) if _, err := accountMap[item].client.Upload(source, path.Join(accountMap[item].backupPath, "system_snapshot", path.Base(file))); err != nil { + global.LOG.Debugf("upload to %s failed, err: %v", item, err) snap.Status.Upload = err.Error() _ = snapshotRepo.UpdateStatus(snap.Status.ID, map[string]interface{}{"upload": err.Error()}) return } + global.LOG.Debugf("upload to %s successful", item) } snap.Status.Upload = constant.StatusDone _ = snapshotRepo.UpdateStatus(snap.Status.ID, map[string]interface{}{"upload": constant.StatusDone}) diff --git a/backend/init/hook/hook.go b/backend/init/hook/hook.go index 6dd0a9952..cea498a95 100644 --- a/backend/init/hook/hook.go +++ b/backend/init/hook/hook.go @@ -76,46 +76,59 @@ func Init() { } func handleSnapStatus() { + msgFailed := "the task was interrupted due to the restart of the 1panel service" + _ = global.DB.Model(&model.Snapshot{}).Where("status = ?", "OnSaveData"). + Updates(map[string]interface{}{"status": constant.StatusSuccess}).Error + + _ = global.DB.Model(&model.Snapshot{}).Where("status = ?", constant.StatusWaiting). + Updates(map[string]interface{}{ + "status": constant.StatusFailed, + "message": msgFailed, + }).Error + + _ = global.DB.Model(&model.Snapshot{}).Where("recover_status = ?", constant.StatusWaiting). + Updates(map[string]interface{}{ + "recover_status": constant.StatusFailed, + "recover_message": msgFailed, + }).Error + + _ = global.DB.Model(&model.Snapshot{}).Where("rollback_status = ?", constant.StatusWaiting). + Updates(map[string]interface{}{ + "rollback_status": constant.StatusFailed, + "rollback_message": msgFailed, + }).Error + snapRepo := repo.NewISnapshotRepo() - snaps, _ := snapRepo.GetList() - for _, snap := range snaps { - if snap.Status == "OnSaveData" { - _ = snapRepo.Update(snap.ID, map[string]interface{}{"status": constant.StatusSuccess}) - } - if snap.Status == constant.StatusWaiting { - _ = snapRepo.Update(snap.ID, map[string]interface{}{"status": constant.StatusFailed, "message": "the task was interrupted due to the restart of the 1panel service"}) - } - } status, _ := snapRepo.GetStatusList() - for _, statu := range status { + for _, item := range status { updates := make(map[string]interface{}) - if statu.Panel == constant.StatusRunning { + if item.Panel == constant.StatusRunning { updates["panel"] = constant.StatusFailed } - if statu.PanelInfo == constant.StatusRunning { + if item.PanelInfo == constant.StatusRunning { updates["panel_info"] = constant.StatusFailed } - if statu.DaemonJson == constant.StatusRunning { + if item.DaemonJson == constant.StatusRunning { updates["daemon_json"] = constant.StatusFailed } - if statu.AppData == constant.StatusRunning { + if item.AppData == constant.StatusRunning { updates["app_data"] = constant.StatusFailed } - if statu.PanelData == constant.StatusRunning { + if item.PanelData == constant.StatusRunning { updates["panel_data"] = constant.StatusFailed } - if statu.BackupData == constant.StatusRunning { + if item.BackupData == constant.StatusRunning { updates["backup_data"] = constant.StatusFailed } - if statu.Compress == constant.StatusRunning { + if item.Compress == constant.StatusRunning { updates["compress"] = constant.StatusFailed } - if statu.Upload == constant.StatusUploading { + if item.Upload == constant.StatusUploading { updates["upload"] = constant.StatusFailed } if len(updates) != 0 { - _ = snapRepo.UpdateStatus(statu.ID, updates) + _ = snapRepo.UpdateStatus(item.ID, updates) } } } diff --git a/backend/utils/cloud_storage/client/local.go b/backend/utils/cloud_storage/client/local.go index 61e34ed9d..7028f54c0 100644 --- a/backend/utils/cloud_storage/client/local.go +++ b/backend/utils/cloud_storage/client/local.go @@ -4,6 +4,7 @@ import ( "fmt" "os" "path" + "path/filepath" "github.com/1Panel-dev/1Panel/backend/utils/cmd" ) @@ -61,9 +62,35 @@ func (c localClient) Upload(src, target string) (bool, error) { } func (c localClient) Download(src, target string) (bool, error) { + localPath := path.Join(c.dir, src) + if _, err := os.Stat(path.Dir(target)); err != nil { + if os.IsNotExist(err) { + if err = os.MkdirAll(path.Dir(target), os.ModePerm); err != nil { + return false, err + } + } else { + return false, err + } + } + + stdout, err := cmd.Execf("\\cp -f %s %s", localPath, target) + if err != nil { + return false, fmt.Errorf("cp file failed, stdout: %v, err: %v", stdout, err) + } return true, nil } func (c localClient) ListObjects(prefix string) ([]string, error) { - return nil, nil + itemPath := path.Join(c.dir, prefix) + var files []string + if err := filepath.Walk(itemPath, func(path string, info os.FileInfo, err error) error { + if !info.IsDir() { + files = append(files, info.Name()) + } + return nil + }); err != nil { + return nil, err + } + + return files, nil } diff --git a/backend/utils/cloud_storage/client/onedrive.go b/backend/utils/cloud_storage/client/onedrive.go index 115943530..65733976b 100644 --- a/backend/utils/cloud_storage/client/onedrive.go +++ b/backend/utils/cloud_storage/client/onedrive.go @@ -111,7 +111,7 @@ func (o oneDriveClient) Upload(src, target string) (bool, error) { return false, errors.New("Only file is allowed to be uploaded here.") } var isOk bool - if fileInfo.Size() > 4*1024*1024 { + if fileInfo.Size() < 4*1024*1024 { isOk, err = o.upSmall(ctx, src, folderID, fileInfo.Size()) } else { isOk, err = o.upBig(ctx, src, folderID, fileInfo.Size()) diff --git a/frontend/src/views/setting/snapshot/status/index.vue b/frontend/src/views/setting/snapshot/status/index.vue index 52a16e955..bed032c99 100644 --- a/frontend/src/views/setting/snapshot/status/index.vue +++ b/frontend/src/views/setting/snapshot/status/index.vue @@ -17,7 +17,7 @@ - +