diff --git a/agent/app/api/v2/snapshot.go b/agent/app/api/v2/snapshot.go index 4a3409b40..afe56bc68 100644 --- a/agent/app/api/v2/snapshot.go +++ b/agent/app/api/v2/snapshot.go @@ -36,7 +36,7 @@ func (b *BaseApi) CreateSnapshot(c *gin.Context) { return } - if err := snapshotService.SnapshotCreate(req, false); err != nil { + if err := snapshotService.SnapshotCreate(req, 0); err != nil { helper.InternalServer(c, err) return } diff --git a/agent/app/service/cronjob_backup.go b/agent/app/service/cronjob_backup.go index 795cdcae1..20449f7a2 100644 --- a/agent/app/service/cronjob_backup.go +++ b/agent/app/service/cronjob_backup.go @@ -215,7 +215,7 @@ func (u *CronjobService) handleSystemLog(cronjob model.Cronjob, startTime time.T return nil } -func (u *CronjobService) handleSnapshot(cronjob model.Cronjob, startTime time.Time, taskID string) error { +func (u *CronjobService) handleSnapshot(cronjob model.Cronjob, jobRecord model.JobRecords) error { accountMap, err := NewBackupClientMap(strings.Split(cronjob.SourceAccountIDs, ",")) if err != nil { return err @@ -239,9 +239,9 @@ func (u *CronjobService) handleSnapshot(cronjob model.Cronjob, startTime time.Ti scope = "agent" } req := dto.SnapshotCreate{ - Name: fmt.Sprintf("snapshot-1panel-%s-%s-linux-%s-%s", scope, versionItem.Value, loadOs(), startTime.Format(constant.DateTimeSlimLayout)+common.RandStrAndNum(5)), + Name: fmt.Sprintf("snapshot-1panel-%s-%s-linux-%s-%s", scope, versionItem.Value, loadOs(), jobRecord.StartTime.Format(constant.DateTimeSlimLayout)+common.RandStrAndNum(5)), Secret: cronjob.Secret, - TaskID: taskID, + TaskID: jobRecord.TaskID, SourceAccountIDs: record.SourceAccountIDs, DownloadAccountID: cronjob.DownloadAccountID, @@ -255,7 +255,7 @@ func (u *CronjobService) handleSnapshot(cronjob model.Cronjob, startTime time.Ti WithTaskLog: true, } - if err := NewISnapshotService().SnapshotCreate(req, true); err != nil { + if err := NewISnapshotService().SnapshotCreate(req, jobRecord.ID); err != nil { return err } record.FileName = req.Name + ".tar.gz" diff --git a/agent/app/service/cronjob_helper.go b/agent/app/service/cronjob_helper.go index 6b3bb39a1..1616aeedf 100644 --- a/agent/app/service/cronjob_helper.go +++ b/agent/app/service/cronjob_helper.go @@ -63,7 +63,7 @@ func (u *CronjobService) HandleJob(cronjob *model.Cronjob) { err = u.handleSystemLog(*cronjob, record.StartTime) case "snapshot": _ = cronjobRepo.UpdateRecords(record.ID, map[string]interface{}{"records": record.Records}) - err = u.handleSnapshot(*cronjob, record.StartTime, record.TaskID) + err = u.handleSnapshot(*cronjob, record) } if err != nil { diff --git a/agent/app/service/firewall.go b/agent/app/service/firewall.go index 7b090b9b8..f7ec66d0b 100644 --- a/agent/app/service/firewall.go +++ b/agent/app/service/firewall.go @@ -619,6 +619,14 @@ func (u *FirewallService) addPortsBeforeStart(client firewall.FirewallClient) er if err := client.Port(fireClient.FireInfo{Port: global.CONF.Base.Port, Protocol: "tcp", Strategy: "accept"}, "add"); err != nil { return err } + } else { + var portSetting model.Setting + _ = global.CoreDB.Where("key = ?", "ServerPort").First(&portSetting).Error + if len(portSetting.Value) != 0 { + if err := client.Port(fireClient.FireInfo{Port: portSetting.Value, Protocol: "tcp", Strategy: "accept"}, "add"); err != nil { + return err + } + } } if err := client.Port(fireClient.FireInfo{Port: "22", Protocol: "tcp", Strategy: "accept"}, "add"); err != nil { return err diff --git a/agent/app/service/snapshot.go b/agent/app/service/snapshot.go index c4af3e615..8dff45d0e 100644 --- a/agent/app/service/snapshot.go +++ b/agent/app/service/snapshot.go @@ -30,7 +30,7 @@ type SnapshotService struct { type ISnapshotService interface { SearchWithPage(req dto.PageSnapshot) (int64, interface{}, error) LoadSnapshotData() (dto.SnapshotData, error) - SnapshotCreate(req dto.SnapshotCreate, isCron bool) error + SnapshotCreate(req dto.SnapshotCreate, jobID uint) error SnapshotReCreate(id uint) error SnapshotRecover(req dto.SnapshotRecover) error SnapshotRollback(req dto.SnapshotRecover) error @@ -151,6 +151,7 @@ func (u *SnapshotService) Delete(req dto.SnapshotBatchDelete) error { global.LOG.Debugf("remove snapshot file %s.tar.gz from %s", snap.Name, item.name) _, _ = item.client.Delete(path.Join(item.backupPath, "system_snapshot", snap.Name+".tar.gz")) } + _ = backupRepo.DeleteRecord(context.Background(), repo.WithByType("snapshot"), backupRepo.WithByFileName(snap.Name+".tar.gz")) } if err := snapshotRepo.Delete(repo.WithByID(snap.ID)); err != nil { diff --git a/agent/app/service/snapshot_create.go b/agent/app/service/snapshot_create.go index e34cadddd..d0ff9e49f 100644 --- a/agent/app/service/snapshot_create.go +++ b/agent/app/service/snapshot_create.go @@ -26,14 +26,14 @@ import ( "gorm.io/gorm" ) -func (u *SnapshotService) SnapshotCreate(req dto.SnapshotCreate, isCron bool) error { +func (u *SnapshotService) SnapshotCreate(req dto.SnapshotCreate, jobID uint) error { versionItem, _ := settingRepo.Get(settingRepo.WithByKey("SystemVersion")) scope := "core" if !global.IsMaster { scope = "agent" } - if !isCron { + if jobID == 0 { req.Name = fmt.Sprintf("1panel-%s-%s-linux-%s-%s", versionItem.Value, scope, loadOs(), time.Now().Format(constant.DateTimeSlimLayout)) } appItem, _ := json.Marshal(req.AppData) @@ -70,14 +70,14 @@ func (u *SnapshotService) SnapshotCreate(req dto.SnapshotCreate, isCron bool) er global.LOG.Errorf("new task for create snapshot failed, err: %v", err) return err } - if !isCron { + if jobID == 0 { go func() { - _ = handleSnapshot(req, taskItem) + _ = handleSnapshot(req, taskItem, jobID) }() return nil } - return handleSnapshot(req, taskItem) + return handleSnapshot(req, taskItem, jobID) } func (u *SnapshotService) SnapshotReCreate(id uint) error { @@ -108,13 +108,13 @@ func (u *SnapshotService) SnapshotReCreate(id uint) error { return err } go func() { - _ = handleSnapshot(req, taskItem) + _ = handleSnapshot(req, taskItem, 0) }() return nil } -func handleSnapshot(req dto.SnapshotCreate, taskItem *task.Task) error { +func handleSnapshot(req dto.SnapshotCreate, taskItem *task.Task, jobID uint) error { rootDir := path.Join(global.Dir.TmpDir, "system", req.Name) itemHelper := snapHelper{SnapID: req.ID, Task: *taskItem, FileOp: files.NewFileOp(), Ctx: context.Background()} baseDir := path.Join(rootDir, "base") @@ -122,7 +122,16 @@ func handleSnapshot(req dto.SnapshotCreate, taskItem *task.Task) error { taskItem.AddSubTaskWithAlias( "SnapDBInfo", - func(t *task.Task) error { return loadDbConn(&itemHelper, rootDir, req) }, + func(t *task.Task) error { + if err := loadDbConn(&itemHelper, rootDir, req); err != nil { + return err + } + _ = itemHelper.snapAgentDB.Where("id = ?", req.ID).Delete(&model.Snapshot{}).Error + if jobID != 0 { + _ = itemHelper.snapAgentDB.Where("id = ?", jobID).Delete(&model.JobRecords{}).Error + } + return nil + }, nil, ) @@ -198,6 +207,7 @@ func handleSnapshot(req dto.SnapshotCreate, taskItem *task.Task) error { type snapHelper struct { SnapID uint + SnapName string snapAgentDB *gorm.DB snapCoreDB *gorm.DB Ctx context.Context @@ -251,8 +261,6 @@ func loadDbConn(snap *snapHelper, targetDir string, req dto.SnapshotCreate) erro return err } } - - _ = snap.snapAgentDB.Where("id = ?", snap.SnapID).Delete(&model.Snapshot{}).Error return nil }