]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
dnsdist: Print useful messages when query and response actions are mixed 5342/head
authorRemi Gacogne <remi.gacogne@powerdns.com>
Wed, 24 May 2017 08:10:45 +0000 (09:10 +0100)
committerRemi Gacogne <remi.gacogne@powerdns.com>
Wed, 24 May 2017 08:10:45 +0000 (09:10 +0100)
pdns/dnsdist-lua.cc
pdns/dnsdist-lua2.cc

index 47510a36271938f151e56efa4aec396574b66081..3f494f825f9768b283708872d6712202d892e822 100644 (file)
@@ -991,8 +991,13 @@ vector<std::function<void(void)>> setupLua(bool client, const std::string& confi
       return std::shared_ptr<DNSRule>(new RCodeRule(rcode));
     });
 
-  g_lua.writeFunction("addAction", [](luadnsrule_t var, std::shared_ptr<DNSAction> ea)
+  g_lua.writeFunction("addAction", [](luadnsrule_t var, boost::variant<std::shared_ptr<DNSAction>, std::shared_ptr<DNSResponseAction> > era)
                      {
+                        if (era.type() == typeid(std::shared_ptr<DNSResponseAction>)) {
+                          throw std::runtime_error("addAction() can only be called with query-related actions, not response-related ones. Are you looking for addResponseAction()?");
+                        }
+
+                        auto ea = *boost::get<std::shared_ptr<DNSAction>>(&era);
                         setLuaSideEffect();
                        auto rule=makeRule(var);
                        g_rulactions.modify([rule, ea](decltype(g_rulactions)::value_type& rulactions){
index 89276ec9b369020ec8fd04e0eaaa1b746a2a0f46..cd3cf50a9140a0c334e42be31cdc0c825d658dfd 100644 (file)
@@ -826,13 +826,19 @@ void moreLua(bool client)
 
     g_lua.registerFunction("getStats", &DNSAction::getStats);
 
-  g_lua.writeFunction("addResponseAction", [](luadnsrule_t var, std::shared_ptr<DNSResponseAction> ea) {
-      setLuaSideEffect();
-      auto rule=makeRule(var);
-      g_resprulactions.modify([rule, ea](decltype(g_resprulactions)::value_type& rulactions){
-          rulactions.push_back({rule, ea});
-        });
-    });
+    g_lua.writeFunction("addResponseAction", [](luadnsrule_t var, boost::variant<std::shared_ptr<DNSAction>, std::shared_ptr<DNSResponseAction> > era) {
+        if (era.type() == typeid(std::shared_ptr<DNSAction>)) {
+          throw std::runtime_error("addResponseAction() can only be called with response-related actions, not query-related ones. Are you looking for addAction()?");
+        }
+
+        auto ea = *boost::get<std::shared_ptr<DNSResponseAction>>(&era);
+
+        setLuaSideEffect();
+        auto rule=makeRule(var);
+        g_resprulactions.modify([rule, ea](decltype(g_resprulactions)::value_type& rulactions){
+            rulactions.push_back({rule, ea});
+          });
+      });
 
     g_lua.writeFunction("showResponseRules", []() {
         setLuaNoSideEffect();