make q do axfr
This commit is contained in:
parent
c03a914cec
commit
ec1f57db6c
79
ex/q/q.go
79
ex/q/q.go
|
@ -11,12 +11,18 @@ import (
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
var dnskey *dns.RR_DNSKEY
|
// TODO: serial in ixfr
|
||||||
|
|
||||||
|
var (
|
||||||
|
dnskey *dns.RR_DNSKEY
|
||||||
|
short *bool
|
||||||
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
|
short = flag.Bool("short", false, "abbreviate long DNSSEC records")
|
||||||
|
|
||||||
dnssec := flag.Bool("dnssec", false, "request DNSSEC records")
|
dnssec := flag.Bool("dnssec", false, "request DNSSEC records")
|
||||||
query := flag.Bool("question", false, "show question")
|
query := flag.Bool("question", false, "show question")
|
||||||
short := flag.Bool("short", false, "abbreviate long DNSSEC records")
|
|
||||||
check := flag.Bool("check", false, "check internal DNSSEC consistency")
|
check := flag.Bool("check", false, "check internal DNSSEC consistency")
|
||||||
six := flag.Bool("6", false, "use IPv6 only")
|
six := flag.Bool("6", false, "use IPv6 only")
|
||||||
four := flag.Bool("4", false, "use IPv4 only")
|
four := flag.Bool("4", false, "use IPv4 only")
|
||||||
|
@ -31,6 +37,7 @@ func main() {
|
||||||
tcp := flag.Bool("tcp", false, "TCP mode")
|
tcp := flag.Bool("tcp", false, "TCP mode")
|
||||||
nsid := flag.Bool("nsid", false, "set edns nsid option")
|
nsid := flag.Bool("nsid", false, "set edns nsid option")
|
||||||
client := flag.String("client", "", "set edns client-subnet option")
|
client := flag.String("client", "", "set edns client-subnet option")
|
||||||
|
//serial := flag.Int("serial", 0, "perform an IXFR with this serial")
|
||||||
flag.Usage = func() {
|
flag.Usage = func() {
|
||||||
fmt.Fprintf(os.Stderr, "Usage: %s [@server] [qtype] [qclass] [name ...]\n", os.Args[0])
|
fmt.Fprintf(os.Stderr, "Usage: %s [@server] [qtype] [qclass] [name ...]\n", os.Args[0])
|
||||||
flag.PrintDefaults()
|
flag.PrintDefaults()
|
||||||
|
@ -39,7 +46,7 @@ func main() {
|
||||||
conf, _ := dns.ClientConfigFromFile("/etc/resolv.conf")
|
conf, _ := dns.ClientConfigFromFile("/etc/resolv.conf")
|
||||||
nameserver := "@" + conf.Servers[0]
|
nameserver := "@" + conf.Servers[0]
|
||||||
qtype := uint16(0)
|
qtype := uint16(0)
|
||||||
qclass := uint16(dns.ClassINET) // Default qclass
|
qclass := uint16(dns.ClassINET)
|
||||||
var qname []string
|
var qname []string
|
||||||
|
|
||||||
flag.Parse()
|
flag.Parse()
|
||||||
|
@ -70,14 +77,6 @@ Flags:
|
||||||
// And if it looks like type, it is a type
|
// And if it looks like type, it is a type
|
||||||
if k, ok := dns.Str_rr[strings.ToUpper(flag.Arg(i))]; ok {
|
if k, ok := dns.Str_rr[strings.ToUpper(flag.Arg(i))]; ok {
|
||||||
qtype = k
|
qtype = k
|
||||||
switch qtype {
|
|
||||||
case dns.TypeAXFR:
|
|
||||||
fmt.Fprintf(os.Stderr, "AXFR not supported\n")
|
|
||||||
return
|
|
||||||
case dns.TypeIXFR:
|
|
||||||
fmt.Fprintf(os.Stderr, "AXFR not supported\n")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
continue Flags
|
continue Flags
|
||||||
}
|
}
|
||||||
// If it looks like a class, it is a class
|
// If it looks like a class, it is a class
|
||||||
|
@ -90,14 +89,6 @@ Flags:
|
||||||
i, e := strconv.Atoi(string([]byte(flag.Arg(i))[4:]))
|
i, e := strconv.Atoi(string([]byte(flag.Arg(i))[4:]))
|
||||||
if e == nil {
|
if e == nil {
|
||||||
qtype = uint16(i)
|
qtype = uint16(i)
|
||||||
switch qtype {
|
|
||||||
case dns.TypeAXFR:
|
|
||||||
fmt.Fprintf(os.Stderr, "AXFR not supported\n")
|
|
||||||
return
|
|
||||||
case dns.TypeIXFR:
|
|
||||||
fmt.Fprintf(os.Stderr, "AXFR not supported\n")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
continue Flags
|
continue Flags
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -192,10 +183,15 @@ Flags:
|
||||||
m.SetTsig(name, algo, 300, time.Now().Unix())
|
m.SetTsig(name, algo, 300, time.Now().Unix())
|
||||||
c.TsigSecret = map[string]string{name: secret}
|
c.TsigSecret = map[string]string{name: secret}
|
||||||
} else {
|
} else {
|
||||||
fmt.Fprintf(os.Stderr, "tsig key data error\n")
|
fmt.Fprintf(os.Stderr, "TSIG key data error\n")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if qtype == dns.TypeAXFR || qtype == dns.TypeIXFR {
|
||||||
|
doXfr(c, m, nameserver)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
c.DoRtt(m, nameserver, nil, func(m, r *dns.Msg, rtt time.Duration, e error, data interface{}) {
|
c.DoRtt(m, nameserver, nil, func(m, r *dns.Msg, rtt time.Duration, e error, data interface{}) {
|
||||||
defer func() {
|
defer func() {
|
||||||
if i == len(qname)-1 {
|
if i == len(qname)-1 {
|
||||||
|
@ -211,7 +207,7 @@ Flags:
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if r.Id != m.Id {
|
if r.Id != m.Id {
|
||||||
fmt.Printf("Id mismatch\n")
|
fmt.Fprintf(os.Stderr, "Id mismatch\n")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if r.MsgHdr.Truncated && *fallback {
|
if r.MsgHdr.Truncated && *fallback {
|
||||||
|
@ -320,18 +316,18 @@ func nsecCheck(in *dns.Msg) {
|
||||||
return
|
return
|
||||||
Check:
|
Check:
|
||||||
/*
|
/*
|
||||||
w, err := in.Nsec3Verify(in.Question[0])
|
w, err := in.Nsec3Verify(in.Question[0])
|
||||||
switch w {
|
switch w {
|
||||||
case dns.NSEC3_NXDOMAIN:
|
case dns.NSEC3_NXDOMAIN:
|
||||||
fmt.Printf(";+ [beta] Correct denial of existence (NSEC3/NXDOMAIN)\n")
|
fmt.Printf(";+ [beta] Correct denial of existence (NSEC3/NXDOMAIN)\n")
|
||||||
case dns.NSEC3_NODATA:
|
case dns.NSEC3_NODATA:
|
||||||
fmt.Printf(";+ [beta] Correct denial of existence (NSEC3/NODATA)\n")
|
fmt.Printf(";+ [beta] Correct denial of existence (NSEC3/NODATA)\n")
|
||||||
default:
|
default:
|
||||||
// w == 0
|
// w == 0
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Printf(";- [beta] Incorrect denial of existence (NSEC3): %s\n", err.Error())
|
fmt.Printf(";- [beta] Incorrect denial of existence (NSEC3): %s\n", err.Error())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
*/
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -413,3 +409,22 @@ func shortRR(r dns.RR) dns.RR {
|
||||||
}
|
}
|
||||||
return r
|
return r
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func doXfr(c *dns.Client, m *dns.Msg, nameserver string) {
|
||||||
|
if t, e := c.XfrReceive(m, nameserver); e == nil {
|
||||||
|
for r := range t {
|
||||||
|
if r.Error == nil {
|
||||||
|
for _, rr := range r.RR {
|
||||||
|
if *short {
|
||||||
|
rr = shortRR(rr)
|
||||||
|
}
|
||||||
|
fmt.Printf("%v\n", rr)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
fmt.Fprintf(os.Stderr, "Failure to read XFR: %s\n", r.Error.Error())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
fmt.Printf("Error %v\n", e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue