]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
dnsdist: Make SNMP configuration immutable
authorRemi Gacogne <remi.gacogne@powerdns.com>
Tue, 24 Dec 2024 10:53:30 +0000 (11:53 +0100)
committerRemi Gacogne <remi.gacogne@powerdns.com>
Thu, 16 Jan 2025 08:50:21 +0000 (09:50 +0100)
pdns/dnsdistdist/dnsdist-backend.cc
pdns/dnsdistdist/dnsdist-configuration.hh
pdns/dnsdistdist/dnsdist-lua-actions.cc
pdns/dnsdistdist/dnsdist-lua-bindings-dnsquestion.cc
pdns/dnsdistdist/dnsdist-lua-ffi.cc
pdns/dnsdistdist/dnsdist-lua.cc
pdns/dnsdistdist/dnsdist.cc
pdns/fstrm_logger.hh

index d493d3f9aa1f68036fe345cb52746b28db82a5f2..0139982c075a3a0035aac43d56f26ceb3b0de9f8 100644 (file)
@@ -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);
     }
   }
index d2a8edc5db7cd6cec52e8e5e0be04bcb4faad0ca..435cc0964db946330cb651ce0aa5c7b996521630 100644 (file)
@@ -59,6 +59,7 @@ struct ImmutableConfiguration
   std::set<std::string> d_capabilitiesToRetain;
   std::vector<uint32_t> d_tcpFastOpenKey;
   std::vector<std::shared_ptr<ClientState>> 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};
index 6a89743d58d65fb57050715e4884f777e680afaa..8f7b3a674b9910a9fdb48f952a9d6d5c22fbfd4f 100644 (file)
@@ -1712,7 +1712,7 @@ public:
   }
   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 @@ public:
   }
   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);
     }
 
index 8be21fd3d8a1e45fff3aee0849d7be33ff212940..8863e0bb5da71d10372907ad61838f992f1f298d 100644 (file)
@@ -174,7 +174,7 @@ void setupLuaBindingsDNSQuestion(LuaContext& luaCtx)
 
   luaCtx.registerFunction<void (DNSQuestion::*)(std::string)>("sendTrap", [](const DNSQuestion& dnsQuestion, boost::optional<std::string> 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<void (DNSResponse::*)(std::string)>("sendTrap", [](const DNSResponse& dnsResponse, boost::optional<std::string> 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 */
index 12f901acf5364ea9bc22d2a1b565d8e842b5fc23..913f8d05720d266944d9fbad4ce23963a343abc0 100644 (file)
@@ -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));
   }
 }
index 4cd7ab494a8981ccdc232c1ff32f0700d684f8b6..d530a9564a0873e7f0012ab2719b2287d2e4bb08 100644 (file)
@@ -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<DNSDistSNMPAgent>("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);
     }
   });
index 67b8625930c8ad684396f3c7b3e3f51d29a3b8eb..99c8700b242bd73450c3d5cdac8212d08601779c 100644 (file)
@@ -3444,9 +3444,12 @@ int main(int argc, char** argv)
     g_delay = std::make_unique<DelayPipe<DelayedPacket>>();
 #endif /* DISABLE_DELAY_PIPE */
 
-    if (g_snmpAgent != nullptr) {
+#if defined(HAVE_NET_SNMP)
+    if (dnsdist::configuration::getImmutableConfiguration().d_snmpEnabled) {
+      g_snmpAgent = std::make_unique<DNSDistSNMPAgent>("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
index 44657247d86aafc16e362b100c709e08c611f932..41d00740eb3134bb1931eee49367db34e4ce23be 100644 (file)
@@ -36,7 +36,7 @@
 class FrameStreamLogger : public RemoteLoggerInterface
 {
 public:
-  FrameStreamLogger(int family, std::string address, bool connect, const std::unordered_map<string, unsigned>& options = std::unordered_map<string, unsigned>());
+  FrameStreamLogger(int family, std::string address, bool connect, const std::unordered_map<string, unsigned int>& options = std::unordered_map<string, unsigned int>());
   FrameStreamLogger(const FrameStreamLogger&) = delete;
   FrameStreamLogger(FrameStreamLogger&&) = delete;
   FrameStreamLogger& operator=(const FrameStreamLogger&) = delete;