diff --git a/_examples/ns/ns.go b/_examples/ns/ns.go index 538c89f1..5dd3f72f 100644 --- a/_examples/ns/ns.go +++ b/_examples/ns/ns.go @@ -1,129 +1,42 @@ package main import ( - "net" - "dns" "os" - "flag" + "dns" "fmt" - "strconv" - "strings" + "flag" + "json" ) func main() { - var dnssec *bool = flag.Bool("dnssec", false, "Request DNSSEC records") - var port *string = flag.String("port", "53", "Set the query port") - var aa *bool = flag.Bool("aa", false, "Set AA flag in query") - var ad *bool = flag.Bool("ad", false, "Set AD flag in query") - var cd *bool = flag.Bool("cd", false, "Set CD flag in query") - var rd *bool = flag.Bool("rd", true, "Unset RD flag in query") - var tcp *bool = flag.Bool("tcp", false, "TCP mode") - var nsid *bool = flag.Bool("nsid", false, "Ask for the NSID") +// var zone *string = flag.String("zone", "", "The zone to serve") flag.Usage = func() { - fmt.Fprintf(os.Stderr, "Usage: %s [@server] [qtype] [qclass] [name ...]\n", os.Args[0]) + fmt.Fprintf(os.Stderr, "Usage: %s zone...\n", os.Args[0]) flag.PrintDefaults() } - - nameserver := "@127.0.0.1" // Default nameserver - qtype := uint16(dns.TypeA) // Default qtype - qclass := uint16(dns.ClassINET) // Default qclass - var qname []string - flag.Parse() -Flags: - for i := 0; i < flag.NArg(); i++ { - // If it starts with @ it is a nameserver - if flag.Arg(i)[0] == '@' { - nameserver = flag.Arg(i) - continue Flags - } - // First class, then type, to make ANY queries possible - // And if it looks like type, it is a type - for k, v := range dns.Rr_str { - if v == strings.ToUpper(flag.Arg(i)) { - qtype = k - continue Flags - } - } - // If it looks like a class, it is a class - for k, v := range dns.Class_str { - if v == strings.ToUpper(flag.Arg(i)) { - qclass = k - continue Flags - } - } - // If it starts with TYPExxx it is unknown rr - if strings.HasPrefix(flag.Arg(i), "TYPE") { - i, e := strconv.Atoi(string([]byte(flag.Arg(i))[4:])) - if e == nil { - qtype = uint16(i) - continue Flags - } - } - - // Anything else is a qname - qname = append(qname, flag.Arg(i)) - } - r := new(dns.Resolver) - r.FromFile("/etc/resolv.conf") - r.Timeout = 2 - r.Port = *port - r.Tcp = *tcp - r.Attempts = 1 - // @server may be a name, resolv that - var err os.Error - nameserver = string([]byte(nameserver)[1:]) // chop off @ - _, addr, err := net.LookupHost(nameserver) - if err == nil { - r.Servers = addr - } else { - r.Servers = []string{nameserver} - } - m := new(dns.Msg) - m.MsgHdr.Authoritative = *aa - m.MsgHdr.AuthenticatedData = *ad - m.MsgHdr.CheckingDisabled = *cd - m.MsgHdr.RecursionDesired = *rd + m.MsgHdr.Id = dns.Id() + m.MsgHdr.Authoritative = true + m.MsgHdr.AuthenticatedData = false + m.MsgHdr.RecursionAvailable = true + m.MsgHdr.Response = true + m.MsgHdr.Opcode = dns.OpcodeQuery + m.MsgHdr.Rcode = dns.RcodeSuccess m.Question = make([]dns.Question, 1) - if *dnssec || *nsid { - opt := new(dns.RR_OPT) - opt.Hdr = dns.RR_Header{Name: "", Rrtype: dns.TypeOPT} - opt.SetVersion(0) - opt.SetDo() - opt.SetUDPSize(dns.DefaultMsgSize) - if *nsid { - opt.SetNsid("") - } - m.Extra = make([]dns.RR, 1) - m.Extra[0] = opt - } + m.Question[0] = dns.Question{"miek.nl.", dns.TypeTXT, dns.ClassINET} + m.Answer = make([]dns.RR, 1) + t := new(dns.RR_TXT) + t.Hdr = dns.RR_Header{Name: "miek.nl.", Rrtype: dns.TypeTXT, Class: dns.ClassINET, Ttl: 3600} + t.Txt = "Een antwoord" + m.Answer[0] = t - for _, v := range qname { - m.Question[0] = dns.Question{v, qtype, qclass} - m.SetId() - in, err := r.Query(m) - if in != nil { - if m.Id != in.Id { - fmt.Printf("Id mismatch\n") - } - fmt.Printf("%v\n", in) - } else { - fmt.Printf("%v\n", err.String()) - } + json, err := json.Marshal(m) + if err != nil { + fmt.Printf("Err: %s", err.String()) + os.Exit(1) } + fmt.Printf("%v", string(json)) + } -/* -41 func (m *Meta) String() string { -42 s := ";; Query time: " + strconv.Itoa(int(m.QueryEnd-m.QueryStart)) + " nsec" -43 s += "\n;; MSG SIZE rcvd: " + strconv.Itoa(m.RLen) + ", sent: " + strconv.Itoa(m.QLen) -44 rf := float32(m.RLen) -45 qf := float32(m.QLen) -46 if qf != 0 { -47 s += " (" + strconv.Ftoa32(rf/qf, 'f', 2) + ":1)" -48 } -49 // WHEN?? -50 return s -51 } -*/ diff --git a/_examples/q/q.go b/_examples/q/q.go index 538c89f1..674d03e6 100644 --- a/_examples/q/q.go +++ b/_examples/q/q.go @@ -12,6 +12,7 @@ import ( func main() { var dnssec *bool = flag.Bool("dnssec", false, "Request DNSSEC records") + var short *bool = flag.Bool("short", false, "Abbriate long DNSKEY and RRSIG RRs") var port *string = flag.String("port", "53", "Set the query port") var aa *bool = flag.Bool("aa", false, "Set AA flag in query") var ad *bool = flag.Bool("ad", false, "Set AD flag in query") @@ -102,18 +103,46 @@ Flags: for _, v := range qname { m.Question[0] = dns.Question{v, qtype, qclass} - m.SetId() + m.Id = dns.Id() in, err := r.Query(m) if in != nil { if m.Id != in.Id { fmt.Printf("Id mismatch\n") } + if *short { + in = shortMsg(in) + } fmt.Printf("%v\n", in) } else { fmt.Printf("%v\n", err.String()) } } } + +// Walk trough message and short Key data and Sig data +func shortMsg(in *dns.Msg) *dns.Msg { + for i := 0; i < len(in.Answer); i++ { + in.Answer[i] = shortRR(in.Answer[i]) + } + for i := 0; i < len(in.Ns); i++ { + in.Ns[i] = shortRR(in.Ns[i]) + } + for i := 0; i < len(in.Extra); i++ { + in.Extra[i] = shortRR(in.Extra[i]) + } + return in +} + +func shortRR(r dns.RR) dns.RR { + switch t := r.(type) { + case *dns.RR_DNSKEY: + t.PublicKey = "( ... )" + case *dns.RR_RRSIG: + t.Signature = "( ... )" + } + return r +} + /* 41 func (m *Meta) String() string { 42 s := ";; Query time: " + strconv.Itoa(int(m.QueryEnd-m.QueryStart)) + " nsec" diff --git a/msg.go b/msg.go index 82da25a6..c8173233 100644 --- a/msg.go +++ b/msg.go @@ -1055,7 +1055,8 @@ func (dns *Msg) String() string { return s } -// Set an Msg Id to a random value. -func (m *Msg) SetId() { - m.Id = uint16(rand.Int()) ^ uint16(time.Nanoseconds()) +// Return a 16 bits random number to be used as +// msg id +func Id() uint16 { + return uint16(rand.Int()) ^ uint16(time.Nanoseconds()) } diff --git a/resolver.go b/resolver.go index 9868d4df..509aa221 100644 --- a/resolver.go +++ b/resolver.go @@ -58,7 +58,7 @@ func (res *Resolver) Query(q *Msg) (d *Msg, err os.Error) { if q.Id == 0 { // No Id sed, set it - q.SetId() + q.Id = Id() } sending, ok := q.Pack() if !ok { @@ -119,7 +119,7 @@ func (res *Resolver) Ixfr(q *Msg, m chan Xfr) { var _ = err // TODO(mg) if q.Id == 0 { - q.SetId() + q.Id = Id() } defer close(m) @@ -227,7 +227,7 @@ func (res *Resolver) Axfr(q *Msg, m chan Xfr) { var _ = err // TODO(mg) if q.Id == 0 { - q.SetId() + q.Id = Id() } defer close(m) diff --git a/resolver_test.go b/resolver_test.go index 48168bc4..b2749265 100644 --- a/resolver_test.go +++ b/resolver_test.go @@ -82,7 +82,7 @@ func TestResolverTsig(t *testing.T) { // ask something m.Question[0] = Question{"powerdns.nl", TypeDNSKEY, ClassINET} m.Extra = make([]RR, 1) - m.SetId() + m.Id = Id() tsig := new(RR_TSIG) tsig.Hdr.Name = "miek.nl" // for tsig this is the key's name