diff --git a/backend/app/service/cronjob_helper.go b/backend/app/service/cronjob_helper.go index f2cc61945..65a60578a 100644 --- a/backend/app/service/cronjob_helper.go +++ b/backend/app/service/cronjob_helper.go @@ -2,6 +2,7 @@ package service import ( "context" + "encoding/json" "fmt" "os" "path" @@ -275,6 +276,21 @@ func loadClientMap(backupAccounts string) (map[string]cronjobUploadHelper, error if account.BackupPath != "/" { pathItem = strings.TrimPrefix(account.BackupPath, "/") } + if target == constant.Local { + varMap := make(map[string]interface{}) + if err := json.Unmarshal([]byte(account.Vars), &varMap); err != nil { + return nil, err + } + if _, ok := varMap["dir"]; !ok { + return nil, errors.New("load local backup dir failed") + } + baseDir, ok := varMap["dir"].(string) + if ok { + pathItem = baseDir + } else { + return nil, fmt.Errorf("error type dir: %T", varMap["dir"]) + } + } clients[target] = cronjobUploadHelper{ client: client, backupPath: pathItem, diff --git a/backend/utils/common/common.go b/backend/utils/common/common.go index ecffb38b9..97dd4459b 100644 --- a/backend/utils/common/common.go +++ b/backend/utils/common/common.go @@ -123,6 +123,11 @@ func CopyFile(src, dst string) error { if path.Base(src) != path.Base(dst) { dst = path.Join(dst, path.Base(src)) } + if _, err := os.Stat(path.Dir(dst)); err != nil { + if os.IsNotExist(err) { + _ = os.MkdirAll(path.Dir(dst), os.ModePerm) + } + } target, err := os.OpenFile(dst+"_temp", os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0755) if err != nil { return err