diff options
| author | Shulhan <ms@kilabit.info> | 2022-04-14 22:47:33 +0700 |
|---|---|---|
| committer | Shulhan <ms@kilabit.info> | 2022-04-14 22:47:33 +0700 |
| commit | 358c5ee72207c37712e44edcdb479c97f1266c8a (patch) | |
| tree | 67f1603c68a289509a088083acf4c61e4886b4f2 /cmd/resolver/resolver.go | |
| parent | 6ead9209bbc431b33ccbdebfffe98ffd23e4f9a7 (diff) | |
| download | rescached-358c5ee72207c37712e44edcdb479c97f1266c8a.tar.xz | |
cmd/resolver: implement caches command
The caches command fetch and print all caches from rescached server.
Diffstat (limited to 'cmd/resolver/resolver.go')
| -rw-r--r-- | cmd/resolver/resolver.go | 73 |
1 files changed, 65 insertions, 8 deletions
diff --git a/cmd/resolver/resolver.go b/cmd/resolver/resolver.go index 19cebaf..c9f172e 100644 --- a/cmd/resolver/resolver.go +++ b/cmd/resolver/resolver.go @@ -10,16 +10,18 @@ import ( "strings" "time" + "github.com/shuLhan/rescached-go/v4" "github.com/shuLhan/share/lib/dns" libnet "github.com/shuLhan/share/lib/net" ) const ( - defAttempts = 1 - defQueryType = "A" - defQueryClass = "IN" - defResolvConf = "/etc/resolv.conf" - defTimeout = 5 * time.Second + defAttempts = 1 + defQueryType = "A" + defQueryClass = "IN" + defRescachedUrl = "http://127.0.0.1:5380" + defResolvConf = "/etc/resolv.conf" + defTimeout = 5 * time.Second ) type resolver struct { @@ -31,13 +33,68 @@ type resolver struct { sqtype string sqclass string - nameserver string - qtype dns.RecordType - qclass dns.RecordClass + nameserver string + rescachedUrl string + + qtype dns.RecordType + qclass dns.RecordClass insecure bool } +func (rsol *resolver) doCmdCaches() { + var ( + resc *rescached.Client + answer *dns.Answer + answers []*dns.Answer + format string + header string + line strings.Builder + err error + x int + maxNameLen int + ) + + if len(rsol.rescachedUrl) == 0 { + rsol.rescachedUrl = defRescachedUrl + } + + resc = rescached.NewClient(rsol.rescachedUrl, rsol.insecure) + + answers, err = resc.Caches() + if err != nil { + log.Printf("resolver: caches: %s", err) + return + } + + fmt.Printf("Total caches: %d\n", len(answers)) + + for _, answer = range answers { + if len(answer.QName) > maxNameLen { + maxNameLen = len(answer.QName) + } + } + + format = fmt.Sprintf("%%4s | %%%ds | %%4s | %%5s | %%30s | %%30s", maxNameLen) + header = fmt.Sprintf(format, "#", "Name", "Type", "Class", "Received at", "Accessed at") + for x = 0; x < len(header); x++ { + line.WriteString("-") + } + fmt.Println(line.String()) + fmt.Println(header) + fmt.Println(line.String()) + + format = fmt.Sprintf("%%4d | %%%ds | %%4s | %%5s | %%30s | %%30s\n", maxNameLen) + for x, answer = range answers { + fmt.Printf(format, x, answer.QName, + dns.RecordTypeNames[answer.RType], + dns.RecordClassName[answer.RClass], + time.Unix(answer.ReceivedAt, 0), + time.Unix(answer.AccessedAt, 0), + ) + } +} + func (rsol *resolver) doCmdQuery(args []string) { var ( maxAttempts = defAttempts |
