diff --git a/backend/app/service/backup_website.go b/backend/app/service/backup_website.go index 902bff755..43a4f311d 100644 --- a/backend/app/service/backup_website.go +++ b/backend/app/service/backup_website.go @@ -11,6 +11,7 @@ import ( "github.com/1Panel-dev/1Panel/backend/app/dto" "github.com/1Panel-dev/1Panel/backend/app/model" + "github.com/1Panel-dev/1Panel/backend/buserr" "github.com/1Panel-dev/1Panel/backend/constant" "github.com/1Panel-dev/1Panel/backend/global" "github.com/1Panel-dev/1Panel/backend/utils/cmd" @@ -80,11 +81,11 @@ func handleWebsiteRecover(website *model.Website, recoverFile string, isRollback temPathWithName := tmpPath + "/" + website.Alias if !fileOp.Stat(tmpPath+"/website.json") || !fileOp.Stat(temPathWithName+".conf") || !fileOp.Stat(temPathWithName+".web.tar.gz") { - return errors.New("the wrong recovery package does not have .conf or .web.tar.gz files") + return buserr.WithDetail(constant.ErrBackupExist, ".conf or .web.tar.gz", nil) } if website.Type == constant.Deployment { if !fileOp.Stat(temPathWithName + ".app.tar.gz") { - return errors.New("the wrong recovery package does not have .app.tar.gz files") + return buserr.WithDetail(constant.ErrBackupExist, ".app.tar.gz", nil) } } var oldWebsite model.Website @@ -95,8 +96,9 @@ func handleWebsiteRecover(website *model.Website, recoverFile string, isRollback if err := json.Unmarshal(websiteJson, &oldWebsite); err != nil { return fmt.Errorf("unmarshal app.json failed, err: %v", err) } - if oldWebsite.Alias != website.Alias || oldWebsite.Type != website.Type || oldWebsite.ID != website.ID { - return errors.New("the current backup file does not match the application") + + if err := checkValidOfWebsite(&oldWebsite, website); err != nil { + return err } isOk := false @@ -155,6 +157,7 @@ func handleWebsiteRecover(website *model.Website, recoverFile string, isRollback return errors.New(string(stdout)) } + oldWebsite.ID = website.ID if err := websiteRepo.SaveWithoutCtx(&oldWebsite); err != nil { global.LOG.Errorf("handle save website data failed, err: %v", err) return err @@ -212,3 +215,29 @@ func handleWebsiteBackup(website *model.Website, backupDir, fileName string) err return nil } + +func checkValidOfWebsite(oldWebsite, website *model.Website) error { + if oldWebsite.Alias != website.Alias || oldWebsite.Type != website.Type { + return buserr.WithDetail(constant.ErrBackupMatch, fmt.Sprintf("oldName: %s, oldType: %v", oldWebsite.Alias, oldWebsite.Type), nil) + } + if oldWebsite.AppInstallID != 0 { + app, err := appInstallRepo.GetFirst(commonRepo.WithByID(website.AppInstallID)) + if err != nil { + return buserr.WithDetail(constant.ErrBackupMatch, "app", nil) + } + if app.App.Type != "website" { + return buserr.WithDetail(constant.ErrBackupMatch, fmt.Sprintf("appType: %s", app.App.Type), nil) + } + } + if oldWebsite.RuntimeID != 0 { + if _, err := runtimeRepo.GetFirst(commonRepo.WithByID(website.RuntimeID)); err != nil { + return buserr.WithDetail(constant.ErrBackupMatch, "runtime", nil) + } + } + if oldWebsite.WebsiteSSLID != 0 { + if _, err := websiteSSLRepo.GetFirst(commonRepo.WithByID(website.WebsiteSSLID)); err != nil { + return buserr.WithDetail(constant.ErrBackupMatch, "ssl", nil) + } + } + return nil +} diff --git a/backend/constant/errs.go b/backend/constant/errs.go index 42b61aeaa..f3fd6fdb6 100644 --- a/backend/constant/errs.go +++ b/backend/constant/errs.go @@ -68,6 +68,8 @@ var ( ErrGroupIsUsed = "ErrGroupIsUsed" ErrUsernameIsExist = "ErrUsernameIsExist" ErrUsernameIsNotExist = "ErrUsernameIsNotExist" + ErrBackupMatch = "ErrBackupMatch" + ErrBackupExist = "ErrBackupExist" ) // ssl diff --git a/backend/i18n/lang/en.yaml b/backend/i18n/lang/en.yaml index 7717b352d..a64e4a0e9 100644 --- a/backend/i18n/lang/en.yaml +++ b/backend/i18n/lang/en.yaml @@ -59,6 +59,8 @@ ErrDomainIsExist: "Domain is already exist" ErrAliasIsExist: "Alias is already exist" ErrAppDelete: 'Other Website use this App' ErrGroupIsUsed: 'The group is in use and cannot be deleted' +ErrBackupMatch: 'the backup file does not match the current partial data of the website: {{ .detail}}"' +ErrBackupExist: 'the backup file corresponds to a portion of the original data that does not exist: {{ .detail}}"' #ssl ErrSSLCannotDelete: "The certificate is being used by the website and cannot be removed" diff --git a/backend/i18n/lang/zh-Hant.yaml b/backend/i18n/lang/zh-Hant.yaml index 4de120506..33d19642d 100644 --- a/backend/i18n/lang/zh-Hant.yaml +++ b/backend/i18n/lang/zh-Hant.yaml @@ -59,6 +59,8 @@ ErrDomainIsExist: "域名已存在" ErrAliasIsExist: "代號已存在" ErrAppDelete: '其他網站使用此應用,無法刪除' ErrGroupIsUsed: '分組正在使用中,無法刪除' +ErrBackupMatch: '該備份文件與當前網站部分數據不匹配: {{ .detail}}"' +ErrBackupExist: '該備份文件對應部分原數據不存在: {{ .detail}}"' #ssl ErrSSLCannotDelete: "證書正在被網站使用,無法刪除" diff --git a/backend/i18n/lang/zh.yaml b/backend/i18n/lang/zh.yaml index 027888629..162f3c670 100644 --- a/backend/i18n/lang/zh.yaml +++ b/backend/i18n/lang/zh.yaml @@ -59,6 +59,8 @@ ErrDomainIsExist: "域名已存在" ErrAliasIsExist: "代号已存在" ErrAppDelete: '其他网站使用此应用,无法删除' ErrGroupIsUsed: '分组正在使用中,无法删除' +ErrBackupMatch: '该备份文件与当前网站部分数据不匹配 {{ .detail}}"' +ErrBackupExist: '该备份文件对应部分源数据不存在 {{ .detail}}"' #ssl ErrSSLCannotDelete: "证书正在被网站使用,无法删除"