diff --git a/agent/app/api/v2/backup.go b/agent/app/api/v2/backup.go index c448b2616..0b32124b8 100644 --- a/agent/app/api/v2/backup.go +++ b/agent/app/api/v2/backup.go @@ -25,6 +25,36 @@ func (b *BaseApi) CheckBackupUsed(c *gin.Context) { helper.SuccessWithOutData(c) } +func (b *BaseApi) SyncBackupAccount(c *gin.Context) { + var req dto.SyncFromMaster + if err := helper.CheckBindAndValidate(&req, c); err != nil { + return + } + + if err := backupService.Sync(req); err != nil { + helper.BadRequest(c, err) + return + } + + helper.SuccessWithOutData(c) +} + +// @Tags Backup Account +// @Summary Load backup account options +// @Description 获取备份账号选项 +// @Accept json +// @Success 200 {array} dto.BackupOption +// @Security ApiKeyAuth +// @Router /backup/options [get] +func (b *BaseApi) LoadBackupOptions(c *gin.Context) { + list, err := backupService.LoadBackupOptions() + if err != nil { + helper.InternalServer(c, err) + return + } + helper.SuccessWithData(c, list) +} + // @Tags Backup Account // @Summary Page backup records // @Description 获取备份记录列表分页 diff --git a/agent/app/api/v2/health.go b/agent/app/api/v2/health.go index 4dbfd6ece..b8af24aeb 100644 --- a/agent/app/api/v2/health.go +++ b/agent/app/api/v2/health.go @@ -1,18 +1,10 @@ package v2 import ( - "net/http" - "github.com/1Panel-dev/1Panel/agent/app/api/v2/helper" - "github.com/1Panel-dev/1Panel/agent/utils/xpack" "github.com/gin-gonic/gin" ) func (b *BaseApi) CheckHealth(c *gin.Context) { - _, err := xpack.RequestToMaster("/api/v2/agent/xpack/health", http.MethodGet, nil) - if err != nil { - helper.InternalServer(c, err) - return - } helper.SuccessWithOutData(c) } diff --git a/agent/app/dto/backup.go b/agent/app/dto/backup.go index 6170f2de3..fbdf55ad8 100644 --- a/agent/app/dto/backup.go +++ b/agent/app/dto/backup.go @@ -4,6 +4,18 @@ import ( "time" ) +type SyncFromMaster struct { + Name string `json:"name" validate:"required"` + Operation string `json:"operation" validate:"required,oneof=create delete update"` + Data string `json:"data"` +} + +type BackupOption struct { + ID uint `json:"id"` + Name string `json:"name"` + Type string `json:"type"` +} + type CommonBackup struct { Type string `json:"type" validate:"required,oneof=app mysql mariadb redis website postgresql"` Name string `json:"name"` diff --git a/agent/app/model/app_launcher.go b/agent/app/model/app_launcher.go new file mode 100644 index 000000000..83457836d --- /dev/null +++ b/agent/app/model/app_launcher.go @@ -0,0 +1,6 @@ +package model + +type AppLauncher struct { + BaseModel + Key string `json:"key"` +} diff --git a/agent/app/model/backup.go b/agent/app/model/backup.go index c4ac67188..79680f46b 100644 --- a/agent/app/model/backup.go +++ b/agent/app/model/backup.go @@ -2,13 +2,15 @@ package model type BackupAccount struct { BaseModel - Name string `json:"name"` - Type string `json:"type"` + Name string `gorm:"not null" json:"name"` + Type string `gorm:"not null" json:"type"` Bucket string `json:"bucket"` AccessKey string `json:"accessKey"` Credential string `json:"credential"` BackupPath string `json:"backupPath"` Vars string `json:"vars"` + + RememberAuth bool `json:"rememberAuth"` } // Source ---> SourceAccountIDs diff --git a/agent/app/model/setting.go b/agent/app/model/setting.go index d47cb6c1c..092557c9a 100644 --- a/agent/app/model/setting.go +++ b/agent/app/model/setting.go @@ -8,11 +8,10 @@ type Setting struct { } type NodeInfo struct { - BaseDir string `json:"baseDir"` - Version string `json:"version"` - MasterAddr string `json:"masterAddr"` - EncryptKey string `json:"encryptKey"` - ServerCrt string `json:"serverCrt"` - ServerKey string `json:"serverKey"` - CurrentNode string `json:"currentNode"` + Scope string `json:"scope"` + BaseDir string `json:"baseDir"` + Version string `json:"version"` + EncryptKey string `json:"encryptKey"` + ServerCrt string `json:"serverCrt"` + ServerKey string `json:"serverKey"` } diff --git a/agent/app/repo/app_launcher.go b/agent/app/repo/app_launcher.go new file mode 100644 index 000000000..b597e20bf --- /dev/null +++ b/agent/app/repo/app_launcher.go @@ -0,0 +1,55 @@ +package repo + +import ( + "github.com/1Panel-dev/1Panel/agent/app/model" + "github.com/1Panel-dev/1Panel/agent/global" +) + +type LauncherRepo struct{} + +type ILauncherRepo interface { + Get(opts ...DBOption) (model.AppLauncher, error) + List(opts ...DBOption) ([]model.AppLauncher, error) + Create(launcher *model.AppLauncher) error + Save(launcher *model.AppLauncher) error + Delete(opts ...DBOption) error +} + +func NewILauncherRepo() ILauncherRepo { + return &LauncherRepo{} +} + +func (u *LauncherRepo) Get(opts ...DBOption) (model.AppLauncher, error) { + var launcher model.AppLauncher + db := global.DB + for _, opt := range opts { + db = opt(db) + } + err := db.First(&launcher).Error + return launcher, err +} +func (u *LauncherRepo) List(opts ...DBOption) ([]model.AppLauncher, error) { + var ops []model.AppLauncher + db := global.DB.Model(&model.AppLauncher{}) + for _, opt := range opts { + db = opt(db) + } + err := db.Find(&ops).Error + return ops, err +} + +func (u *LauncherRepo) Create(launcher *model.AppLauncher) error { + return global.DB.Create(launcher).Error +} + +func (u *LauncherRepo) Save(launcher *model.AppLauncher) error { + return global.DB.Save(launcher).Error +} + +func (u *LauncherRepo) Delete(opts ...DBOption) error { + db := global.DB + for _, opt := range opts { + db = opt(db) + } + return db.Delete(&model.AppLauncher{}).Error +} diff --git a/agent/app/repo/backup.go b/agent/app/repo/backup.go index e01a3f40a..26f3fca58 100644 --- a/agent/app/repo/backup.go +++ b/agent/app/repo/backup.go @@ -11,6 +11,12 @@ import ( type BackupRepo struct{} type IBackupRepo interface { + Get(opts ...DBOption) (model.BackupAccount, error) + List(opts ...DBOption) ([]model.BackupAccount, error) + Create(backup *model.BackupAccount) error + Save(backup *model.BackupAccount) error + Delete(opts ...DBOption) error + ListRecord(opts ...DBOption) ([]model.BackupRecord, error) PageRecord(page, size int, opts ...DBOption) (int64, []model.BackupRecord, error) CreateRecord(record *model.BackupRecord) error @@ -26,6 +32,54 @@ func NewIBackupRepo() IBackupRepo { return &BackupRepo{} } +func (u *BackupRepo) Get(opts ...DBOption) (model.BackupAccount, error) { + var backup model.BackupAccount + db := global.DB + for _, opt := range opts { + db = opt(db) + } + err := db.First(&backup).Error + return backup, err +} + +func (u *BackupRepo) Page(page, size int, opts ...DBOption) (int64, []model.BackupAccount, error) { + var ops []model.BackupAccount + db := global.DB.Model(&model.BackupAccount{}) + for _, opt := range opts { + db = opt(db) + } + count := int64(0) + db = db.Count(&count) + err := db.Limit(size).Offset(size * (page - 1)).Find(&ops).Error + return count, ops, err +} + +func (u *BackupRepo) List(opts ...DBOption) ([]model.BackupAccount, error) { + var ops []model.BackupAccount + db := global.DB.Model(&model.BackupAccount{}) + for _, opt := range opts { + db = opt(db) + } + err := db.Find(&ops).Error + return ops, err +} + +func (u *BackupRepo) Create(backup *model.BackupAccount) error { + return global.DB.Create(backup).Error +} + +func (u *BackupRepo) Save(backup *model.BackupAccount) error { + return global.DB.Save(backup).Error +} + +func (u *BackupRepo) Delete(opts ...DBOption) error { + db := global.DB + for _, opt := range opts { + db = opt(db) + } + return db.Delete(&model.BackupAccount{}).Error +} + func (u *BackupRepo) ListRecord(opts ...DBOption) ([]model.BackupRecord, error) { var users []model.BackupRecord db := global.DB.Model(&model.BackupRecord{}) diff --git a/agent/app/service/backup.go b/agent/app/service/backup.go index 8ce775b60..c8a46cb5d 100644 --- a/agent/app/service/backup.go +++ b/agent/app/service/backup.go @@ -1,12 +1,10 @@ package service import ( - "bytes" "context" "encoding/base64" "encoding/json" "fmt" - "net/http" "os" "path" "sort" @@ -21,7 +19,6 @@ import ( "github.com/1Panel-dev/1Panel/agent/global" "github.com/1Panel-dev/1Panel/agent/utils/cloud_storage" "github.com/1Panel-dev/1Panel/agent/utils/encrypt" - "github.com/1Panel-dev/1Panel/agent/utils/xpack" "github.com/jinzhu/copier" "github.com/pkg/errors" ) @@ -30,6 +27,9 @@ type BackupService struct{} type IBackupService interface { CheckUsed(id uint) error + Sync(req dto.SyncFromMaster) error + + LoadBackupOptions() ([]dto.BackupOption, error) SearchRecordsWithPage(search dto.RecordSearch) (int64, []dto.BackupRecords, error) SearchRecordsByCronjobWithPage(search dto.RecordSearchByCronjob) (int64, []dto.BackupRecords, error) @@ -61,6 +61,53 @@ func NewIBackupService() IBackupService { return &BackupService{} } +func (u *BackupService) Sync(req dto.SyncFromMaster) error { + var accountItem model.BackupAccount + if err := json.Unmarshal([]byte(req.Data), &accountItem); err != nil { + return err + } + accountItem.AccessKey, _ = encrypt.StringEncryptWithBase64(accountItem.AccessKey) + accountItem.Credential, _ = encrypt.StringEncryptWithBase64(accountItem.Credential) + account, _ := backupRepo.Get(commonRepo.WithByName(req.Name)) + switch req.Operation { + case "create": + if account.ID != 0 { + accountItem.ID = account.ID + return backupRepo.Save(&accountItem) + } + return backupRepo.Create(&accountItem) + case "delete": + if account.ID == 0 { + return constant.ErrRecordNotFound + } + return backupRepo.Delete(commonRepo.WithByID(account.ID)) + case "update": + if account.ID == 0 { + return constant.ErrRecordNotFound + } + accountItem.ID = account.ID + return backupRepo.Save(&accountItem) + default: + return fmt.Errorf("not support such operation %s", req.Operation) + } +} + +func (u *BackupService) LoadBackupOptions() ([]dto.BackupOption, error) { + accounts, err := backupRepo.List(commonRepo.WithOrderBy("created_at desc")) + if err != nil { + return nil, err + } + var data []dto.BackupOption + for _, account := range accounts { + var item dto.BackupOption + if err := copier.Copy(&item, &account); err != nil { + global.LOG.Errorf("copy backup account to dto backup info failed, err: %v", err) + } + data = append(data, item) + } + return data, nil +} + func (u *BackupService) SearchRecordsWithPage(search dto.RecordSearch) (int64, []dto.BackupRecords, error) { total, records, err := backupRepo.PageRecord( search.Page, search.PageSize, @@ -289,29 +336,7 @@ func NewBackupClientWithID(id uint) (*model.BackupAccount, cloud_storage.CloudSt account.AccessKey, _ = encrypt.StringDecryptWithKey(account.AccessKey, setting.Value) account.Credential, _ = encrypt.StringDecryptWithKey(account.Credential, setting.Value) } else { - bodyItem, err := json.Marshal(dto.OperateByID{ID: id}) - if err != nil { - return nil, nil, err - } - data, err := xpack.RequestToMaster("/api/v2/agent/xpack/backup", http.MethodPost, bytes.NewReader(bodyItem)) - if err != nil { - return nil, nil, err - } - item, err := json.Marshal(data) - if err != nil { - return nil, nil, err - } - if err := json.Unmarshal(item, &account); err != nil { - return nil, nil, fmt.Errorf("err response from master: %v", data) - } - - if account.Type == constant.Local { - localDir, err := LoadLocalDirByStr(account.Vars) - if err != nil { - return nil, nil, err - } - global.CONF.System.Backup = localDir - } + account, _ = backupRepo.Get(commonRepo.WithByID(id)) } backClient, err := newClient(&account) if err != nil { @@ -351,24 +376,7 @@ func NewBackupClientMap(ids []string) (map[string]backupClientHelper, error) { item, _ := strconv.Atoi(ids[i]) idItems = append(idItems, uint(item)) } - operateByIDs := struct { - IDs []uint `json:"ids"` - }{IDs: idItems} - bodyItem, err := json.Marshal(operateByIDs) - if err != nil { - return nil, err - } - data, err := xpack.RequestToMaster("/api/v2/agent/xpack/backup/list", http.MethodPost, bytes.NewReader(bodyItem)) - if err != nil { - return nil, err - } - item, err := json.Marshal(data) - if err != nil { - return nil, err - } - if err := json.Unmarshal(item, &accounts); err != nil { - return nil, fmt.Errorf("err response from master: %v", data) - } + accounts, _ = backupRepo.List(commonRepo.WithByIDs(idItems)) } clientMap := make(map[string]backupClientHelper) for _, item := range accounts { diff --git a/agent/app/service/dashboard.go b/agent/app/service/dashboard.go index aaa67c143..ecd510062 100644 --- a/agent/app/service/dashboard.go +++ b/agent/app/service/dashboard.go @@ -4,7 +4,6 @@ import ( "encoding/json" "fmt" network "net" - "net/http" "os" "sort" "strings" @@ -12,6 +11,7 @@ import ( "time" "github.com/1Panel-dev/1Panel/agent/app/dto" + "github.com/1Panel-dev/1Panel/agent/app/model" "github.com/1Panel-dev/1Panel/agent/constant" "github.com/1Panel-dev/1Panel/agent/global" "github.com/1Panel-dev/1Panel/agent/utils/cmd" @@ -29,6 +29,8 @@ import ( type DashboardService struct{} type IDashboardService interface { + Sync(req dto.SyncFromMaster) error + LoadOsInfo() (*dto.OsInfo, error) LoadBaseInfo(ioOption string, netOption string) (*dto.DashboardBase, error) LoadCurrentInfoForNode() *dto.NodeCurrent @@ -43,6 +45,35 @@ func NewIDashboardService() IDashboardService { return &DashboardService{} } +func (u *DashboardService) Sync(req dto.SyncFromMaster) error { + var launcherItem model.AppLauncher + if err := json.Unmarshal([]byte(req.Data), &launcherItem); err != nil { + return err + } + launcher, _ := launcherRepo.Get(settingRepo.WithByKey(req.Name)) + switch req.Operation { + case "create": + if launcher.ID != 0 { + launcherItem.ID = launcher.ID + return launcherRepo.Save(&launcherItem) + } + return launcherRepo.Create(&launcherItem) + case "delete": + if launcher.ID == 0 { + return constant.ErrRecordNotFound + } + return launcherRepo.Delete(commonRepo.WithByID(launcher.ID)) + case "update": + if launcher.ID == 0 { + return constant.ErrRecordNotFound + } + launcherItem.ID = launcher.ID + return launcherRepo.Save(&launcherItem) + default: + return fmt.Errorf("not support such operation %s", req.Operation) + } +} + func (u *DashboardService) Restart(operation string) error { if operation != "1panel" && operation != "system" { return fmt.Errorf("handle restart operation %s failed, err: nonsupport such operation", operation) @@ -487,16 +518,9 @@ func loadShowList() []string { } return data } - res, err := xpack.RequestToMaster("/api/v2/core/launcher/search", http.MethodGet, nil) - if err != nil { - return data - } - item, err := json.Marshal(res) - if err != nil { - return data - } - if err := json.Unmarshal(item, &data); err != nil { - return data + list, _ := launcherRepo.List() + for _, item := range list { + data = append(data, item.Key) } return data } diff --git a/agent/app/service/entry.go b/agent/app/service/entry.go index 01976eaae..9d5ec7f5a 100644 --- a/agent/app/service/entry.go +++ b/agent/app/service/entry.go @@ -10,6 +10,7 @@ var ( appDetailRepo = repo.NewIAppDetailRepo() tagRepo = repo.NewITagRepo() appInstallRepo = repo.NewIAppInstallRepo() + launcherRepo = repo.NewILauncherRepo() appInstallResourceRepo = repo.NewIAppInstallResourceRpo() mysqlRepo = repo.NewIMysqlRepo() diff --git a/agent/app/service/setting.go b/agent/app/service/setting.go index c72437e52..6347d587d 100644 --- a/agent/app/service/setting.go +++ b/agent/app/service/setting.go @@ -76,6 +76,7 @@ func (u *SettingService) ReloadConn() error { return nil } if isLocal { + global.IsMaster = true return nil } @@ -90,7 +91,7 @@ func (u *SettingService) ReloadConn() error { global.LOG.Errorf("update server crt failed, err: %v", err) return nil } - if err := settingRepo.Update("CurrentNode", nodeInfo.CurrentNode); err != nil { + if err := settingRepo.Update("NodeScope", nodeInfo.Scope); err != nil { global.LOG.Errorf("update current node failed, err: %v", err) return nil } @@ -102,15 +103,10 @@ func (u *SettingService) ReloadConn() error { global.LOG.Errorf("update base dir failed, err: %v", err) return nil } - if err := settingRepo.Update("MasterAddr", nodeInfo.MasterAddr); err != nil { - global.LOG.Errorf("update master addr failed, err: %v", err) - return nil - } - global.CONF.System.BaseDir, _ = settingRepo.GetValueByKey("BaseDir") - global.CONF.System.Version, _ = settingRepo.GetValueByKey("SystemVersion") - global.CONF.System.EncryptKey, _ = settingRepo.GetValueByKey("EncryptKey") - global.CONF.System.CurrentNode, _ = settingRepo.GetValueByKey("CurrentNode") - global.CONF.System.MasterAddr, _ = settingRepo.GetValueByKey("MasterAddr") + global.CONF.System.BaseDir = nodeInfo.BaseDir + global.CONF.System.Version = nodeInfo.Version + global.CONF.System.EncryptKey = nodeInfo.EncryptKey + global.IsMaster = nodeInfo.Scope == "master" return nil } diff --git a/agent/configs/system.go b/agent/configs/system.go index 413be7ee2..ce5820a01 100644 --- a/agent/configs/system.go +++ b/agent/configs/system.go @@ -3,11 +3,9 @@ package configs type System struct { Mode string `mapstructure:"mode"` - Version string `mapstructure:"version"` - BaseDir string `mapstructure:"base_dir"` - CurrentNode string `mapstructure:"base_dir"` - MasterAddr string `mapstructure:"master_addr"` - EncryptKey string `mapstructure:"encrypt_key"` + Version string `mapstructure:"version"` + BaseDir string `mapstructure:"base_dir"` + EncryptKey string `mapstructure:"encrypt_key"` DbFile string `mapstructure:"db_agent_file"` DbPath string `mapstructure:"db_path"` diff --git a/agent/constant/backup.go b/agent/constant/backup.go index 751316855..b6c6d9d2a 100644 --- a/agent/constant/backup.go +++ b/agent/constant/backup.go @@ -16,6 +16,4 @@ const ( UPYUN = "UPYUN" ALIYUN = "ALIYUN" GoogleDrive = "GoogleDrive" - - OneDriveRedirectURI = "http://localhost/login/authorized" ) diff --git a/agent/global/global.go b/agent/global/global.go index 9dddc878e..41aa92dbe 100644 --- a/agent/global/global.go +++ b/agent/global/global.go @@ -22,9 +22,8 @@ var ( CACHE *badger_db.Cache Viper *viper.Viper - Cron *cron.Cron - MonitorCronID cron.EntryID - OneDriveCronID cron.EntryID + Cron *cron.Cron + MonitorCronID cron.EntryID IsMaster bool diff --git a/agent/init/hook/hook.go b/agent/init/hook/hook.go index c1bf09c4b..f2c528684 100644 --- a/agent/init/hook/hook.go +++ b/agent/init/hook/hook.go @@ -9,12 +9,9 @@ import ( "github.com/1Panel-dev/1Panel/agent/constant" "github.com/1Panel-dev/1Panel/agent/global" "github.com/1Panel-dev/1Panel/agent/utils/common" - "github.com/1Panel-dev/1Panel/agent/utils/encrypt" - "github.com/1Panel-dev/1Panel/agent/utils/xpack" ) func Init() { - service.NewISettingService().ReloadConn() initGlobalData() handleCronjobStatus() handleSnapStatus() @@ -30,16 +27,9 @@ func initGlobalData() { global.LOG.Fatalf("init service before start failed, err: %v", err) } - global.CONF.System.BaseDir, _ = settingRepo.GetValueByKey("BaseDir") - global.CONF.System.Version, _ = settingRepo.GetValueByKey("SystemVersion") - global.CONF.System.EncryptKey, _ = settingRepo.GetValueByKey("EncryptKey") - global.CONF.System.CurrentNode, _ = settingRepo.GetValueByKey("CurrentNode") - - global.IsMaster = global.CONF.System.CurrentNode == "127.0.0.1" || len(global.CONF.System.CurrentNode) == 0 + _ = service.NewISettingService().ReloadConn() if global.IsMaster { global.CoreDB = common.LoadDBConnByPath(path.Join(global.CONF.System.DbPath, "core.db"), "core") - } else { - global.CONF.System.MasterAddr, _ = settingRepo.GetValueByKey("MasterAddr") } } @@ -99,45 +89,3 @@ func loadLocalDir() { } global.CONF.System.Backup = localDir } - -func initWithNodeJson() { - if global.IsMaster { - return - } - isLocal, nodeInfo, err := xpack.LoadNodeInfo() - if err != nil { - global.LOG.Errorf("load new node info failed, err: %v", err) - return - } - if isLocal { - return - } - - settingRepo := repo.NewISettingRepo() - itemKey, _ := encrypt.StringEncrypt(nodeInfo.ServerKey) - if err := settingRepo.Update("ServerKey", itemKey); err != nil { - global.LOG.Errorf("update server key failed, err: %v", err) - return - } - itemCrt, _ := encrypt.StringEncrypt(nodeInfo.ServerCrt) - if err := settingRepo.Update("ServerCrt", itemCrt); err != nil { - global.LOG.Errorf("update server crt failed, err: %v", err) - return - } - if err := settingRepo.Update("CurrentNode", nodeInfo.CurrentNode); err != nil { - global.LOG.Errorf("update current node failed, err: %v", err) - return - } - if err := settingRepo.Update("SystemVersion", nodeInfo.Version); err != nil { - global.LOG.Errorf("update system version failed, err: %v", err) - return - } - if err := settingRepo.Update("BaseDir", nodeInfo.BaseDir); err != nil { - global.LOG.Errorf("update base dir failed, err: %v", err) - return - } - if err := settingRepo.Update("MasterAddr", nodeInfo.MasterAddr); err != nil { - global.LOG.Errorf("update master addr failed, err: %v", err) - return - } -} diff --git a/agent/init/migration/migrate.go b/agent/init/migration/migrate.go index 6ad8ac415..36d24b8e5 100644 --- a/agent/init/migration/migrate.go +++ b/agent/init/migration/migrate.go @@ -15,7 +15,6 @@ func Init() { migrations.InitImageRepo, migrations.InitDefaultCA, migrations.InitPHPExtensions, - migrations.InitBaseDir, }) if err := m.Migrate(); err != nil { global.LOG.Error(err) diff --git a/agent/init/migration/migrations/init.go b/agent/init/migration/migrations/init.go index c6bb3413e..f27f1b08d 100644 --- a/agent/init/migration/migrations/init.go +++ b/agent/init/migration/migrations/init.go @@ -24,6 +24,8 @@ var AddTable = &gormigrate.Migration{ &model.AppTag{}, &model.Tag{}, &model.App{}, + &model.AppLauncher{}, + &model.BackupAccount{}, &model.BackupRecord{}, &model.Clam{}, &model.ComposeTemplate{}, @@ -79,9 +81,6 @@ var InitSetting = &gormigrate.Migration{ if err := tx.Create(&model.Setting{Key: "BaseDir", Value: nodeInfo.BaseDir}).Error; err != nil { return err } - if err := tx.Create(&model.Setting{Key: "CurrentNode", Value: nodeInfo.CurrentNode}).Error; err != nil { - return err - } if err := tx.Create(&model.Setting{Key: "EncryptKey", Value: nodeInfo.EncryptKey}).Error; err != nil { return err } @@ -93,7 +92,7 @@ var InitSetting = &gormigrate.Migration{ if err := tx.Create(&model.Setting{Key: "ServerCrt", Value: itemCrt}).Error; err != nil { return err } - if err := tx.Create(&model.Setting{Key: "MasterAddr", Value: nodeInfo.MasterAddr}).Error; err != nil { + if err := tx.Create(&model.Setting{Key: "NodeScope", Value: nodeInfo.Scope}).Error; err != nil { return err } if err := tx.Create(&model.Setting{Key: "SystemVersion", Value: nodeInfo.Version}).Error; err != nil { @@ -218,13 +217,3 @@ var InitPHPExtensions = &gormigrate.Migration{ return nil }, } - -var InitBaseDir = &gormigrate.Migration{ - ID: "20241122-init-setting", - Migrate: func(tx *gorm.DB) error { - if err := tx.Create(&model.Setting{Key: "BaseDir", Value: global.CONF.System.BaseDir}).Error; err != nil { - return err - } - return nil - }, -} diff --git a/agent/router/backup.go b/agent/router/backup.go index c951f3380..c6c59679f 100644 --- a/agent/router/backup.go +++ b/agent/router/backup.go @@ -12,6 +12,9 @@ func (s *BackupRouter) InitRouter(Router *gin.RouterGroup) { baseApi := v2.ApiGroupApp.BaseApi { backupRouter.GET("/check/:id", baseApi.CheckBackupUsed) + backupRouter.POST("/sync", baseApi.SyncBackupAccount) + backupRouter.GET("/options", baseApi.LoadBackupOptions) + backupRouter.POST("/backup", baseApi.Backup) backupRouter.POST("/recover", baseApi.Recover) backupRouter.POST("/recover/byupload", baseApi.RecoverByUpload) diff --git a/agent/utils/xpack/xpack.go b/agent/utils/xpack/xpack.go index b53453247..d359ef1e6 100644 --- a/agent/utils/xpack/xpack.go +++ b/agent/utils/xpack/xpack.go @@ -5,7 +5,6 @@ package xpack import ( "crypto/tls" "fmt" - "io" "net" "net/http" "strings" @@ -50,6 +49,7 @@ func LoadNodeInfo() (bool, model.NodeInfo, error) { info.BaseDir = loadParams("BASE_DIR") info.Version = loadParams("ORIGINAL_VERSION") info.EncryptKey = common.RandStr(16) + info.Scope = "master" return false, info, nil } @@ -65,10 +65,6 @@ func loadParams(param string) string { return info } -func RequestToMaster(reqUrl, reqMethod string, reqBody io.Reader) (interface{}, error) { - return nil, nil -} - func GetImagePrefix() string { return "" } diff --git a/core/app/api/v2/backup.go b/core/app/api/v2/backup.go index 4e2eb3f54..c9d829098 100644 --- a/core/app/api/v2/backup.go +++ b/core/app/api/v2/backup.go @@ -31,12 +31,12 @@ func (b *BaseApi) CreateBackup(c *gin.Context) { } // @Tags Backup Account -// @Summary Refresh OneDrive token -// @Description 刷新 OneDrive token +// @Summary Refresh token +// @Description 刷新 token // @Success 200 // @Security ApiKeyAuth -// @Router /core/backup/refresh/onedrive [post] -func (b *BaseApi) RefreshOneDriveToken(c *gin.Context) { +// @Router /core/backup/refresh/token [post] +func (b *BaseApi) RefreshToken(c *gin.Context) { backupService.Run() helper.SuccessWithData(c, nil) } @@ -64,13 +64,13 @@ func (b *BaseApi) ListBuckets(c *gin.Context) { } // @Tags Backup Account -// @Summary Load OneDrive info -// @Description 获取 OneDrive 信息 +// @Summary Load backup account base info +// @Description 获取预定义备份账号信息 // @Accept json // @Success 200 {object} dto.OneDriveInfo // @Security ApiKeyAuth // @Router /core/backup/client/:clientType [get] -func (b *BaseApi) LoadOneDriveInfo(c *gin.Context) { +func (b *BaseApi) LoadBackupClientInfo(c *gin.Context) { clientType, ok := c.Params.Get("clientType") if !ok { helper.BadRequest(c, fmt.Errorf("error %s in path", "clientType")) @@ -84,22 +84,6 @@ func (b *BaseApi) LoadOneDriveInfo(c *gin.Context) { helper.SuccessWithData(c, data) } -// @Tags Backup Account -// @Summary Load backup account options -// @Description 获取备份账号选项 -// @Accept json -// @Success 200 {array} dto.BackupOption -// @Security ApiKeyAuth -// @Router /core/backup/options [get] -func (b *BaseApi) LoadBackupOptions(c *gin.Context) { - list, err := backupService.LoadBackupOptions() - if err != nil { - helper.InternalServer(c, err) - return - } - helper.SuccessWithData(c, list) -} - // @Tags Backup Account // @Summary Delete backup account // @Description 删除备份账号 diff --git a/core/app/dto/backup.go b/core/app/dto/backup.go index 8379cb160..9319df1b2 100644 --- a/core/app/dto/backup.go +++ b/core/app/dto/backup.go @@ -2,6 +2,12 @@ package dto import "time" +type SyncToAgent struct { + Name string `json:"name" validate:"required"` + Operation string `json:"operation" validate:"required,oneof=create delere update"` + Data string `json:"data"` +} + type BackupOperate struct { ID uint `json:"id"` Name string `json:"name"` @@ -15,12 +21,6 @@ type BackupOperate struct { RememberAuth bool `json:"rememberAuth"` } -type BackupOption struct { - ID uint `json:"id"` - Name string `json:"name"` - Type string `json:"type"` -} - type BackupInfo struct { ID uint `json:"id"` Name string `json:"name"` diff --git a/core/app/dto/setting.go b/core/app/dto/setting.go index 98c76c203..a4b73f325 100644 --- a/core/app/dto/setting.go +++ b/core/app/dto/setting.go @@ -6,7 +6,6 @@ type SettingInfo struct { UserName string `json:"userName"` SystemVersion string `json:"systemVersion"` DeveloperMode string `json:"developerMode"` - MasterAddr string `json:"masterAddr"` SessionTimeout string `json:"sessionTimeout"` Port string `json:"port"` diff --git a/core/app/model/backup.go b/core/app/model/backup.go index 704febc4a..aa9756eb7 100644 --- a/core/app/model/backup.go +++ b/core/app/model/backup.go @@ -1,7 +1,5 @@ package model -import "time" - type BackupAccount struct { BaseModel Name string `gorm:"not null" json:"name"` @@ -12,6 +10,5 @@ type BackupAccount struct { BackupPath string `json:"backupPath"` Vars string `json:"vars"` - RememberAuth bool `json:"rememberAuth"` - DeletedAt time.Time `json:"deletedAt"` + RememberAuth bool `json:"rememberAuth"` } diff --git a/core/app/service/app_launcher.go b/core/app/service/app_launcher.go index 3f0a85b32..88926b446 100644 --- a/core/app/service/app_launcher.go +++ b/core/app/service/app_launcher.go @@ -1,9 +1,15 @@ package service import ( + "bytes" + "encoding/json" + "net/http" + "github.com/1Panel-dev/1Panel/core/app/dto" + "github.com/1Panel-dev/1Panel/core/app/model" "github.com/1Panel-dev/1Panel/core/app/repo" "github.com/1Panel-dev/1Panel/core/constant" + "github.com/1Panel-dev/1Panel/core/utils/xpack" ) type LauncherService struct{} @@ -36,11 +42,25 @@ func (u *LauncherService) ChangeShow(req dto.SettingUpdate) error { return nil } launcher.Key = req.Key - return launcherRepo.Create(&launcher) + if err := launcherRepo.Create(&launcher); err != nil { + return err + } + go syncLauncherToAgent(launcher, "create") + return nil } if launcher.ID == 0 { return nil } + if err := launcherRepo.Delete(repo.WithByKey(req.Key)); err != nil { + return err + } + go syncLauncherToAgent(launcher, "delete") + return nil +} - return launcherRepo.Delete(repo.WithByKey(req.Key)) +func syncLauncherToAgent(launcher model.AppLauncher, operation string) { + itemData, _ := json.Marshal(launcher) + itemJson := dto.SyncToAgent{Name: launcher.Key, Operation: operation, Data: string(itemData)} + bodyItem, _ := json.Marshal(itemJson) + _ = xpack.RequestToAgent("/api/v2/backups/sync", http.MethodPost, bytes.NewReader((bodyItem))) } diff --git a/core/app/service/backup.go b/core/app/service/backup.go index 4d929be35..c9ad84d04 100644 --- a/core/app/service/backup.go +++ b/core/app/service/backup.go @@ -2,6 +2,7 @@ package service import ( "bufio" + "bytes" "encoding/base64" "encoding/json" "fmt" @@ -34,7 +35,6 @@ type IBackupService interface { List(req dto.OperateByIDs) ([]dto.BackupInfo, error) GetLocalDir() (string, error) - LoadBackupOptions() ([]dto.BackupOption, error) SearchWithPage(search dto.SearchPageWithType) (int64, interface{}, error) LoadBackupClientInfo(clientType string) (dto.BackupClientInfo, error) Create(backupDto dto.BackupOperate) error @@ -106,22 +106,6 @@ func (u *BackupService) GetLocalDir() (string, error) { return dir, nil } -func (u *BackupService) LoadBackupOptions() ([]dto.BackupOption, error) { - accounts, err := backupRepo.List(repo.WithOrderBy("created_at desc")) - if err != nil { - return nil, err - } - var data []dto.BackupOption - for _, account := range accounts { - var item dto.BackupOption - if err := copier.Copy(&item, &account); err != nil { - global.LOG.Errorf("copy backup account to dto backup info failed, err: %v", err) - } - data = append(data, item) - } - return data, nil -} - func (u *BackupService) SearchWithPage(req dto.SearchPageWithType) (int64, interface{}, error) { count, accounts, err := backupRepo.Page( req.Page, @@ -245,6 +229,7 @@ func (u *BackupService) Create(req dto.BackupOperate) error { if err := backupRepo.Create(&backup); err != nil { return err } + go syncAccountToAgent(backup, "create") return nil } @@ -296,6 +281,7 @@ func (u *BackupService) Delete(id uint) error { return buserr.New(constant.ErrBackupInUsed) } + go syncAccountToAgent(backup, "delete") return backupRepo.Delete(repo.WithByID(id)) } @@ -362,6 +348,7 @@ func (u *BackupService) Update(req dto.BackupOperate) error { if err := backupRepo.Save(&newBackup); err != nil { return err } + go syncAccountToAgent(backup, "update") return nil } @@ -551,5 +538,16 @@ func refreshToken() { varsItem, _ := json.Marshal(varMap) _ = global.DB.Model(&model.BackupAccount{}).Where("id = ?", backupItem.ID).Updates(map[string]interface{}{"vars": varsItem}).Error + + go syncAccountToAgent(backupItem, "update") } } + +func syncAccountToAgent(backup model.BackupAccount, operation string) { + backup.AccessKey, _ = encrypt.StringDecryptWithBase64(backup.AccessKey) + backup.Credential, _ = encrypt.StringDecryptWithBase64(backup.Credential) + itemData, _ := json.Marshal(backup) + itemJson := dto.SyncToAgent{Name: backup.Name, Operation: operation, Data: string(itemData)} + bodyItem, _ := json.Marshal(itemJson) + _ = xpack.RequestToAgent("/api/v2/backups/sync", http.MethodPost, bytes.NewReader((bodyItem))) +} diff --git a/core/app/service/setting.go b/core/app/service/setting.go index 4e320fcf7..2a0fcba3e 100644 --- a/core/app/service/setting.go +++ b/core/app/service/setting.go @@ -9,7 +9,6 @@ import ( "net" "os" "path" - "regexp" "strconv" "strings" "time" @@ -23,7 +22,6 @@ import ( "github.com/1Panel-dev/1Panel/core/utils/common" "github.com/1Panel-dev/1Panel/core/utils/encrypt" "github.com/1Panel-dev/1Panel/core/utils/firewall" - "github.com/1Panel-dev/1Panel/core/utils/xpack" "github.com/gin-gonic/gin" ) @@ -113,12 +111,6 @@ func (u *SettingService) Update(key, value string) error { } case "UserName", "Password": _ = global.SESSION.Clean() - case "MasterAddr": - go func() { - if err := xpack.UpdateMasterAddr(value); err != nil { - global.LOG.Errorf("update master addr failed, err: %v", err) - } - }() } return nil @@ -203,27 +195,8 @@ func (u *SettingService) UpdatePort(port uint) error { } go func() { time.Sleep(1 * time.Second) - defer func() { - if _, err := cmd.Exec("systemctl restart 1panel.service"); err != nil { - global.LOG.Errorf("restart system port failed, err: %v", err) - } - }() - - masterAddr, err := settingRepo.Get(repo.WithByKey("MasterAddr")) - if err != nil { - global.LOG.Errorf("load master addr from db failed, err: %v", err) - return - } - if len(masterAddr.Value) != 0 { - oldMasterPort := loadPort(masterAddr.Value) - if len(oldMasterPort) != 0 { - newMasterAddr := strings.ReplaceAll(masterAddr.Value, oldMasterPort, fmt.Sprintf("%v", port)) - _ = settingRepo.Update("MasterAddr", newMasterAddr) - if err := xpack.UpdateMasterAddr(newMasterAddr); err != nil { - global.LOG.Errorf("update master addr from db failed, err: %v", err) - return - } - } + if _, err := cmd.Exec("systemctl restart 1panel.service"); err != nil { + global.LOG.Errorf("restart system port failed, err: %v", err) } }() return nil @@ -291,31 +264,7 @@ func (u *SettingService) UpdateSSL(c *gin.Context, req dto.SSLUpdate) error { return err } - if err := u.UpdateSystemSSL(); err != nil { - return err - } - - go func() { - oldSSL, _ := settingRepo.Get(repo.WithByKey("SSL")) - if oldSSL.Value != req.SSL { - masterAddr, err := settingRepo.Get(repo.WithByKey("MasterAddr")) - if err != nil { - global.LOG.Errorf("load master addr from db failed, err: %v", err) - return - } - addrItem := masterAddr.Value - if req.SSL == constant.StatusDisable { - addrItem = strings.ReplaceAll(addrItem, "https://", "http://") - } else { - addrItem = strings.ReplaceAll(addrItem, "http://", "https://") - } - _ = settingRepo.Update("MasterAddr", addrItem) - if err := xpack.UpdateMasterAddr(addrItem); err != nil { - global.LOG.Errorf("update master addr from db failed, err: %v", err) - } - } - }() - return nil + return u.UpdateSystemSSL() } func (u *SettingService) LoadFromCert() (*dto.SSLInfo, error) { @@ -517,17 +466,3 @@ func checkCertValid() error { return nil } - -func loadPort(address string) string { - re := regexp.MustCompile(`(?:(?:\[([0-9a-fA-F:]+)\])|([^:/\s]+))(?::(\d+))?$`) - matches := re.FindStringSubmatch(address) - if len(matches) <= 0 { - return "" - } - var port string - port = matches[3] - if len(port) != 0 { - return port - } - return "" -} diff --git a/core/constant/errs.go b/core/constant/errs.go index 3265cbf47..dda876c43 100644 --- a/core/constant/errs.go +++ b/core/constant/errs.go @@ -64,7 +64,6 @@ var ( var ( ErrBackupInUsed = "ErrBackupInUsed" ErrBackupLocalDelete = "ErrBackupLocalDelete" - ErrMasterAddr = "ErrMasterAddr" ) var ( diff --git a/core/i18n/lang/zh.yaml b/core/i18n/lang/zh.yaml index d7f26d31b..36b5e4448 100644 --- a/core/i18n/lang/zh.yaml +++ b/core/i18n/lang/zh.yaml @@ -17,7 +17,6 @@ ErrEntrance: "安全入口信息错误,请检查后重试!" ErrGroupIsDefault: '默认分组,无法删除' ErrGroupIsUsed: "分组正在使用中,无法删除" ErrLocalDelete: "无法删除本地节点!" -ErrMasterAddr: "当前未设置主节点地址,无法添加节点!" #app ErrPortInUsed: "{{ .detail }} 端口已被占用!" diff --git a/core/init/migration/migrate.go b/core/init/migration/migrate.go index 1c5c442f0..cc05aa786 100644 --- a/core/init/migration/migrate.go +++ b/core/init/migration/migrate.go @@ -12,7 +12,6 @@ func Init() { migrations.AddTable, migrations.InitSetting, migrations.InitOneDrive, - migrations.InitMasterAddr, migrations.InitHost, migrations.InitTerminalSetting, migrations.InitAppLauncher, diff --git a/core/init/migration/migrations/init.go b/core/init/migration/migrations/init.go index 8d7b6e3c4..64a674734 100644 --- a/core/init/migration/migrations/init.go +++ b/core/init/migration/migrations/init.go @@ -197,16 +197,6 @@ var InitOneDrive = &gormigrate.Migration{ }, } -var InitMasterAddr = &gormigrate.Migration{ - ID: "20240814-init-master-addr", - Migrate: func(tx *gorm.DB) error { - if err := tx.Create(&model.Setting{Key: "MasterAddr", Value: ""}).Error; err != nil { - return err - } - return nil - }, -} - var InitTerminalSetting = &gormigrate.Migration{ ID: "20240814-init-terminal-setting", Migrate: func(tx *gorm.DB) error { diff --git a/core/init/router/router.go b/core/init/router/router.go index 6712ae4ab..c5cff9292 100644 --- a/core/init/router/router.go +++ b/core/init/router/router.go @@ -3,21 +3,21 @@ package router import ( "encoding/base64" "fmt" - "github.com/1Panel-dev/1Panel/core/app/service" - "github.com/1Panel-dev/1Panel/core/cmd/server/res" - "github.com/1Panel-dev/1Panel/core/constant" "net/http" "regexp" "strconv" "strings" + "github.com/1Panel-dev/1Panel/core/app/service" + "github.com/1Panel-dev/1Panel/core/cmd/server/res" + "github.com/1Panel-dev/1Panel/core/constant" + "github.com/1Panel-dev/1Panel/core/cmd/server/docs" "github.com/1Panel-dev/1Panel/core/cmd/server/web" "github.com/1Panel-dev/1Panel/core/global" "github.com/1Panel-dev/1Panel/core/i18n" "github.com/1Panel-dev/1Panel/core/middleware" rou "github.com/1Panel-dev/1Panel/core/router" - "github.com/1Panel-dev/1Panel/core/utils/xpack" "github.com/gin-contrib/gzip" "github.com/gin-gonic/gin" swaggerfiles "github.com/swaggo/files" @@ -157,9 +157,6 @@ func Routers() *gin.Engine { setWebStatic(PublicGroup) } - agentRouter := Router.Group("/api/v2/agent") - xpack.InitAgentRouter(agentRouter) - Router.Use(middleware.OperationLog()) if global.CONF.System.IsDemo { Router.Use(middleware.DemoHandle()) diff --git a/core/router/ro_backup.go b/core/router/ro_backup.go index 9667c58b2..044d7bf78 100644 --- a/core/router/ro_backup.go +++ b/core/router/ro_backup.go @@ -9,17 +9,16 @@ import ( type BackupRouter struct{} func (s *BackupRouter) InitRouter(Router *gin.RouterGroup) { - backupRouter := Router.Group("backup"). + backupRouter := Router.Group("backups"). Use(middleware.JwtAuth()). Use(middleware.SessionAuth()). Use(middleware.PasswordExpired()) baseApi := v2.ApiGroupApp.BaseApi { backupRouter.GET("/local", baseApi.GetLocalDir) - backupRouter.GET("/onedrive", baseApi.LoadOneDriveInfo) - backupRouter.GET("/options", baseApi.LoadBackupOptions) + backupRouter.GET("/client/:clientType", baseApi.LoadBackupClientInfo) backupRouter.POST("/search", baseApi.SearchBackup) - backupRouter.POST("/refresh/onedrive", baseApi.RefreshOneDriveToken) + backupRouter.POST("/refresh/token", baseApi.RefreshToken) backupRouter.POST("/buckets", baseApi.ListBuckets) backupRouter.POST("", baseApi.CreateBackup) backupRouter.POST("/del", baseApi.DeleteBackup) diff --git a/core/utils/xpack/xpack.go b/core/utils/xpack/xpack.go index 423f14617..e94264301 100644 --- a/core/utils/xpack/xpack.go +++ b/core/utils/xpack/xpack.go @@ -3,6 +3,8 @@ package xpack import ( + "io" + "github.com/gin-gonic/gin" ) @@ -12,6 +14,4 @@ func UpdateGroup(name string, group, newGroup uint) error { return nil } func CheckBackupUsed(id uint) error { return nil } -func InitAgentRouter(Router *gin.RouterGroup) {} - -func UpdateMasterAddr(newAddr string) error { return nil } +func RequestToAgent(reqUrl, reqMethod string, reqBody io.Reader) error { return nil } diff --git a/frontend/src/api/interface/backup.ts b/frontend/src/api/interface/backup.ts index dd9783580..b9a3057ef 100644 --- a/frontend/src/api/interface/backup.ts +++ b/frontend/src/api/interface/backup.ts @@ -24,7 +24,7 @@ export namespace Backup { varsJson: object; createdAt: Date; } - export interface OneDriveInfo { + export interface ClientInfo { client_id: string; client_secret: string; redirect_uri: string; diff --git a/frontend/src/api/interface/setting.ts b/frontend/src/api/interface/setting.ts index 0a2a116b5..1c9a0394b 100644 --- a/frontend/src/api/interface/setting.ts +++ b/frontend/src/api/interface/setting.ts @@ -6,7 +6,6 @@ export namespace Setting { password: string; email: string; systemIP: string; - masterAddr: string; systemVersion: string; dockerSockPath: string; developerMode: string; diff --git a/frontend/src/api/modules/backup.ts b/frontend/src/api/modules/backup.ts index 57605820a..b9024337c 100644 --- a/frontend/src/api/modules/backup.ts +++ b/frontend/src/api/modules/backup.ts @@ -6,6 +6,9 @@ import { Backup } from '../interface/backup'; import { TimeoutEnum } from '@/enums/http-enum'; // backup-agent +export const listBackupOptions = () => { + return http.get>(`/backups/options`); +}; export const handleBackup = (params: Backup.Backup) => { return http.post(`/backups/backup`, params, TimeoutEnum.T_1H); }; @@ -32,20 +35,17 @@ export const getFilesFromBackup = (id: number) => { }; // backup-core -export const refreshOneDrive = () => { - return http.post(`/core/backup/refresh/onedrive`, {}); -}; -export const getBackupList = () => { - return http.get>(`/core/backup/options`); +export const refreshToken = () => { + return http.post(`/core/backups/refresh/token`, {}); }; export const getLocalBackupDir = () => { - return http.get(`/core/backup/local`); + return http.get(`/core/backups/local`); }; export const searchBackup = (params: Backup.SearchWithType) => { - return http.post>(`/core/backup/search`, params); + return http.post>(`/core/backups/search`, params); }; export const getClientInfo = (clientType: string) => { - return http.get(`/core/backup/client/${clientType}`); + return http.get(`/core/backups/client/${clientType}`); }; export const addBackup = (params: Backup.BackupOperate) => { let request = deepCopy(params) as Backup.BackupOperate; @@ -55,7 +55,7 @@ export const addBackup = (params: Backup.BackupOperate) => { if (request.credential) { request.credential = Base64.encode(request.credential); } - return http.post(`/core/backup`, request, TimeoutEnum.T_60S); + return http.post(`/core/backups`, request, TimeoutEnum.T_60S); }; export const editBackup = (params: Backup.BackupOperate) => { let request = deepCopy(params) as Backup.BackupOperate; @@ -65,10 +65,10 @@ export const editBackup = (params: Backup.BackupOperate) => { if (request.credential) { request.credential = Base64.encode(request.credential); } - return http.post(`/core/backup/update`, request); + return http.post(`/core/backups/update`, request); }; export const deleteBackup = (params: { id: number }) => { - return http.post(`/core/backup/del`, params); + return http.post(`/core/backups/del`, params); }; export const listBucket = (params: Backup.ForBucket) => { let request = deepCopy(params) as Backup.BackupOperate; @@ -78,5 +78,5 @@ export const listBucket = (params: Backup.ForBucket) => { if (request.credential) { request.credential = Base64.encode(request.credential); } - return http.post(`/core/backup/buckets`, request); + return http.post(`/core/backups/buckets`, request); }; diff --git a/frontend/src/views/cronjob/operate/index.vue b/frontend/src/views/cronjob/operate/index.vue index 799569aea..5753c0deb 100644 --- a/frontend/src/views/cronjob/operate/index.vue +++ b/frontend/src/views/cronjob/operate/index.vue @@ -500,7 +500,7 @@ import { reactive, ref } from 'vue'; import { Rules } from '@/global/form-rules'; import FileList from '@/components/file-list/index.vue'; -import { getBackupList } from '@/api/modules/backup'; +import { listBackupOptions } from '@/api/modules/backup'; import i18n from '@/lang'; import { ElForm } from 'element-plus'; import { Cronjob } from '@/api/interface/cronjob'; @@ -864,12 +864,13 @@ const handleFileDelete = (index: number) => { }; const loadBackups = async () => { - const res = await getBackupList(); + const res = await listBackupOptions(); + let options = res.data || []; backupOptions.value = []; if (!dialogData.value.rowData!.sourceAccounts) { dialogData.value.rowData!.sourceAccounts = [1]; } - for (const item of res.data) { + for (const item of options) { if (item.id === 0) { continue; } diff --git a/frontend/src/views/setting/backup-account/index.vue b/frontend/src/views/setting/backup-account/index.vue index 8082f04e6..9a6357b9e 100644 --- a/frontend/src/views/setting/backup-account/index.vue +++ b/frontend/src/views/setting/backup-account/index.vue @@ -56,7 +56,7 @@
{{ $t('setting.refreshTime') + ':' + row.varsJson['refresh_time'] }} - + {{ 'Token ' + $t('commons.button.refresh') }} @@ -97,7 +97,7 @@