aboutsummaryrefslogtreecommitdiff
path: root/cmd/resolver/resolver.go
diff options
context:
space:
mode:
authorShulhan <ms@kilabit.info>2022-05-17 23:39:10 +0700
committerShulhan <ms@kilabit.info>2022-05-17 23:51:00 +0700
commitbb08b5bb6ad6cf3e1c409db7d69ace4364e7bc8d (patch)
tree5fed4b58027ada9acafb5af0795e2acc1868325d /cmd/resolver/resolver.go
parentbe96c68a070474364690f0655b26dc8823eea293 (diff)
downloadrescached-bb08b5bb6ad6cf3e1c409db7d69ace4364e7bc8d.tar.xz
cmd/resolver: implement command to delete record on zone
Given the following command $ resolver zone.d rr delete <zone> <"@" | subdomain> <type> <class> <value> It will delete the record in zone by given subdomain, type, class, and value.
Diffstat (limited to 'cmd/resolver/resolver.go')
-rw-r--r--cmd/resolver/resolver.go105
1 files changed, 90 insertions, 15 deletions
diff --git a/cmd/resolver/resolver.go b/cmd/resolver/resolver.go
index ead3cfc..b22bee1 100644
--- a/cmd/resolver/resolver.go
+++ b/cmd/resolver/resolver.go
@@ -534,16 +534,18 @@ func (rsol *resolver) doCmdZonedRR(resc *rescached.Client, args []string) {
}
var (
- cmdAction string
+ cmdAction = strings.ToLower(args[0])
)
- cmdAction = strings.ToLower(args[0])
args = args[1:]
switch cmdAction {
case subCmdAdd:
rsol.doCmdZonedRRAdd(resc, args)
+ case subCmdDelete:
+ rsol.doCmdZonedRRDelete(resc, args)
+
case subCmdGet:
rsol.doCmdZonedRRGet(resc, args)
@@ -636,6 +638,72 @@ func (rsol *resolver) doCmdZonedRRAdd(resc *rescached.Client, args []string) {
fmt.Println(string(vbytes))
}
+// doCmdZonedRRDelete delete record from zone.
+// This command accept the following arguments:
+//
+// 0 1 2 3 4
+// <zone> <domain> <type> <class> <value> ...
+func (rsol *resolver) doCmdZonedRRDelete(resc *rescached.Client, args []string) {
+ if len(args) < 5 {
+ log.Fatalf("resolver: %s %s %s: missing arguments", rsol.cmd, subCmdRR, subCmdDelete)
+ }
+
+ var (
+ zone = strings.ToLower(args[0])
+ rreq = dns.ResourceRecord{}
+
+ zoneRecords dns.ZoneRecords
+ vstr string
+ vuint uint64
+ err error
+ ok bool
+ )
+
+ rreq.Name = strings.ToLower(args[1])
+ if rreq.Name == "@" {
+ rreq.Name = ""
+ }
+
+ vstr = strings.ToUpper(args[2])
+ rreq.Type, ok = dns.RecordTypes[vstr]
+ if !ok {
+ log.Fatalf("resolver: invalid record type: %q", vstr)
+ }
+
+ vstr = strings.ToUpper(args[3])
+ rreq.Class, ok = dns.RecordClasses[vstr]
+ if !ok {
+ log.Fatalf("resolver: invalid record class: %q", vstr)
+ }
+
+ vstr = args[4]
+
+ if rreq.Type == dns.RecordTypeMX {
+ if len(args) < 5 {
+ log.Fatalf("resolver: missing argument for MX record")
+ }
+ vuint, err = strconv.ParseUint(vstr, 10, 64)
+ if err != nil {
+ log.Fatalf("resolver: invalid MX preference: %q", vstr)
+ }
+ var rrMX = &dns.RDataMX{
+ Preference: int16(vuint),
+ Exchange: args[5],
+ }
+ rreq.Value = rrMX
+ } else {
+ rreq.Value = vstr
+ }
+
+ zoneRecords, err = resc.ZonedRecordDelete(zone, rreq)
+ if err != nil {
+ log.Fatalf("resolver: %s", err)
+ }
+
+ fmt.Println("OK")
+ printZoneRecords(zoneRecords)
+}
+
// doCmdZonedRRGet get and print the records on zone.
func (rsol *resolver) doCmdZonedRRGet(resc *rescached.Client, args []string) {
if len(args) == 0 {
@@ -644,9 +712,6 @@ func (rsol *resolver) doCmdZonedRRGet(resc *rescached.Client, args []string) {
var (
zoneRecords dns.ZoneRecords
- dname string
- listRR []*dns.ResourceRecord
- rr *dns.ResourceRecord
err error
)
@@ -655,16 +720,7 @@ func (rsol *resolver) doCmdZonedRRGet(resc *rescached.Client, args []string) {
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)
- }
- }
+ printZoneRecords(zoneRecords)
}
// initSystemResolver read the system resolv.conf to create fallback DNS
@@ -843,3 +899,22 @@ func printQueryResponse(nameserver string, msg *dns.Message) {
fmt.Println(b.String())
printMessage(msg)
}
+
+func printZoneRecords(zr dns.ZoneRecords) {
+ var (
+ dname string
+ listRR []*dns.ResourceRecord
+ rr *dns.ResourceRecord
+ )
+
+ for dname, listRR = range zr {
+ 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)
+ }
+ }
+}