From 6de094593e28c40cc6c711b0d6ee39754f407ea6 Mon Sep 17 00:00:00 2001 From: zhanghan Date: Tue, 9 Sep 2025 14:35:37 +0800 Subject: [PATCH] Multiple script types are supported for selection --- .../internal/module/common/enum/enum.go | 54 +++++++++++++++---- .../internal/module/common/enum/rule/rule.go | 15 +++--- .../module/common/enum/script/script.go | 47 +++++++++++----- .../dangerous_rule/model/dangerous_rule.go | 28 +++++----- .../dangerous_rule/service/dangerous_rule.go | 2 +- 5 files changed, 99 insertions(+), 47 deletions(-) diff --git a/automation/server/internal/module/common/enum/enum.go b/automation/server/internal/module/common/enum/enum.go index d59e3c44..e3e24703 100644 --- a/automation/server/internal/module/common/enum/enum.go +++ b/automation/server/internal/module/common/enum/enum.go @@ -1,30 +1,66 @@ package enum import ( + "database/sql/driver" "encoding/json" + "fmt" "sort" ) +type EnumMap map[int]string + +func (m EnumMap) String(id int) string { + if v, ok := m[id]; ok { + return v + } + return "未知" +} + type Item struct { ID int `json:"id"` Type string `json:"type"` } -type MapWrapper map[int]string - -func (m MapWrapper) MarshalJSON() ([]byte, error) { +func (m EnumMap) ToItems() []Item { keys := make([]int, 0, len(m)) for k := range m { keys = append(keys, k) } sort.Ints(keys) - items := make([]Item, 0, len(keys)) for _, k := range keys { - items = append(items, Item{ - ID: k, - Type: m[k], - }) + items = append(items, Item{ID: k, Type: m[k]}) + } + return items +} + +type MultiEnum []int + +func (a MultiEnum) Strings(m EnumMap) []string { + out := make([]string, 0, len(a)) + for _, v := range a { + out = append(out, m.String(v)) + } + return out +} + +func (a MultiEnum) Value() (driver.Value, error) { + return json.Marshal(a) +} + +func (a *MultiEnum) Scan(value interface{}) error { + if value == nil { + *a = nil + return nil + } + var bytes []byte + switch v := value.(type) { + case []byte: + bytes = v + case string: + bytes = []byte(v) + default: + return fmt.Errorf("cannot scan %T into MultiEnum", value) } - return json.Marshal(items) + return json.Unmarshal(bytes, a) } diff --git a/automation/server/internal/module/common/enum/rule/rule.go b/automation/server/internal/module/common/enum/rule/rule.go index 7376ac23..beef7df3 100644 --- a/automation/server/internal/module/common/enum/rule/rule.go +++ b/automation/server/internal/module/common/enum/rule/rule.go @@ -9,18 +9,15 @@ const ( SeverityWarning Severity = 2 ) -var SeverityMap = enum.MapWrapper{ +var SeverityMap = enum.EnumMap{ int(SeverityBlock): "拦截", int(SeverityWarning): "警告", } func (s Severity) String() string { - switch s { - case SeverityBlock: - return "拦截" - case SeverityWarning: - return "警告" - default: - return "未定义" - } + return SeverityMap.String(int(s)) +} + +func GetSeverities() []enum.Item { + return SeverityMap.ToItems() } diff --git a/automation/server/internal/module/common/enum/script/script.go b/automation/server/internal/module/common/enum/script/script.go index 2e97d7fb..7fc338ac 100644 --- a/automation/server/internal/module/common/enum/script/script.go +++ b/automation/server/internal/module/common/enum/script/script.go @@ -1,6 +1,10 @@ package script -import "openeuler.org/PilotGo/PilotGo-plugin-automation/internal/module/common/enum" +import ( + "database/sql/driver" + + "openeuler.org/PilotGo/PilotGo-plugin-automation/internal/module/common/enum" +) type ScriptType int @@ -11,24 +15,39 @@ const ( SQL ScriptType = 4 ) -var ScriptTypeMap = enum.MapWrapper{ +var ScriptTypeMap = enum.EnumMap{ int(Shell): "Shell", int(Perl): "Perl", int(Python): "Python", int(SQL): "SQL", } -func (s ScriptType) String() string { - switch s { - case Shell: - return "Shell" - case Perl: - return "Perl" - case Python: - return "Python" - case SQL: - return "SQL" - default: - return "未支持" +type ScriptTypeArr []ScriptType + +func (a ScriptTypeArr) Strings() []string { + intArr := make([]int, len(a)) + for i, v := range a { + intArr[i] = int(v) + } + return enum.MultiEnum(intArr).Strings(enum.EnumMap(ScriptTypeMap)) +} + +func (a ScriptTypeArr) Value() (driver.Value, error) { + intArr := make([]int, len(a)) + for i, v := range a { + intArr[i] = int(v) + } + return enum.MultiEnum(intArr).Value() +} + +func (a *ScriptTypeArr) Scan(value interface{}) error { + var m enum.MultiEnum + if err := m.Scan(value); err != nil { + return err + } + *a = make([]ScriptType, len(m)) + for i, v := range m { + (*a)[i] = ScriptType(v) } + return nil } diff --git a/automation/server/internal/module/dangerous_rule/model/dangerous_rule.go b/automation/server/internal/module/dangerous_rule/model/dangerous_rule.go index 47418ea6..50cdb98d 100644 --- a/automation/server/internal/module/dangerous_rule/model/dangerous_rule.go +++ b/automation/server/internal/module/dangerous_rule/model/dangerous_rule.go @@ -8,26 +8,26 @@ import ( ) type DangerousRule struct { - ID int `json:"id" gorm:"primaryKey;autoIncrement"` - Expression string `json:"expression"` // 语法检测表达式 - Description string `json:"description"` // 规则描述 - ScriptType script.ScriptType `json:"script_type"` // 脚本类型 - Severity rule.Severity `json:"severity"` // 风险等级: 拦截(脚本不可保存、带参数时是否可执行), 警告(用户二次确认) - Creator string `json:"creator"` // 创建人 - CreatedAt string `json:"created_at"` // 创建时间 - UpdatedAt string `json:"updated_at"` // 更新时间 - Status bool `json:"status"` // 规则启用、禁用 + ID int `json:"id" gorm:"primaryKey;autoIncrement"` + Expression string `gorm:"type:varchar(255);uniqueIndex:uniq_expression" json:"expression"` // 语法检测表达式 + Description string `json:"description"` // 规则描述 + ScriptTypes script.ScriptTypeArr `gorm:"type:json" json:"script_types"` // 脚本类型 + Severity rule.Severity `json:"severity"` // 风险等级: 拦截(脚本不可保存、带参数时是否可执行), 警告(用户二次确认) + Creator string `json:"creator"` // 创建人 + CreatedAt string `json:"created_at"` // 创建时间 + UpdatedAt string `json:"updated_at"` // 更新时间 + Status bool `json:"status"` // 规则启用、禁用 } func (r DangerousRule) MarshalJSON() ([]byte, error) { type Alias DangerousRule return json.Marshal(&struct { - Severity string `json:"severity"` - ScriptType string `json:"script_type"` + Severity string `json:"severity"` + ScriptTypes []string `json:"script_types"` Alias }{ - Severity: r.Severity.String(), // 把数字转成文字 - ScriptType: r.ScriptType.String(), - Alias: (Alias)(r), + Severity: r.Severity.String(), // 把数字转成文字 + ScriptTypes: r.ScriptTypes.Strings(), + Alias: (Alias)(r), }) } diff --git a/automation/server/internal/module/dangerous_rule/service/dangerous_rule.go b/automation/server/internal/module/dangerous_rule/service/dangerous_rule.go index 54cd3dbb..f67feef8 100644 --- a/automation/server/internal/module/dangerous_rule/service/dangerous_rule.go +++ b/automation/server/internal/module/dangerous_rule/service/dangerous_rule.go @@ -11,7 +11,7 @@ func AddDangerousRule(rule *model.DangerousRule) error { if err := dao.AddDangerousRule(&model.DangerousRule{ Expression: rule.Expression, Description: rule.Description, - ScriptType: rule.ScriptType, + ScriptTypes: rule.ScriptTypes, Severity: rule.Severity, Creator: rule.Creator, CreatedAt: time.Now().Format("2006-01-02 15:04:05"), -- Gitee