waf.go 5.06 KB
Newer Older
qiuqunfeng's avatar
qiuqunfeng committed
1 2 3 4 5
package model

import (
	"database/sql/driver"
	"encoding/json"
6
	"errors"
7
	"time"
qiuqunfeng's avatar
commit  
qiuqunfeng committed
8 9

	"github.com/rs/zerolog/log"
qiuqunfeng's avatar
qiuqunfeng committed
10 11 12 13 14
)

type HostList []string

func (h HostList) Value() (driver.Value, error) {
qiuqunfeng's avatar
commit  
qiuqunfeng committed
15
	return json.Marshal(h)
qiuqunfeng's avatar
qiuqunfeng committed
16 17 18
}

func (h *HostList) Scan(src interface{}) error {
qiuqunfeng's avatar
commit  
qiuqunfeng committed
19
	log.Info().Msgf("Scan host list: %v", src)
qiuqunfeng's avatar
commit  
qiuqunfeng committed
20
	return json.Unmarshal(src.([]byte), h)
qiuqunfeng's avatar
qiuqunfeng committed
21 22
}

qiuqunfeng's avatar
commit  
qiuqunfeng committed
23
type RuleCategoryStatus struct {
qiuqunfeng's avatar
qiuqunfeng committed
24 25 26 27 28 29 30 31 32 33
	CategoryID []string `json:"category_id"`
	Status     int      `json:"status"`
}

func (r *RuleCategoryStatus) Scan(src interface{}) error {
	return json.Unmarshal(src.([]byte), r)
}

func (r RuleCategoryStatus) Value() (driver.Value, error) {
	return json.Marshal(r)
qiuqunfeng's avatar
qiuqunfeng committed
34 35
}

qiuqunfeng's avatar
commit  
qiuqunfeng committed
36 37 38 39 40 41 42 43 44 45
type RuleCategoryStatusList []RuleCategoryStatus

func (r RuleCategoryStatusList) Value() (driver.Value, error) {
	return json.Marshal(r)
}

func (r *RuleCategoryStatusList) Scan(src interface{}) error {
	return json.Unmarshal(src.([]byte), r)
}

qiuqunfeng's avatar
qiuqunfeng committed
46 47 48 49 50 51
const (
	WafStatusEnable  = 0
	WafStatusDisable = 1
	WafStatusUnknown = 2
)

qiuqunfeng's avatar
commit  
qiuqunfeng committed
52
type WafService struct {
53
	ID                 uint32              `gorm:"column:id;primaryKey;autoIncrement"`
qiuqunfeng's avatar
qiuqunfeng committed
54 55 56 57 58 59 60
	GatewayName        string              `gorm:"column:gateway_name"`
	Namespace          string              `gorm:"column:namespace"`
	RegionCode         string              `gorm:"column:region_code"`
	Mode               string              `gorm:"column:mode"`
	RuleNum            int                 `gorm:"column:rule_num"`
	AttackNum          int                 `gorm:"column:attack_num"`
	RuleCategoryStatus *RuleCategoryStatus `gorm:"column:rule_category_status;type:json"`
61
	// ListenerWafs       string              `gorm:"column:listener_wafs"`
62
	// Host               HostList            `gorm:"column:host"`
qiuqunfeng's avatar
commit  
qiuqunfeng committed
63 64 65 66
}

func (WafService) TableName() string {
	return "waf_services"
qiuqunfeng's avatar
qiuqunfeng committed
67 68 69
}

type WafRule struct {
qiuqunfeng's avatar
commit  
qiuqunfeng committed
70 71 72 73
	ID         int    `json:"id"`
	CategoryID string `gorm:"column:category_id"`
	Level      int    `json:"level"`
	// Status      int    `gorm:"column:status"`
qiuqunfeng's avatar
qiuqunfeng committed
74 75 76 77 78 79 80 81 82 83 84
	Name        string `json:"name"`
	Type        string `json:"type"`
	Description string `json:"description"`
	Expr        string `json:"expr"`
	Mode        string `json:"mode"`
}

func (WafRule) TableName() string {
	return "waf_rules"
}

