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 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198

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 (
	OperationCreate Operation = "CREATE"
	OperationDelete Operation = "DELETE"
)

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"
}