glider/ipset/ipset_linux.go

72 lines
1.3 KiB
Go
Raw Normal View History

2018-08-13 00:42:59 +08:00
package ipset
import (
2020-04-06 23:37:36 +08:00
"errors"
"strings"
"sync"
2020-09-27 00:08:16 +08:00
"github.com/nadoo/ipset"
2020-09-27 00:08:16 +08:00
"github.com/nadoo/glider/rule"
2018-06-28 09:49:23 +08:00
)
// Manager struct.
type Manager struct {
domainSet sync.Map
}
// NewManager returns a Manager
func NewManager(rules []*rule.Config) (*Manager, error) {
2020-09-27 00:08:16 +08:00
if err := ipset.Init(); err != nil {
return nil, err
}
2020-08-26 19:21:35 +08:00
// create ipset, avoid redundant.
sets := make(map[string]struct{})
for _, r := range rules {
if r.IPSet != "" {
2020-08-26 19:21:35 +08:00
sets[r.IPSet] = struct{}{}
}
}
2020-08-26 19:21:35 +08:00
for set := range sets {
2020-09-27 00:08:16 +08:00
ipset.Create(set)
ipset.Flush(set)
2020-08-26 19:21:35 +08:00
}
// init ipset
m := &Manager{}
for _, r := range rules {
if r.IPSet != "" {
for _, domain := range r.Domain {
m.domainSet.Store(domain, r.IPSet)
}
for _, ip := range r.IP {
2020-09-27 00:08:16 +08:00
ipset.Add(r.IPSet, ip)
}
for _, cidr := range r.CIDR {
2020-09-27 00:08:16 +08:00
ipset.Add(r.IPSet, cidr)
}
}
}
return m, nil
}
// AddDomainIP implements the dns AnswerHandler function, used to update ipset according to domainSet rule.
func (m *Manager) AddDomainIP(domain, ip string) error {
if domain == "" || ip == "" {
return errors.New("please specify the domain and ip address")
}
domain = strings.ToLower(domain)
for i := len(domain); i != -1; {
i = strings.LastIndexByte(domain[:i], '.')
2020-09-27 00:08:16 +08:00
if setName, ok := m.domainSet.Load(domain[i+1:]); ok {
ipset.Add(setName.(string), ip)
}
}
return nil
}