From: Remi Gacogne Date: Tue, 9 Feb 2021 13:50:23 +0000 (+0100) Subject: dnsdist: Add 'spoof' and 'spoofRaw' Lua bindings X-Git-Tag: dnsdist-1.6.0-alpha2~43^2~2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=2be05607c1d8b1263a81739a6c1e87b188eb3353;p=thirdparty%2Fpdns.git dnsdist: Add 'spoof' and 'spoofRaw' Lua bindings This commits makes it possible to spoof multiple values from Lua: ``` function myfunc(dq) local ret = { newCA("192.0.2.1"), newCA("192.0.2.2") } dq:spoof(ret) return DNSAction.HeaderModify end addAction(AllRule(), LuaAction(myfunc)) ``` Barely tested, need tests and documentation. --- diff --git a/pdns/dnsdist-lua-bindings-dnsquestion.cc b/pdns/dnsdist-lua-bindings-dnsquestion.cc index 2a254ccd4f..ceb04e6b77 100644 --- a/pdns/dnsdist-lua-bindings-dnsquestion.cc +++ b/pdns/dnsdist-lua-bindings-dnsquestion.cc @@ -151,6 +151,30 @@ void setupLuaBindingsDNSQuestion(LuaContext& luaCtx) return result; }); + luaCtx.registerFunction>& responses)>("spoof", [](DNSQuestion& dq, const std::vector>& responses) { + std::vector cas; + cas.reserve(responses.size()); + for (const auto& addr : responses) { + cas.push_back(addr.second); + } + + std::string result; + SpoofAction sa(cas); + sa(&dq, &result); + }); + + luaCtx.registerFunction>& responses)>("spoofRaw", [](DNSQuestion& dq, const std::vector>& responses) { + std::vector data; + data.reserve(responses.size()); + for (const auto& resp : responses) { + data.push_back(resp.second); + } + + std::string result; + SpoofAction sa(data); + sa(&dq, &result); + }); + /* LuaWrapper doesn't support inheritance */ luaCtx.registerMember("localaddr", [](const DNSResponse& dq) -> const ComboAddress { return *dq.local; }, [](DNSResponse& dq, const ComboAddress newLocal) { (void) newLocal; }); luaCtx.registerMember("qname", [](const DNSResponse& dq) -> const DNSName { return *dq.qname; }, [](DNSResponse& dq, const DNSName newName) { (void) newName; }); diff --git a/pdns/dnsdistdist/test-dnsdistlbpolicies_cc.cc b/pdns/dnsdistdist/test-dnsdistlbpolicies_cc.cc index ca17ca8e45..028b30c91c 100644 --- a/pdns/dnsdistdist/test-dnsdistlbpolicies_cc.cc +++ b/pdns/dnsdistdist/test-dnsdistlbpolicies_cc.cc @@ -5,6 +5,7 @@ #include #include "dnsdist.hh" +#include "dnsdist-lua.hh" #include "dnsdist-lua-ffi.hh" #include "dolog.hh" @@ -83,6 +84,11 @@ void setLuaNoSideEffect() { } +DNSAction::Action SpoofAction::operator()(DNSQuestion* dq, std::string* ruleresult) const +{ + return DNSAction::Action::None; +} + string g_outputBuffer; static DNSQuestion getDQ(const DNSName* providedName = nullptr)