Created
June 17, 2020 07:57
-
-
Save Habbie/fbe04da4aa5098b0930ef54f1abb725f to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff --git a/pdns/dnsdist-console.cc b/pdns/dnsdist-console.cc | |
index bb9d6998b..997d8ae7c 100644 | |
--- a/pdns/dnsdist-console.cc | |
+++ b/pdns/dnsdist-console.cc | |
@@ -419,7 +419,7 @@ const std::vector<ConsoleKeyword> g_consoleKeywords{ | |
{ "inClientStartup", true, "", "returns true during console client parsing of configuration" }, | |
{ "includeDirectory", true, "path", "include configuration files from `path`" }, | |
{ "KeyValueLookupKeyQName", true, "[wireFormat]", "Return a new KeyValueLookupKey object that, when passed to KeyValueStoreLookupAction or KeyValueStoreLookupRule, will return the qname of the query, either in wire format (default) or in plain text if 'wireFormat' is false" }, | |
- { "KeyValueLookupKeySourceIP", true, "", "Return a new KeyValueLookupKey object that, when passed to KeyValueStoreLookupAction or KeyValueStoreLookupRule, will return the source IP of the client in network byte-order." }, | |
+ { "KeyValueLookupKeySourceIP", true, "[v4Mask [,v6Mask]]", "Return a new KeyValueLookupKey object that, when passed to KeyValueStoreLookupAction or KeyValueStoreLookupRule, will return the (possibly bitmasked) source IP of the client in network byte-order." }, | |
{ "KeyValueLookupKeySuffix", true, "[minLabels [,wireFormat]]", "Return a new KeyValueLookupKey object that, when passed to KeyValueStoreLookupAction or KeyValueStoreLookupRule, will return a vector of keys based on the labels of the qname in DNS wire format or plain text" }, | |
{ "KeyValueLookupKeyTag", true, "tag", "Return a new KeyValueLookupKey object that, when passed to KeyValueStoreLookupAction or KeyValueStoreLookupRule, will return the value of the corresponding tag for this query, if it exists" }, | |
{ "KeyValueStoreLookupAction", true, "kvs, lookupKey, destinationTag", "does a lookup into the key value store referenced by 'kvs' using the key returned by 'lookupKey', and storing the result if any into the tag named 'destinationTag'" }, | |
diff --git a/pdns/dnsdistdist/dnsdist-kvs.hh b/pdns/dnsdistdist/dnsdist-kvs.hh | |
index 997de05a2..08f95e078 100644 | |
--- a/pdns/dnsdistdist/dnsdist-kvs.hh | |
+++ b/pdns/dnsdistdist/dnsdist-kvs.hh | |
@@ -36,6 +36,9 @@ public: | |
class KeyValueLookupKeySourceIP: public KeyValueLookupKey | |
{ | |
public: | |
+ KeyValueLookupKeySourceIP(size_t v4Mask, size_t v6Mask): d_v4mask(v4Mask), d_v6mask(v6Mask) | |
+ { | |
+ } | |
std::vector<std::string> getKeys(const ComboAddress& addr); | |
std::vector<std::string> getKeys(const DNSQuestion& dq) override | |
@@ -45,8 +48,10 @@ public: | |
std::string toString() const override | |
{ | |
- return "source IP"; | |
+ return "source IP (v4/v6 masked to "+std::to_string(d_v4mask)+"/"+std::to_string(d_v6mask)+" bits)"; | |
} | |
+private: | |
+ size_t d_v4mask, d_v6mask; | |
}; | |
class KeyValueLookupKeyQName: public KeyValueLookupKey | |
diff --git a/pdns/dnsdistdist/dnsdist-lua-bindings-kvs.cc b/pdns/dnsdistdist/dnsdist-lua-bindings-kvs.cc | |
index a026cfb11..d437ee5c4 100644 | |
--- a/pdns/dnsdistdist/dnsdist-lua-bindings-kvs.cc | |
+++ b/pdns/dnsdistdist/dnsdist-lua-bindings-kvs.cc | |
@@ -26,8 +26,8 @@ | |
void setupLuaBindingsKVS(bool client) | |
{ | |
/* Key Value Store objects */ | |
- g_lua.writeFunction("KeyValueLookupKeySourceIP", []() { | |
- return std::shared_ptr<KeyValueLookupKey>(new KeyValueLookupKeySourceIP()); | |
+ g_lua.writeFunction("KeyValueLookupKeySourceIP", [](boost::optional<size_t> v4Mask, boost::optional<size_t> v6Mask) { | |
+ return std::shared_ptr<KeyValueLookupKey>(new KeyValueLookupKeySourceIP(v4Mask.get_value_or(32), v6Mask.get_value_or(128))); | |
}); | |
g_lua.writeFunction("KeyValueLookupKeyQName", [](boost::optional<bool> wireFormat) { | |
return std::shared_ptr<KeyValueLookupKey>(new KeyValueLookupKeyQName(wireFormat ? *wireFormat : true)); | |
@@ -65,7 +65,7 @@ void setupLuaBindingsKVS(bool client) | |
if (keyVar.type() == typeid(ComboAddress)) { | |
const auto ca = boost::get<ComboAddress>(&keyVar); | |
- KeyValueLookupKeySourceIP lookup; | |
+ KeyValueLookupKeySourceIP lookup(32, 128); | |
for (const auto& key : lookup.getKeys(*ca)) { | |
if (kvs->getValue(key, result)) { | |
return result; | |
diff --git a/pdns/dnsdistdist/test-dnsdistkvs_cc.cc b/pdns/dnsdistdist/test-dnsdistkvs_cc.cc | |
index 41516d756..4887a96df 100644 | |
--- a/pdns/dnsdistdist/test-dnsdistkvs_cc.cc | |
+++ b/pdns/dnsdistdist/test-dnsdistkvs_cc.cc | |
@@ -11,7 +11,7 @@ static void doKVSChecks(std::unique_ptr<KeyValueStore>& kvs, const ComboAddress& | |
{ | |
/* source IP */ | |
{ | |
- auto lookupKey = make_unique<KeyValueLookupKeySourceIP>(); | |
+ auto lookupKey = make_unique<KeyValueLookupKeySourceIP>(32, 128); | |
std::string value; | |
/* local address is not in the db, remote is */ | |
BOOST_CHECK_EQUAL(kvs->getValue(std::string(reinterpret_cast<const char*>(&lc.sin4.sin_addr.s_addr), sizeof(lc.sin4.sin_addr.s_addr)), value), false); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment