]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
Basic runtime global enabling/disabling of event traces via setting and rec_control
authorOtto <otto.moerbeek@open-xchange.com>
Thu, 19 Aug 2021 09:46:49 +0000 (11:46 +0200)
committerOtto <otto.moerbeek@open-xchange.com>
Wed, 13 Oct 2021 12:33:17 +0000 (14:33 +0200)
pdns/pdns_recursor.cc
pdns/rec_channel_rec.cc
pdns/syncres.cc
pdns/syncres.hh

index b78753ad16ae74e601a82055ac77b9c4a83d029b..adc99539932f6e63496ce519ebee40556945f99e 100644 (file)
@@ -1109,7 +1109,7 @@ static void protobufLogResponse(const struct dnsheader* dh, LocalStateHolder<Lua
     pbMessage.setNewlyObservedDomain(false);
   }
 #endif
-  if (eventTrace.enabled()) {
+  if (eventTrace.enabled() && SyncRes::s_event_trace_enabled & SyncRes::event_trace_to_pb) {
     pbMessage.addEvents(eventTrace);
   }
   protobufLogResponse(pbMessage);
@@ -2336,7 +2336,7 @@ static void startDoResolve(void *p)
         }
       }
 #endif /* NOD_ENABLED */
-      if (sr.d_eventTrace.enabled()) {
+      if (SyncRes::s_event_trace_enabled & SyncRes::event_trace_to_pb) {
         pbMessage.addEvents(sr.d_eventTrace);
       }
       if (dc->d_logResponse) {
@@ -2344,7 +2344,7 @@ static void startDoResolve(void *p)
       }
     }
 
