[新增] 添加自动 IP 组规则的抓取记录功能,支持查看已抓取 IP 列表及其到期状态

This commit is contained in:
ryan
2026-06-01 10:30:00 +08:00
parent 2dc7e72621
commit bd7f008322
7 changed files with 352 additions and 24 deletions
+48
View File
@@ -0,0 +1,48 @@
package migrate
import (
"fmt"
"gorm.io/gorm"
)
// WAF IP Group schema changes for v18:
// We introduce the `ext_ips` column to keep track of captured IPs with their capture timestamps.
// If more information needs to be saved for captured IPs, it can be added directly inside this JSON structure.
type wafIPGroupV18 struct {
ExtIPs string `gorm:"column:ext_ips;type:text;not null;default:'[]'"`
}
func init() {
Register(V18())
}
func V18() Migration {
return Migration{
FromVersion: 17,
ToVersion: 18,
Migrate: migrateV18,
Validate: validateV18,
}
}
func (wafIPGroupV18) TableName() string {
return "waf_ip_groups"
}
func migrateV18(ctx Context, db *gorm.DB, backend string) error {
return ctx.ApplyCurrentSchema(db, backend)
}
func validateV18(ctx Context, db *gorm.DB, backend string) error {
if err := ctx.ValidateDatabaseSchemaVersion(db, backend, 17); err != nil {
return err
}
if db == nil || !db.Migrator().HasTable(&wafIPGroupV18{}) {
return fmt.Errorf("table waf_ip_groups is missing")
}
if !db.Migrator().HasColumn(&wafIPGroupV18{}, "ext_ips") {
return fmt.Errorf("column waf_ip_groups.ext_ips is missing")
}
return nil
}
+12
View File
@@ -80,6 +80,8 @@ func (databaseSchemaMigrationContext) ValidateDatabaseSchemaVersion(db *gorm.DB,
return validateDatabaseSchemaV16(db, backend)
case 17:
return validateDatabaseSchemaV17(db, backend)
case 18:
return validateDatabaseSchemaV18(db, backend)
default:
return fmt.Errorf("database schema validation for v%d is not defined", version)
}
@@ -1190,6 +1192,16 @@ func validateDatabaseSchemaV17(db *gorm.DB, backend string) error {
return nil
}
func validateDatabaseSchemaV18(db *gorm.DB, backend string) error {
if err := validateDatabaseSchemaV17(db, backend); err != nil {
return err
}
if !db.Migrator().HasColumn(&WAFIPGroup{}, "ext_ips") {
return fmt.Errorf("column waf_ip_groups.ext_ips is missing")
}
return nil
}
func databaseSchemaMigrations() []databaseSchemaMigration {
ctx := databaseSchemaMigrationContext{}
migrations := []databaseSchemaMigration{}
+3
View File
@@ -31,6 +31,7 @@ type WAFIPGroup struct {
Enabled bool `json:"enabled" gorm:"not null;default:true"`
IPList string `json:"ip_list" gorm:"type:text;not null;default:'[]'"`
AutoConfig string `json:"auto_config" gorm:"type:text;not null;default:'{}'"`
ExtIPs string `json:"ext_ips" gorm:"type:text;not null;default:'[]'"`
SubscriptionURL string `json:"subscription_url" gorm:"size:2048;not null;default:''"`
SubscriptionFormat string `json:"subscription_format" gorm:"size:32;not null;default:'text'"`
SubscriptionMappingRule string `json:"subscription_mapping_rule" gorm:"size:255;not null;default:''"`
@@ -138,6 +139,7 @@ func (group *WAFIPGroup) Update() error {
"enabled": group.Enabled,
"ip_list": group.IPList,
"auto_config": group.AutoConfig,
"ext_ips": group.ExtIPs,
"subscription_url": group.SubscriptionURL,
"subscription_format": group.SubscriptionFormat,
"subscription_mapping_rule": group.SubscriptionMappingRule,
@@ -152,6 +154,7 @@ func (group *WAFIPGroup) Update() error {
func (group *WAFIPGroup) UpdateSyncResult() error {
return DB.Model(&WAFIPGroup{}).Where("id = ?", group.ID).Updates(map[string]any{
"ip_list": group.IPList,
"ext_ips": group.ExtIPs,
"last_synced_at": group.LastSyncedAt,
"next_sync_at": group.NextSyncAt,
"last_sync_status": group.LastSyncStatus,