Skip to content

Commit 8440d77

Browse files
authored
fix: Fix the issue of backup account synchronization failure (#7821)
1 parent 6cd72f1 commit 8440d77

File tree

13 files changed

+73
-46
lines changed

13 files changed

+73
-46
lines changed

agent/app/api/v2/backup.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,13 @@ import (
1111
)
1212

1313
func (b *BaseApi) CheckBackupUsed(c *gin.Context) {
14-
id, err := helper.GetIntParamByKey(c, "id")
14+
name, err := helper.GetStrParamByKey(c, "name")
1515
if err != nil {
1616
helper.BadRequest(c, err)
1717
return
1818
}
1919

20-
if err := backupService.CheckUsed(id); err != nil {
20+
if err := backupService.CheckUsed(name); err != nil {
2121
helper.BadRequest(c, err)
2222
return
2323
}

agent/app/repo/backup.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ type IBackupRepo interface {
1717
Create(backup *model.BackupAccount) error
1818
Save(backup *model.BackupAccount) error
1919
Delete(opts ...DBOption) error
20+
WithByPublic(isPublic bool) DBOption
2021

2122
ListRecord(opts ...DBOption) ([]model.BackupRecord, error)
2223
PageRecord(page, size int, opts ...DBOption) (int64, []model.BackupRecord, error)
@@ -35,6 +36,12 @@ func NewIBackupRepo() IBackupRepo {
3536
return &BackupRepo{}
3637
}
3738

39+
func (u *BackupRepo) WithByPublic(isPublic bool) DBOption {
40+
return func(g *gorm.DB) *gorm.DB {
41+
return g.Where("is_public = ?", isPublic)
42+
}
43+
}
44+
3845
func (u *BackupRepo) Get(opts ...DBOption) (model.BackupAccount, error) {
3946
var backup model.BackupAccount
4047
db := global.DB

agent/app/service/backup.go

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ import (
2828
type BackupService struct{}
2929

3030
type IBackupService interface {
31-
CheckUsed(id uint) error
31+
CheckUsed(name string) error
3232
Sync(req dto.SyncFromMaster) error
3333

3434
LoadBackupOptions() ([]dto.BackupOption, error)
@@ -103,8 +103,8 @@ func (u *BackupService) SearchWithPage(req dto.SearchPageWithType) (int64, inter
103103
item.Vars = string(itemVars)
104104
}
105105
} else {
106-
item.AccessKey = base64.StdEncoding.EncodeToString([]byte(item.AccessKey))
107-
item.Credential = base64.StdEncoding.EncodeToString([]byte(item.Credential))
106+
item.AccessKey, _ = encrypt.StringDecryptWithBase64(item.AccessKey)
107+
item.Credential, _ = encrypt.StringDecryptWithBase64(item.Credential)
108108
}
109109

110110
if account.Type == constant.OneDrive || account.Type == constant.ALIYUN || account.Type == constant.GoogleDrive {
@@ -394,15 +394,19 @@ func (u *BackupService) LoadBackupOptions() ([]dto.BackupOption, error) {
394394
return data, nil
395395
}
396396

397-
func (u *BackupService) CheckUsed(id uint) error {
397+
func (u *BackupService) CheckUsed(name string) error {
398+
account, _ := backupRepo.Get(repo.WithByName(name), backupRepo.WithByPublic(true))
399+
if account.ID == 0 {
400+
return nil
401+
}
398402
cronjobs, _ := cronjobRepo.List()
399403
for _, job := range cronjobs {
400-
if job.DownloadAccountID == id {
404+
if job.DownloadAccountID == account.ID {
401405
return buserr.New("ErrBackupInUsed")
402406
}
403407
ids := strings.Split(job.SourceAccountIDs, ",")
404408
for _, idItem := range ids {
405-
if idItem == fmt.Sprintf("%v", id) {
409+
if idItem == fmt.Sprintf("%v", account.ID) {
406410
return buserr.New("ErrBackupInUsed")
407411
}
408412
}

agent/init/hook/hook.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package hook
22

33
import (
4+
"os"
45
"path"
56

67
"github.com/1Panel-dev/1Panel/agent/app/dto"
@@ -102,4 +103,10 @@ func loadLocalDir() {
102103
return
103104
}
104105
global.Dir.LocalBackupDir = account.BackupPath
106+
107+
if _, err := os.Stat(account.BackupPath); err != nil && os.IsNotExist(err) {
108+
if err = os.MkdirAll(account.BackupPath, os.ModePerm); err != nil {
109+
global.LOG.Errorf("mkdir %s failed, err: %v", account.BackupPath, err)
110+
}
111+
}
105112
}

agent/router/backup.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ func (s *BackupRouter) InitRouter(Router *gin.RouterGroup) {
1111
backupRouter := Router.Group("backups")
1212
baseApi := v2.ApiGroupApp.BaseApi
1313
{
14-
backupRouter.GET("/check/:id", baseApi.CheckBackupUsed)
14+
backupRouter.GET("/check/:name", baseApi.CheckBackupUsed)
1515
backupRouter.POST("/sync", baseApi.SyncBackupAccount)
1616
backupRouter.GET("/options", baseApi.LoadBackupOptions)
1717
backupRouter.POST("/search", baseApi.SearchBackup)

core/app/api/v2/backup.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -33,13 +33,13 @@ func (b *BaseApi) CreateBackup(c *gin.Context) {
3333
// @Tags Backup Account
3434
// @Summary Refresh token
3535
// @Accept json
36-
// @Param request body dto.BackupOperate true "request"
36+
// @Param request body dto.OperateByName true "request"
3737
// @Success 200
3838
// @Security ApiKeyAuth
3939
// @Security Timestamp
4040
// @Router /core/backups/refresh/token [post]
4141
func (b *BaseApi) RefreshToken(c *gin.Context) {
42-
var req dto.OperateByID
42+
var req dto.OperateByName
4343
if err := helper.CheckBindAndValidate(&req, c); err != nil {
4444
return
4545
}
@@ -96,19 +96,19 @@ func (b *BaseApi) LoadBackupClientInfo(c *gin.Context) {
9696
// @Tags Backup Account
9797
// @Summary Delete backup account
9898
// @Accept json
99-
// @Param request body dto.OperateByID true "request"
99+
// @Param request body dto.OperateByName true "request"
100100
// @Success 200
101101
// @Security ApiKeyAuth
102102
// @Security Timestamp
103103
// @Router /core/backups/del [post]
104-
// @x-panel-log {"bodyKeys":["id"],"paramKeys":[],"BeforeFunctions":[{"input_column":"id","input_value":"id","isList":false,"db":"backup_accounts","output_column":"type","output_value":"types"}],"formatZH":"删除备份账号 [types]","formatEN":"delete backup account [types]"}
104+
// @x-panel-log {"bodyKeys":["name"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"删除备份账号 [name]","formatEN":"delete backup account [name]"}
105105
func (b *BaseApi) DeleteBackup(c *gin.Context) {
106-
var req dto.OperateByID
106+
var req dto.OperateByName
107107
if err := helper.CheckBindAndValidate(&req, c); err != nil {
108108
return
109109
}
110110

111-
if err := backupService.Delete(req.ID); err != nil {
111+
if err := backupService.Delete(req.Name); err != nil {
112112
helper.InternalServer(c, err)
113113
return
114114
}

core/app/dto/common.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,10 @@ type OperateByType struct {
3535
Type string `json:"type"`
3636
}
3737

38+
type OperateByName struct {
39+
Name string `json:"name"`
40+
}
41+
3842
type OperateByID struct {
3943
ID uint `json:"id"`
4044
}

core/app/service/backup.go

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,8 @@ type IBackupService interface {
3333
Create(backupDto dto.BackupOperate) error
3434
GetBuckets(backupDto dto.ForBuckets) ([]interface{}, error)
3535
Update(req dto.BackupOperate) error
36-
Delete(id uint) error
37-
RefreshToken(req dto.OperateByID) error
36+
Delete(name string) error
37+
RefreshToken(req dto.OperateByName) error
3838
}
3939

4040
func NewIBackupService() IBackupService {
@@ -156,8 +156,8 @@ func (u *BackupService) GetBuckets(req dto.ForBuckets) ([]interface{}, error) {
156156
return client.ListBuckets()
157157
}
158158

159-
func (u *BackupService) Delete(id uint) error {
160-
backup, _ := backupRepo.Get(repo.WithByID(id))
159+
func (u *BackupService) Delete(name string) error {
160+
backup, _ := backupRepo.Get(repo.WithByName(name))
161161
if backup.ID == 0 {
162162
return buserr.New("ErrRecordNotFound")
163163
}
@@ -167,21 +167,21 @@ func (u *BackupService) Delete(id uint) error {
167167
if backup.Type == constant.Local {
168168
return buserr.New("ErrBackupLocal")
169169
}
170-
if _, err := req_helper.NewLocalClient(fmt.Sprintf("/api/v2/backups/check/%v", id), http.MethodGet, nil); err != nil {
170+
if _, err := req_helper.NewLocalClient(fmt.Sprintf("/api/v2/backups/check/%s", name), http.MethodGet, nil); err != nil {
171171
global.LOG.Errorf("check used of local cronjob failed, err: %v", err)
172172
return buserr.New("ErrBackupInUsed")
173173
}
174-
if err := xpack.CheckBackupUsed(id); err != nil {
174+
if err := xpack.CheckBackupUsed(name); err != nil {
175175
global.LOG.Errorf("check used of node cronjob failed, err: %v", err)
176176
return buserr.New("ErrBackupInUsed")
177177
}
178178

179179
go syncAccountToAgent(backup, "delete")
180-
return backupRepo.Delete(repo.WithByID(id))
180+
return backupRepo.Delete(repo.WithByName(name))
181181
}
182182

183183
func (u *BackupService) Update(req dto.BackupOperate) error {
184-
backup, _ := backupRepo.Get(repo.WithByID(req.ID))
184+
backup, _ := backupRepo.Get(repo.WithByName(req.Name))
185185
if backup.ID == 0 {
186186
return buserr.New("ErrRecordNotFound")
187187
}
@@ -198,6 +198,7 @@ func (u *BackupService) Update(req dto.BackupOperate) error {
198198
if err := copier.Copy(&newBackup, &req); err != nil {
199199
return buserr.WithDetail("ErrStructTransform", err.Error(), nil)
200200
}
201+
newBackup.ID = backup.ID
201202
itemAccessKey, err := base64.StdEncoding.DecodeString(newBackup.AccessKey)
202203
if err != nil {
203204
return err
@@ -235,8 +236,8 @@ func (u *BackupService) Update(req dto.BackupOperate) error {
235236
return nil
236237
}
237238

238-
func (u *BackupService) RefreshToken(req dto.OperateByID) error {
239-
backup, _ := backupRepo.Get(repo.WithByID(req.ID))
239+
func (u *BackupService) RefreshToken(req dto.OperateByName) error {
240+
backup, _ := backupRepo.Get(repo.WithByName(req.Name))
240241
if backup.ID == 0 {
241242
return buserr.New("ErrRecordNotFound")
242243
}

core/utils/cloud_storage/client/helper.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import (
88

99
func loadParamFromVars(key string, vars map[string]interface{}) string {
1010
if _, ok := vars[key]; !ok {
11-
if key != "bucket" && key != "port" {
11+
if key != "bucket" && key != "port" && key != "authMode" && key != "passPhrase" {
1212
global.LOG.Errorf("load param %s from vars failed, err: not exist!", key)
1313
}
1414
return ""

core/utils/xpack/xpack.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ func Proxy(c *gin.Context, currentNode string) {}
1616

1717
func UpdateGroup(name string, group, newGroup uint) error { return nil }
1818

19-
func CheckBackupUsed(id uint) error { return nil }
19+
func CheckBackupUsed(name string) error { return nil }
2020

2121
func RequestToAllAgent(reqUrl, reqMethod string, reqBody io.Reader) error { return nil }
2222

0 commit comments

Comments
 (0)