aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShulhan <ms@kilabit.info>2022-05-16 13:22:52 +0700
committerShulhan <ms@kilabit.info>2022-05-16 13:22:52 +0700
commit58adf877165752bcba4a76f40b70c938af698f56 (patch)
tree203bc211e48037461ee38b809a56d1db9fcf0ad6
parent3568245be794cb73790331f85ee2b6d1a20754ef (diff)
downloadrescached-58adf877165752bcba4a76f40b70c938af698f56.tar.xz
cmd/resolver: implement command to get records on zone
Given the following command, $ resolver zone.d rr get <zone> It will fetch and print all records in the specific <zone>.
-rw-r--r--_doc/resolver.adoc14
-rw-r--r--_sys/usr/share/man/man1/resolver.1.gzbin3421 -> 3508 bytes
-rw-r--r--client.go27
-rw-r--r--cmd/resolver/resolver.go41
4 files changed, 81 insertions, 1 deletions
diff --git a/_doc/resolver.adoc b/_doc/resolver.adoc
index b82cea4..362bc62 100644
--- a/_doc/resolver.adoc
+++ b/_doc/resolver.adoc
@@ -219,6 +219,10 @@ Delete zone file inside the zone.d directory.
=== MANAGING RECORD IN ZONE.D
+`zone.d rr get <zone>`::
+
+Get and print all records in the zone.
+
zone.d rr add <zone> <"@" | subdomain> <ttl> <type> <class> <value> ...::
+
--
@@ -377,6 +381,16 @@ Print all zone in the server,
Assume that we have create zone "my.zone".
+Get all records in the zone "my.zone",
+
+ $ resolver zone.d rr get my.zone
+ my.zone
+ 604800 MX IN map[Exchange:mail.my.zone Preference:10]
+ 604800 A IN 127.0.0.2
+ 604800 A IN 127.0.0.3
+ www.my.zone
+ 604800 A IN 192.168.1.2
+
Add IPv4 address "127.0.0.1" for domain my.zone,
$ resolver zone.d rr add my.zone @ 0 A IN 127.0.0.1
diff --git a/_sys/usr/share/man/man1/resolver.1.gz b/_sys/usr/share/man/man1/resolver.1.gz
index bc2d8eb..a3b628c 100644
--- a/_sys/usr/share/man/man1/resolver.1.gz
+++ b/_sys/usr/share/man/man1/resolver.1.gz
Binary files differ
diff --git a/client.go b/client.go
index 608f81c..fb71e58 100644
--- a/client.go
+++ b/client.go
@@ -499,6 +499,33 @@ func (cl *Client) ZonedDelete(name string) (zone *dns.Zone, err error) {
return zone, nil
}
+// ZoneRecords fetch the zone records by its name.
+func (cl *Client) ZonedRecords(zone string) (zoneRecords dns.ZoneRecords, err error) {
+ var (
+ logp = "ZonedRecords"
+ params = url.Values{}
+ res = libhttp.EndpointResponse{
+ Data: &zoneRecords,
+ }
+
+ resBody []byte
+ )
+
+ params.Set(paramNameZone, zone)
+
+ _, resBody, err = cl.Get(apiZonedRR, nil, params)
+ if err != nil {
+ return nil, fmt.Errorf("%s: %w", logp, err)
+ }
+
+ err = json.Unmarshal(resBody, &res)
+ if err != nil {
+ return nil, fmt.Errorf("%s: %w", logp, err)
+ }
+
+ return zoneRecords, nil
+}
+
// ZonedRecordAdd add new record to zone file.
func (cl *Client) ZonedRecordAdd(zone string, rreq dns.ResourceRecord) (rres *dns.ResourceRecord, err error) {
var (
diff --git a/cmd/resolver/resolver.go b/cmd/resolver/resolver.go
index deb787f..ead3cfc 100644
--- a/cmd/resolver/resolver.go
+++ b/cmd/resolver/resolver.go
@@ -529,16 +529,24 @@ func (rsol *resolver) doCmdZoned(args []string) {
}
func (rsol *resolver) doCmdZonedRR(resc *rescached.Client, args []string) {
+ if len(args) == 0 {
+ log.Fatalf("resolver: %s %s: missing arguments", rsol.cmd, subCmdRR)
+ }
+
var (
- cmdAction = strings.ToLower(args[0])
+ cmdAction string
)
+ cmdAction = strings.ToLower(args[0])
args = args[1:]
switch cmdAction {
case subCmdAdd:
rsol.doCmdZonedRRAdd(resc, args)
+ case subCmdGet:
+ rsol.doCmdZonedRRGet(resc, args)
+
default:
log.Fatalf("resolver: %s %s: unknown action: %q", rsol.cmd, subCmdRR, cmdAction)
}
@@ -628,6 +636,37 @@ func (rsol *resolver) doCmdZonedRRAdd(resc *rescached.Client, args []string) {
fmt.Println(string(vbytes))
}
+// doCmdZonedRRGet get and print the records on zone.
+func (rsol *resolver) doCmdZonedRRGet(resc *rescached.Client, args []string) {
+ if len(args) == 0 {
+ log.Fatalf("resolver: missing zone argument")
+ }
+
+ var (
+ zoneRecords dns.ZoneRecords
+ dname string
+ listRR []*dns.ResourceRecord
+ rr *dns.ResourceRecord
+ err error
+ )
+
+ zoneRecords, err = resc.ZonedRecords(args[0])
+ if err != nil {
+ log.Fatalf("resolver: %s", err)
+ }
+
+ for dname, listRR = range zoneRecords {
+ fmt.Println(dname)
+ for _, rr = range listRR {
+ fmt.Printf(" %6d %2s %2s %v\n",
+ rr.TTL,
+ dns.RecordTypeNames[rr.Type],
+ dns.RecordClassName[rr.Class],
+ rr.Value)
+ }
+ }
+}
+
// initSystemResolver read the system resolv.conf to create fallback DNS
// resolver.
func (rsol *resolver) initSystemResolver() (err error) {