From 7f29529f0bb83bd216f396447f45e4ecf6d454dc Mon Sep 17 00:00:00 2001 From: Remi Gacogne Date: Tue, 17 Sep 2019 10:52:50 +0200 Subject: [PATCH] dnsdist: Don't connect to remote logger in client/command mode --- pdns/dnsdist-lua-actions.cc | 24 +++++++++++-------- .../dnsdist-lua-bindings-protobuf.cc | 16 ++++++++++++- 2 files changed, 29 insertions(+), 11 deletions(-) diff --git a/pdns/dnsdist-lua-actions.cc b/pdns/dnsdist-lua-actions.cc index 3f7c3a638..4b9499340 100644 --- a/pdns/dnsdist-lua-actions.cc +++ b/pdns/dnsdist-lua-actions.cc @@ -1330,11 +1330,13 @@ void setupLuaActions() }); g_lua.writeFunction("RemoteLogAction", [](std::shared_ptr logger, boost::optional > alterFunc, boost::optional> vars) { - // avoids potentially-evaluated-expression warning with clang. - RemoteLoggerInterface& rl = *logger.get(); - if (typeid(rl) != typeid(RemoteLogger)) { - // We could let the user do what he wants, but wrapping PowerDNS Protobuf inside a FrameStream tagged as dnstap is logically wrong. - throw std::runtime_error(std::string("RemoteLogAction only takes RemoteLogger. For other types, please look at DnstapLogAction.")); + if (logger) { + // avoids potentially-evaluated-expression warning with clang. + RemoteLoggerInterface& rl = *logger.get(); + if (typeid(rl) != typeid(RemoteLogger)) { + // We could let the user do what he wants, but wrapping PowerDNS Protobuf inside a FrameStream tagged as dnstap is logically wrong. + throw std::runtime_error(std::string("RemoteLogAction only takes RemoteLogger. For other types, please look at DnstapLogAction.")); + } } std::string serverID; @@ -1356,11 +1358,13 @@ void setupLuaActions() }); g_lua.writeFunction("RemoteLogResponseAction", [](std::shared_ptr logger, boost::optional > alterFunc, boost::optional includeCNAME, boost::optional> vars) { - // avoids potentially-evaluated-expression warning with clang. - RemoteLoggerInterface& rl = *logger.get(); - if (typeid(rl) != typeid(RemoteLogger)) { - // We could let the user do what he wants, but wrapping PowerDNS Protobuf inside a FrameStream tagged as dnstap is logically wrong. - throw std::runtime_error("RemoteLogResponseAction only takes RemoteLogger. For other types, please look at DnstapLogResponseAction."); + if (logger) { + // avoids potentially-evaluated-expression warning with clang. + RemoteLoggerInterface& rl = *logger.get(); + if (typeid(rl) != typeid(RemoteLogger)) { + // We could let the user do what he wants, but wrapping PowerDNS Protobuf inside a FrameStream tagged as dnstap is logically wrong. + throw std::runtime_error("RemoteLogResponseAction only takes RemoteLogger. For other types, please look at DnstapLogResponseAction."); + } } std::string serverID; diff --git a/pdns/dnsdistdist/dnsdist-lua-bindings-protobuf.cc b/pdns/dnsdistdist/dnsdist-lua-bindings-protobuf.cc index ebc165fef..876c8124d 100644 --- a/pdns/dnsdistdist/dnsdist-lua-bindings-protobuf.cc +++ b/pdns/dnsdistdist/dnsdist-lua-bindings-protobuf.cc @@ -95,11 +95,17 @@ void setupLuaBindingsProtoBuf(bool client) /* RemoteLogger */ g_lua.writeFunction("newRemoteLogger", [client](const std::string& remote, boost::optional timeout, boost::optional maxQueuedEntries, boost::optional reconnectWaitTime) { + if (client) { + return std::shared_ptr(nullptr); + } return std::shared_ptr(new RemoteLogger(ComboAddress(remote), timeout ? *timeout : 2, maxQueuedEntries ? (*maxQueuedEntries*100) : 10000, reconnectWaitTime ? *reconnectWaitTime : 1, client)); }); g_lua.writeFunction("newFrameStreamUnixLogger", [client](const std::string& address) { #ifdef HAVE_FSTRM + if (client) { + return std::shared_ptr(nullptr); + } return std::shared_ptr(new FrameStreamLogger(AF_UNIX, address, !client)); #else throw std::runtime_error("fstrm support is required to build an AF_UNIX FrameStreamLogger"); @@ -108,11 +114,19 @@ void setupLuaBindingsProtoBuf(bool client) g_lua.writeFunction("newFrameStreamTcpLogger", [client](const std::string& address) { #if defined(HAVE_FSTRM) && defined(HAVE_FSTRM_TCP_WRITER_INIT) + if (client) { + return std::shared_ptr(nullptr); + } return std::shared_ptr(new FrameStreamLogger(AF_INET, address, !client)); #else throw std::runtime_error("fstrm with TCP support is required to build an AF_INET FrameStreamLogger"); #endif /* HAVE_FSTRM */ }); - g_lua.registerFunction("toString", &RemoteLoggerInterface::toString); + g_lua.registerFunction::*)()>("toString", [](const std::shared_ptr& logger) { + if (logger) { + return logger->toString(); + } + return std::string(); + }); } -- 2.40.0