-    if (sr.d_eventTrace.enabled()) {
+    if (sr.d_eventTrace.enabled() && SyncRes::s_event_trace_enabled & SyncRes::event_trace_to_log) {
       g_log << Logger::Info << sr.d_eventTrace.toString() << endl;
     }
 
@@ -2749,7 +2749,7 @@ static void handleRunningTCPQuestion(int fd, FDMultiplexer::funcparam_t& var)
       bool logQuery = false;
       bool qnameParsed = false;
 
-      dc->d_eventTrace.setEnabled(true);
+      dc->d_eventTrace.setEnabled(SyncRes::s_event_trace_enabled);
       dc->d_eventTrace.add(RecEventTrace::RecRecv);
       auto luaconfsLocal = g_luaconfs.getLocal();
       if (checkProtobufExport(luaconfsLocal)) {
@@ -2902,7 +2902,7 @@ static void handleRunningTCPQuestion(int fd, FDMultiplexer::funcparam_t& var)
             protobufLogResponse(dh, luaconfsLocal, pbData, tv, true, dc->d_source, dc->d_destination, dc->d_ednssubnet, dc->d_uuid, dc->d_requestorId, dc->d_deviceId, dc->d_deviceName, dc->d_meta, dc->d_eventTrace);
           }
 
-          if (dc->d_eventTrace.enabled()) {
+          if (dc->d_eventTrace.enabled() && SyncRes::s_event_trace_enabled & SyncRes::event_trace_to_log) {
             g_log << Logger::Info << dc->d_eventTrace.toString() << endl;
           }
         } else {
@@ -3153,7 +3153,7 @@ static string* doProcessUDPQuestion(const std::string& question, const ComboAddr
         protobufLogResponse(dh, luaconfsLocal, pbData, tv, false, source, destination, ednssubnet, uniqueId, requestorId, deviceId, deviceName, meta, eventTrace);
       }
 
-      if (eventTrace.enabled()) {
+      if (eventTrace.enabled() && SyncRes::s_event_trace_enabled & SyncRes::event_trace_to_log) {
         g_log << Logger::Info << eventTrace.toString() << endl;
       }
       if (sendErr && g_logCommonErrors) {
@@ -3258,7 +3258,7 @@ static void handleNewUDPQuestion(int fd, FDMultiplexer::funcparam_t& var)
 
     if((len=recvmsg(fd, &msgh, 0)) >= 0) {
       eventTrace.clear();
-      eventTrace.setEnabled(true);
+      eventTrace.setEnabled(SyncRes::s_event_trace_enabled);
       eventTrace.add(RecEventTrace::RecRecv);
 
       firstQuery = false;
@@ -4981,6 +4981,7 @@ static int serviceMain(int argc, char*argv[])
   SyncRes::s_tcp_fast_open_connect = ::arg().mustDo("tcp-fast-open-connect");
 
   SyncRes::s_dot_to_port_853 = ::arg().mustDo("dot-to-port-853");
+  SyncRes::s_event_trace_enabled = ::arg().asNum("event-trace-enabled");
 
   if (SyncRes::s_tcp_fast_open_connect) {
     checkFastOpenSysctl(true);
@@ -5999,6 +6000,7 @@ int main(int argc, char **argv)
 
     ::arg().setSwitch("dot-to-port-853", "Force DoT connection to target port 853 if DoT compiled in")="yes";
     ::arg().set("dot-to-auth-names", "Use DoT to authoritative servers with these names or suffixes")="";
+    ::arg().set("event-trace-enabled", "If set, event traces are collected and send out via protobuf logging (1), logfile (2) or both(3)")="0";
 
     ::arg().set("tcp-out-max-idle-ms", "Time TCP/DoT connections are left idle in milliseconds or 0 if no limit") = "10000";
     ::arg().set("tcp-out-max-idle-per-auth", "Maximum number of idle TCP/DoT connections to a specific IP per thread, 0 means do not keep idle connections open") = "10";
index d19d719b0c67d0f96abe04c5d0b12c13a3aee526..dbc3a15355d0ee5de6b0542e1e8587438a221e7d 100644 (file)
@@ -1882,6 +1882,20 @@ static string clearDontThrottleNetmasks(T begin, T end) {
   return ret + "\n";
 }
 
+template <typename T>
+static string setEventTracing(T begin, T end)
+{
+  if (begin == end) {
+    return "No event trace enabled value specified\n";
+  }
+  try {
+    SyncRes::s_event_trace_enabled = pdns_stou(*begin);
+    return "New event trace enabled value: " + std::to_string(SyncRes::s_event_trace_enabled) + "\n";
+  }
+  catch (const std::exception& e) {
+    return "Error parsing the new event trace enabled value: " + std::string(e.what()) + "\n";
+  }
+}
 
 RecursorControlChannel::Answer RecursorControlParser::getAnswer(int s, const string& question, RecursorControlParser::func_t** command)
 {
@@ -1940,6 +1954,7 @@ RecursorControlChannel::Answer RecursorControlParser::getAnswer(int s, const str
 "set-minimum-ttl value            set minimum-ttl-override\n"
 "set-carbon-server                set a carbon server for telemetry\n"
 "set-dnssec-log-bogus SETTING     enable (SETTING=yes) or disable (SETTING=no) logging of DNSSEC validation failures\n"
+"set-event-trace-enabled SETTING  set logging of event trace messages, 0 = disabled, 1 = prottobuf, 2 = log file, 3 = both\n"
 "trace-regex [regex]              emit resolution trace for matching queries (empty regex to clear trace)\n"
 "top-largeanswer-remotes          show top remotes receiving large answers\n"
 "top-queries                      show top queries\n"
@@ -2157,6 +2172,9 @@ RecursorControlChannel::Answer RecursorControlParser::getAnswer(int s, const str
   if (cmd == "clear-dont-throttle-netmasks") {
     return {0, clearDontThrottleNetmasks(begin, end)};
   }
+  if (cmd == "set-event-trace-enabled") {
+    return {0, setEventTracing(begin, end)};
+  }
 
   return {1, "Unknown command '"+cmd+"', try 'help'\n"};
 }
index b73f21ac30f938374272b2ff6ff9a26e006dc7f0..55c13620ffbe7e09d66d298425fcf23d89d95f3a 100644 (file)
@@ -100,6 +100,7 @@ unsigned int SyncRes::s_refresh_ttlperc;
 int SyncRes::s_tcp_fast_open;
 bool SyncRes::s_tcp_fast_open_connect;
 bool SyncRes::s_dot_to_port_853;
+int SyncRes::s_event_trace_enabled;
 
 #define LOG(x) if(d_lm == Log) { g_log <<Logger::Warning << x; } else if(d_lm == Store) { d_trace << x; }
 
index a750b56db652d4f3382f8e5827ce216fe8e3b417..20892d3334a9825beee1c30e91e3c5986dcc958b 100644 (file)
@@ -789,7 +789,11 @@ public:
   static int s_tcp_fast_open;
   static bool s_tcp_fast_open_connect;
   static bool s_dot_to_port_853;
-  
+
+  static const int event_trace_to_pb = 1;
+  static const int event_trace_to_log = 2;
+  static int s_event_trace_enabled;
+
   std::unordered_map<std::string,bool> d_discardedPolicies;
   DNSFilterEngine::Policy d_appliedPolicy;
   std::unordered_set<std::string> d_policyTags;