]> git.ipfire.org Git - thirdparty/knot-resolver.git/commitdiff
zonefile.lua: support comments and string input
authorVladimír Čunát <vladimir.cunat@nic.cz>
Tue, 14 Feb 2017 15:13:23 +0000 (16:13 +0100)
committerVladimír Čunát <vladimir.cunat@nic.cz>
Mon, 27 Feb 2017 10:14:07 +0000 (11:14 +0100)
Comment parsing will only be supported in future libzscanner version.
Also move out of the module, as trust_anchors.lua requires it and isn't
in a module.

daemon/daemon.mk
daemon/lua/kres.lua
daemon/lua/zonefile.lua.in [moved from modules/policy/zonefile.lua with 83% similarity]
modules/policy/policy.mk

index 23a219480d79032da2b2b54c3bdd417ce62b3177..3b4a678c61f2225f462bd39a7f18490582396046 100644 (file)
@@ -9,7 +9,8 @@ kresd_SOURCES := \
        daemon/tls_ephemeral_credentials.c \
        daemon/main.c
 
-kresd_DIST := daemon/lua/kres.lua daemon/lua/kres-gen.lua daemon/lua/trust_anchors.lua
+kresd_DIST := daemon/lua/kres.lua daemon/lua/kres-gen.lua \
+              daemon/lua/trust_anchors.lua daemon/lua/zonefile.lua
 
 # Embedded resources
 %.inc: %.lua
@@ -56,6 +57,11 @@ daemon-clean: kresd-clean
 daemon/lua/trust_anchors.lua: daemon/lua/trust_anchors.lua.in
        @$(call quiet,SED,$<) -e "s|@ETCDIR@|$(ETCDIR)|g" $< > $@
 
+LIBZSCANNER_COMMENTS := \
+       $(shell pkg-config libzscanner --atleast-version=2.4.2 && echo true || echo false)
+daemon/lua/zonefile.lua: daemon/lua/zonefile.lua.in
+       @$(call quiet,SED,$<) -e "s|@LIBZSCANNER_COMMENTS@|$(LIBZSCANNER_COMMENTS)|g" $< > $@
+
 daemon/lua/kres-gen.lua: | $(libkres)
        @echo "WARNING: regenerating $@"
        daemon/lua/kres-gen.sh > $@
index db4b549837902f6b163499dc6b32fee8f85ac2c1..e67731582b565ad3ddcd6ff73c3ffdf265ea14cb 100644 (file)
@@ -281,8 +281,10 @@ local function rr2str(rr)
                end))
        end
        local rdata = hex_encode(rr.rdata)
-       return string.format('%s %d IN TYPE%d \\# %d %s',
+       res = string.format('%s %d IN TYPE%d \\# %d %s',
                dname2str(rr.owner), rr.ttl, rr.type, #rr.rdata, rdata)
+       if rr.comment then res = res .. ';' .. rr.comment end
+       return res
 end
 
 -- Module API
similarity index 83%
rename from modules/policy/zonefile.lua
rename to daemon/lua/zonefile.lua.in
index bf6d1463e8d2db73e4e1fae1ed596fa098bcc794..89b783f865b16d4ffecd0af90478b5f7ca7d3329 100644 (file)
@@ -156,22 +156,35 @@ ffi.metatype( zs_scanner_t, {
                end,
                current_rr = function(zs)
                        assert(ffi.istype(zs, zs_scanner_t))
-                       return {owner = ffi.string(zs.r_owner, zs.r_owner_length),
-                               ttl = tonumber(zs.r_ttl),
-                               class = tonumber(zs.r_class),
-                               type = tonumber(zs.r_type), 
-                               rdata = ffi.string(zs.r_data, zs.r_data_length)}
+                       return {
+                               owner = ffi.string(zs.r_owner, zs.r_owner_length),
+                               ttl = tonumber(zs.r_ttl),
+                               class = tonumber(zs.r_class),
+                               type = tonumber(zs.r_type),
+                               rdata = ffi.string(zs.r_data, zs.r_data_length),
+                               comment = zs:current_comment(),
+                       }
                end,
                strerr = function(zs)
                        assert(ffi.istype(zs, zs_scanner_t))
                        return ffi.string(libzscanner.zs_strerror(zs.error.code))
                end,
+               current_comment = function(zs)
+                       if not @LIBZSCANNER_COMMENTS@ then return nil end -- support in libzscanner
+                       if zs.buffer_length > 0 then
+                               return ffi.string(zs.buffer, zs.buffer_length - 1)
+                       else
+                               return nil
+                       end
+               end
        },
 })
 
 -- Module API
 local rrparser = {
        new = zs_scanner_t,
+
+       -- Parse a file into a list of RRs
        file = function (path)
                local zs = zs_scanner_t()
                local ok, err = zs:open(path)
@@ -184,6 +197,20 @@ local rrparser = {
                end
                return results
        end,
+
+       -- Parse a string into a list of RRs.
+       string = function (input)
+               local zs = zs_scanner_t()
+               local results = {}
+               local ok = zs:parse(input .. '\n') -- avoid problems with strings without newlines
+                                                                                  -- TODO: it's OK since libzscanner-2.4.2
+               while ok do
+                       table.insert(results, zs:current_rr())
+                       ok = zs:parse()
+               end
+               return results
+       end,
+
        state = zs_state,
 }
 return rrparser
index 63ca42848bca40f188153f38f9c7b6ad139c1e67..f859ac9701d71dffc607e99c963e64a29d39d9d2 100644 (file)
@@ -1,2 +1,2 @@
-policy_SOURCES := policy.lua aho-corasick.lua zonefile.lua
+policy_SOURCES := policy.lua aho-corasick.lua
 $(call make_lua_module,policy)