From 5ce1d5dd69ed9bfff2894f191b7b5f282b37beb2 Mon Sep 17 00:00:00 2001 From: Mubashshir Date: Mon, 4 Apr 2022 00:17:47 +0600 Subject: [PATCH] lexers: Add BIND DNS Zone lexer Closes #623 Signed-off-by: Mubashshir --- lexers/dns.go | 17 +++++++ lexers/embedded/dns.xml | 42 ++++++++++++++++ lexers/testdata/dns.actual | 19 +++++++ lexers/testdata/dns.expected | 98 ++++++++++++++++++++++++++++++++++++ 4 files changed, 176 insertions(+) create mode 100644 lexers/dns.go create mode 100644 lexers/embedded/dns.xml create mode 100644 lexers/testdata/dns.actual create mode 100644 lexers/testdata/dns.expected diff --git a/lexers/dns.go b/lexers/dns.go new file mode 100644 index 000000000..7e699622a --- /dev/null +++ b/lexers/dns.go @@ -0,0 +1,17 @@ +package lexers + +import ( + "regexp" +) + +// TODO(moorereason): can this be factored away? +var zoneAnalyserRe = regexp.MustCompile(`(?m)^@\s+IN\s+SOA\s+`) + +func init() { // nolint: gochecknoinits + Get("dns").SetAnalyser(func(text string) float32 { + if zoneAnalyserRe.FindString(text) != "" { + return 1.0 + } + return 0.0 + }) +} diff --git a/lexers/embedded/dns.xml b/lexers/embedded/dns.xml new file mode 100644 index 000000000..2a854e57f --- /dev/null +++ b/lexers/embedded/dns.xml @@ -0,0 +1,42 @@ + + + + dns + zone + bind + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lexers/testdata/dns.actual b/lexers/testdata/dns.actual new file mode 100644 index 000000000..b9fe55815 --- /dev/null +++ b/lexers/testdata/dns.actual @@ -0,0 +1,19 @@ +; /etc/bind/zones/example.org +$TTL 3h; +@ IN SOA ns.example.org. example.org. ( + 1 ; serial + 3h; refresh timeout + 1h; retry timeout + 1w; expire timeout + 1h; negative caching TTL +) +@ IN NS ns.example.org. ; name server +@ IN MX 10 example.org. ; mail exchange server + +ns IN A 1.2.3.4 +@ IN A 1.2.3.4 + +ns IN AAAA ef::1 +@ IN AAAA ef::1 + +www IN CNAME example.org. diff --git a/lexers/testdata/dns.expected b/lexers/testdata/dns.expected new file mode 100644 index 000000000..9d1fa645d --- /dev/null +++ b/lexers/testdata/dns.expected @@ -0,0 +1,98 @@ +[ + {"type":"Comment","value":"; /etc/bind/zones/example.org"}, + {"type":"TextWhitespace","value":"\n"}, + {"type":"NameAttribute","value":"$TTL"}, + {"type":"TextWhitespace","value":" "}, + {"type":"LiteralStringChar","value":"3h"}, + {"type":"Comment","value":";"}, + {"type":"TextWhitespace","value":"\n"}, + {"type":"NameClass","value":"@"}, + {"type":"TextWhitespace","value":"\t"}, + {"type":"Keyword","value":"IN"}, + {"type":"TextWhitespace","value":"\t"}, + {"type":"Keyword","value":"SOA"}, + {"type":"TextWhitespace","value":"\t"}, + {"type":"NameProperty","value":"ns.example.org. example.org. "}, + {"type":"Punctuation","value":"("}, + {"type":"TextWhitespace","value":"\n\t"}, + {"type":"LiteralStringChar","value":"1"}, + {"type":"TextWhitespace","value":" "}, + {"type":"Comment","value":"; serial"}, + {"type":"TextWhitespace","value":"\n\t"}, + {"type":"LiteralStringChar","value":"3h"}, + {"type":"Comment","value":"; refresh timeout"}, + {"type":"TextWhitespace","value":"\n\t"}, + {"type":"LiteralStringChar","value":"1h"}, + {"type":"Comment","value":"; retry timeout"}, + {"type":"TextWhitespace","value":"\n\t"}, + {"type":"LiteralStringChar","value":"1w"}, + {"type":"Comment","value":"; expire timeout"}, + {"type":"TextWhitespace","value":"\n\t"}, + {"type":"LiteralStringChar","value":"1h"}, + {"type":"Comment","value":"; negative caching TTL"}, + {"type":"TextWhitespace","value":"\n"}, + {"type":"Punctuation","value":")"}, + {"type":"TextWhitespace","value":"\n"}, + {"type":"NameClass","value":"@"}, + {"type":"TextWhitespace","value":"\t"}, + {"type":"Keyword","value":"IN"}, + {"type":"TextWhitespace","value":"\t"}, + {"type":"Keyword","value":"NS"}, + {"type":"TextWhitespace","value":"\t\t"}, + {"type":"NameProperty","value":"ns.example.org. "}, + {"type":"TextWhitespace","value":" "}, + {"type":"Comment","value":"; name server"}, + {"type":"TextWhitespace","value":"\n"}, + {"type":"NameClass","value":"@"}, + {"type":"TextWhitespace","value":"\t"}, + {"type":"Keyword","value":"IN"}, + {"type":"TextWhitespace","value":"\t"}, + {"type":"Keyword","value":"MX"}, + {"type":"TextWhitespace","value":"\t"}, + {"type":"LiteralStringChar","value":"10"}, + {"type":"TextWhitespace","value":"\t"}, + {"type":"NameProperty","value":"example.org. "}, + {"type":"TextWhitespace","value":" "}, + {"type":"Comment","value":"; mail exchange server"}, + {"type":"TextWhitespace","value":"\n\n"}, + {"type":"NameClass","value":"ns"}, + {"type":"TextWhitespace","value":"\t"}, + {"type":"Keyword","value":"IN"}, + {"type":"TextWhitespace","value":"\t"}, + {"type":"Keyword","value":"A"}, + {"type":"TextWhitespace","value":"\t\t"}, + {"type":"LiteralNumberInteger","value":"1.2.3.4"}, + {"type":"TextWhitespace","value":"\n"}, + {"type":"NameClass","value":"@"}, + {"type":"TextWhitespace","value":"\t"}, + {"type":"Keyword","value":"IN"}, + {"type":"TextWhitespace","value":"\t"}, + {"type":"Keyword","value":"A"}, + {"type":"TextWhitespace","value":"\t\t"}, + {"type":"LiteralNumberInteger","value":"1.2.3.4"}, + {"type":"TextWhitespace","value":"\n\n"}, + {"type":"NameClass","value":"ns"}, + {"type":"TextWhitespace","value":"\t"}, + {"type":"Keyword","value":"IN"}, + {"type":"TextWhitespace","value":"\t"}, + {"type":"Keyword","value":"AAAA"}, + {"type":"TextWhitespace","value":"\t"}, + {"type":"LiteralNumberIntegerLong","value":"ef::1"}, + {"type":"TextWhitespace","value":"\n"}, + {"type":"NameClass","value":"@"}, + {"type":"TextWhitespace","value":"\t"}, + {"type":"Keyword","value":"IN"}, + {"type":"TextWhitespace","value":"\t"}, + {"type":"Keyword","value":"AAAA"}, + {"type":"TextWhitespace","value":"\t"}, + {"type":"LiteralNumberIntegerLong","value":"ef::1"}, + {"type":"TextWhitespace","value":"\n\n"}, + {"type":"NameClass","value":"www"}, + {"type":"TextWhitespace","value":"\t"}, + {"type":"Keyword","value":"IN"}, + {"type":"TextWhitespace","value":"\t"}, + {"type":"Keyword","value":"CNAME"}, + {"type":"TextWhitespace","value":"\t"}, + {"type":"NameProperty","value":"example.org."}, + {"type":"TextWhitespace","value":"\n"} +]