Actually remove resolver.go
This commit is contained in:
parent
466291701c
commit
8368f4ce60
|
@ -189,7 +189,8 @@ func (c *Client) Do(m *Msg, a string) {
|
|||
}
|
||||
}
|
||||
|
||||
// A sync query
|
||||
// Perform an synchronize query. Send the message m to the address
|
||||
// contained in a
|
||||
func (c *Client) Exchange(m *Msg, a string) *Msg {
|
||||
w := new(reply)
|
||||
w.client = c
|
||||
|
|
102
dns_test.go
102
dns_test.go
|
@ -1,102 +0,0 @@
|
|||
package dns
|
||||
|
||||
import (
|
||||
"testing"
|
||||
"time"
|
||||
)
|
||||
|
||||
func TestPackUnpack(t *testing.T) {
|
||||
out := new(Msg)
|
||||
out.Answer = make([]RR, 1)
|
||||
key := new(RR_DNSKEY)
|
||||
key.Hdr = RR_Header{Name: "miek.nl.", Rrtype: TypeDNSKEY, Class: ClassINET, Ttl: 3600}
|
||||
key = &RR_DNSKEY{Flags: 257, Protocol: 3, Algorithm: AlgRSASHA1}
|
||||
key.PublicKey = "AwEAAaHIwpx3w4VHKi6i1LHnTaWeHCL154Jug0Rtc9ji5qwPXpBo6A5sRv7cSsPQKPIwxLpyCrbJ4mr2L0EPOdvP6z6YfljK2ZmTbogU9aSU2fiq/4wjxbdkLyoDVgtO+JsxNN4bjr4WcWhsmk1Hg93FV9ZpkWb0Tbad8DFqNDzr//kZ"
|
||||
|
||||
out.Answer[0] = key
|
||||
msg, ok := out.Pack()
|
||||
if !ok {
|
||||
t.Log("Failed to pack msg with DNSKEY")
|
||||
t.Fail()
|
||||
}
|
||||
|
||||
in := new(Msg)
|
||||
if !in.Unpack(msg) {
|
||||
t.Log("Failed to unpack msg with DNSKEY")
|
||||
t.Fail()
|
||||
}
|
||||
|
||||
sig := new(RR_RRSIG)
|
||||
sig.Hdr = RR_Header{Name: "miek.nl.", Rrtype: TypeRRSIG, Class: ClassINET, Ttl: 3600}
|
||||
sig = &RR_RRSIG{TypeCovered: TypeDNSKEY, Algorithm: AlgRSASHA1, Labels: 2,
|
||||
OrigTtl: 3600, Expiration: 4000, Inception: 4000, KeyTag: 34641, SignerName: "miek.nl.",
|
||||
Signature: "AwEAAaHIwpx3w4VHKi6i1LHnTaWeHCL154Jug0Rtc9ji5qwPXpBo6A5sRv7cSsPQKPIwxLpyCrbJ4mr2L0EPOdvP6z6YfljK2ZmTbogU9aSU2fiq/4wjxbdkLyoDVgtO+JsxNN4bjr4WcWhsmk1Hg93FV9ZpkWb0Tbad8DFqNDzr//kZ"}
|
||||
|
||||
out.Answer[0] = sig
|
||||
msg, ok = out.Pack()
|
||||
if !ok {
|
||||
t.Log("Failed to pack msg with RRSIG")
|
||||
t.Fail()
|
||||
}
|
||||
|
||||
if !in.Unpack(msg) {
|
||||
t.Log("Failed to unpack msg with RRSIG")
|
||||
t.Fail()
|
||||
}
|
||||
}
|
||||
|
||||
func TestEDNS_RR(t *testing.T) {
|
||||
edns := new(RR_OPT)
|
||||
edns.Hdr.Name = "." // must . be for edns
|
||||
edns.Hdr.Rrtype = TypeOPT
|
||||
edns.Hdr.Class = ClassINET
|
||||
edns.Hdr.Ttl = 3600
|
||||
edns.Option = make([]Option, 1)
|
||||
edns.Option[0].Code = OptionCodeNSID
|
||||
edns.Option[0].Data = "lalalala"
|
||||
//t..Logf("%v\n", edns)
|
||||
}
|
||||
|
||||
func TestTsig(t *testing.T) {
|
||||
tsig := new(Tsig)
|
||||
tsig.Name = "axfr."
|
||||
tsig.Algorithm = HmacMD5
|
||||
tsig.Fudge = 300
|
||||
tsig.TimeSigned = uint64(time.Seconds())
|
||||
tsig.Secret = "so6ZGir4GPAqINNh9U5c3A=="
|
||||
|
||||
// Perform a TSIG from miek.nl
|
||||
m := new(Msg)
|
||||
m.Question = make([]Question, 1)
|
||||
m.Question[0] = Question{"miek.nl.", TypeAXFR, ClassINET}
|
||||
m.Id = Id()
|
||||
|
||||
res := new(Resolver)
|
||||
res.FromFile("/etc/resolv.conf")
|
||||
res.Servers = []string{"85.223.71.124"}
|
||||
res.Tcp = true
|
||||
|
||||
c := make(chan Xfr)
|
||||
go res.XfrTsig(m, tsig, c)
|
||||
for x := range c {
|
||||
if x.Err != nil {
|
||||
t.Logf("Failed Xfr from miek.nl %v\n", x.Err)
|
||||
t.Fail()
|
||||
}
|
||||
}
|
||||
|
||||
tsig.Secret = "ZGZqc2tmZAo="
|
||||
// Do it again, must fail
|
||||
c = make(chan Xfr) // Reopen the channel
|
||||
go res.XfrTsig(m, tsig, c)
|
||||
ok := false
|
||||
for x := range c {
|
||||
if x.Err != nil {
|
||||
ok = true
|
||||
}
|
||||
}
|
||||
if ok == true {
|
||||
t.Logf("AXFR with wrong secret should fail")
|
||||
t.Fail()
|
||||
}
|
||||
}
|
|
@ -100,7 +100,7 @@ func TestSignVerify(t *testing.T) {
|
|||
sig := new(RR_RRSIG)
|
||||
sig.Hdr = RR_Header{"miek.nl.", TypeRRSIG, ClassINET, 14400, 0}
|
||||
sig.TypeCovered = soa.Hdr.Rrtype
|
||||
sig.Labels = LabelCount(soa.Hdr.Name)
|
||||
sig.Labels = labelCount(soa.Hdr.Name)
|
||||
sig.OrigTtl = soa.Hdr.Ttl
|
||||
sig.Expiration = 1296534305 // date -u '+%s' -d"2011-02-01 04:25:05"
|
||||
sig.Inception = 1293942305 // date -u '+%s' -d"2011-01-02 04:25:05"
|
||||
|
|
|
@ -5,13 +5,13 @@ import (
|
|||
)
|
||||
|
||||
func TestPackNsec3(t *testing.T) {
|
||||
nsec3 := HashName("dnsex.nl",HashSHA1 , 0, "DEAD")
|
||||
nsec3 := hashName("dnsex.nl",HashSHA1 , 0, "DEAD")
|
||||
if nsec3 != "ROCCJAE8BJJU7HN6T7NG3TNM8ACRS87J" {
|
||||
t.Logf("%v\n", nsec3)
|
||||
t.Fail()
|
||||
}
|
||||
|
||||
nsec3 = HashName("a.b.c.example.org",HashSHA1 , 2, "DEAD")
|
||||
nsec3 = hashName("a.b.c.example.org",HashSHA1 , 2, "DEAD")
|
||||
if nsec3 != "6LQ07OAHBTOOEU2R9ANI2AT70K5O0RCG" {
|
||||
t.Logf("%v\n", nsec3)
|
||||
t.Fail()
|
||||
|
|
107
resolver.go
107
resolver.go
|
@ -1,107 +0,0 @@
|
|||
// Copyright 2011 Miek Gieben. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
// DNS resolver client: see RFC 1035.
|
||||
|
||||
package dns
|
||||
|
||||
import (
|
||||
"os"
|
||||
)
|
||||
|
||||
// These channels are global so that all parts of the application
|
||||
// can send queries (or even pick them up).
|
||||
var (
|
||||
// Request an async query by sending to this channel.
|
||||
QueryRequest chan *Query
|
||||
// Listen for replies to previously sent queries on this channel.
|
||||
QueryReply chan *Query
|
||||
)
|
||||
|
||||
// Query is used to communicate with the Query* functions.
|
||||
type Query struct {
|
||||
// The query message which is to be send.
|
||||
Query *Msg
|
||||
|
||||
// Any reply message that came back from the wire.
|
||||
Reply *Msg
|
||||
|
||||
// It is only required to fill out Conn.RemoteAddr.
|
||||
// Optionally you may set Conn.Tsig if TSIG is required.
|
||||
// The rest of the structure is filled by the Query functions.
|
||||
Conn *Conn
|
||||
|
||||
// If there are any errors there Err is not nil
|
||||
Err os.Error
|
||||
}
|
||||
|
||||
// Initialize the QueryRequest and QueryReply channels. This
|
||||
// is only required when async. queries are wanted.
|
||||
func InitQueryChannels() {
|
||||
QueryRequest = make(chan *Query)
|
||||
QueryReply = make(chan *Query)
|
||||
}
|
||||
|
||||
// QueryAndServeTCP listens for incoming requests on channel in and then calls f.
|
||||
// The function f is executed in a seperate goroutine and performs the actual
|
||||
// TCP query and should return the result on the QueryReply channel.
|
||||
func QueryAndServeTCP(f func(*Conn, *Msg)) os.Error {
|
||||
if f == nil {
|
||||
return ErrHandle
|
||||
}
|
||||
if QueryReply == nil || QueryRequest == nil {
|
||||
return ErrChan
|
||||
}
|
||||
query("tcp", f)
|
||||
return nil
|
||||
}
|
||||
|
||||
// QueryAndServeUDP listens for incoming requests on channel in and then calls f.
|
||||
// The function f is executed in a seperate goroutine and performs the actual
|
||||
// UDP query and should return the result on the QueryReply channel.
|
||||
func QueryAndServeUDP(f func(*Conn, *Msg)) os.Error {
|
||||
if f == nil {
|
||||
return ErrHandle
|
||||
}
|
||||
if QueryReply == nil || QueryRequest == nil {
|
||||
return ErrChan
|
||||
}
|
||||
query("udp", f)
|
||||
return nil
|
||||
}
|
||||
|
||||
func query(n string, f func(*Conn, *Msg)) {
|
||||
for {
|
||||
select {
|
||||
case q := <-QueryRequest:
|
||||
err := q.Conn.Dial(n)
|
||||
if err != nil {
|
||||
QueryReply <- &Query{Err: err}
|
||||
}
|
||||
go f(q.Conn, q.Query)
|
||||
}
|
||||
}
|
||||
panic("not reached")
|
||||
}
|
||||
|
||||
// SimpleQuery performs a query and waits for the reply before
|
||||
// returning.
|
||||
func SimpleQuery(n string, d *Conn, m *Msg) (*Msg, os.Error) {
|
||||
err := d.Dial(n)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
o, err := d.ExchangeMsg(m, false)
|
||||
d.Close()
|
||||
return o, err
|
||||
}
|
||||
|
||||
// HandleQuery can be used as a default query handler. It
|
||||
// fires of the querie, wait for a response and sends the
|
||||
// response back on the QueryReply channel. HandleQuery closes d.
|
||||
func HandleQuery(d *Conn, i *Msg) {
|
||||
o, e := d.ExchangeMsg(i, false)
|
||||
QueryReply <- &Query{Query: i, Reply: o, Conn: d, Err: e}
|
||||
d.Close()
|
||||
}
|
136
resolver_test.go
136
resolver_test.go
|
@ -1,136 +0,0 @@
|
|||
package dns
|
||||
|
||||
import (
|
||||
"time"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestResolver(t *testing.T) {
|
||||
res := new(Resolver)
|
||||
res.Servers = []string{"127.0.0.1"}
|
||||
|
||||
m := new(Msg)
|
||||
m.MsgHdr.RecursionDesired = true //only set this bit
|
||||
m.Question = make([]Question, 1)
|
||||
|
||||
// ask something
|
||||
m.Question[0] = Question{"miek.nl", TypeSOA, ClassINET}
|
||||
in, _ := res.Query(m)
|
||||
|
||||
if in != nil && in.Rcode != RcodeSuccess {
|
||||
t.Log("Failed to get an valid answer")
|
||||
t.Fail()
|
||||
t.Logf("%v\n", in)
|
||||
}
|
||||
|
||||
// ask something
|
||||
m.Question[0] = Question{"www.nlnetlabs.nl", TypeRRSIG, ClassINET}
|
||||
in, _ = res.Query(m)
|
||||
|
||||
if in != nil && in.Rcode != RcodeSuccess {
|
||||
t.Log("Failed to get an valid answer")
|
||||
t.Fail()
|
||||
t.Logf("%v\n", in)
|
||||
}
|
||||
}
|
||||
|
||||
func TestResolverEdns(t *testing.T) {
|
||||
res := new(Resolver)
|
||||
res.Servers = []string{"127.0.0.1"}
|
||||
res.Timeout = 2
|
||||
res.Attempts = 1
|
||||
|
||||
m := new(Msg)
|
||||
m.MsgHdr.RecursionDesired = true //only set this bit
|
||||
m.Question = make([]Question, 1)
|
||||
|
||||
// Add EDNS rr
|
||||
edns := new(RR_OPT)
|
||||
edns.Hdr.Name = "." // must . be for edns
|
||||
edns.Hdr.Rrtype = TypeOPT
|
||||
// You can handle an OTP RR as any other, but there
|
||||
// are some convience functions
|
||||
edns.SetUDPSize(2048)
|
||||
edns.SetDo()
|
||||
edns.Option = make([]Option, 1)
|
||||
edns.SetNsid("") // Empty to request it
|
||||
|
||||
// ask something
|
||||
m.Question[0] = Question{"powerdns.nl", TypeDNSKEY, ClassINET}
|
||||
m.Extra = make([]RR, 1)
|
||||
m.Extra[0] = edns
|
||||
|
||||
in, _ := res.Query(m)
|
||||
if in != nil {
|
||||
if in.Rcode != RcodeSuccess {
|
||||
t.Logf("%v\n", in)
|
||||
t.Log("Failed to get an valid answer")
|
||||
t.Fail()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestResolverTsig(t *testing.T) {
|
||||
res := new(Resolver)
|
||||
res.Servers = []string{"127.0.0.1"}
|
||||
res.Timeout = 2
|
||||
res.Attempts = 1
|
||||
|
||||
m := new(Msg)
|
||||
m.MsgHdr.RecursionDesired = true //only set this bit
|
||||
m.Question = make([]Question, 1)
|
||||
|
||||
// ask something
|
||||
m.Question[0] = Question{"powerdns.nl", TypeDNSKEY, ClassINET}
|
||||
m.Extra = make([]RR, 1)
|
||||
m.Id = Id()
|
||||
|
||||
|
||||
tsig := new(Tsig)
|
||||
tsig.Name = "miek.nl."
|
||||
tsig.Algorithm = HmacMD5
|
||||
tsig.Fudge = 300
|
||||
tsig.TimeSigned = uint64(time.Seconds())
|
||||
tsig.Secret = "ZGZqc2tmZAo="
|
||||
|
||||
in, _ := res.QueryTsig(m,tsig)
|
||||
if in != nil {
|
||||
if in.Rcode != RcodeSuccess {
|
||||
t.Logf("%v\n", in)
|
||||
t.Log("Failed to get an valid answer")
|
||||
// t.Fail()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestAXFR(t *testing.T) {
|
||||
res := new(Resolver)
|
||||
res.Servers = []string{"127.0.0.1"}
|
||||
m := new(Msg)
|
||||
m.Question = make([]Question, 1)
|
||||
m.Question[0] = Question{"miek.nl", TypeAXFR, ClassINET}
|
||||
|
||||
ch := make(chan Xfr)
|
||||
go res.Xfr(m, ch)
|
||||
for x := range ch {
|
||||
var _ = x
|
||||
/* fmt.Printf("%v\n",dm.Dns) */
|
||||
}
|
||||
/* channel is closed by Axfr() */
|
||||
}
|
||||
|
||||
func TestFromFile(t *testing.T) {
|
||||
res := new(Resolver)
|
||||
res.FromFile("/etc/resolv.conf")
|
||||
m := new(Msg)
|
||||
m.Question = make([]Question, 1)
|
||||
m.Question[0] = Question{"a.miek.nl", TypeA, ClassINET}
|
||||
|
||||
in, _ := res.Query(m)
|
||||
if in != nil {
|
||||
if in.Rcode != RcodeSuccess {
|
||||
t.Log("Failed to get an valid answer")
|
||||
t.Fail()
|
||||
}
|
||||
}
|
||||
}
|
125
server_test.go
125
server_test.go
|
@ -1,125 +0,0 @@
|
|||
package dns
|
||||
|
||||
import (
|
||||
"testing"
|
||||
"time"
|
||||
)
|
||||
|
||||
func createpkg(id uint16, tcp bool) *Msg {
|
||||
m := new(Msg)
|
||||
m.MsgHdr.Id = id
|
||||
m.MsgHdr.Authoritative = true
|
||||
m.MsgHdr.AuthenticatedData = false
|
||||
m.MsgHdr.RecursionAvailable = true
|
||||
m.MsgHdr.Response = true
|
||||
m.MsgHdr.Opcode = OpcodeQuery
|
||||
m.MsgHdr.Rcode = RcodeSuccess
|
||||
m.Question = make([]Question, 1)
|
||||
m.Question[0] = Question{"miek.nl.", TypeTXT, ClassINET}
|
||||
m.Answer = make([]RR, 1)
|
||||
t := new(RR_TXT)
|
||||
t.Hdr = RR_Header{Name: "miek.nl.", Rrtype: TypeTXT, Class: ClassINET, Ttl: 3600}
|
||||
if tcp {
|
||||
t.Txt = "Dit is iets anders TCP"
|
||||
} else {
|
||||
t.Txt = "Dit is iets anders UDP"
|
||||
}
|
||||
m.Answer[0] = t
|
||||
return m
|
||||
}
|
||||
|
||||
func handle(c *Conn, in *Msg) {
|
||||
if in.MsgHdr.Response == true {
|
||||
return
|
||||
}
|
||||
out := createpkg(in.MsgHdr.Id, true)
|
||||
c.WriteMsg(out)
|
||||
}
|
||||
|
||||
func TestResponder(t *testing.T) {
|
||||
// ListenAndServeTCP("127.0.0.1:8053", replyTCP)
|
||||
time.Sleep(2 * 1e9)
|
||||
}
|
||||
|
||||
/*
|
||||
type servtsig Server
|
||||
|
||||
func createpkgtsig(id uint16, tcp bool, remove net.Addr) []byte {
|
||||
m := new(Msg)
|
||||
m.MsgHdr.Id = id
|
||||
m.MsgHdr.Authoritative = true
|
||||
m.MsgHdr.AuthenticatedData = false
|
||||
m.MsgHdr.RecursionAvailable = true
|
||||
m.MsgHdr.Response = true
|
||||
m.MsgHdr.Opcode = OpcodeQuery
|
||||
m.MsgHdr.Rcode = RcodeSuccess
|
||||
m.Question = make([]Question, 1)
|
||||
m.Question[0] = Question{"miek.nl.", TypeTXT, ClassINET}
|
||||
m.Answer = make([]RR, 1)
|
||||
t := new(RR_TXT)
|
||||
t.Hdr = RR_Header{Name: "miek.nl.", Rrtype: TypeTXT, Class: ClassINET, Ttl: 3600}
|
||||
if tcp {
|
||||
t.Txt = "Dit is iets anders TCP"
|
||||
} else {
|
||||
t.Txt = "Dit is iets anders UDP"
|
||||
}
|
||||
m.Answer[0] = t
|
||||
out, _ := m.Pack()
|
||||
return out
|
||||
}
|
||||
|
||||
func (s *servtsig) ResponderUDP(c *net.UDPConn, a net.Addr, in []byte) {
|
||||
inmsg := new(Msg)
|
||||
inmsg.Unpack(in)
|
||||
fmt.Printf("%v\n", inmsg)
|
||||
if inmsg.MsgHdr.Response == true {
|
||||
// Uh... answering to an response??
|
||||
// dont think so
|
||||
return
|
||||
}
|
||||
rr := inmsg.Extra[len(inmsg.Extra)-1]
|
||||
switch t := rr.(type) {
|
||||
case *RR_TSIG:
|
||||
v := t.Verify(inmsg, "awwLOtRfpGE+rRKF2+DEiw==")
|
||||
println(v)
|
||||
}
|
||||
|
||||
|
||||
out := createpkgtsig(inmsg.MsgHdr.Id, false, a)
|
||||
SendUDP(out, c, a)
|
||||
// Meta.QLen/RLen/QueryStart/QueryEnd can be filled in at
|
||||
// this point for logging purposses or anything else
|
||||
}
|
||||
|
||||
func (s *servtsig) ResponderTCP(c *net.TCPConn, in []byte) {
|
||||
inmsg := new(Msg)
|
||||
inmsg.Unpack(in)
|
||||
if inmsg.MsgHdr.Response == true {
|
||||
// Uh... answering to an response??
|
||||
// dont think so
|
||||
return
|
||||
}
|
||||
out := createpkgtsig(inmsg.MsgHdr.Id, true, c.RemoteAddr())
|
||||
SendTCP(out, c)
|
||||
}
|
||||
|
||||
func TestResponderTsig(t *testing.T) {
|
||||
su := new(Server)
|
||||
su.Address = "127.0.0.1"
|
||||
su.Port = "8053"
|
||||
var us *servtsig
|
||||
uch := make(chan os.Error)
|
||||
go su.NewResponder(us, uch)
|
||||
|
||||
st := new(Server)
|
||||
st.Address = "127.0.0.1"
|
||||
st.Port = "8053"
|
||||
st.Tcp = true
|
||||
var ts *servtsig
|
||||
tch := make(chan os.Error)
|
||||
go st.NewResponder(ts, tch)
|
||||
time.Sleep(1 * 1e9)
|
||||
uch <- nil
|
||||
tch <- nil
|
||||
}
|
||||
*/
|
Loading…
Reference in New Issue