Skip to content

Commit 38965d4

Browse files
committed
update: filter results in k8spider
1 parent 9ab3204 commit 38965d4

File tree

2 files changed

+75
-8
lines changed

2 files changed

+75
-8
lines changed

cmd/root.go

+12-1
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,9 @@ var Opts = struct {
2222
ThreadingNum int
2323

2424
SkipKubeDNSCheck bool
25+
26+
FilterRules []string
27+
FilterStrings []string
2528
}{}
2629

2730
func init() {
@@ -43,6 +46,9 @@ func init() {
4346
RootCmd.PersistentFlags().IntVarP(&Opts.ThreadingNum, "thread-num", "n", 16, "threading num, default 16")
4447

4548
RootCmd.PersistentFlags().BoolVarP(&Opts.SkipKubeDNSCheck, "skip-kube-dns-check", "k", false, "skip kube-dns check, force check if current environment is matched kube-dns schema")
49+
50+
RootCmd.PersistentFlags().StringSliceVarP(&Opts.FilterRules, "filter-rules", "f", []string{}, "filter regexp rules")
51+
RootCmd.PersistentFlags().StringSliceVarP(&Opts.FilterStrings, "filter-strings", "s", []string{}, "filter contained strings")
4652
}
4753

4854
var RootCmd = &cobra.Command{
@@ -62,7 +68,12 @@ var RootCmd = &cobra.Command{
6268
if Opts.DnsServer != "" {
6369
pkg.NetResolver = pkg.WarpDnsServer(Opts.DnsServer)
6470
}
65-
71+
for _, rules := range Opts.FilterRules {
72+
pkg.NetResolver.SetFilter(rules)
73+
}
74+
for _, rules := range Opts.FilterStrings {
75+
pkg.NetResolver.SetFilter(rules)
76+
}
6677
// Check if current environment is a kubernetes cluster
6778
// If the command is whereisdns, which means DNS is not sure , so skip this check!
6879
// If SkipKubeDNSCheck is true, skip this check!

pkg/query_utils.go

+63-7
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ package pkg
33
import (
44
"context"
55
"net"
6+
"regexp"
7+
"strings"
68
"time"
79

810
log "github.com/sirupsen/logrus"
@@ -15,18 +17,65 @@ var (
1517
)
1618

1719
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
2125
}
2226

2327
func DefaultResolver() *SpiderResolver {
2428
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.
2529
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+
}
2965
}
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 \nresult: %s", strings.Join(target, " "), strings.Join(filtered, " "))
78+
return filtered
3079
}
3180

3281
func WarpDnsServer(dnsServer string) *SpiderResolver {
@@ -54,7 +103,7 @@ func (s *SpiderResolver) PTRRecord(ip net.IP) []string {
54103
log.Debugf("LookupAddr failed: %v", err)
55104
return nil
56105
}
57-
return names
106+
return s.filterStringArray(names)
58107
}
59108

60109
func PTRRecord(ip net.IP) []string {
@@ -63,6 +112,13 @@ func PTRRecord(ip net.IP) []string {
63112

64113
func (s *SpiderResolver) SRVRecord(svcDomain string) (string, []*net.SRV, error) {
65114
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+
}
66122
return cname, srvs, err
67123
}
68124

0 commit comments

Comments
 (0)