Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions agent/app/dto/clam.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"`
Expand Down Expand Up @@ -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"`
Expand All @@ -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"`
Expand Down
2 changes: 2 additions & 0 deletions agent/app/model/clam.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"`

Expand Down
6 changes: 6 additions & 0 deletions agent/app/service/clam.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand All @@ -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"
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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 {
Expand Down
1 change: 1 addition & 0 deletions agent/init/migration/migrate.go
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ func InitAgentDB() {
migrations.InitLocalSSHShow,
migrations.InitRecordStatus,
migrations.AddShowNameForQuickJump,
migrations.AddTimeoutForClam,
})
if err := m.Migrate(); err != nil {
global.LOG.Error(err)
Expand Down
13 changes: 13 additions & 0 deletions agent/init/migration/migrations/init.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
},
}
2 changes: 1 addition & 1 deletion agent/utils/clam/clam.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
2 changes: 1 addition & 1 deletion frontend/src/api/interface/cronjob.ts
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ export namespace Cronjob {
retryTimes: number;
timeout: number;
timeoutItem: number;
timeoutUint: string;
timeoutUnit: string;
status: string;
secret: string;
hasAlert: boolean;
Expand Down
5 changes: 5 additions & 0 deletions frontend/src/api/interface/toolbox.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -151,6 +154,7 @@ export namespace Toolbox {
infectedStrategy: string;
infectedDir: string;
spec: string;
timeout: number;
specObj: Cronjob.SpecObj;
description: string;
}
Expand All @@ -161,6 +165,7 @@ export namespace Toolbox {
infectedStrategy: string;
infectedDir: string;
spec: string;
timeout: number;
specObj: Cronjob.SpecObj;
description: string;
}
Expand Down
5 changes: 5 additions & 0 deletions frontend/src/utils/util.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down
18 changes: 11 additions & 7 deletions frontend/src/views/cronjob/cronjob/operate/index.vue
Original file line number Diff line number Diff line change
Expand Up @@ -702,7 +702,7 @@
<el-form-item :label="$t('cronjob.timeout')" prop="timeoutItem">
<el-input type="number" class="selectClass" v-model.number="form.timeoutItem">
<template #append>
<el-select v-model="form.timeoutUint" style="width: 80px">
<el-select v-model="form.timeoutUnit" style="width: 80px">
<el-option :label="$t('commons.units.second')" value="s" />
<el-option :label="$t('commons.units.minute')" value="m" />
<el-option :label="$t('commons.units.hour')" value="h" />
Expand Down Expand Up @@ -779,7 +779,7 @@ import { loadContainerUsers } from '@/api/modules/container';
import { storeToRefs } from 'pinia';
import { GlobalStore } from '@/store';
import LicenseImport from '@/components/license-import/index.vue';
import { transferTimeToSecond } from '@/utils/util';
import { splitTimeFromSecond, transferTimeToSecond } from '@/utils/util';
import { getGroupList } from '@/api/modules/group';
import { routerToName, routerToPath } from '@/utils/router';
const router = useRouter();
Expand Down Expand Up @@ -845,7 +845,7 @@ const form = reactive<Cronjob.CronjobInfo>({
retryTimes: 3,
timeout: 3600,
timeoutItem: 3600,
timeoutUint: 's',
timeoutUnit: 's',
status: '',
secret: '',
hasAlert: false,
Expand Down Expand Up @@ -935,8 +935,12 @@ const search = async () => {
form.ignoreErr = res.data.ignoreErr;
form.retainCopies = res.data.retainCopies;
form.retryTimes = res.data.retryTimes;
form.timeout = res.data.timeout;
form.timeoutItem = res.data.timeout || 3600;

form.timeout = res.data.timeout || 3600;
let item = splitTimeFromSecond(form.timeout);
form.timeoutItem = item.timeItem;
form.timeoutUnit = item.timeUnit;

form.secret = res.data.secret;
form.hasAlert = res.data.alertCount > 0;
form.alertCount = res.data.alertCount || 3;
Expand Down Expand Up @@ -1138,7 +1142,7 @@ const rules = reactive({
retainCopies: [Rules.number],
retryTimes: [Rules.number],
timeoutItem: [Rules.number],
timeoutUint: [Rules.requiredSelect],
timeoutUnit: [Rules.requiredSelect],
alertCount: [Rules.integerNumber, { validator: checkSendCount, trigger: 'blur' }],
alertMethodItems: [Rules.requiredSelect],
});
Expand Down Expand Up @@ -1420,7 +1424,7 @@ const onSubmit = async (formEl: FormInstance | undefined) => {
if (!form.inContainer) {
form.containerName = '';
}
form.timeout = transferTimeToSecond(form.timeoutItem + form.timeoutUint);
form.timeout = transferTimeToSecond(form.timeoutItem + form.timeoutUnit);
if (form.appIdList) {
form.appID = form.appIdList.join(',');
}
Expand Down
6 changes: 3 additions & 3 deletions frontend/src/views/setting/snapshot/create/index.vue
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@
<el-form-item :label="$t('cronjob.timeout')" prop="timeoutItem">
<el-input type="number" class="selectClass" v-model.number="form.timeoutItem">
<template #append>
<el-select v-model="form.timeoutUint" style="width: 80px">
<el-select v-model="form.timeoutUnit" style="width: 80px">
<el-option :label="$t('commons.units.second')" value="s" />
<el-option :label="$t('commons.units.minute')" value="m" />
<el-option :label="$t('commons.units.hour')" value="h" />
Expand Down Expand Up @@ -210,7 +210,7 @@ const form = reactive({

timeout: 3600,
timeoutItem: 3600,
timeoutUint: 's',
timeoutUnit: 's',

backupAllImage: false,
withDockerConf: true,
Expand Down Expand Up @@ -422,7 +422,7 @@ const submitAddSnapshot = async () => {
loading.value = true;
form.taskID = newUUID();
form.sourceAccountIDs = form.fromAccounts.join(',');
form.timeout = transferTimeToSecond(form.timeoutItem + form.timeoutUint);
form.timeout = transferTimeToSecond(form.timeoutItem + form.timeoutUnit);
await snapshotCreate(form)
.then(() => {
loading.value = false;
Expand Down
2 changes: 2 additions & 0 deletions frontend/src/views/toolbox/clam/index.vue
Original file line number Diff line number Diff line change
Expand Up @@ -264,6 +264,8 @@ const onOpenDialog = async (
minute: 30,
second: 30,
},
timeoutItem: 5,
timeoutUnit: 'h',
},
) => {
let params = {
Expand Down
20 changes: 20 additions & 0 deletions frontend/src/views/toolbox/clam/operate/index.vue
Original file line number Diff line number Diff line change
Expand Up @@ -173,6 +173,17 @@
<span class="input-help">{{ $t('xpack.alert.alertCountHelper') }}</span>
</el-form-item>
</div>
<el-form-item :label="$t('cronjob.timeout')" prop="timeoutItem">
<el-input type="number" class="selectClass" v-model.number="dialogData.rowData!.timeoutItem">
<template #append>
<el-select v-model="dialogData.rowData!.timeoutUnit" style="width: 80px">
<el-option :label="$t('commons.units.second')" value="s" />
<el-option :label="$t('commons.units.minute')" value="m" />
<el-option :label="$t('commons.units.hour')" value="h" />
</el-select>
</template>
</el-input>
</el-form-item>
<el-form-item :label="$t('commons.table.description')" prop="description">
<el-input type="textarea" :rows="3" clearable v-model="dialogData.rowData!.description" />
</el-form-item>
Expand Down Expand Up @@ -206,6 +217,7 @@ import { createClam, updateClam } from '@/api/modules/toolbox';
import { storeToRefs } from 'pinia';
import { GlobalStore } from '@/store';
import { specOptions, transObjToSpec, transSpecToObj, weekOptions } from '@/views/cronjob/cronjob/helper';
import { splitTimeFromSecond, transferTimeToSecond } from '@/utils/util';

const globalStore = GlobalStore();
const licenseRef = ref();
Expand Down Expand Up @@ -239,6 +251,11 @@ const acceptParams = (params: DialogProps): void => {
second: 30,
};
}
if (dialogData.value.rowData!.timeout) {
let item = splitTimeFromSecond(dialogData.value.rowData!.timeout);
dialogData.value.rowData.timeoutItem = item.timeItem;
dialogData.value.rowData.timeoutUnit = item.timeUnit;
}
dialogData.value.rowData.hasAlert = dialogData.value.rowData!.alertCount > 0;
dialogData.value.rowData!.alertCount = dialogData.value.rowData!.alertCount || 3;
if (dialogData.value.rowData!.alertMethod) {
Expand Down Expand Up @@ -429,6 +446,9 @@ const onSubmit = async (formEl: FormInstance | undefined) => {
return;
}
}
dialogData.value.rowData.timeout = transferTimeToSecond(
dialogData.value.rowData.timeoutItem + dialogData.value.rowData.timeoutUnit,
);
dialogData.value.rowData.spec = spec;
if (dialogData.value.rowData!.hasAlert) {
dialogData.value.rowData.alertCount = dialogData.value.rowData!.hasAlert
Expand Down
Loading