From 48713b51f10e1d45b75dd2715e3d35cf241f6445 Mon Sep 17 00:00:00 2001 From: ssongliu <73214554+ssongliu@users.noreply.github.com> Date: Thu, 11 Jan 2024 11:01:40 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E8=A7=A3=E5=86=B3=E8=AE=A1=E5=88=92?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E5=A4=87=E4=BB=BD=E7=BD=91=E7=AB=99=E5=A4=B1?= =?UTF-8?q?=E8=B4=A5=E7=9A=84=E9=97=AE=E9=A2=98=20(#3572)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/app/dto/response/website.go | 6 ++ backend/app/service/cronjob_helper.go | 108 ++++++++----------- backend/app/service/website.go | 18 ++-- backend/init/migration/migrate.go | 1 + backend/init/migration/migrations/v_1_9.go | 30 ++++++ frontend/src/views/cronjob/operate/index.vue | 14 ++- 6 files changed, 106 insertions(+), 71 deletions(-) diff --git a/backend/app/dto/response/website.go b/backend/app/dto/response/website.go index bae123317..dc18345ae 100644 --- a/backend/app/dto/response/website.go +++ b/backend/app/dto/response/website.go @@ -13,6 +13,12 @@ type WebsiteDTO struct { RuntimeName string `json:"runtimeName"` } +type WebsiteOption struct { + ID uint `json:"id"` + PrimaryDomain string `json:"primaryDomain"` + Alias string `json:"alias"` +} + type WebsitePreInstallCheck struct { Name string `json:"name"` Status string `json:"status"` diff --git a/backend/app/service/cronjob_helper.go b/backend/app/service/cronjob_helper.go index ddac6ad53..32e3f479c 100644 --- a/backend/app/service/cronjob_helper.go +++ b/backend/app/service/cronjob_helper.go @@ -340,20 +340,11 @@ func (u *CronjobService) handleDatabase(cronjob model.Cronjob, backup model.Back func (u *CronjobService) handleCutWebsiteLog(cronjob *model.Cronjob, startTime time.Time) ([]string, string, error) { var ( - websites []string err error filePaths []string msgs []string ) - if cronjob.Website == "all" { - websites, _ = NewIWebsiteService().GetWebsiteOptions() - if len(websites) == 0 { - return msgs, "", nil - } - } else { - websites = append(websites, cronjob.Website) - } - + websites := loadWebsForJob(*cronjob) nginx, err := getAppInstallByKey(constant.AppOpenresty) if err != nil { return msgs, "", nil @@ -362,42 +353,32 @@ func (u *CronjobService) handleCutWebsiteLog(cronjob *model.Cronjob, startTime t fileOp := files.NewFileOp() var wg sync.WaitGroup wg.Add(len(websites)) - for _, websiteName := range websites { - name := websiteName - go func() { - website, _ := websiteRepo.GetFirst(websiteRepo.WithDomain(name)) - if website.ID == 0 { - wg.Done() - return - } - websiteLogDir := path.Join(baseDir, website.Alias, "log") - srcAccessLogPath := path.Join(websiteLogDir, "access.log") - srcErrorLogPath := path.Join(websiteLogDir, "error.log") - dstLogDir := path.Join(global.CONF.System.Backup, "log", "website", website.Alias) - if !fileOp.Stat(dstLogDir) { - _ = os.MkdirAll(dstLogDir, 0755) - } + for _, website := range websites { + websiteLogDir := path.Join(baseDir, website.Alias, "log") + srcAccessLogPath := path.Join(websiteLogDir, "access.log") + srcErrorLogPath := path.Join(websiteLogDir, "error.log") + dstLogDir := path.Join(global.CONF.System.Backup, "log", "website", website.Alias) + if !fileOp.Stat(dstLogDir) { + _ = os.MkdirAll(dstLogDir, 0755) + } - dstName := fmt.Sprintf("%s_log_%s.gz", website.PrimaryDomain, startTime.Format("20060102150405")) - dstFilePath := path.Join(dstLogDir, dstName) - filePaths = append(filePaths, dstFilePath) + dstName := fmt.Sprintf("%s_log_%s.gz", website.PrimaryDomain, startTime.Format("20060102150405")) + dstFilePath := path.Join(dstLogDir, dstName) + filePaths = append(filePaths, dstFilePath) - if err = backupLogFile(dstFilePath, websiteLogDir, fileOp); err != nil { - websiteErr := buserr.WithNameAndErr("ErrCutWebsiteLog", name, err) - err = websiteErr - msgs = append(msgs, websiteErr.Error()) - global.LOG.Error(websiteErr.Error()) - wg.Done() - return - } else { - _ = fileOp.WriteFile(srcAccessLogPath, strings.NewReader(""), 0755) - _ = fileOp.WriteFile(srcErrorLogPath, strings.NewReader(""), 0755) - } - msg := i18n.GetMsgWithMap("CutWebsiteLogSuccess", map[string]interface{}{"name": name, "path": dstFilePath}) - global.LOG.Infof(msg) - msgs = append(msgs, msg) - wg.Done() - }() + if err = backupLogFile(dstFilePath, websiteLogDir, fileOp); err != nil { + websiteErr := buserr.WithNameAndErr("ErrCutWebsiteLog", website.PrimaryDomain, err) + err = websiteErr + msgs = append(msgs, websiteErr.Error()) + global.LOG.Error(websiteErr.Error()) + continue + } else { + _ = fileOp.WriteFile(srcAccessLogPath, strings.NewReader(""), 0755) + _ = fileOp.WriteFile(srcErrorLogPath, strings.NewReader(""), 0755) + } + msg := i18n.GetMsgWithMap("CutWebsiteLogSuccess", map[string]interface{}{"name": website.PrimaryDomain, "path": dstFilePath}) + global.LOG.Infof(msg) + msgs = append(msgs, msg) } wg.Wait() u.HandleRmExpired("LOCAL", "", "", cronjob, nil) @@ -505,16 +486,7 @@ func (u *CronjobService) handleWebsite(cronjob model.Cronjob, backup model.Backu return paths, err } - var weblist []string - if cronjob.Website == "all" { - weblist, err = NewIWebsiteService().GetWebsiteOptions() - if err != nil { - return paths, err - } - } else { - weblist = append(weblist, cronjob.Website) - } - + weblist := loadWebsForJob(cronjob) var client cloud_storage.CloudStorageClient if backup.Type != "LOCAL" { client, err = NewIBackupService().NewClient(&backup) @@ -526,25 +498,21 @@ func (u *CronjobService) handleWebsite(cronjob model.Cronjob, backup model.Backu for _, websiteItem := range weblist { var record model.BackupRecord record.Type = "website" - record.Name = cronjob.Website + record.Name = websiteItem.PrimaryDomain + record.DetailName = websiteItem.Alias record.Source = "LOCAL" record.BackupType = backup.Type - website, err := websiteRepo.GetFirst(websiteRepo.WithDomain(websiteItem)) - if err != nil { - return paths, err - } - backupDir := path.Join(localDir, fmt.Sprintf("website/%s", website.PrimaryDomain)) + backupDir := path.Join(localDir, fmt.Sprintf("website/%s", websiteItem.PrimaryDomain)) record.FileDir = backupDir itemFileDir := strings.TrimPrefix(backupDir, localDir+"/") if !cronjob.KeepLocal && backup.Type != "LOCAL" { record.Source = backup.Type record.FileDir = strings.TrimPrefix(backupDir, localDir+"/") } - record.FileName = fmt.Sprintf("website_%s_%s.tar.gz", website.PrimaryDomain, startTime.Format("20060102150405")) - if err := handleWebsiteBackup(&website, backupDir, record.FileName); err != nil { + record.FileName = fmt.Sprintf("website_%s_%s.tar.gz", websiteItem.PrimaryDomain, startTime.Format("20060102150405")) + if err := handleWebsiteBackup(&websiteItem, backupDir, record.FileName); err != nil { return paths, err } - record.Name = website.PrimaryDomain if err := backupRepo.CreateRecord(&record); err != nil { global.LOG.Errorf("save backup record failed, err: %v", err) return paths, err @@ -759,3 +727,17 @@ func loadDbsForJob(cronjob model.Cronjob) []databaseHelper { } return dbs } + +func loadWebsForJob(cronjob model.Cronjob) []model.Website { + var weblist []model.Website + if cronjob.Website == "all" { + weblist, _ = websiteRepo.List() + return weblist + } + itemID, _ := (strconv.Atoi(cronjob.Website)) + webItem, _ := websiteRepo.GetFirst(commonRepo.WithByID(uint(itemID))) + if webItem.ID != 0 { + weblist = append(weblist, webItem) + } + return weblist +} diff --git a/backend/app/service/website.go b/backend/app/service/website.go index cf80ed221..2432f6834 100644 --- a/backend/app/service/website.go +++ b/backend/app/service/website.go @@ -9,7 +9,6 @@ import ( "encoding/pem" "errors" "fmt" - "github.com/1Panel-dev/1Panel/backend/utils/common" "os" "path" "reflect" @@ -19,6 +18,9 @@ import ( "syscall" "time" + "github.com/1Panel-dev/1Panel/backend/utils/common" + "github.com/jinzhu/copier" + "github.com/1Panel-dev/1Panel/backend/i18n" "github.com/spf13/afero" @@ -55,7 +57,7 @@ type IWebsiteService interface { GetWebsites() ([]response.WebsiteDTO, error) CreateWebsite(create request.WebsiteCreate) error OpWebsite(req request.WebsiteOp) error - GetWebsiteOptions() ([]string, error) + GetWebsiteOptions() ([]response.WebsiteOption, error) UpdateWebsite(req request.WebsiteUpdate) error DeleteWebsite(req request.WebsiteDelete) error GetWebsite(id uint) (response.WebsiteDTO, error) @@ -348,14 +350,18 @@ func (w WebsiteService) OpWebsite(req request.WebsiteOp) error { return websiteRepo.Save(context.Background(), &website) } -func (w WebsiteService) GetWebsiteOptions() ([]string, error) { - webs, err := websiteRepo.GetBy() +func (w WebsiteService) GetWebsiteOptions() ([]response.WebsiteOption, error) { + webs, err := websiteRepo.List() if err != nil { return nil, err } - var datas []string + var datas []response.WebsiteOption for _, web := range webs { - datas = append(datas, web.PrimaryDomain) + var item response.WebsiteOption + if err := copier.Copy(&item, &web); err != nil { + return nil, err + } + datas = append(datas, item) } return datas, nil } diff --git a/backend/init/migration/migrate.go b/backend/init/migration/migrate.go index 8b35edb62..5d4a85221 100644 --- a/backend/init/migration/migrate.go +++ b/backend/init/migration/migrate.go @@ -65,6 +65,7 @@ func Init() { migrations.AddTablePHPExtensions, migrations.AddTableDatabasePostgresql, migrations.AddPostgresqlSuperUser, + migrations.UpdateCronjobWithWebsite, }) if err := m.Migrate(); err != nil { global.LOG.Error(err) diff --git a/backend/init/migration/migrations/v_1_9.go b/backend/init/migration/migrations/v_1_9.go index 058ca315c..3b06d7289 100644 --- a/backend/init/migration/migrations/v_1_9.go +++ b/backend/init/migration/migrations/v_1_9.go @@ -132,6 +132,12 @@ var AddTableDatabasePostgresql = &gormigrate.Migration{ return err } for _, job := range jobs { + if job.DBName == "all" { + if err := tx.Model(&model.Cronjob{}).Where("id = ?", job.ID).Update("db_type", "mysql").Error; err != nil { + global.LOG.Errorf("update db type of cronjob %s failed, err: %v", job.Name, err) + continue + } + } var db model.DatabaseMysql if err := tx.Where("id == ?", job.DBName).First(&db).Error; err != nil { continue @@ -158,3 +164,27 @@ var AddPostgresqlSuperUser = &gormigrate.Migration{ return nil }, } + +var UpdateCronjobWithWebsite = &gormigrate.Migration{ + ID: "20230809-update-cronjob-with-website", + Migrate: func(tx *gorm.DB) error { + var cronjobs []model.Cronjob + if err := tx.Where("(type = ? OR type = ?) AND website != ?", "website", "cutWebsiteLog", "all").Find(&cronjobs).Error; err != nil { + return err + } + + for _, job := range cronjobs { + var web model.Website + if err := tx.Where("primary_domain = ?", job.Website).First(&web).Error; err != nil { + continue + } + if err := tx.Model(&model.Cronjob{}). + Where("id = ?", job.ID). + Updates(map[string]interface{}{"website": web.ID}).Error; err != nil { + continue + } + } + + return nil + }, +} diff --git a/frontend/src/views/cronjob/operate/index.vue b/frontend/src/views/cronjob/operate/index.vue index 57f343bbe..b19a0ff7b 100644 --- a/frontend/src/views/cronjob/operate/index.vue +++ b/frontend/src/views/cronjob/operate/index.vue @@ -141,7 +141,17 @@ :label="$t('commons.table.all')" value="all" /> - + + {{ item.primaryDomain }} + + {{ item.alias }} + + {{ $t('cronjob.cutWebsiteLogHelper') }} @@ -351,7 +361,7 @@ const handleClose = () => { const localDirID = ref(); const containerOptions = ref(); -const websiteOptions = ref(); +const websiteOptions = ref([]); const backupOptions = ref(); const appOptions = ref();