aboutsummaryrefslogtreecommitdiff
path: root/cmd/resolver/resolver.go
diff options
context:
space:
mode:
authorShulhan <ms@kilabit.info>2022-05-15 22:57:26 +0700
committerShulhan <ms@kilabit.info>2022-05-15 22:57:26 +0700
commitf21e7c468c4d4479919c4a483451c6672698ab0a (patch)
treede450231be1c96eeb8161f2844baa3879de8b515 /cmd/resolver/resolver.go
parentfe92d71726313f54ea91980d40c8ef52872ac1f2 (diff)
downloadrescached-f21e7c468c4d4479919c4a483451c6672698ab0a.tar.xz
cmd/resolver: implement command to add new record to zone
The command has the following signature, zone.d rr add <zone> <"@" | subdomain> <ttl> <type> <class> <value> ...:: The domain name can be set to origin using "@" or empty string, subdomain (without ending with "."), or fully qualified domain name (end with "."). If ttl is set to 0, it will default to 604800 (7 days). List of valid type are A, NS, CNAME, PTR, MX, TXT, and AAAA. List of valid class are IN, CS, HS.
Diffstat (limited to 'cmd/resolver/resolver.go')
-rw-r--r--cmd/resolver/resolver.go110
1 files changed, 106 insertions, 4 deletions
diff --git a/cmd/resolver/resolver.go b/cmd/resolver/resolver.go
index 75287db..36175a1 100644
--- a/cmd/resolver/resolver.go
+++ b/cmd/resolver/resolver.go
@@ -10,6 +10,7 @@ import (
"log"
"math/rand"
"os"
+ "strconv"
"strings"
"time"
@@ -475,9 +476,9 @@ func (rsol *resolver) doCmdZoned(args []string) {
var (
subCmd = strings.ToLower(args[0])
+ resc = rsol.newRescachedClient()
- resc *rescached.Client
- err error
+ err error
)
switch subCmd {
@@ -487,7 +488,6 @@ func (rsol *resolver) doCmdZoned(args []string) {
log.Fatalf("resolver: %s %s: missing parameter name", rsol.cmd, subCmd)
}
- resc = rsol.newRescachedClient()
_, err = resc.ZonedCreate(args[0])
if err != nil {
log.Fatalf("resolver: %s", err)
@@ -500,18 +500,120 @@ func (rsol *resolver) doCmdZoned(args []string) {
log.Fatalf("resolver: %s %s: missing parameter name", rsol.cmd, subCmd)
}
- resc = rsol.newRescachedClient()
_, err = resc.ZonedDelete(args[0])
if err != nil {
log.Fatalf("resolver: %s", err)
}
fmt.Println("OK")
+ case subCmdRR:
+ rsol.doCmdZonedRR(resc, args[1:])
+
default:
log.Fatalf("resolver: %s: unknown sub command: %s", rsol.cmd, subCmd)
}
}
+func (rsol *resolver) doCmdZonedRR(resc *rescached.Client, args []string) {
+ var (
+ cmdAction = strings.ToLower(args[0])
+ )
+
+ args = args[1:]
+
+ switch cmdAction {
+ case subCmdAdd:
+ rsol.doCmdZonedRRAdd(resc, args)
+
+ default:
+ log.Fatalf("resolver: %s %s: unknown action: %q", rsol.cmd, subCmdRR, cmdAction)
+ }
+}
+
+// doCmdZonedRRAdd add new record to the zone.
+// This command accept the following arguments:
+//
+// 0 1 2 3 4 5
+// <zone> <domain> <ttl> <type> <class> <value> ...
+//
+// List of valid type are A, NS, CNAME, PTR, MX, TXT, and AAAA.
+// For the MX record we pass two parameters:
+//
+// 5 6
+// <pref> <exchange>
+func (rsol *resolver) doCmdZonedRRAdd(resc *rescached.Client, args []string) {
+ if len(args) < 6 {
+ log.Fatalf("resolver: %s %s %s: missing arguments", rsol.cmd, subCmdRR, subCmdAdd)
+ }
+
+ var (
+ zone = strings.ToLower(args[0])
+ rreq = dns.ResourceRecord{}
+
+ rres *dns.ResourceRecord
+ vstr string
+ vuint uint64
+ vbytes []byte
+ err error
+ ok bool
+ )
+
+ rreq.Name = strings.ToLower(args[1])
+ if rreq.Name == "@" {
+ rreq.Name = ""
+ }
+
+ vuint, err = strconv.ParseUint(args[2], 10, 64)
+ if err != nil {
+ log.Fatalf("resolver: invalid TTL: %q", args[2])
+ }
+
+ rreq.TTL = uint32(vuint)
+
+ vstr = strings.ToUpper(args[3])
+ rreq.Type, ok = dns.RecordTypes[vstr]
+ if !ok {
+ log.Fatalf("resolver: invalid record type: %q", vstr)
+ }
+
+ vstr = strings.ToUpper(args[4])
+ rreq.Class, ok = dns.RecordClasses[vstr]
+ if !ok {
+ log.Fatalf("resolver: invalid record class: %q", vstr)
+ }
+
+ vstr = args[5]
+
+ if rreq.Type == dns.RecordTypeMX {
+ if len(args) < 6 {
+ 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[6],
+ }
+ rreq.Value = rrMX
+ } else {
+ rreq.Value = args[5]
+ }
+
+ rres, err = resc.ZonedRecordAdd(zone, rreq)
+ if err != nil {
+ log.Fatalf("resolver: %s", err)
+ }
+
+ vbytes, err = json.MarshalIndent(rres, "", " ")
+ if err != nil {
+ log.Fatalf("resolver: %s", err)
+ }
+
+ fmt.Println(string(vbytes))
+}
+
// initSystemResolver read the system resolv.conf to create fallback DNS
// resolver.
func (rsol *resolver) initSystemResolver() (err error) {