pkg/skoop/netstack/ipset.go (57 lines of code) (raw):
package netstack
import (
"github.com/beevik/etree"
"github.com/pkg/errors"
)
type IPSetManager struct {
sets map[string]*IPSet
}
func (m *IPSetManager) GetIPSet(name string) *IPSet {
return m.sets[name]
}
type IPSet struct {
Name string `json:"n"`
Type string `json:"t"`
Members map[string]string `json:"m"`
}
func NewIPSetManager(ipsets []*IPSet) (*IPSetManager, error) {
ret := &IPSetManager{
sets: make(map[string]*IPSet),
}
for _, i := range ipsets {
ret.sets[i.Name] = i
}
return ret, nil
}
func ParseIPSet(dump string) ([]*IPSet, error) {
var ret []*IPSet
doc := etree.NewDocument()
if err := doc.ReadFromString(dump); err != nil {
return nil, err
}
for _, xmlIPSet := range doc.Root().ChildElements() {
ipset, err := parseOneIPSet(xmlIPSet)
if err != nil {
return nil, errors.Wrap(err, "error parse ipset")
}
ret = append(ret, ipset)
}
return ret, nil
}
func parseOneIPSet(xmlIPSet *etree.Element) (*IPSet, error) {
name := xmlIPSet.SelectAttr("name").Value
_type := xmlIPSet.FindElement("type").Text()
xmlMembers := xmlIPSet.FindElement("members")
members := make(map[string]string)
if xmlMembers != nil {
for _, xmlMember := range xmlMembers.FindElements("member") {
m := xmlMember.FindElement("elem").Text()
members[m] = m
}
}
return &IPSet{
Name: name,
Type: _type,
Members: members,
}, nil
}