From 35a1e137e2e0dfedff78acb3ab8a632bb82227bf Mon Sep 17 00:00:00 2001 From: Miek Gieben Date: Thu, 15 Dec 2011 22:40:07 +0100 Subject: [PATCH] More parsing fixes --- dns.go | 2 +- parse_test.go | 32 +++++++++++++++++++------------- zscan.go | 32 ++++++++++++++++++++------------ zscan_rr.go | 1 - 4 files changed, 40 insertions(+), 27 deletions(-) diff --git a/dns.go b/dns.go index 2e136a67..ee6c1260 100644 --- a/dns.go +++ b/dns.go @@ -17,7 +17,7 @@ // // 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, // TSIG, EDNS0, dynamic updates, notifies and DNSSEC validation/signing. diff --git a/parse_test.go b/parse_test.go index c4e1b85b..38edb64b 100644 --- a/parse_test.go +++ b/parse_test.go @@ -98,26 +98,32 @@ func TestDotInName(t *testing.T) { // Make this a decend test case. For now, good enough func TestParse(t *testing.T) { 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 MX 10 elektron.atoom.net.\n": "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. A 127.0.0.1": "miek.nl.\t0\tCLASS0\tA\t127.0.0.1", -// "miek.nl. IN AAAA ::1": "miek.nl.\t0\tIN\tAAAA\t::1", -// "miek.nl. IN A 127.0.0.1": "miek.nl.\t0\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. 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.": "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. A 127.0.0.1": "miek.nl.\t3600\tIN\tA\t127.0.0.1", + "miek.nl. IN AAAA ::1": "miek.nl.\t3600\tIN\tAAAA\t::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.\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", -// "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 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. 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 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 { rr, _ := NewRR(i) - if rr != nil && rr.String() != o { - t.Logf("\"%s\" should be equal to\n\"%s\"\n", i, o) - t.Fail() - } else { + if rr == nil { t.Log("Failed to parse RR") 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()) + } } } diff --git a/zscan.go b/zscan.go index 8ac225a5..9b6d4a29 100644 --- a/zscan.go +++ b/zscan.go @@ -15,7 +15,7 @@ import ( // * Handle comments: ; // * Handle braces. const ( - // Zonefile + // Zonefile _EOF = iota // Don't let it start with zero _STRING _BLANK @@ -24,9 +24,9 @@ const ( _OWNER _CLASS - // Privatekey file - _VALUE - _KEY + // Privatekey file + _VALUE + _KEY _EXPECT_OWNER // Ownername _EXPECT_OWNER_BL // Whitespace after the ownername @@ -41,7 +41,7 @@ const ( ) // Only used when debugging the parser itself. -var DEBUG = true +var DEBUG = false type ParseError struct { err string @@ -55,18 +55,24 @@ func (e *ParseError) Error() string { } type Lex struct { - token string // text of the token - value int // value: _STRING, _BLANK, etc. - line int // line in the file - column int // column in the fil + token string // text of the token + value int // value: _STRING, _BLANK, etc. + line int // line in the file + column int // column in the fil } // 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 -// 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) { 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 return r, nil // Todo: errors } @@ -99,6 +105,9 @@ func ParseZone(r io.Reader, cr chan RR) { } switch st { case _EXPECT_OWNER: + // Set the defaults here + h.Ttl = DefaultTtl + h.Class = ClassINET switch l.value { case _NEWLINE: // Empty line st = _EXPECT_OWNER @@ -118,7 +127,6 @@ func ParseZone(r io.Reader, cr chan RR) { switch l.value { case _RRTYPE: h.Rrtype, _ = Str_rr[strings.ToUpper(l.token)] - h.Ttl = DefaultTtl st = _EXPECT_RDATA case _CLASS: h.Class, ok = Str_class[strings.ToUpper(l.token)] diff --git a/zscan_rr.go b/zscan_rr.go index ae2b2778..14e00468 100644 --- a/zscan_rr.go +++ b/zscan_rr.go @@ -112,7 +112,6 @@ func setA(h RR_Header, c chan Lex) (RR, error) { l := <-c rr.A = net.ParseIP(l.token) - println(l.token) if rr.A == nil { return nil, &ParseError{"bad A", l} }