]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
dnsdist: Add 'spoof' and 'spoofRaw' Lua bindings
authorRemi Gacogne <remi.gacogne@powerdns.com>
Tue, 9 Feb 2021 13:50:23 +0000 (14:50 +0100)
committerRemi Gacogne <remi.gacogne@powerdns.com>
Tue, 9 Feb 2021 13:50:23 +0000 (14:50 +0100)
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.

pdns/dnsdist-lua-bindings-dnsquestion.cc
pdns/dnsdistdist/test-dnsdistlbpolicies_cc.cc

index 2a254ccd4f5e265af6877891c5d47788bb01f3c1..ceb04e6b7793d1aa24b1c4aa7adecf00f687929d 100644 (file)
@@ -151,6 +151,30 @@ void setupLuaBindingsDNSQuestion(LuaContext& luaCtx)
     return result;
   });
 
+  luaCtx.registerFunction<void(DNSQuestion::*)(const std::vector<std::pair<int, ComboAddress>>& responses)>("spoof", [](DNSQuestion& dq, const std::vector<std::pair<int, ComboAddress>>& responses) {
+    std::vector<ComboAddress> 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<void(DNSQuestion::*)(const std::vector<std::pair<int, std::string>>& responses)>("spoofRaw", [](DNSQuestion& dq, const std::vector<std::pair<int, std::string>>& responses) {
+    std::vector<std::string> 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<const ComboAddress (DNSResponse::*)>("localaddr", [](const DNSResponse& dq) -> const ComboAddress { return *dq.local; }, [](DNSResponse& dq, const ComboAddress newLocal) { (void) newLocal; });
   luaCtx.registerMember<const DNSName (DNSResponse::*)>("qname", [](const DNSResponse& dq) -> const DNSName { return *dq.qname; }, [](DNSResponse& dq, const DNSName newName) { (void) newName; });
index ca17ca8e458fa20add410b245428c4d589141b75..028b30c91c0d8eb2819d768fc554f4315f9b844d 100644 (file)
@@ -5,6 +5,7 @@
 #include <boost/test/unit_test.hpp>
 
 #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)