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();