From: Vladimír Čunát Date: Tue, 14 Feb 2017 15:13:23 +0000 (+0100) Subject: zonefile.lua: support comments and string input X-Git-Tag: v1.3.0~23^2~69^2~1 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=260c79e91b9dc11b0b55e017bb52cbde14db96f0;p=thirdparty%2Fknot-resolver.git zonefile.lua: support comments and string input 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. --- diff --git a/daemon/daemon.mk b/daemon/daemon.mk index 23a219480..3b4a678c6 100644 --- a/daemon/daemon.mk +++ b/daemon/daemon.mk @@ -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 > $@ diff --git a/daemon/lua/kres.lua b/daemon/lua/kres.lua index db4b54983..e67731582 100644 --- a/daemon/lua/kres.lua +++ b/daemon/lua/kres.lua @@ -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 diff --git a/modules/policy/zonefile.lua b/daemon/lua/zonefile.lua.in similarity index 83% rename from modules/policy/zonefile.lua rename to daemon/lua/zonefile.lua.in index bf6d1463e..89b783f86 100644 --- a/modules/policy/zonefile.lua +++ b/daemon/lua/zonefile.lua.in @@ -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 diff --git a/modules/policy/policy.mk b/modules/policy/policy.mk index 63ca42848..f859ac970 100644 --- a/modules/policy/policy.mk +++ b/modules/policy/policy.mk @@ -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)