@@ -3,6 +3,8 @@ package pkg
3
3
import (
4
4
"context"
5
5
"net"
6
+ "regexp"
7
+ "strings"
6
8
"time"
7
9
8
10
log "github.com/sirupsen/logrus"
@@ -15,18 +17,65 @@ var (
15
17
)
16
18
17
19
type SpiderResolver struct {
18
- dns string
19
- ctx context.Context
20
- r * net.Resolver
20
+ dns string
21
+ ctx context.Context
22
+ r * net.Resolver
23
+ filter []* regexp.Regexp
24
+ contains []string
21
25
}
22
26
23
27
func DefaultResolver () * SpiderResolver {
24
28
ctx , _ := context .WithTimeout (context .Background (), time .Duration (DnsTimeout )* time .Second ) // I don't think if a inside cluster dns query has more than 2s latency.
25
29
return & SpiderResolver {
26
- dns : "<default-dns>" ,
27
- r : net .DefaultResolver ,
28
- ctx : ctx ,
30
+ dns : "<default-dns>" ,
31
+ r : net .DefaultResolver ,
32
+ ctx : ctx ,
33
+ filter : []* regexp.Regexp {},
34
+ contains : []string {},
35
+ }
36
+ }
37
+
38
+ func (r * SpiderResolver ) SetFilter (filters ... string ) {
39
+ for _ , filter := range filters {
40
+ r .filter = append (r .filter , regexp .MustCompile (filter ))
41
+ }
42
+ }
43
+
44
+ func (r * SpiderResolver ) SetContainsFilter (name ... string ) {
45
+ r .contains = append (r .contains , name ... )
46
+ }
47
+
48
+ func (r * SpiderResolver ) SetSuffixFilter (filter string ) {
49
+ r .SetFilter (filter + "$" )
50
+ }
51
+
52
+ func (r * SpiderResolver ) filterString (target string ) bool {
53
+ log .Tracef ("filtering %s" , target )
54
+ for _ , re := range r .filter {
55
+ if re .MatchString (target ) {
56
+ log .Tracef ("target %s matched regexp rule %s" , target , re .String ())
57
+ return true
58
+ }
59
+ }
60
+ for _ , re := range r .contains {
61
+ if strings .Contains (target , re ) {
62
+ log .Tracef ("target %s matched contains rule %s" , target , re )
63
+ return true
64
+ }
29
65
}
66
+ return false
67
+ }
68
+
69
+ func (r * SpiderResolver ) filterStringArray (target []string ) []string {
70
+ var filtered []string
71
+ for _ , re := range target {
72
+ if r .filterString (re ) {
73
+ continue
74
+ }
75
+ filtered = append (filtered , re )
76
+ }
77
+ log .Tracef ("filtering %s \n result: %s" , strings .Join (target , " " ), strings .Join (filtered , " " ))
78
+ return filtered
30
79
}
31
80
32
81
func WarpDnsServer (dnsServer string ) * SpiderResolver {
@@ -54,7 +103,7 @@ func (s *SpiderResolver) PTRRecord(ip net.IP) []string {
54
103
log .Debugf ("LookupAddr failed: %v" , err )
55
104
return nil
56
105
}
57
- return names
106
+ return s . filterStringArray ( names )
58
107
}
59
108
60
109
func PTRRecord (ip net.IP ) []string {
@@ -63,6 +112,13 @@ func PTRRecord(ip net.IP) []string {
63
112
64
113
func (s * SpiderResolver ) SRVRecord (svcDomain string ) (string , []* net.SRV , error ) {
65
114
cname , srvs , err := s .r .LookupSRV (s .ctx , "" , "" , svcDomain )
115
+ var finalsrv []* net.SRV
116
+ for _ , srv := range srvs {
117
+ if s .filterString (srv .Target ) {
118
+ continue
119
+ }
120
+ finalsrv = append (finalsrv , srv )
121
+ }
66
122
return cname , srvs , err
67
123
}
68
124
0 commit comments