Parsing zone files - does not work (yet)
This commit is contained in:
parent
0742f1e75f
commit
7c716e66c0
6
Makefile
6
Makefile
|
@ -14,14 +14,16 @@ GOFILES=\
|
|||
dnssec.go\
|
||||
edns.go\
|
||||
keygen.go\
|
||||
kparse.go\
|
||||
msg.go\
|
||||
nsec3.go \
|
||||
server.go \
|
||||
tsig.go\
|
||||
types.go\
|
||||
zparse.go\
|
||||
kparse.go\
|
||||
xfr.go\
|
||||
zone.go\
|
||||
zparse.go\
|
||||
|
||||
|
||||
include $(GOROOT)/src/Make.pkg
|
||||
|
||||
|
|
|
@ -114,10 +114,11 @@ func (r *RR_DNSKEY) PrivateKeyString(p PrivateKey) (s string) {
|
|||
|
||||
// Do I want Read/SetString or both???
|
||||
func (k *RR_DNSKEY) Read(q io.Reader) os.Error {
|
||||
r, e := Zparse(q)
|
||||
if e != nil || r == nil {
|
||||
z, e := Zparse(q)
|
||||
if e != nil || z == nil {
|
||||
return e
|
||||
}
|
||||
r := z.Pop().(RR)
|
||||
if _, ok := r.(*RR_DNSKEY); !ok {
|
||||
panic("did not read a DNSKEY")
|
||||
}
|
||||
|
|
|
@ -131,11 +131,12 @@ func TestParse(t *testing.T) {
|
|||
"nlnetlabs.nl.\t3175\tIN\tDNSKEY\t256 3 8 AwEAAdR7XR95OaAN9Rz7TbtPalQ9guQk7zfxTHYNKhsiwTZA9z+F16nD0VeBlk7dNik3ETpT2GLAwr9sntG898JwurCDe353wHPvjZtMCdiTVp3cRCrjuCEvoFpmZNN82H0gaH/4v8mkv/QBDAkDSncYjz/FqHKAeYy3cMcjY6RyVweh",
|
||||
}
|
||||
for test, result := range tests {
|
||||
r, err := Zparse(strings.NewReader(test))
|
||||
if err != nil || r == nil{
|
||||
z, err := Zparse(strings.NewReader(test))
|
||||
if err != nil || z == nil{
|
||||
t.Logf("Error of nil r %v %s\n", err, test)
|
||||
t.Fail()
|
||||
}
|
||||
r := z.Pop().(RR)
|
||||
if r.String() != result {
|
||||
t.Logf("\"%s\" should be equal to\n\"%s\"\n", r, result)
|
||||
t.Fail()
|
||||
|
|
6
types.go
6
types.go
|
@ -7,9 +7,9 @@ package dns
|
|||
|
||||
import (
|
||||
"net"
|
||||
"time"
|
||||
"strconv"
|
||||
"strings"
|
||||
"time"
|
||||
)
|
||||
|
||||
// Packet formats
|
||||
|
@ -954,11 +954,11 @@ func tsigTimeToDate(t uint64) string {
|
|||
|
||||
// Helper function for parsing from strings
|
||||
func parse(s string) RR {
|
||||
rr, err := Zparse(strings.NewReader(s))
|
||||
z, err := Zparse(strings.NewReader(s))
|
||||
if err != nil {
|
||||
return nil
|
||||
}
|
||||
return rr
|
||||
return z.Pop().(RR)
|
||||
}
|
||||
|
||||
// Map of constructors for each RR wire type.
|
||||
|
|
|
@ -0,0 +1,38 @@
|
|||
// 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.
|
||||
|
||||
// Implements a concept of zones. In its most basic form
|
||||
// a list of RRs.
|
||||
package dns
|
||||
|
||||
import (
|
||||
"container/vector"
|
||||
)
|
||||
|
||||
type Zone struct {
|
||||
v vector.Vector
|
||||
}
|
||||
|
||||
func (z *Zone) Push(r RR) {
|
||||
z.v.Push(r)
|
||||
}
|
||||
|
||||
func (z *Zone) Pop() RR {
|
||||
return z.v.Pop().(RR)
|
||||
}
|
||||
|
||||
func (z *Zone) At(i int) RR {
|
||||
return z.v.At(i).(RR)
|
||||
}
|
||||
|
||||
func (z *Zone) Len() int {
|
||||
return z.v.Len()
|
||||
}
|
||||
|
||||
func (z *Zone) String() string {
|
||||
for i:=0; i < z.Len(); i++ {
|
||||
println(z.At(i).String())
|
||||
}
|
||||
return ""
|
||||
}
|
23
zparse.rl
23
zparse.rl
|
@ -65,23 +65,24 @@ func (to *token) reset() {
|
|||
// All the NewReader stuff is expensive...
|
||||
// only works for short io.Readers as we put the whole thing
|
||||
// in a string -- needs to be extended for large files (sliding window).
|
||||
func Zparse(q io.Reader) (rr RR, err os.Error) {
|
||||
func Zparse(q io.Reader) (z *Zone, err os.Error) {
|
||||
buf := make([]byte, _IOBUF)
|
||||
n, err := q.Read(buf)
|
||||
if err != nil {
|
||||
println("RETURNING HERE\n")
|
||||
return nil, err
|
||||
}
|
||||
buf = buf[:n]
|
||||
z = new(Zone)
|
||||
|
||||
data := string(buf)
|
||||
cs, p, pe, eof := 0, 0, len(data), len(data)
|
||||
mark := 0
|
||||
hdr := new(RR_Header)
|
||||
tok := newToken()
|
||||
var rr RR
|
||||
|
||||
%%{
|
||||
# can't do comments yet
|
||||
# can't do comments yet TODO
|
||||
action mark { mark = p }
|
||||
action qname { hdr.Name = data[mark:p] }
|
||||
action qclass { hdr.Class = Str_class[data[mark:p]] }
|
||||
|
@ -90,6 +91,7 @@ func Zparse(q io.Reader) (rr RR, err os.Error) {
|
|||
action number { tok.pushInt(data[mark:p]) }
|
||||
action text { tok.pushString(data[mark:p]) }
|
||||
action textblank { tok.pushString(data[mark:p]) }
|
||||
action set { z.Push(rr); tok.reset(); println("setting") }
|
||||
|
||||
action qtype {
|
||||
i := Str_rr[data[mark:p]]
|
||||
|
@ -105,11 +107,12 @@ func Zparse(q io.Reader) (rr RR, err os.Error) {
|
|||
qclass = ('IN'i|'CS'i|'CH'i|'HS'i|'ANY'i|'NONE'i) %qclass;
|
||||
ttl = digit+ >mark;
|
||||
bl = [ \t]+ %mark;
|
||||
qname = [a-zA-Z0-9.\\_]+ %qname;
|
||||
qname = [\-a-zA-Z0-9.\\_]+ %qname;
|
||||
# If I use this in the definitions at the end, things break.
|
||||
# 6l seems to hang when compiling the resulting .go file...
|
||||
tb = [ a-zA-Z0-9.\\/+=:]+ $1 %0 %textblank;
|
||||
t = [a-zA-Z0-9.\\/+=:]+ $1 %0 %text;
|
||||
# tb is WITH the space
|
||||
tb = [\-a-zA-Z0-9.\\/+=: ]+ $1 %0 %textblank;
|
||||
t = [\-a-zA-Z0-9.\\/+=:]+ $1 %0 %text;
|
||||
n = [0-9]+ $1 %0 %number;
|
||||
comment = /^;/;
|
||||
|
||||
|
@ -132,7 +135,7 @@ func Zparse(q io.Reader) (rr RR, err os.Error) {
|
|||
| ('DS'i %qtype bl n bl n bl n bl t) %rdata_ds
|
||||
| ('DNSKEY'i %qtype bl n bl n bl n bl t) %rdata_dnskey
|
||||
| ('RRSIG'i %qtype bl n bl n bl n bl n bl n bl n bl n bl t bl t) %rdata_rrsig
|
||||
);
|
||||
) %set;
|
||||
|
||||
rr = lhs rhs;
|
||||
main := rr+;
|
||||
|
@ -145,11 +148,11 @@ func Zparse(q io.Reader) (rr RR, err os.Error) {
|
|||
// No clue what I'm doing what so ever
|
||||
if p == pe {
|
||||
println("unexpected eof")
|
||||
return rr, nil
|
||||
return z, nil
|
||||
} else {
|
||||
println("error at position ", p)
|
||||
return rr, nil
|
||||
return z, nil
|
||||
}
|
||||
}
|
||||
return rr, nil
|
||||
return z, nil
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue