More parsing fixes
This commit is contained in:
parent
f4329cce16
commit
35a1e137e2
2
dns.go
2
dns.go
|
@ -17,7 +17,7 @@
|
||||||
//
|
//
|
||||||
// Or directly from a string:
|
// Or directly from a string:
|
||||||
//
|
//
|
||||||
// mx := NewRRString("miek.nl IN MX 10 mx.miek.nl.")
|
// mx := NewRR("miek.nl. IN MX 10 mx.miek.nl.")
|
||||||
//
|
//
|
||||||
// The package dns supports (async) querying/replying, incoming/outgoing Axfr/Ixfr,
|
// The package dns supports (async) querying/replying, incoming/outgoing Axfr/Ixfr,
|
||||||
// TSIG, EDNS0, dynamic updates, notifies and DNSSEC validation/signing.
|
// TSIG, EDNS0, dynamic updates, notifies and DNSSEC validation/signing.
|
||||||
|
|
|
@ -98,26 +98,32 @@ func TestDotInName(t *testing.T) {
|
||||||
// Make this a decend test case. For now, good enough
|
// Make this a decend test case. For now, good enough
|
||||||
func TestParse(t *testing.T) {
|
func TestParse(t *testing.T) {
|
||||||
tests := map[string]string{
|
tests := map[string]string{
|
||||||
// "miek.nl. 3600 IN A 127.0.0.1": "miek.nl.\t3600\tIN\tA\t127.0.0.1",
|
"miek.nl. 3600 IN A 127.0.0.1": "miek.nl.\t3600\tIN\tA\t127.0.0.1",
|
||||||
"miek.nl. 3600 IN MX 10 elektron.atoom.net.\n": "miek.nl.\t3600\tIN\tMX\t10 elektron.atoom.net.",
|
"miek.nl. 3600 IN MX 10 elektron.atoom.net.": "miek.nl.\t3600\tIN\tMX\t10 elektron.atoom.net.",
|
||||||
// "miek.nl. IN 3600 A 127.0.0.1": "miek.nl.\t3600\tIN\tA\t127.0.0.1",
|
"miek.nl. IN 3600 A 127.0.0.1": "miek.nl.\t3600\tIN\tA\t127.0.0.1",
|
||||||
// "miek.nl. A 127.0.0.1": "miek.nl.\t0\tCLASS0\tA\t127.0.0.1",
|
"miek.nl. A 127.0.0.1": "miek.nl.\t3600\tIN\tA\t127.0.0.1",
|
||||||
// "miek.nl. IN AAAA ::1": "miek.nl.\t0\tIN\tAAAA\t::1",
|
"miek.nl. IN AAAA ::1": "miek.nl.\t3600\tIN\tAAAA\t::1",
|
||||||
// "miek.nl. IN A 127.0.0.1": "miek.nl.\t0\tIN\tA\t127.0.0.1",
|
"miek.nl. IN A 127.0.0.1": "miek.nl.\t3600\tIN\tA\t127.0.0.1",
|
||||||
// "miek.nl. IN DNSKEY 256 3 5 AwEAAb+8lGNCxJgLS8rYVer6EnHVuIkQDghdjdtewDzU3G5R7PbMbKVRvH2Ma7pQyYceoaqWZQirSj72euPWfPxQnMy9ucCylA+FuH9cSjIcPf4PqJfdupHk9X6EBYjxrCLY4p1/yBwgyBIRJtZtAqM3ceAH2WovEJD6rTtOuHo5AluJ": "miek.nl.\t0\tIN\tDNSKEY\t256 3 5 AwEAAb+8lGNCxJgLS8rYVer6EnHVuIkQDghdjdtewDzU3G5R7PbMbKVRvH2Ma7pQyYceoaqWZQirSj72euPWfPxQnMy9ucCylA+FuH9cSjIcPf4PqJfdupHk9X6EBYjxrCLY4p1/yBwgyBIRJtZtAqM3ceAH2WovEJD6rTtOuHo5AluJ",
|
"miek.nl. IN DNSKEY 256 3 5 AwEAAb+8lGNCxJgLS8rYVer6EnHVuIkQDghdjdtewDzU3G5R7PbMbKVRvH2Ma7pQyYceoaqWZQirSj72euPWfPxQnMy9ucCylA+FuH9cSjIcPf4PqJfdupHk9X6EBYjxrCLY4p1/yBwgyBIRJtZtAqM3ceAH2WovEJD6rTtOuHo5AluJ":
|
||||||
|
"miek.nl.\t3600\tIN\tDNSKEY\t256 3 5 AwEAAb+8lGNCxJgLS8rYVer6EnHVuIkQDghdjdtewDzU3G5R7PbMbKVRvH2Ma7pQyYceoaqWZQirSj72euPWfPxQnMy9ucCylA+FuH9cSjIcPf4PqJfdupHk9X6EBYjxrCLY4p1/yBwgyBIRJtZtAqM3ceAH2WovEJD6rTtOuHo5AluJ",
|
||||||
// "nlnetlabs.nl. 3175 IN DNSKEY 256 3 8 AwEAAdR7XR95OaAN9Rz7TbtPalQ9guQk7zfxTHYNKhsiwTZA9z+F16nD0VeBlk7dNik3ETpT2GLAwr9sntG898JwurCDe353wHPvjZtMCdiTVp3cRCrjuCEvoFpmZNN82H0gaH/4v8mkv/QBDAkDSncYjz/FqHKAeYy3cMcjY6RyVweh": "nlnetlabs.nl.\t3175\tIN\tDNSKEY\t256 3 8 AwEAAdR7XR95OaAN9Rz7TbtPalQ9guQk7zfxTHYNKhsiwTZA9z+F16nD0VeBlk7dNik3ETpT2GLAwr9sntG898JwurCDe353wHPvjZtMCdiTVp3cRCrjuCEvoFpmZNN82H0gaH/4v8mkv/QBDAkDSncYjz/FqHKAeYy3cMcjY6RyVweh",
|
// "nlnetlabs.nl. 3175 IN DNSKEY 256 3 8 AwEAAdR7XR95OaAN9Rz7TbtPalQ9guQk7zfxTHYNKhsiwTZA9z+F16nD0VeBlk7dNik3ETpT2GLAwr9sntG898JwurCDe353wHPvjZtMCdiTVp3cRCrjuCEvoFpmZNN82H0gaH/4v8mkv/QBDAkDSncYjz/FqHKAeYy3cMcjY6RyVweh": "nlnetlabs.nl.\t3175\tIN\tDNSKEY\t256 3 8 AwEAAdR7XR95OaAN9Rz7TbtPalQ9guQk7zfxTHYNKhsiwTZA9z+F16nD0VeBlk7dNik3ETpT2GLAwr9sntG898JwurCDe353wHPvjZtMCdiTVp3cRCrjuCEvoFpmZNN82H0gaH/4v8mkv/QBDAkDSncYjz/FqHKAeYy3cMcjY6RyVweh",
|
||||||
// "dnsex.nl. 86400 IN SOA elektron.atoom.net. miekg.atoom.net. 1299256910 14400 3600 604800 86400": "dnsex.nl.\t86400\tIN\tSOA\telektron.atoom.net. miekg.atoom.net. 1299256910 14400 3600 604800 86400",
|
"dnsex.nl. 86400 IN SOA elektron.atoom.net. miekg.atoom.net. 1299256910 14400 3600 604800 86400":
|
||||||
// "dnsex.nl. 86400 IN RRSIG SOA 8 2 86400 20110403154150 20110304154150 23334 dnsex.nl. QN6hwJQLEBqRVKmO2LgkuRSx9bkKIZxXlTVtHg5SaiN+8RCTckGtUXkQ vmZiBt3RdIWAjaabQYpEZHgvyjfy4Wwu/9RPDYnLt/qoyr4QKAdujchc m+fMDSbbcC7AN08i5D/dUWfNOHXjRJLY7t7AYB9DBt32LazIb0EU9QiW 5Cg=": "dnsex.nl.\t86400\tIN\tRRSIG\tSOA 8 2 86400 20110403154150 20110304154150 23334 dnsex.nl. QN6hwJQLEBqRVKmO2LgkuRSx9bkKIZxXlTVtHg5SaiN+8RCTckGtUXkQvmZiBt3RdIWAjaabQYpEZHgvyjfy4Wwu/9RPDYnLt/qoyr4QKAdujchcm+fMDSbbcC7AN08i5D/dUWfNOHXjRJLY7t7AYB9DBt32LazIb0EU9QiW5Cg=",
|
"dnsex.nl.\t86400\tIN\tSOA\telektron.atoom.net. miekg.atoom.net. 1299256910 14400 3600 604800 86400",
|
||||||
|
"dnsex.nl. 86400 IN RRSIG SOA 8 2 86400 20110403154150 20110304154150 23334 dnsex.nl. QN6hwJQLEBqRVKmO2LgkuRSx9bkKIZxXlTVtHg5SaiN+8RCTckGtUXkQ vmZiBt3RdIWAjaabQYpEZHgvyjfy4Wwu/9RPDYnLt/qoyr4QKAdujchc m+fMDSbbcC7AN08i5D/dUWfNOHXjRJLY7t7AYB9DBt32LazIb0EU9QiW 5Cg=":
|
||||||
|
"dnsex.nl.\t86400\tIN\tRRSIG\tSOA 8 2 86400 20110403154150 20110304154150 23334 dnsex.nl. QN6hwJQLEBqRVKmO2LgkuRSx9bkKIZxXlTVtHg5SaiN+8RCTckGtUXkQvmZiBt3RdIWAjaabQYpEZHgvyjfy4Wwu/9RPDYnLt/qoyr4QKAdujchcm+fMDSbbcC7AN08i5D/dUWfNOHXjRJLY7t7AYB9DBt32LazIb0EU9QiW5Cg=",
|
||||||
}
|
}
|
||||||
for i, o := range tests {
|
for i, o := range tests {
|
||||||
rr, _ := NewRR(i)
|
rr, _ := NewRR(i)
|
||||||
if rr != nil && rr.String() != o {
|
if rr == nil {
|
||||||
t.Logf("\"%s\" should be equal to\n\"%s\"\n", i, o)
|
|
||||||
t.Fail()
|
|
||||||
} else {
|
|
||||||
t.Log("Failed to parse RR")
|
t.Log("Failed to parse RR")
|
||||||
t.Fail()
|
t.Fail()
|
||||||
}
|
}
|
||||||
|
if rr.String() != o {
|
||||||
|
t.Logf("`%s' should be equal to\n`%s', but is `%s'\n", i, o, rr.String())
|
||||||
|
t.Fail()
|
||||||
|
} else {
|
||||||
|
t.Logf("RR is %s", rr.String())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
32
zscan.go
32
zscan.go
|
@ -15,7 +15,7 @@ import (
|
||||||
// * Handle comments: ;
|
// * Handle comments: ;
|
||||||
// * Handle braces.
|
// * Handle braces.
|
||||||
const (
|
const (
|
||||||
// Zonefile
|
// Zonefile
|
||||||
_EOF = iota // Don't let it start with zero
|
_EOF = iota // Don't let it start with zero
|
||||||
_STRING
|
_STRING
|
||||||
_BLANK
|
_BLANK
|
||||||
|
@ -24,9 +24,9 @@ const (
|
||||||
_OWNER
|
_OWNER
|
||||||
_CLASS
|
_CLASS
|
||||||
|
|
||||||
// Privatekey file
|
// Privatekey file
|
||||||
_VALUE
|
_VALUE
|
||||||
_KEY
|
_KEY
|
||||||
|
|
||||||
_EXPECT_OWNER // Ownername
|
_EXPECT_OWNER // Ownername
|
||||||
_EXPECT_OWNER_BL // Whitespace after the ownername
|
_EXPECT_OWNER_BL // Whitespace after the ownername
|
||||||
|
@ -41,7 +41,7 @@ const (
|
||||||
)
|
)
|
||||||
|
|
||||||
// Only used when debugging the parser itself.
|
// Only used when debugging the parser itself.
|
||||||
var DEBUG = true
|
var DEBUG = false
|
||||||
|
|
||||||
type ParseError struct {
|
type ParseError struct {
|
||||||
err string
|
err string
|
||||||
|
@ -55,18 +55,24 @@ func (e *ParseError) Error() string {
|
||||||
}
|
}
|
||||||
|
|
||||||
type Lex struct {
|
type Lex struct {
|
||||||
token string // text of the token
|
token string // text of the token
|
||||||
value int // value: _STRING, _BLANK, etc.
|
value int // value: _STRING, _BLANK, etc.
|
||||||
line int // line in the file
|
line int // line in the file
|
||||||
column int // column in the fil
|
column int // column in the fil
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewRR parses the string s and returns the RR contained in there. If the string
|
// NewRR parses the string s and returns the RR contained in there. If the string
|
||||||
// contains more than one RR, only the first is returned. If an error is detected
|
// contains more than one RR, only the first is returned. If an error is detected
|
||||||
// an error is returned. [TODO]
|
// an error is returned.
|
||||||
|
// If the class is not specified, the IN class is assumed. If the TTL is not
|
||||||
|
// specified DefaultTtl is assumed.
|
||||||
func NewRR(s string) (RR, error) {
|
func NewRR(s string) (RR, error) {
|
||||||
cr := make(chan RR)
|
cr := make(chan RR)
|
||||||
go ParseZone(strings.NewReader(s), cr)
|
if s[len(s)-1] != '\n' { // We need a closing newline
|
||||||
|
go ParseZone(strings.NewReader(s+"\n"), cr)
|
||||||
|
} else {
|
||||||
|
go ParseZone(strings.NewReader(s), cr)
|
||||||
|
}
|
||||||
r := <-cr // There are no error send as of yet
|
r := <-cr // There are no error send as of yet
|
||||||
return r, nil // Todo: errors
|
return r, nil // Todo: errors
|
||||||
}
|
}
|
||||||
|
@ -99,6 +105,9 @@ func ParseZone(r io.Reader, cr chan RR) {
|
||||||
}
|
}
|
||||||
switch st {
|
switch st {
|
||||||
case _EXPECT_OWNER:
|
case _EXPECT_OWNER:
|
||||||
|
// Set the defaults here
|
||||||
|
h.Ttl = DefaultTtl
|
||||||
|
h.Class = ClassINET
|
||||||
switch l.value {
|
switch l.value {
|
||||||
case _NEWLINE: // Empty line
|
case _NEWLINE: // Empty line
|
||||||
st = _EXPECT_OWNER
|
st = _EXPECT_OWNER
|
||||||
|
@ -118,7 +127,6 @@ func ParseZone(r io.Reader, cr chan RR) {
|
||||||
switch l.value {
|
switch l.value {
|
||||||
case _RRTYPE:
|
case _RRTYPE:
|
||||||
h.Rrtype, _ = Str_rr[strings.ToUpper(l.token)]
|
h.Rrtype, _ = Str_rr[strings.ToUpper(l.token)]
|
||||||
h.Ttl = DefaultTtl
|
|
||||||
st = _EXPECT_RDATA
|
st = _EXPECT_RDATA
|
||||||
case _CLASS:
|
case _CLASS:
|
||||||
h.Class, ok = Str_class[strings.ToUpper(l.token)]
|
h.Class, ok = Str_class[strings.ToUpper(l.token)]
|
||||||
|
|
|
@ -112,7 +112,6 @@ func setA(h RR_Header, c chan Lex) (RR, error) {
|
||||||
|
|
||||||
l := <-c
|
l := <-c
|
||||||
rr.A = net.ParseIP(l.token)
|
rr.A = net.ParseIP(l.token)
|
||||||
println(l.token)
|
|
||||||
if rr.A == nil {
|
if rr.A == nil {
|
||||||
return nil, &ParseError{"bad A", l}
|
return nil, &ParseError{"bad A", l}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue