]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
rec: handle applicable dynamic parts of YAML only config when reloading Lua config
authorOtto Moerbeek <otto.moerbeek@open-xchange.com>
Wed, 7 Jan 2026 09:03:19 +0000 (10:03 +0100)
committerOtto Moerbeek <otto.moerbeek@open-xchange.com>
Thu, 22 Jan 2026 12:30:59 +0000 (13:30 +0100)
Fixes #16673

Signed-off-by: Otto Moerbeek <otto.moerbeek@open-xchange.com>
pdns/recursordist/rec-rust-lib/cxxsupport.cc
pdns/recursordist/rec_channel_rec.cc

index bce09eface349fa507578556aadbc163eaf34657..a8cf4e4c3252350961a46ec8d0bb84b9f5f7d208 100644 (file)
@@ -1429,8 +1429,6 @@ bool pdns::settings::rec::luaItemSet(const pdns::rust::settings::rec::Recursorse
   alldefault = alldefault && settings.recordcache.zonetocaches.empty();
   alldefault = alldefault && settings.recursor.allowed_additional_qtypes.empty();
   alldefault = alldefault && settings.incoming.proxymappings.empty();
-  alldefault = alldefault && settings.outgoing.tls_configurations.empty(); // actually not a Lua item, but very much alike
-  alldefault = alldefault && settings.logging.opentelemetry_trace_conditions.empty(); // actually not a Lua item, but very much alike
   return !alldefault;
 }
 
index 6348c931eaa99cd50655f2532a1cf3a43f48b5df..7fb322bf0fbba52e8c7ba920856239a8e6df8785 100644 (file)
@@ -2081,21 +2081,53 @@ RecursorControlChannel::Answer luaconfig(bool broadcast)
   LuaConfigItems lci;
   lci.d_slog = g_slog;
   extern std::unique_ptr<ProxyMapping> g_proxyMapping;
+  pdns::rust::settings::rec::Recursorsettings settings;
+  extern std::unique_ptr<OpenTelemetryTraceConditions> g_OTConditions;
+  OpenTelemetryTraceConditions conditions;
+  pdns::settings::rec::YamlSettingsStatus yamlstat = pdns::settings::rec::YamlSettingsStatus::CannotOpen;
+
+  // IF we have a yaml file read it to be ab le to use parts of it later
+  if (g_yamlSettings) {
+    string configname = ::arg()["config-dir"] + "/recursor";
+    if (!::arg()["config-name"].empty()) {
+      configname = ::arg()["config-dir"] + "/recursor-" + ::arg()["config-name"];
+    }
+    bool dummy1{};
+    bool dummy2{};
+    yamlstat = pdns::settings::rec::tryReadYAML(configname + g_yamlSettingsSuffix, false, dummy1, dummy2, settings, g_slog, Logr::Error);
+  }
+
   if (!g_luaSettingsInYAML) {
+    // We have a lua config file, but also process dynamic YAML parts if applicable, currenlty those are:
+    // - the OT trace conditions
+    // - the outgoing TLS config
     try {
+      if (yamlstat == pdns::settings::rec::YamlSettingsStatus::OK) {
+        // YAML read above succeeded
+        ProxyMapping dummyProxyMapping;
+        LuaConfigItems dummpyLuaConfig;
+        pdns::settings::rec::fromBridgeStructToLuaConfig(settings, dummpyLuaConfig, dummyProxyMapping, conditions);
+        TCPOutConnectionManager::setupOutgoingTLSConfigTables(settings);
+        if (broadcast) {
+          broadcastFunction([conds = std::move(conditions)] { return pleaseSupplantOTConditions(conds); });
+        }
+      }
       if (::arg()["lua-config-file"].empty()) {
         return {0, "No Lua or corresponding YAML configuration active\n"};
       }
       loadRecursorLuaConfig(::arg()["lua-config-file"], proxyMapping, lci);
+
       activateLuaConfig(lci);
       lci = g_luaconfs.getCopy();
       if (broadcast) {
         startLuaConfigDelayedThreads(lci, lci.generation);
         broadcastFunction([pmap = std::move(proxyMapping)] { return pleaseSupplantProxyMapping(pmap); });
+
       }
       else {
-        // Initial proxy mapping
+        // Initial proxy mapping and OT conditions
         g_proxyMapping = proxyMapping.empty() ? nullptr : std::make_unique<ProxyMapping>(proxyMapping);
+        g_OTConditions = conditions.empty() ? nullptr : std::make_unique<OpenTelemetryTraceConditions>(conditions);
       }
       if (broadcast) {
         g_slog->withName("config")->info(Logr::Info, "Reloaded");
@@ -2110,20 +2142,11 @@ RecursorControlChannel::Answer luaconfig(bool broadcast)
     }
   }
   try {
-    string configname = ::arg()["config-dir"] + "/recursor";
-    if (!::arg()["config-name"].empty()) {
-      configname = ::arg()["config-dir"] + "/recursor-" + ::arg()["config-name"];
-    }
-    bool dummy1{};
-    bool dummy2{};
-    pdns::rust::settings::rec::Recursorsettings settings;
-    auto yamlstat = pdns::settings::rec::tryReadYAML(configname + g_yamlSettingsSuffix, false, dummy1, dummy2, settings, g_slog, Logr::Error);
     if (yamlstat != pdns::settings::rec::YamlSettingsStatus::OK) {
       return {1, "Reloading dynamic part of YAML configuration failed\n"};
     }
     auto generation = g_luaconfs.getLocal()->generation;
     lci.generation = generation + 1;
-    OpenTelemetryTraceConditions conditions;
     pdns::settings::rec::fromBridgeStructToLuaConfig(settings, lci, proxyMapping, conditions);
     activateLuaConfig(lci);
     lci = g_luaconfs.getCopy();
@@ -2135,7 +2158,7 @@ RecursorControlChannel::Answer luaconfig(bool broadcast)
       broadcastFunction([conds = std::move(conditions)] { return pleaseSupplantOTConditions(conds); });
     }
     else {
-      // Initial proxy mapping
+      // Initial proxy mapping and OT conditions
       g_proxyMapping = proxyMapping.empty() ? nullptr : std::make_unique<ProxyMapping>(proxyMapping);
       *g_initialOpenTelemetryConditions.lock() = conditions.empty() ? nullptr : std::make_unique<OpenTelemetryTraceConditions>(conditions);
     }