-
Notifications
You must be signed in to change notification settings - Fork 0
/
main.go
91 lines (79 loc) · 2.14 KB
/
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
package cidr_merger
import (
"net"
"strings"
)
func parseIp(str string) net.IP {
for _, b := range str {
switch b {
case '.':
return net.ParseIP(str).To4()
case ':':
return net.ParseIP(str).To16()
}
}
return nil
}
// maybe IpWrapper, Range or IpNetWrapper is returned
// 128.0.0.0-255.255.255.255 -> Range
// 192.168.9.0/22 -> IpNetWrapper
// 127.0.0.1 -> IpWrapper
func parse(text string) (IRange, error) {
if index := strings.IndexByte(text, '/'); index != -1 {
if _, network, err := net.ParseCIDR(text); err == nil {
return IpNetWrapper{network}, nil
} else {
return nil, err
}
}
if ip := parseIp(text); ip != nil {
return IpWrapper{ip}, nil
}
if index := strings.IndexByte(text, '-'); index != -1 {
if start, end := parseIp(text[:index]), parseIp(text[index+1:]); start != nil && end != nil {
if len(start) == len(end) && !lessThan(end, start) {
return &Range{start: start, end: end}, nil
}
}
return nil, &net.ParseError{Type: "range", Text: text}
}
return nil, &net.ParseError{Type: "ip/CIDR address/range", Text: text}
}
// MergeIRange 对ip进行合并
// see https://github.com/zhanhb/cidr-merger
func MergeIRange(result []IRange, typeRange bool) []IRange {
result = sortAndMerge(result)
return convertBatch(result, typeRange)
}
// MergeIp 对ip进行合并
// see https://github.com/zhanhb/cidr-merger
func MergeIp(in []string, typeRange bool) []string {
var result []IRange
for _, text := range in {
if maybe, err := parse(text); err != nil {
continue
} else {
result = append(result, maybe)
}
}
result = MergeIRange(result, typeRange)
resArr := make([]string, 0)
for _, r := range result {
resArr = append(resArr, r.String())
}
return resArr
}
// MergeIPNet 对ip进行合并
// see https://github.com/zhanhb/cidr-merger
func MergeIPNet(in []*net.IPNet, typeRange bool) []*net.IPNet {
result := make([]IRange, len(in))
for i, it := range in {
result[i] = IpNetWrapper{IPNet: it}
}
result = MergeIRange(result, typeRange)
resArr := make([]*net.IPNet, 0, len(result))
for _, r := range result {
resArr = append(resArr, r.ToIpNets()...)
}
return resArr
}