On 19/02/2023 20.04, Blažej Krajňák wrote:
local msg = '1 resolver.example. alpn=dot
ipv4hint=192.0.2.1
ipv6hint=2001:db8::1'
answer:put(qry.sname, 900, answer:qclass(), kres.type.SVCB,
string.char(#msg) .. msg)
This part won't construct correct wire format for SVCB.
I think this example should work:
-- Parse RDATA, from presentation to wire-format.
-- in: a string or table of strings, each a line describing RRTYPE+RDATA
-- out: a table of RDATA strings in wire-format
function parse_rdata(strs, nothing)
local zonefile = require('zonefile')
if nothing ~= nil then -- accidents like forgetting braces
error('one string or table of strings is accepted', 2)
end
if type(strs) ~= 'table' then strs = { strs } end -- TODO: allow this case?
local res = {}
for _, line in ipairs(strs) do
if type(line) ~= 'string' then
error('one string or table of strings is accepted', 2)
end
local rrs = zonefile.string('. ' .. line)
if #rrs == 0 then error('failed to parse line: ' .. line, 2) end
for _, rr in ipairs(rrs) do
table.insert(res, rr.rdata)
end
end
return res
end
svcb_str = {
'SVCB 1
dns.quad9.net. alpn=dot port=853 ipv4hint=9.9.9.9,149.112.112.112
ipv6hint=2620:fe::fe',
'SVCB 2
dns.quad9.net. mandatory=key65380 alpn=h2 port=443
ipv4hint=9.9.9.9,149.112.112.112 ipv6hint=2620:fe::fe
key65380="/dns-query{?dns}"',
}
policy.add(
policy.suffix(
policy.ANSWER({ [kres.type.SVCB] = { rdata=parse_rdata(svcb_str), ttl=300 } },
true),
{ todname('_dns.resolver.arpa') }))