diff --git a/pdns/dnsdistdist/dnsdist-backend.cc b/pdns/dnsdistdist/dnsdist-backend.cc index d493d3f9aa1f..0139982c075a 100644 --- a/pdns/dnsdistdist/dnsdist-backend.cc +++ b/pdns/dnsdistdist/dnsdist-backend.cc @@ -867,7 +867,7 @@ void DownstreamState::submitHealthCheckResult(bool initial, bool newResult) } setUpStatus(newState); - if (g_snmpAgent != nullptr && dnsdist::configuration::getCurrentRuntimeConfiguration().d_snmpTrapsEnabled) { + if (g_snmpAgent != nullptr && dnsdist::configuration::getImmutableConfiguration().d_snmpTrapsEnabled) { g_snmpAgent->sendBackendStatusChangeTrap(*this); } } diff --git a/pdns/dnsdistdist/dnsdist-configuration.hh b/pdns/dnsdistdist/dnsdist-configuration.hh index d2a8edc5db7c..435cc0964db9 100644 --- a/pdns/dnsdistdist/dnsdist-configuration.hh +++ b/pdns/dnsdistdist/dnsdist-configuration.hh @@ -59,6 +59,7 @@ struct ImmutableConfiguration std::set d_capabilitiesToRetain; std::vector d_tcpFastOpenKey; std::vector> d_frontends; + std::string d_snmpDaemonSocketPath; #ifdef __linux__ // On Linux this gives us 128k pending queries (default is 8192 queries), // which should be enough to deal with huge spikes @@ -93,6 +94,8 @@ struct ImmutableConfiguration bool d_randomizeIDsToBackend{false}; bool d_ringsRecordQueries{true}; bool d_ringsRecordResponses{true}; + bool d_snmpEnabled{false}; + bool d_snmpTrapsEnabled{false}; }; /* this part of the configuration can be updated at runtime via @@ -152,8 +155,6 @@ struct RuntimeConfiguration bool d_servFailOnNoPolicy{false}; bool d_allowEmptyResponse{false}; bool d_dropEmptyQueries{false}; - bool d_snmpEnabled{false}; - bool d_snmpTrapsEnabled{false}; bool d_consoleEnabled{false}; bool d_logConsoleConnections{true}; bool d_addEDNSToSelfGeneratedResponses{true}; diff --git a/pdns/dnsdistdist/dnsdist-lua-actions.cc b/pdns/dnsdistdist/dnsdist-lua-actions.cc index 6a89743d58d6..8f7b3a674b99 100644 --- a/pdns/dnsdistdist/dnsdist-lua-actions.cc +++ b/pdns/dnsdistdist/dnsdist-lua-actions.cc @@ -1712,7 +1712,7 @@ class SNMPTrapAction : public DNSAction } DNSAction::Action operator()(DNSQuestion* dnsquestion, std::string* ruleresult) const override { - if (g_snmpAgent != nullptr && dnsdist::configuration::getCurrentRuntimeConfiguration().d_snmpTrapsEnabled) { + if (g_snmpAgent != nullptr && dnsdist::configuration::getImmutableConfiguration().d_snmpTrapsEnabled) { g_snmpAgent->sendDNSTrap(*dnsquestion, d_reason); } @@ -1919,7 +1919,7 @@ class SNMPTrapResponseAction : public DNSResponseAction } DNSResponseAction::Action operator()(DNSResponse* response, std::string* ruleresult) const override { - if (g_snmpAgent != nullptr && dnsdist::configuration::getCurrentRuntimeConfiguration().d_snmpTrapsEnabled) { + if (g_snmpAgent != nullptr && dnsdist::configuration::getImmutableConfiguration().d_snmpTrapsEnabled) { g_snmpAgent->sendDNSTrap(*response, d_reason); } diff --git a/pdns/dnsdistdist/dnsdist-lua-bindings-dnsquestion.cc b/pdns/dnsdistdist/dnsdist-lua-bindings-dnsquestion.cc index 8be21fd3d8a1..8863e0bb5da7 100644 --- a/pdns/dnsdistdist/dnsdist-lua-bindings-dnsquestion.cc +++ b/pdns/dnsdistdist/dnsdist-lua-bindings-dnsquestion.cc @@ -174,7 +174,7 @@ void setupLuaBindingsDNSQuestion(LuaContext& luaCtx) luaCtx.registerFunction("sendTrap", [](const DNSQuestion& dnsQuestion, boost::optional reason) { #ifdef HAVE_NET_SNMP - if (g_snmpAgent != nullptr && dnsdist::configuration::getCurrentRuntimeConfiguration().d_snmpTrapsEnabled) { + if (g_snmpAgent != nullptr && dnsdist::configuration::getImmutableConfiguration().d_snmpTrapsEnabled) { g_snmpAgent->sendDNSTrap(dnsQuestion, reason ? *reason : ""); } #endif /* HAVE_NET_SNMP */ @@ -505,7 +505,7 @@ void setupLuaBindingsDNSQuestion(LuaContext& luaCtx) luaCtx.registerFunction("sendTrap", [](const DNSResponse& dnsResponse, boost::optional reason) { #ifdef HAVE_NET_SNMP - if (g_snmpAgent != nullptr && dnsdist::configuration::getCurrentRuntimeConfiguration().d_snmpTrapsEnabled) { + if (g_snmpAgent != nullptr && dnsdist::configuration::getImmutableConfiguration().d_snmpTrapsEnabled) { g_snmpAgent->sendDNSTrap(dnsResponse, reason ? *reason : ""); } #endif /* HAVE_NET_SNMP */ diff --git a/pdns/dnsdistdist/dnsdist-lua-ffi.cc b/pdns/dnsdistdist/dnsdist-lua-ffi.cc index 12f901acf536..913f8d05720d 100644 --- a/pdns/dnsdistdist/dnsdist-lua-ffi.cc +++ b/pdns/dnsdistdist/dnsdist-lua-ffi.cc @@ -637,7 +637,7 @@ bool dnsdist_ffi_dnsquestion_set_trailing_data(dnsdist_ffi_dnsquestion_t* dq, co void dnsdist_ffi_dnsquestion_send_trap(dnsdist_ffi_dnsquestion_t* dq, const char* reason, size_t reasonLen) { - if (g_snmpAgent != nullptr && dnsdist::configuration::getCurrentRuntimeConfiguration().d_snmpTrapsEnabled) { + if (g_snmpAgent != nullptr && dnsdist::configuration::getImmutableConfiguration().d_snmpTrapsEnabled) { g_snmpAgent->sendDNSTrap(*dq->dq, std::string(reason, reasonLen)); } } diff --git a/pdns/dnsdistdist/dnsdist-lua.cc b/pdns/dnsdistdist/dnsdist-lua.cc index 4cd7ab494a89..d530a9564a08 100644 --- a/pdns/dnsdistdist/dnsdist-lua.cc +++ b/pdns/dnsdistdist/dnsdist-lua.cc @@ -2242,28 +2242,18 @@ static void setupLuaConfig(LuaContext& luaCtx, bool client, bool configCheck) if (client || configCheck) { return; } - if (!checkConfigurationTime("snmpAgent")) { - return; - } - { - if (dnsdist::configuration::getCurrentRuntimeConfiguration().d_snmpEnabled) { - errlog("snmpAgent() cannot be used twice!"); - g_outputBuffer = "snmpAgent() cannot be used twice!\n"; - return; - } - } - - dnsdist::configuration::updateRuntimeConfiguration([enableTraps](dnsdist::configuration::RuntimeConfiguration& config) { + dnsdist::configuration::updateImmutableConfiguration([enableTraps, &daemonSocket](dnsdist::configuration::ImmutableConfiguration& config) { config.d_snmpEnabled = true; config.d_snmpTrapsEnabled = enableTraps; + if (daemonSocket) { + config.d_snmpDaemonSocketPath = *daemonSocket; + } }); - - g_snmpAgent = std::make_unique("dnsdist", daemonSocket ? *daemonSocket : std::string()); }); luaCtx.writeFunction("sendCustomTrap", [](const std::string& str) { - if (g_snmpAgent != nullptr && dnsdist::configuration::getCurrentRuntimeConfiguration().d_snmpTrapsEnabled) { + if (g_snmpAgent != nullptr && dnsdist::configuration::getImmutableConfiguration().d_snmpTrapsEnabled) { g_snmpAgent->sendCustomTrap(str); } }); diff --git a/pdns/dnsdistdist/dnsdist.cc b/pdns/dnsdistdist/dnsdist.cc index 67b8625930c8..99c8700b242b 100644 --- a/pdns/dnsdistdist/dnsdist.cc +++ b/pdns/dnsdistdist/dnsdist.cc @@ -3444,9 +3444,12 @@ int main(int argc, char** argv) g_delay = std::make_unique>(); #endif /* DISABLE_DELAY_PIPE */ - if (g_snmpAgent != nullptr) { +#if defined(HAVE_NET_SNMP) + if (dnsdist::configuration::getImmutableConfiguration().d_snmpEnabled) { + g_snmpAgent = std::make_unique("dnsdist", dnsdist::configuration::getImmutableConfiguration().d_snmpDaemonSocketPath); g_snmpAgent->run(); } +#endif /* HAVE_NET_SNMP */ /* we need to create the TCP worker threads before the acceptor ones, otherwise we might crash when processing diff --git a/pdns/fstrm_logger.hh b/pdns/fstrm_logger.hh index 44657247d86a..41d00740eb31 100644 --- a/pdns/fstrm_logger.hh +++ b/pdns/fstrm_logger.hh @@ -36,7 +36,7 @@ class FrameStreamLogger : public RemoteLoggerInterface { public: - FrameStreamLogger(int family, std::string address, bool connect, const std::unordered_map& options = std::unordered_map()); + FrameStreamLogger(int family, std::string address, bool connect, const std::unordered_map& options = std::unordered_map()); FrameStreamLogger(const FrameStreamLogger&) = delete; FrameStreamLogger(FrameStreamLogger&&) = delete; FrameStreamLogger& operator=(const FrameStreamLogger&) = delete;