From fea310bbcfe11f7b8b197f16237bbcdd5e99a185 Mon Sep 17 00:00:00 2001 From: Miek Gieben Date: Thu, 13 Jan 2011 16:12:02 +0100 Subject: [PATCH] New API rename resolver.DnsMsg to resolver.Msg. shorter and better Adapt all files to this change --- ChangeLog | 3 +++ TODO | 8 ------- _examples/axfr/axfr.go | 2 +- _examples/chaos/chaos.go | 14 ++++++------ _examples/dnssectest/dnssectest.go | 13 +++++------ _examples/mx/_go_.6 | Bin 25735 -> 25586 bytes _examples/mx/mx.go | 4 ++-- _examples/notify/notify.go | 6 ++--- _examples/q/q.go | 4 ++-- resolver/axfr_test.go | 2 +- resolver/resolver.go | 34 ++++++++++++++--------------- resolver/resolverEdns_test.go | 4 ++-- resolver/resolverTsig_test.go | 4 ++-- resolver/resolver_test.go | 6 ++--- responder/responder.go | 16 +++++++------- 15 files changed, 57 insertions(+), 63 deletions(-) create mode 100644 ChangeLog diff --git a/ChangeLog b/ChangeLog new file mode 100644 index 00000000..7fbf2f2e --- /dev/null +++ b/ChangeLog @@ -0,0 +1,3 @@ + + +* Cherry picked GRONG for server side ideas diff --git a/TODO b/TODO index be3db016..39f1ae1f 100644 --- a/TODO +++ b/TODO @@ -2,17 +2,9 @@ Todo: Short term: * NSEC3 - need base32 for Nsec3 * Parsing from strings -* Server support * Signature generation * Testsuite * Cleanup the code -* use the responder idea from GRONG - so we then have dns/resolver - asking - and dns/responder - answering - -For servers we might need client IP and stuff -- look how -we need to encode this in the DnsMsg (which is the type of -the channel we use to comm. with resolvers) Issues: * escaped dots in names \. diff --git a/_examples/axfr/axfr.go b/_examples/axfr/axfr.go index ea341752..1aee53ca 100644 --- a/_examples/axfr/axfr.go +++ b/_examples/axfr/axfr.go @@ -15,7 +15,7 @@ func main() { m.Question = make([]dns.Question, 1) m.Question[0] = dns.Question{"atoom.net", dns.TypeAXFR, dns.ClassINET} - ch <- resolver.DnsMsg{m, nil} + ch <- resolver.Msg{m, nil} for dm := range ch { fmt.Printf("%v\n",dm.Dns) } diff --git a/_examples/chaos/chaos.go b/_examples/chaos/chaos.go index 5e3d1f51..c1e6dc58 100644 --- a/_examples/chaos/chaos.go +++ b/_examples/chaos/chaos.go @@ -17,7 +17,7 @@ func main() { r.Servers = []string{"127.0.0.1"} r.Timeout = 2 r.Attempts = 1 - var in resolver.DnsMsg + var in resolver.Msg if len(os.Args) != 2 { fmt.Printf("%s NAMESERVER\n", os.Args[0]) @@ -30,13 +30,13 @@ func main() { // set the resolver to query the NS directly r.Servers = []string{a.String()} m.Question[0] = dns.Question{"version.bind.", dns.TypeTXT, dns.ClassCHAOS} - qr <- resolver.DnsMsg{m, nil} + qr <- resolver.Msg{m, nil} in = <-qr if in.Dns != nil && in.Dns.Answer != nil { fmt.Printf("%v\n", in.Dns.Answer[0]) } m.Question[0] = dns.Question{"hostname.bind.", dns.TypeTXT, dns.ClassCHAOS} - qr <- resolver.DnsMsg{m, nil} + qr <- resolver.Msg{m, nil} in = <-qr if in.Dns != nil && in.Dns.Answer != nil { fmt.Printf("%v\n", in.Dns.Answer[0]) @@ -44,18 +44,18 @@ func main() { } // Stop the resolver, send it a null mesg - qr <- resolver.DnsMsg{nil, nil} + qr <- resolver.Msg{nil, nil} <-qr } -func addresses(qr chan resolver.DnsMsg, name string) []net.IP { +func addresses(qr chan resolver.Msg, name string) []net.IP { m := new(dns.Msg) m.MsgHdr.RecursionDesired = true //only set this bit m.Question = make([]dns.Question, 1) var ips []net.IP m.Question[0] = dns.Question{os.Args[1], dns.TypeA, dns.ClassINET} - qr <- resolver.DnsMsg{m, nil} + qr <- resolver.Msg{m, nil} in := <-qr if in.Dns == nil { @@ -71,7 +71,7 @@ func addresses(qr chan resolver.DnsMsg, name string) []net.IP { ips = append(ips, a.(*dns.RR_A).A) } m.Question[0] = dns.Question{os.Args[1], dns.TypeAAAA, dns.ClassINET} - qr <- resolver.DnsMsg{m, nil} + qr <- resolver.Msg{m, nil} in = <-qr if in.Dns == nil { diff --git a/_examples/dnssectest/dnssectest.go b/_examples/dnssectest/dnssectest.go index 409a82ba..ef255e0d 100644 --- a/_examples/dnssectest/dnssectest.go +++ b/_examples/dnssectest/dnssectest.go @@ -2,7 +2,6 @@ package main import ( "dns" - "dns/dnssec" "dns/resolver" "fmt" ) @@ -17,7 +16,7 @@ func main() { key.Hdr.Ttl = 3600 key.Flags = 257 key.Protocol = 3 - key.Algorithm = dnssec.AlgRSASHA1 + key.Algorithm = dns.AlgRSASHA1 key.PubKey = "AwEAAaHIwpx3w4VHKi6i1LHnTaWeHCL154Jug0Rtc9ji5qwPXpBo6A5sRv7cSsPQKPIwxLpyCrbJ4mr2L0EPOdvP6z6YfljK2ZmTbogU9aSU2fiq/4wjxbdkLyoDVgtO+JsxNN4bjr4WcWhsmk1Hg93FV9ZpkWb0Tbad8DFq NDzr//kZ" sig := new(dns.RR_RRSIG) @@ -26,7 +25,7 @@ func main() { sig.Hdr.Class = dns.ClassINET sig.Hdr.Ttl = 3600 sig.TypeCovered = dns.TypeDNSKEY - sig.Algorithm = dnssec.AlgRSASHA1 + sig.Algorithm = dns.AlgRSASHA1 sig.OrigTtl = 4000 sig.Expiration = 1000 sig.Inception = 800 @@ -51,20 +50,20 @@ func main() { m.Question = make([]dns.Question, 1) m.Question[0] = dns.Question{"miek.nl", dns.TypeDS, dns.ClassINET} - ch <- resolver.DnsMsg{m, nil} + ch <- resolver.Msg{m, nil} in := <-ch fmt.Printf("%v\n", in.Dns) m.Question[0] = dns.Question{"www.nlnetlabs.nl", dns.TypeRRSIG, dns.ClassINET} - ch <- resolver.DnsMsg{m, nil} + ch <- resolver.Msg{m, nil} in = <-ch fmt.Printf("%v\n", in.Dns) m.Question[0] = dns.Question{"xxxx.nlnetlabs.nl", dns.TypeDNSKEY, dns.ClassINET} - ch <- resolver.DnsMsg{m, nil} + ch <- resolver.Msg{m, nil} in = <-ch fmt.Printf("%v\n", in.Dns) - ch <- resolver.DnsMsg{nil, nil} + ch <- resolver.Msg{nil, nil} <-ch } diff --git a/_examples/mx/_go_.6 b/_examples/mx/_go_.6 index 6117f940336f31f660c134660097a5ed7f801c87..b108f21f25be26203223b8612ae005b7ab48dcbb 100644 GIT binary patch delta 628 zcmZoa$@u9w?2%86>QUCM>~gyE%fl zhI{jM2`3Jgu*B9WlVuglCLb~t+Pp%sNqn-dWdNt^t@$@@GXTNlCd(3#)MRcey~#FK z3E1q}Vim;l$>P+b$z0a8d|-FL-LQGKH6P>TH8z1PQ7_xQCNtVX4C}Hj!R9hCyBrps zh+4DBZFZHsV3)%Tntaeyc(bbg1^&rD{Pfj*i**_FfsPZ;XA%HX%7qH)Ah!a68CYC6 zpG&!rRcNxGzvAQ~e^o}o%`^Pjc_uH4wv=T7X%Hw>0Gf`fL7OmqDL_fk8N*Lw)i=1>woY zminx$-Vb-1P0qF~0V$q*-_ik0%UdPjcF{zuAeOCjmrbAi+^SXtVzQ0`vYR&-S@SW1 z&1tX+Wa(b-5i|L!4a5RZ+cw<3d1#x%(sA&F^W;FgN~pn_s0QD#d&Cbmc$c5Px=S9! zKjQhU0zhvm7b<{)5XfRMgZh(8xsX+KvVgxLSdXELSR%H~M{5RSRt8XVe#<)iS4S+d@Ljq`~P@w`iI)T9g7gvCY z!=e@@&ZYqo2RU97$b>sysE}1}@`)G??6&@kQDfAdtQu@Bjb+ diff --git a/_examples/mx/mx.go b/_examples/mx/mx.go index d296e962..562abbd0 100644 --- a/_examples/mx/mx.go +++ b/_examples/mx/mx.go @@ -26,7 +26,7 @@ func main() { m.Question = make([]dns.Question, 1) m.Question[0] = dns.Question{os.Args[1], dns.TypeMX, dns.ClassINET} - qr <- resolver.DnsMsg{m, nil} + qr <- resolver.Msg{m, nil} in := <-qr if in.Dns != nil { if in.Dns.Rcode != dns.RcodeSuccess { @@ -42,6 +42,6 @@ func main() { } // Stop the resolver, send it a null mesg - qr <- resolver.DnsMsg{nil, nil} + qr <- resolver.Msg{nil, nil} <-qr } diff --git a/_examples/notify/notify.go b/_examples/notify/notify.go index af7d6e71..c6e61228 100644 --- a/_examples/notify/notify.go +++ b/_examples/notify/notify.go @@ -15,7 +15,7 @@ func main() { r.Servers = []string{"127.0.0.1"} r.Timeout = 2 r.Attempts = 1 - var in resolver.DnsMsg + var in resolver.Msg if len(os.Args) != 2 { fmt.Printf("%s NAMESERVER\n", os.Args[0]) @@ -26,7 +26,7 @@ func main() { m.Question = make([]dns.Question, 1) m.Question[0] = dns.Question{"miek.nl", dns.TypeSOA, dns.ClassINET} m.MsgHdr.Opcode = dns.OpcodeNotify - qr <- resolver.DnsMsg{m, nil} + qr <- resolver.Msg{m, nil} in = <-qr // if in.Dns != nil && in.Dns.Answer != nil { if in.Dns != nil { @@ -35,6 +35,6 @@ func main() { } // Stop the resolver, send it a null mesg - qr <- resolver.DnsMsg{nil, nil} + qr <- resolver.Msg{nil, nil} <-qr } diff --git a/_examples/q/q.go b/_examples/q/q.go index cbddd44d..1c379faf 100644 --- a/_examples/q/q.go +++ b/_examples/q/q.go @@ -89,7 +89,7 @@ FLAGS: for _, v := range qname { m.Question[0] = dns.Question{v, qtype, qclass} m.SetId() - qr <- resolver.DnsMsg{m, nil} + qr <- resolver.Msg{m, nil} in := <-qr if in.Dns != nil { if m.Id != in.Dns.Id { @@ -100,6 +100,6 @@ FLAGS: fmt.Printf("%v\n", in.Error.String()) } } - qr <- resolver.DnsMsg{nil, nil} + qr <- resolver.Msg{nil, nil} <-qr } diff --git a/resolver/axfr_test.go b/resolver/axfr_test.go index 61c65912..760cc210 100644 --- a/resolver/axfr_test.go +++ b/resolver/axfr_test.go @@ -16,7 +16,7 @@ func TestAXFR(t *testing.T) { m.Question[0] = dns.Question{"miek.nl", dns.TypeAXFR, dns.ClassINET} //m.Question[0] = dns.Question{"atoom.net", dns.TypeAXFR, dns.ClassINET} - ch <- DnsMsg{m, nil} + ch <- Msg{m, nil} for dm := range ch { var _ = dm /* fmt.Printf("%v\n",dm.Dns) */ diff --git a/resolver/resolver.go b/resolver/resolver.go index 990d0e45..be0c0bfd 100644 --- a/resolver/resolver.go +++ b/resolver/resolver.go @@ -17,7 +17,7 @@ // m.MsgHdr.Recursion_desired = true // header bits // m.Question = make([]Question, 1) // 1 RR in question sec. // m.Question[0] = Question{"miek.nl", TypeSOA, ClassINET} -// ch <- DnsMsg{m, nil} // send the query +// ch <- Msg{m, nil} // send the query // in := <-ch // wait for reply // // Note that message id checking is left to the caller @@ -37,7 +37,7 @@ const servErr = "No servers could be reached" // to send packets to it, for sending Error must be nil. // A resolver responds with a reply packet and a possible error. // Sending a nil message instructs to resolver to stop. -type DnsMsg struct { +type Msg struct { Dns *dns.Msg Error os.Error } @@ -61,14 +61,14 @@ type Resolver struct { // Start a new resolver as a goroutine, return the communication channel. // Note the a limit amount of sanity checking is done. There is for instance // no query id matching. -func (res *Resolver) NewQuerier() (ch chan DnsMsg) { - ch = make(chan DnsMsg) +func (res *Resolver) NewQuerier() (ch chan Msg) { + ch = make(chan Msg) go query(res, ch) return } // The query function. -func query(res *Resolver, msg chan DnsMsg) { +func query(res *Resolver, msg chan Msg) { // error checking, robustness var ( c net.Conn @@ -88,7 +88,7 @@ func query(res *Resolver, msg chan DnsMsg) { case out := <-msg: //msg received if out.Dns == nil { // nil message, quit the goroutine - msg <- DnsMsg{nil, nil} + msg <- Msg{nil, nil} close(msg) return } @@ -101,7 +101,7 @@ func query(res *Resolver, msg chan DnsMsg) { } sending, ok := out.Dns.Pack() if !ok { - msg <- DnsMsg{nil, &dns.Error{Error: packErr}} + msg <- Msg{nil, &dns.Error{Error: packErr}} continue } @@ -129,9 +129,9 @@ func query(res *Resolver, msg chan DnsMsg) { } } if err != nil { - msg <- DnsMsg{nil, err} + msg <- Msg{nil, err} } else { - msg <- DnsMsg{in, nil} + msg <- Msg{in, nil} } } } @@ -141,13 +141,13 @@ func query(res *Resolver, msg chan DnsMsg) { // Start a new xfr as a goroutine, return a channel. // Channel will be closed when the axfr is finished, until // that time new messages will appear on the channel -func (res *Resolver) NewXfer() (ch chan DnsMsg) { - ch = make(chan DnsMsg) +func (res *Resolver) NewXfer() (ch chan Msg) { + ch = make(chan Msg) go axfr(res, ch) return } -func axfr(res *Resolver, msg chan DnsMsg) { +func axfr(res *Resolver, msg chan Msg) { var port string var err os.Error var in *dns.Msg @@ -162,7 +162,7 @@ func axfr(res *Resolver, msg chan DnsMsg) { case out := <-msg: // msg received if out.Dns == nil { // stop - msg <- DnsMsg{nil, nil} + msg <- Msg{nil, nil} close(msg) return } @@ -170,7 +170,7 @@ func axfr(res *Resolver, msg chan DnsMsg) { out.Dns.SetId() sending, ok := out.Dns.Pack() if !ok { - msg <- DnsMsg{nil, &dns.Error{Error: packErr}} + msg <- Msg{nil, &dns.Error{Error: packErr}} } SERVER: for i := 0; i < len(res.Servers); i++ { @@ -208,12 +208,12 @@ func axfr(res *Resolver, msg chan DnsMsg) { if !first { if !checkSOA(in, false) { // Soa record not the last one - msg <- DnsMsg{in, nil} + msg <- Msg{in, nil} continue // next } else { c.Close() - msg <- DnsMsg{in, nil} + msg <- Msg{in, nil} close(msg) return } @@ -222,7 +222,7 @@ func axfr(res *Resolver, msg chan DnsMsg) { println("Should never be reached") return } - msg <- DnsMsg{nil, err} + msg <- Msg{nil, err} close(msg) return } diff --git a/resolver/resolverEdns_test.go b/resolver/resolverEdns_test.go index c3593425..29898581 100644 --- a/resolver/resolverEdns_test.go +++ b/resolver/resolverEdns_test.go @@ -34,7 +34,7 @@ func TestResolverEdns(t *testing.T) { m.Extra = make([]dns.RR, 1) m.Extra[0] = edns - ch <- DnsMsg{m, nil} + ch <- Msg{m, nil} in := <-ch if in.Dns != nil { if in.Dns.Rcode != dns.RcodeSuccess { @@ -45,6 +45,6 @@ func TestResolverEdns(t *testing.T) { } else { fmt.Printf("Failed to get a good anwer") } - ch <- DnsMsg{nil, nil} + ch <- Msg{nil, nil} <-ch // wait for ch to close channel } diff --git a/resolver/resolverTsig_test.go b/resolver/resolverTsig_test.go index 94f24a33..fa72a48a 100644 --- a/resolver/resolverTsig_test.go +++ b/resolver/resolverTsig_test.go @@ -33,7 +33,7 @@ func TestResolverTsig(t *testing.T) { m.Extra[0] = tsig - ch <- DnsMsg{m, nil} + ch <- Msg{m, nil} in := <-ch if in.Dns != nil { if in.Dns.Rcode != dns.RcodeSuccess { @@ -44,6 +44,6 @@ func TestResolverTsig(t *testing.T) { } else { fmt.Printf("Failed to get a good anwer") } - ch <- DnsMsg{nil, nil} + ch <- Msg{nil, nil} <-ch // wait for ch to close channel } diff --git a/resolver/resolver_test.go b/resolver/resolver_test.go index 2ca0d023..f08d6526 100644 --- a/resolver/resolver_test.go +++ b/resolver/resolver_test.go @@ -19,7 +19,7 @@ func TestResolver(t *testing.T) { // ask something m.Question[0] = dns.Question{"miek.nl", dns.TypeSOA, dns.ClassINET} - ch <- DnsMsg{m, nil} + ch <- Msg{m, nil} in := <-ch if in.Dns != nil && in.Dns.Rcode != dns.RcodeSuccess { @@ -30,7 +30,7 @@ func TestResolver(t *testing.T) { // ask something m.Question[0] = dns.Question{"www.nlnetlabs.nl", dns.TypeRRSIG, dns.ClassINET} - ch <- DnsMsg{m, nil} + ch <- Msg{m, nil} in = <-ch if in.Dns != nil && in.Dns.Rcode != dns.RcodeSuccess { @@ -41,6 +41,6 @@ func TestResolver(t *testing.T) { fmt.Printf("%v\n", in.Dns) } - ch <- DnsMsg{nil, nil} + ch <- Msg{nil, nil} <-ch } diff --git a/responder/responder.go b/responder/responder.go index b3a7a4e9..53259d90 100644 --- a/responder/responder.go +++ b/responder/responder.go @@ -22,14 +22,14 @@ type Server struct { Mangle func([]byte) []byte // mangle the packet, before sending } -type serverMsgUDP struct { +type MsgUDP struct { c *net.UDPConn // connection addr *net.UDPAddr // remote address msg []byte // raw dns message err os.Error // any errors } -type serverMsgTCP struct { +type MsgTCP struct { c *net.TCPConn // connection msg []byte // raw dns message err os.Error // any errors @@ -60,7 +60,7 @@ func (res *Server) NewResponder(h Responder, ch chan bool) os.Error { } switch res.Tcp { case true: - tch := make(chan serverMsgTCP) + tch := make(chan MsgTCP) a, _ := net.ResolveTCPAddr(res.Address + ":" + port) go listenerTCP(a, tch) foreverTCP: @@ -79,7 +79,7 @@ func (res *Server) NewResponder(h Responder, ch chan bool) os.Error { } case false: - uch := make(chan serverMsgUDP) + uch := make(chan MsgUDP) a, _ := net.ResolveUDPAddr(res.Address + ":" + port) go listenerUDP(a, uch) foreverUDP: @@ -99,7 +99,7 @@ func (res *Server) NewResponder(h Responder, ch chan bool) os.Error { return nil } -func listenerUDP(a *net.UDPAddr, ch chan serverMsgUDP) { +func listenerUDP(a *net.UDPAddr, ch chan MsgUDP) { c, _ := net.ListenUDP("udp", a) // check error TODO(mg) for { @@ -110,11 +110,11 @@ func listenerUDP(a *net.UDPAddr, ch chan serverMsgUDP) { } m = m[:n] // if closed(ch) c.Close() TODO(mg) - ch <- serverMsgUDP{c, radd, m, nil} + ch <- MsgUDP{c, radd, m, nil} } } -func listenerTCP(a *net.TCPAddr, ch chan serverMsgTCP) { +func listenerTCP(a *net.TCPAddr, ch chan MsgTCP) { t, _ := net.ListenTCP("tcp", a) for { l := make([]byte, 2) // receiver length @@ -147,7 +147,7 @@ func listenerTCP(a *net.TCPAddr, ch chan serverMsgTCP) { } i += n } - ch <- serverMsgTCP{c, m, nil} + ch <- MsgTCP{c, m, nil} } }