qiuqunfeng's avatar
commit  
qiuqunfeng committed
85 86 87 88 89 90 91 92 93 94
type RuleList []WafRule

func (r RuleList) Value() (driver.Value, error) {
	return json.Marshal(r)
}

func (r *RuleList) Scan(src interface{}) error {
	return json.Unmarshal(src.([]byte), r)
}

qiuqunfeng's avatar
qiuqunfeng committed
95
type WafRuleCategory struct {
qiuqunfeng's avatar
commit  
qiuqunfeng committed
96 97 98 99 100 101 102 103
	ID            int      `gorm:"column:id;primaryKey;autoIncrement"`
	CategoryID    string   `gorm:"column:category_id"`
	CategoryEN    string   `gorm:"column:category_en"`
	CategoryZH    string   `gorm:"column:category_zh"`
	DescriptionEN string   `gorm:"column:description_en"`
	DescriptionZH string   `gorm:"column:description_zh"`
	Status        int      `gorm:"column:status"`
	Rules         RuleList `gorm:"column:rules"`
qiuqunfeng's avatar
qiuqunfeng committed
104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120
}

func (WafRuleCategory) TableName() string {
	return "waf_rule_categories"
}

func (r *WafRuleCategory) Scan(src interface{}) error {
	err := json.Unmarshal(src.([]byte), r)
	if err != nil {
		return err
	}
	return nil
}

func (r WafRuleCategory) Value() (driver.Value, error) {
	return json.Marshal(r)
}
qiuqunfeng's avatar
qiuqunfeng committed
121 122

type GatewayListener struct {
123 124 125 126 127 128 129
	ID          int      `gorm:"column:id;primaryKey;autoIncrement"`
	GatewayName string   `gorm:"column:gateway_name"`
	Namespace   string   `gorm:"column:namespace"`
	RegionCode  string   `gorm:"column:region_code"`
	Port        int      `gorm:"column:port"`
	Enable      bool     `gorm:"column:enable"`
	Hosts       HostList `gorm:"column:hosts"`
qiuqunfeng's avatar
qiuqunfeng committed
130 131 132 133 134
}

func (GatewayListener) TableName() string {
	return "gateway_listeners"
}
135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162

type IntSlice []uint32

func (sl *IntSlice) Scan(value interface{}) error {
	b, ok := value.([]byte)
	if !ok {
		return errors.New("type assertion to []byte failed")
	}
	return json.Unmarshal(b, &sl)
}
func (sl IntSlice) Value() (driver.Value, error) {
	data, err := json.Marshal(sl)
	return data, err
}

type MatcherExpr struct {
	ID     uint32   `gorm:"column:id;primaryKey;autoIncrement"`
	Name   string   `gorm:"column:name"`
	Scope  IntSlice `gorm:"column:scope"`
	Mode   string   `gorm:"column:mode"`
	Expr   string   `gorm:"column:expr"`
	Global bool     `gorm:"column:global"`
	Status int      `gorm:"column:status"`
}

func (MatcherExpr) TableName() string {
	return "waf_blackwhitelists"
}
163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179

type Model struct {
	ID        uint      `gorm:"primarykey"`
	CreatedAt time.Time `gorm:"column:created_at"`
	UpdatedAt time.Time `gorm:"column:updated_at"`
}

type Status int

const (
	StatusSuccess Status = iota
	StatusFailure
)

type Operation string

const (
180
	OperationCreate Operation = "创建"
181
	OperationDelete Operation = "删除"
182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198
)

type WafListenerHistory struct {
	Model
	Name         string    `gorm:"column:name"`
	GatewayName  string    `gorm:"column:gateway_name"`
	ListenerName string    `gorm:"column:listener_name"`
	Namespace    string    `gorm:"column:namespace"`
	RegionCode   string    `gorm:"column:region_code"`
	Description  string    `gorm:"column:description"`
	Status       Status    `gorm:"column:status"`
	Operation    Operation `gorm:"column:operation"`
}

func (WafListenerHistory) TableName() string {
	return "waf_listener_histories"
}