67 lines
1.1 KiB
Go
67 lines
1.1 KiB
Go
package security
|
|
|
|
import (
|
|
"sort"
|
|
"sync"
|
|
)
|
|
|
|
type Security struct {
|
|
ID string
|
|
Rule string
|
|
IP string
|
|
Priority int64 // 越小优先级越高
|
|
}
|
|
|
|
type Manager struct {
|
|
securities sync.Map
|
|
values []*Security
|
|
}
|
|
|
|
func NewManager() *Manager {
|
|
return &Manager{}
|
|
}
|
|
|
|
func (m *Manager) Clear() {
|
|
m.securities.Range(func(k, _ interface{}) bool {
|
|
m.securities.Delete(k)
|
|
return true
|
|
})
|
|
}
|
|
|
|
func (m *Manager) LoadData() {
|
|
var values []*Security
|
|
m.securities.Range(func(key, value interface{}) bool {
|
|
if security, ok := value.(*Security); ok {
|
|
values = append(values, security)
|
|
}
|
|
return true
|
|
})
|
|
|
|
sort.Slice(values, func(i, j int) bool {
|
|
// 优先级数字越小代表优先级越高,因此此处用小于号
|
|
return values[i].Priority < values[j].Priority
|
|
})
|
|
|
|
m.values = values
|
|
}
|
|
|
|
func (m *Manager) Values() []*Security {
|
|
return m.values
|
|
}
|
|
|
|
func (m *Manager) Add(s *Security) {
|
|
m.securities.Store(s.ID, s)
|
|
m.LoadData()
|
|
}
|
|
|
|
func (m *Manager) Del(id string) {
|
|
m.securities.Delete(id)
|
|
m.LoadData()
|
|
}
|
|
|
|
var GlobalSecurityManager *Manager
|
|
|
|
func init() {
|
|
GlobalSecurityManager = NewManager()
|
|
}
|