From 1088034a5cee29147e9920305794d9593ff10e52 Mon Sep 17 00:00:00 2001 From: ssongliu <73214554+ssongliu@users.noreply.github.com> Date: Wed, 3 Apr 2024 16:50:07 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E8=AE=A1=E5=88=92=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E5=AE=B9=E5=99=A8=E4=B8=AD=E6=89=A7=E8=A1=8C=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=20Command=20=E9=80=89=E9=A1=B9=20(#4398)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Refs #4363 --- backend/app/dto/cronjob.go | 3 +++ backend/app/model/cronjob.go | 1 + backend/app/service/cornjob.go | 1 + backend/app/service/cronjob_helper.go | 6 ++++- backend/init/migration/migrate.go | 1 + backend/init/migration/migrations/v_1_10.go | 10 +++++++ frontend/src/api/interface/cronjob.ts | 2 ++ .../container/container/terminal/index.vue | 2 +- frontend/src/views/cronjob/operate/index.vue | 26 +++++++++++++++++++ 9 files changed, 50 insertions(+), 2 deletions(-) diff --git a/backend/app/dto/cronjob.go b/backend/app/dto/cronjob.go index 6317c9d7c..11fb2b159 100644 --- a/backend/app/dto/cronjob.go +++ b/backend/app/dto/cronjob.go @@ -8,6 +8,7 @@ type CronjobCreate struct { Spec string `json:"spec" validate:"required"` Script string `json:"script"` + Command string `json:"command"` ContainerName string `json:"containerName"` AppID string `json:"appID"` Website string `json:"website"` @@ -28,6 +29,7 @@ type CronjobUpdate struct { Spec string `json:"spec" validate:"required"` Script string `json:"script"` + Command string `json:"command"` ContainerName string `json:"containerName"` AppID string `json:"appID"` Website string `json:"website"` @@ -70,6 +72,7 @@ type CronjobInfo struct { Spec string `json:"spec"` Script string `json:"script"` + Command string `json:"command"` ContainerName string `json:"containerName"` AppID string `json:"appID"` Website string `json:"website"` diff --git a/backend/app/model/cronjob.go b/backend/app/model/cronjob.go index 137968990..c1697ac39 100644 --- a/backend/app/model/cronjob.go +++ b/backend/app/model/cronjob.go @@ -9,6 +9,7 @@ type Cronjob struct { Type string `gorm:"type:varchar(64);not null" json:"type"` Spec string `gorm:"type:varchar(64);not null" json:"spec"` + Command string `gorm:"type:varchar(64)" json:"command"` ContainerName string `gorm:"type:varchar(64)" json:"containerName"` Script string `gorm:"longtext" json:"script"` Website string `gorm:"type:varchar(64)" json:"website"` diff --git a/backend/app/service/cornjob.go b/backend/app/service/cornjob.go index c56dde735..1e09b6a8d 100644 --- a/backend/app/service/cornjob.go +++ b/backend/app/service/cornjob.go @@ -265,6 +265,7 @@ func (u *CronjobService) Update(id uint, req dto.CronjobUpdate) error { upMap["name"] = req.Name upMap["spec"] = spec upMap["script"] = req.Script + upMap["command"] = req.Command upMap["container_name"] = req.ContainerName upMap["app_id"] = req.AppID upMap["website"] = req.Website diff --git a/backend/app/service/cronjob_helper.go b/backend/app/service/cronjob_helper.go index 892c6c036..f2cc61945 100644 --- a/backend/app/service/cronjob_helper.go +++ b/backend/app/service/cronjob_helper.go @@ -38,7 +38,11 @@ func (u *CronjobService) HandleJob(cronjob *model.Cronjob) { _ = cronjobRepo.UpdateRecords(record.ID, map[string]interface{}{"records": record.Records}) script := cronjob.Script if len(cronjob.ContainerName) != 0 { - script = fmt.Sprintf("docker exec %s %s", cronjob.ContainerName, cronjob.Script) + command := "sh" + if len(cronjob.Command) != 0 { + command = cronjob.Command + } + script = fmt.Sprintf("docker exec %s %s -c \"%s\"", cronjob.ContainerName, command, strings.ReplaceAll(cronjob.Script, "\"", "\\\"")) } err = u.handleShell(cronjob.Type, cronjob.Name, script, record.Records) u.removeExpiredLog(*cronjob) diff --git a/backend/init/migration/migrate.go b/backend/init/migration/migrate.go index 45d86a373..198ac74b5 100644 --- a/backend/init/migration/migrate.go +++ b/backend/init/migration/migrate.go @@ -76,6 +76,7 @@ func Init() { migrations.AddSnapshotIgnore, migrations.AddDatabaseIsDelete, migrations.AddXpackHideMenu, + migrations.AddCronjobCommand, }) if err := m.Migrate(); err != nil { global.LOG.Error(err) diff --git a/backend/init/migration/migrations/v_1_10.go b/backend/init/migration/migrations/v_1_10.go index 8ab8041f0..8762244e8 100644 --- a/backend/init/migration/migrations/v_1_10.go +++ b/backend/init/migration/migrations/v_1_10.go @@ -35,3 +35,13 @@ var AddXpackHideMenu = &gormigrate.Migration{ return nil }, } + +var AddCronjobCommand = &gormigrate.Migration{ + ID: "20240403-add-cronjob-command", + Migrate: func(tx *gorm.DB) error { + if err := tx.AutoMigrate(&model.Cronjob{}); err != nil { + return err + } + return nil + }, +} \ No newline at end of file diff --git a/frontend/src/api/interface/cronjob.ts b/frontend/src/api/interface/cronjob.ts index 9b8de3a22..9ae970585 100644 --- a/frontend/src/api/interface/cronjob.ts +++ b/frontend/src/api/interface/cronjob.ts @@ -9,6 +9,8 @@ export namespace Cronjob { specObjs: Array; script: string; + isCustom: boolean; + command: string; inContainer: boolean; containerName: string; appID: string; diff --git a/frontend/src/views/container/container/terminal/index.vue b/frontend/src/views/container/container/terminal/index.vue index d7a67f249..777643d1d 100644 --- a/frontend/src/views/container/container/terminal/index.vue +++ b/frontend/src/views/container/container/terminal/index.vue @@ -82,7 +82,7 @@ const acceptParams = async (params: DialogProps): Promise => { title.value = params.container; form.isCustom = false; form.user = ''; - form.command = '/bin/bash'; + form.command = '/bin/sh'; terminalOpen.value = false; }; diff --git a/frontend/src/views/cronjob/operate/index.vue b/frontend/src/views/cronjob/operate/index.vue index 51d8389c4..31a48c5a3 100644 --- a/frontend/src/views/cronjob/operate/index.vue +++ b/frontend/src/views/cronjob/operate/index.vue @@ -152,6 +152,26 @@ + + + {{ $t('container.custom') }} + + + + + + + @@ -374,6 +394,12 @@ const acceptParams = (params: DialogProps): void => { if (dialogData.value.rowData.backupAccounts) { dialogData.value.rowData.backupAccountList = dialogData.value.rowData.backupAccounts.split(','); } + dialogData.value.rowData!.command = dialogData.value.rowData!.command || 'sh'; + dialogData.value.rowData!.isCustom = + dialogData.value.rowData!.command !== 'sh' && + dialogData.value.rowData!.command !== 'bash' && + dialogData.value.rowData!.command === 'ash'; + title.value = i18n.global.t('cronjob.' + dialogData.value.title); if (dialogData.value?.rowData?.exclusionRules) { dialogData.value.rowData.exclusionRules = dialogData.value.rowData.exclusionRules.replaceAll(',', '\n');