From 0138d481a6ed77cbcee8e2ccf83e29b502ac5ab2 Mon Sep 17 00:00:00 2001 From: ssongliu <73214554+ssongliu@users.noreply.github.com> Date: Tue, 23 Sep 2025 11:56:04 +0800 Subject: [PATCH] fix: Add timeout settings for clam scanning (#10445) Refs #10426 --- agent/app/dto/clam.go | 3 +++ agent/app/model/clam.go | 2 ++ agent/app/service/clam.go | 6 ++++++ agent/init/migration/migrate.go | 1 + agent/init/migration/migrations/init.go | 13 ++++++++++++ agent/utils/clam/clam.go | 2 +- frontend/src/api/interface/cronjob.ts | 2 +- frontend/src/api/interface/toolbox.ts | 5 +++++ frontend/src/utils/util.ts | 5 +++++ .../views/cronjob/cronjob/operate/index.vue | 18 ++++++++++------- .../views/setting/snapshot/create/index.vue | 6 +++--- frontend/src/views/toolbox/clam/index.vue | 2 ++ .../src/views/toolbox/clam/operate/index.vue | 20 +++++++++++++++++++ 13 files changed, 73 insertions(+), 12 deletions(-) diff --git a/agent/app/dto/clam.go b/agent/app/dto/clam.go index 60a24da1a..c69f72b78 100644 --- a/agent/app/dto/clam.go +++ b/agent/app/dto/clam.go @@ -33,6 +33,7 @@ type ClamInfo struct { LastRecordStatus string `json:"lastRecordStatus"` LastRecordTime string `json:"lastRecordTime"` Spec string `json:"spec"` + Timeout uint `json:"timeout"` Description string `json:"description"` AlertCount uint `json:"alertCount"` AlertMethod string `json:"alertMethod"` @@ -77,6 +78,7 @@ type ClamCreate struct { InfectedStrategy string `json:"infectedStrategy"` InfectedDir string `json:"infectedDir"` Spec string `json:"spec"` + Timeout uint `json:"timeout"` Description string `json:"description"` AlertCount uint `json:"alertCount"` AlertTitle string `json:"alertTitle"` @@ -91,6 +93,7 @@ type ClamUpdate struct { InfectedStrategy string `json:"infectedStrategy"` InfectedDir string `json:"infectedDir"` Spec string `json:"spec"` + Timeout uint `json:"timeout"` Description string `json:"description"` AlertCount uint `json:"alertCount"` AlertTitle string `json:"alertTitle"` diff --git a/agent/app/model/clam.go b/agent/app/model/clam.go index f4bf173ec..8980b4e9e 100644 --- a/agent/app/model/clam.go +++ b/agent/app/model/clam.go @@ -10,6 +10,8 @@ type Clam struct { InfectedStrategy string `json:"infectedStrategy"` InfectedDir string `json:"infectedDir"` Spec string `json:"spec"` + RetryTimes uint `json:"retryTimes"` + Timeout uint `json:"timeout"` EntryID int `json:"entryID"` Description string `json:"description"` diff --git a/agent/app/service/clam.go b/agent/app/service/clam.go index 0e064937d..823ca806f 100644 --- a/agent/app/service/clam.go +++ b/agent/app/service/clam.go @@ -8,6 +8,7 @@ import ( "path" "strconv" "strings" + "time" "github.com/1Panel-dev/1Panel/agent/app/dto" "github.com/1Panel-dev/1Panel/agent/app/model" @@ -19,6 +20,7 @@ import ( "github.com/1Panel-dev/1Panel/agent/utils/alert_push" "github.com/1Panel-dev/1Panel/agent/utils/clam" "github.com/1Panel-dev/1Panel/agent/utils/cmd" + "github.com/1Panel-dev/1Panel/agent/utils/common" "github.com/1Panel-dev/1Panel/agent/utils/systemctl" "github.com/1Panel-dev/1Panel/agent/utils/xpack" "github.com/jinzhu/copier" @@ -238,6 +240,7 @@ func (c *ClamService) Update(req dto.ClamUpdate) error { upMap["infected_dir"] = req.InfectedDir upMap["infected_strategy"] = req.InfectedStrategy upMap["spec"] = req.Spec + upMap["timeout"] = req.Timeout upMap["description"] = req.Description if err := clamRepo.Update(req.ID, upMap); err != nil { return err @@ -339,6 +342,9 @@ func (c *ClamService) SearchRecords(req dto.ClamLogSearch) (int64, interface{}, if clam.ID == 0 { return 0, nil, buserr.New("ErrRecordNotFound") } + loc, _ := time.LoadLocation(common.LoadTimeZoneByCmd()) + req.StartTime = req.StartTime.In(loc) + req.EndTime = req.EndTime.In(loc) total, records, err := clamRepo.PageRecords(req.Page, req.PageSize, clamRepo.WithByClamID(req.ClamID), repo.WithByStatus(req.Status), repo.WithByCreatedAt(req.StartTime, req.EndTime)) if err != nil { diff --git a/agent/init/migration/migrate.go b/agent/init/migration/migrate.go index c1739bd22..4189815dc 100644 --- a/agent/init/migration/migrate.go +++ b/agent/init/migration/migrate.go @@ -43,6 +43,7 @@ func InitAgentDB() { migrations.InitLocalSSHShow, migrations.InitRecordStatus, migrations.AddShowNameForQuickJump, + migrations.AddTimeoutForClam, }) 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 858b43b3c..d19b17acf 100644 --- a/agent/init/migration/migrations/init.go +++ b/agent/init/migration/migrations/init.go @@ -583,3 +583,16 @@ var AddShowNameForQuickJump = &gormigrate.Migration{ return tx.AutoMigrate(&model.QuickJump{}) }, } + +var AddTimeoutForClam = &gormigrate.Migration{ + ID: "20250922-add-timeout-for-clam", + Migrate: func(tx *gorm.DB) error { + if err := tx.AutoMigrate(&model.Clam{}); err != nil { + return err + } + if err := tx.Model(&model.Clam{}).Where("1 == 1").Updates(map[string]interface{}{"timeout": 18000}).Error; err != nil { + return err + } + return nil + }, +} diff --git a/agent/utils/clam/clam.go b/agent/utils/clam/clam.go index a48e99bc8..d6e583f3a 100644 --- a/agent/utils/clam/clam.go +++ b/agent/utils/clam/clam.go @@ -33,7 +33,7 @@ func AddScanTask(taskItem *task.Task, clam model.Clam, timeNow string) { strategy = fmt.Sprintf("--%s=%s", clam.InfectedStrategy, dir) } taskItem.Logf("clamdscan --fdpass %s %s", strategy, clam.Path) - mgr := cmd.NewCommandMgr(cmd.WithIgnoreExist1(), cmd.WithTimeout(10*time.Hour), cmd.WithTask(*taskItem)) + mgr := cmd.NewCommandMgr(cmd.WithIgnoreExist1(), cmd.WithTimeout(time.Duration(clam.Timeout)*time.Second), cmd.WithTask(*taskItem)) stdout, err := mgr.RunWithStdoutBashCf("clamdscan --fdpass %s %s", strategy, clam.Path) if err != nil { return fmt.Errorf("clamdscan failed, stdout: %v, err: %v", stdout, err) diff --git a/frontend/src/api/interface/cronjob.ts b/frontend/src/api/interface/cronjob.ts index 551bcf97e..dbf10c8db 100644 --- a/frontend/src/api/interface/cronjob.ts +++ b/frontend/src/api/interface/cronjob.ts @@ -56,7 +56,7 @@ export namespace Cronjob { retryTimes: number; timeout: number; timeoutItem: number; - timeoutUint: string; + timeoutUnit: string; status: string; secret: string; hasAlert: boolean; diff --git a/frontend/src/api/interface/toolbox.ts b/frontend/src/api/interface/toolbox.ts index 9038b888e..7c763e379 100644 --- a/frontend/src/api/interface/toolbox.ts +++ b/frontend/src/api/interface/toolbox.ts @@ -138,6 +138,9 @@ export namespace Toolbox { hasSpec: boolean; spec: string; specObj: Cronjob.SpecObj; + timeout: number; + timeoutItem: number; + timeoutUnit: string; description: string; hasAlert: boolean; alertCount: number; @@ -151,6 +154,7 @@ export namespace Toolbox { infectedStrategy: string; infectedDir: string; spec: string; + timeout: number; specObj: Cronjob.SpecObj; description: string; } @@ -161,6 +165,7 @@ export namespace Toolbox { infectedStrategy: string; infectedDir: string; spec: string; + timeout: number; specObj: Cronjob.SpecObj; description: string; } diff --git a/frontend/src/utils/util.ts b/frontend/src/utils/util.ts index 72fa9e065..45aaa1644 100644 --- a/frontend/src/utils/util.ts +++ b/frontend/src/utils/util.ts @@ -510,6 +510,11 @@ export function transTimeUnit(val: string): any { } return val + i18n.global.t('commons.units.second'); } +export function splitTimeFromSecond(item: number): any { + if (item < 60) return { timeItem: item, timeUnit: 's' }; + if (item < 3600) return { timeItem: item / 60, timeUnit: 'm' }; + return { timeItem: item / 3600, timeUnit: 'h' }; +} export function splitHttp(url: string) { if (url.indexOf('https://') != -1) { diff --git a/frontend/src/views/cronjob/cronjob/operate/index.vue b/frontend/src/views/cronjob/cronjob/operate/index.vue index 22b601f86..243c86cec 100644 --- a/frontend/src/views/cronjob/cronjob/operate/index.vue +++ b/frontend/src/views/cronjob/cronjob/operate/index.vue @@ -702,7 +702,7 @@