...
1
16
17 package net
18
19 import (
20 "fmt"
21 "net"
22 "strings"
23 )
24
25
26 type IPNetSet map[string]*net.IPNet
27
28
29 func ParseIPNets(specs ...string) (IPNetSet, error) {
30 ipnetset := make(IPNetSet)
31 for _, spec := range specs {
32 spec = strings.TrimSpace(spec)
33 _, ipnet, err := ParseCIDRSloppy(spec)
34 if err != nil {
35 return nil, err
36 }
37 k := ipnet.String()
38 ipnetset[k] = ipnet
39 }
40 return ipnetset, nil
41 }
42
43
44 func (s IPNetSet) Insert(items ...*net.IPNet) {
45 for _, item := range items {
46 s[item.String()] = item
47 }
48 }
49
50
51 func (s IPNetSet) Delete(items ...*net.IPNet) {
52 for _, item := range items {
53 delete(s, item.String())
54 }
55 }
56
57
58 func (s IPNetSet) Has(item *net.IPNet) bool {
59 _, contained := s[item.String()]
60 return contained
61 }
62
63
64 func (s IPNetSet) HasAll(items ...*net.IPNet) bool {
65 for _, item := range items {
66 if !s.Has(item) {
67 return false
68 }
69 }
70 return true
71 }
72
73
74
75
76
77
78
79 func (s IPNetSet) Difference(s2 IPNetSet) IPNetSet {
80 result := make(IPNetSet)
81 for k, i := range s {
82 _, found := s2[k]
83 if found {
84 continue
85 }
86 result[k] = i
87 }
88 return result
89 }
90
91
92
93 func (s IPNetSet) StringSlice() []string {
94 a := make([]string, 0, len(s))
95 for k := range s {
96 a = append(a, k)
97 }
98 return a
99 }
100
101
102 func (s IPNetSet) IsSuperset(s2 IPNetSet) bool {
103 for k := range s2 {
104 _, found := s[k]
105 if !found {
106 return false
107 }
108 }
109 return true
110 }
111
112
113
114
115 func (s IPNetSet) Equal(s2 IPNetSet) bool {
116 return len(s) == len(s2) && s.IsSuperset(s2)
117 }
118
119
120 func (s IPNetSet) Len() int {
121 return len(s)
122 }
123
124
125 type IPSet map[string]net.IP
126
127
128 func ParseIPSet(items ...string) (IPSet, error) {
129 ipset := make(IPSet)
130 for _, item := range items {
131 ip := ParseIPSloppy(strings.TrimSpace(item))
132 if ip == nil {
133 return nil, fmt.Errorf("error parsing IP %q", item)
134 }
135
136 ipset[ip.String()] = ip
137 }
138
139 return ipset, nil
140 }
141
142
143 func (s IPSet) Insert(items ...net.IP) {
144 for _, item := range items {
145 s[item.String()] = item
146 }
147 }
148
149
150 func (s IPSet) Delete(items ...net.IP) {
151 for _, item := range items {
152 delete(s, item.String())
153 }
154 }
155
156
157 func (s IPSet) Has(item net.IP) bool {
158 _, contained := s[item.String()]
159 return contained
160 }
161
162
163 func (s IPSet) HasAll(items ...net.IP) bool {
164 for _, item := range items {
165 if !s.Has(item) {
166 return false
167 }
168 }
169 return true
170 }
171
172
173
174
175
176
177
178 func (s IPSet) Difference(s2 IPSet) IPSet {
179 result := make(IPSet)
180 for k, i := range s {
181 _, found := s2[k]
182 if found {
183 continue
184 }
185 result[k] = i
186 }
187 return result
188 }
189
190
191
192 func (s IPSet) StringSlice() []string {
193 a := make([]string, 0, len(s))
194 for k := range s {
195 a = append(a, k)
196 }
197 return a
198 }
199
200
201 func (s IPSet) IsSuperset(s2 IPSet) bool {
202 for k := range s2 {
203 _, found := s[k]
204 if !found {
205 return false
206 }
207 }
208 return true
209 }
210
211
212
213
214 func (s IPSet) Equal(s2 IPSet) bool {
215 return len(s) == len(s2) && s.IsSuperset(s2)
216 }
217
218
219 func (s IPSet) Len() int {
220 return len(s)
221 }
222
View as plain text