]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
Protobuf: Encode UUID in binary. Add question to the response msg 3701/head
authorRemi Gacogne <remi.gacogne@powerdns.com>
Wed, 13 Apr 2016 11:16:13 +0000 (13:16 +0200)
committerRemi Gacogne <remi.gacogne@powerdns.com>
Wed, 13 Apr 2016 11:16:13 +0000 (13:16 +0200)
Also:
- merge the dnsdist and recursor Remote Logger implementations.
- fix the protobuf logging over TCP in dnsdist

17 files changed:
pdns/README-dnsdist.md
pdns/dnsdist-lua2.cc
pdns/dnsdist-protobuf.cc [new file with mode: 0644]
pdns/dnsdist-protobuf.hh [new file with mode: 0644]
pdns/dnsdist-remotelogger.cc [deleted file]
pdns/dnsdist-remotelogger.hh [deleted file]
pdns/dnsdist-tcp.cc
pdns/dnsdistdist/Makefile.am
pdns/dnsdistdist/dnsdist-protobuf.cc [new symlink]
pdns/dnsdistdist/dnsdist-protobuf.hh [new symlink]
pdns/dnsdistdist/dnsdist-remotelogger.cc [deleted symlink]
pdns/dnsdistdist/dnsdist-remotelogger.hh [deleted symlink]
pdns/dnsdistdist/remote_logger.cc [new symlink]
pdns/dnsdistdist/remote_logger.hh [new symlink]
pdns/dnspcap2protobuf.cc
pdns/dnsrulactions.hh
pdns/pdns_recursor.cc

index fa322f84f5268a655c882a04d64109c49ba471f1..2874d3acc162eb14f8eff4d7de69bf0cf1f46f43 100644 (file)
@@ -1175,7 +1175,7 @@ instantiate a server with additional parameters
     * `printDNSCryptProviderFingerprint("/path/to/providerPublic.key")`: display the fingerprint of the provided resolver public key
     * `showDNSCryptBinds():`: display the currently configured DNSCrypt binds
  * RemoteLogger related:
-    * `newRemoteLogger(address:port)`: create a Remote Logger object, to use with `RemoteLogAction()` and `RemoteLogResponseAction()`
+    * `newRemoteLogger(address:port [, timeout=2, maxQueuedEntries=100, reconnectWaitTime=1])`: create a Remote Logger object, to use with `RemoteLogAction()` and `RemoteLogResponseAction()`
 
 All hooks
 ---------
index 3718223cc1bc3e6aa1b5d9ac106404e210a51ec7..18be93099a532810bcbdb8e1ea32e7d863a93e7d 100644 (file)
@@ -582,8 +582,8 @@ void moreLua(bool client)
     g_lua.writeFunction("RemoteLogResponseAction", [](std::shared_ptr<RemoteLogger> logger) {
         return std::shared_ptr<DNSResponseAction>(new RemoteLogResponseAction(logger));
       });
-    g_lua.writeFunction("newRemoteLogger", [client](const std::string& remote) {
-        return std::make_shared<RemoteLogger>(ComboAddress(remote));
+    g_lua.writeFunction("newRemoteLogger", [client](const std::string& remote, boost::optional<uint16_t> timeout, boost::optional<uint64_t> maxQueuedEntries, boost::optional<uint8_t> reconnectWaitTime) {
+        return std::make_shared<RemoteLogger>(ComboAddress(remote), timeout ? *timeout : 2, maxQueuedEntries ? *maxQueuedEntries : 100, reconnectWaitTime ? *reconnectWaitTime : 1);
       });
 
 }
diff --git a/pdns/dnsdist-protobuf.cc b/pdns/dnsdist-protobuf.cc
new file mode 100644 (file)
index 0000000..d0a0d7a
--- /dev/null
@@ -0,0 +1,132 @@
+
+#include "config.h"
+
+#include "dnsdist.hh"
+
+#include "dnsparser.hh"
+#include "dnsdist-protobuf.hh"
+
+#ifdef HAVE_PROTOBUF
+#include "dnsmessage.pb.h"
+
+static void protobufFillMessage(PBDNSMessage& message, const DNSQuestion& dq)
+{
+  std::string* messageId = message.mutable_messageid();
+  messageId->resize(dq.uniqueId.size());
+  std::copy(dq.uniqueId.begin(), dq.uniqueId.end(), messageId->begin());
+
+  message.set_socketfamily(dq.remote->sin4.sin_family == AF_INET ? PBDNSMessage_SocketFamily_INET : PBDNSMessage_SocketFamily_INET6);
+  message.set_socketprotocol(dq.tcp ? PBDNSMessage_SocketProtocol_TCP : PBDNSMessage_SocketProtocol_UDP);
+  if (dq.local->sin4.sin_family == AF_INET) {
+    message.set_to(&dq.local->sin4.sin_addr.s_addr, sizeof(dq.local->sin4.sin_addr.s_addr));
+  }
+  else if (dq.local->sin4.sin_family == AF_INET6) {
+    message.set_to(&dq.local->sin6.sin6_addr.s6_addr, sizeof(dq.local->sin6.sin6_addr.s6_addr));
+  }
+  if (dq.remote->sin4.sin_family == AF_INET) {
+    message.set_from(&dq.remote->sin4.sin_addr.s_addr, sizeof(dq.remote->sin4.sin_addr.s_addr));
+  }
+  else if (dq.remote->sin4.sin_family == AF_INET6) {
+    message.set_from(&dq.remote->sin6.sin6_addr.s6_addr, sizeof(dq.remote->sin6.sin6_addr.s6_addr));
+  }
+
+  message.set_inbytes(dq.len);
+
+  struct timespec ts;
+  clock_gettime(CLOCK_REALTIME, &ts);
+  message.set_timesec(ts.tv_sec);
+  message.set_timeusec(ts.tv_nsec / 1000);
+  message.set_id(ntohs(dq.dh->id));
+
+  PBDNSMessage_DNSQuestion* question = message.mutable_question();
+  question->set_qname(dq.qname->toString());
+  question->set_qtype(dq.qtype);
+  question->set_qclass(dq.qclass);
+}
+
+void protobufMessageFromQuestion(const DNSQuestion& dq, std::string& data)
+{
+  PBDNSMessage message;
+  message.set_type(PBDNSMessage_Type_DNSQueryType);
+  protobufFillMessage(message, dq);
+//  cerr <<message.DebugString()<<endl;
+  message.SerializeToString(&data);
+}
+
+static void addRRs(const char* packet, const size_t len, PBDNSMessage_DNSResponse& response)
+{
+  if (len < sizeof(struct dnsheader))
+    return;
+
+  const struct dnsheader* dh = (const struct dnsheader*) packet;
+
+  if (ntohs(dh->ancount) == 0)
+    return;
+
+  if (ntohs(dh->qdcount) == 0)
+    return;
+
+  vector<uint8_t> content(len - sizeof(dnsheader));
+  copy(packet + sizeof(dnsheader), packet + len, content.begin());
+  PacketReader pr(content);
+
+  size_t idx = 0;
+  DNSName rrname;
+  uint16_t qdcount = ntohs(dh->qdcount);
+  uint16_t ancount = ntohs(dh->ancount);
+  uint16_t rrtype;
+  uint16_t rrclass;
+  string blob;
+  struct dnsrecordheader ah;
+
+  rrname = pr.getName();
+  rrtype = pr.get16BitInt();
+  rrclass = pr.get16BitInt();
+
+  /* consume remaining qd if any */
+  if (qdcount > 1) {
+    for(idx = 1; idx < qdcount; idx++) {
+      rrname = pr.getName();
+      rrtype = pr.get16BitInt();
+      rrclass = pr.get16BitInt();
+      (void) rrtype;
+      (void) rrclass;
+    }
+  }
+
+  /* parse AN */
+  for (idx = 0; idx < ancount; idx++) {
+    rrname = pr.getName();
+    pr.getDnsrecordheader(ah);
+
+    pr.xfrBlob(blob);
+
+    if (ah.d_type == QType::A || ah.d_type == QType::AAAA) {
+      PBDNSMessage_DNSResponse_DNSRR* rr = response.add_rrs();
+      if (rr) {
+        rr->set_name(rrname.toString());
+        rr->set_type(ah.d_type);
+        rr->set_class_(ah.d_class);
+        rr->set_ttl(ah.d_ttl);
+        rr->set_rdata(blob.c_str(), blob.length());
+      }
+    }
+  }
+}
+
+void protobufMessageFromResponse(const DNSQuestion& dr, std::string& data)
+{
+  PBDNSMessage message;
+  message.set_type(PBDNSMessage_Type_DNSResponseType);
+  protobufFillMessage(message, dr);
+
+  PBDNSMessage_DNSResponse response;
+  response.set_rcode(dr.dh->rcode);
+  addRRs((const char*) dr.dh, dr.len, response);
+  message.set_allocated_response(&response);
+
+//  cerr <<message.DebugString()<<endl;
+  message.SerializeToString(&data);
+  message.release_response();
+}
+#endif /* HAVE_PROTOBUF */
diff --git a/pdns/dnsdist-protobuf.hh b/pdns/dnsdist-protobuf.hh
new file mode 100644 (file)
index 0000000..bbac0b2
--- /dev/null
@@ -0,0 +1,9 @@
+
+#pragma once
+#include "config.h"
+
+#ifdef HAVE_PROTOBUF
+void protobufMessageFromQuestion(const DNSQuestion& dq, std::string& data);
+void protobufMessageFromResponse(const DNSQuestion& dr, std::string& data);
+
+#endif /* HAVE_PROTOBUF */
diff --git a/pdns/dnsdist-remotelogger.cc b/pdns/dnsdist-remotelogger.cc
deleted file mode 100644 (file)
index f8aa3a9..0000000
+++ /dev/null
@@ -1,255 +0,0 @@
-
-#include "dolog.hh"
-#include "dnsdist.hh"
-#include "dnsdist-remotelogger.hh"
-#include "dnsparser.hh"
-
-#ifdef HAVE_PROTOBUF
-#include <boost/uuid/uuid_io.hpp>
-#include "dnsmessage.pb.h"
-#endif
-
-bool RemoteLogger::reconnect()
-{
-  if (d_socket >= 0) {
-    close(d_socket);
-  }
-  try {
-    //cerr<<"Connecting to " << d_remote.toStringWithPort()<<endl;
-    d_socket = SSocket(d_remote.sin4.sin_family, SOCK_STREAM, 0);
-    SConnect(d_socket, d_remote);
-    setNonBlocking(d_socket);
-  }
-  catch(const std::exception& e) {
-    infolog("Error connecting to remote logger (%s): %s", d_remote.toStringWithPort(), e.what());
-    return false;
-  }
-  return true;
-}
-
-bool RemoteLogger::sendData(const char* buffer, size_t bufferSize)
-{
-  size_t pos = 0;
-  while(pos < bufferSize) {
-    //cerr<<"Sending "<< bufferSize-pos <<" to " << d_remote.toStringWithPort()<<endl;
-    ssize_t written = write(d_socket, buffer + pos, bufferSize - pos);
-    if (written == -1) {
-      int res = errno;
-      //cerr<<"errno is "<<errno<<endl;
-      if (res == EWOULDBLOCK || res == EAGAIN) {
-        return false;
-      }
-      else if (res != EINTR) {
-        reconnect();
-        return false;
-      }
-    }
-    else if (written == 0) {
-      reconnect();
-      return false;
-    }
-    else {
-      pos += (size_t) written;
-    }
-  }
-
-  return true;
-}
-
-void RemoteLogger::worker()
-{
-  while(true) {
-    std::string data;
-    {
-      std::unique_lock<std::mutex> lock(d_writeMutex);
-      d_queueCond.wait(lock, [this]{return !d_writeQueue.empty();});
-      data = d_writeQueue.front();
-      d_writeQueue.pop();
-    }
-
-    try {
-      uint16_t len = data.length();
-      len = htons(len);
-      writen2WithTimeout(d_socket, &len, sizeof(len), (int) d_timeout);
-      writen2WithTimeout(d_socket, data.c_str(), data.length(), (int) d_timeout);
-    }
-    catch(const std::runtime_error& e) {
-      vinfolog("Error sending data to remote logger (%s): %s", d_remote.toStringWithPort(), e.what());
-
-      while (!reconnect()) {
-        sleep(d_reconnectWaitTime);
-      }
-    }
-  }
-}
-
-void RemoteLogger::queueData(const std::string& data)
-{
-  {
-    std::unique_lock<std::mutex> lock(d_writeMutex);
-    if (d_writeQueue.size() >= d_maxQueuedEntries) {
-      d_writeQueue.pop();
-    }
-    d_writeQueue.push(data);
-  }
-  d_queueCond.notify_one();
-}
-
-RemoteLogger::RemoteLogger(const ComboAddress& remote, uint16_t timeout, uint64_t maxQueuedEntries, uint8_t reconnectWaitTime): d_remote(remote), d_maxQueuedEntries(maxQueuedEntries), d_timeout(timeout), d_reconnectWaitTime(reconnectWaitTime), d_thread(&RemoteLogger::worker, this)
-{
-#ifdef HAVE_PROTOBUF
-  reconnect();
-#else
-  throw new std::runtime_error("Remote logging requires protobuf support, which is not enabled.");
-#endif /* HAVE_PROTOBUF */
-}
-
-RemoteLogger::~RemoteLogger()
-{
-  if (d_socket >= 0)
-    close(d_socket);
-}
-
-void RemoteLogger::logQuery(const DNSQuestion& dq)
-{
-#ifdef HAVE_PROTOBUF
-  PBDNSMessage message;
-  message.set_type(PBDNSMessage_Type_DNSQueryType);
-  message.set_messageid(boost::uuids::to_string(dq.uniqueId));
-  message.set_socketfamily(dq.remote->sin4.sin_family == AF_INET ? PBDNSMessage_SocketFamily_INET : PBDNSMessage_SocketFamily_INET6);
-  message.set_socketprotocol(dq.tcp ? PBDNSMessage_SocketProtocol_TCP : PBDNSMessage_SocketProtocol_UDP);
-  if (dq.local->sin4.sin_family == AF_INET) {
-    message.set_to(&dq.local->sin4.sin_addr.s_addr, sizeof(dq.local->sin4.sin_addr.s_addr));
-  }
-  else if (dq.local->sin4.sin_family == AF_INET6) {
-    message.set_to(&dq.local->sin6.sin6_addr.s6_addr, sizeof(dq.local->sin6.sin6_addr.s6_addr));
-  }
-  if (dq.remote->sin4.sin_family == AF_INET) {
-    message.set_from(&dq.remote->sin4.sin_addr.s_addr, sizeof(dq.remote->sin4.sin_addr.s_addr));
-  }
-  else if (dq.remote->sin4.sin_family == AF_INET6) {
-    message.set_from(&dq.remote->sin6.sin6_addr.s6_addr, sizeof(dq.remote->sin6.sin6_addr.s6_addr));
-  }
-  message.set_inbytes(dq.len);
-  struct timespec ts;
-  clock_gettime(CLOCK_REALTIME, &ts);
-  message.set_timesec(ts.tv_sec);
-  message.set_timeusec(ts.tv_nsec / 1000);
-  message.set_id(ntohs(dq.dh->id));
-
-  PBDNSMessage_DNSQuestion question;
-  question.set_qname(dq.qname->toString());
-  question.set_qtype(dq.qtype);
-  question.set_qclass(dq.qclass);
-  message.set_allocated_question(&question);
-
-  //cerr <<message.DebugString()<<endl;
-  std::string str;
-  message.SerializeToString(&str);
-  queueData(str);
-  message.release_question();
-#endif /* HAVE_PROTOBUF */
-}
-
-#ifdef HAVE_PROTOBUF
-static void addRRs(const char* packet, const size_t len, PBDNSMessage_DNSResponse& response)
-{
-  if (len < sizeof(struct dnsheader))
-    return;
-
-  const struct dnsheader* dh = (const struct dnsheader*) packet;
-
-  if (ntohs(dh->ancount) == 0)
-    return;
-
-  if (ntohs(dh->qdcount) == 0)
-    return;
-
-  vector<uint8_t> content(len - sizeof(dnsheader));
-  copy(packet + sizeof(dnsheader), packet + len, content.begin());
-  PacketReader pr(content);
-
-  size_t idx = 0;
-  DNSName rrname;
-  uint16_t qdcount = ntohs(dh->qdcount);
-  uint16_t ancount = ntohs(dh->ancount);
-  uint16_t rrtype;
-  uint16_t rrclass;
-  string blob;
-  struct dnsrecordheader ah;
-
-  rrname = pr.getName();
-  rrtype = pr.get16BitInt();
-  rrclass = pr.get16BitInt();
-
-  /* consume remaining qd if any */
-  if (qdcount > 1) {
-    for(idx = 1; idx < qdcount; idx++) {
-      rrname = pr.getName();
-      rrtype = pr.get16BitInt();
-      rrclass = pr.get16BitInt();
-      (void) rrtype;
-      (void) rrclass;
-    }
-  }
-
-  /* parse AN */
-  for (idx = 0; idx < ancount; idx++) {
-    rrname = pr.getName();
-    pr.getDnsrecordheader(ah);
-
-    pr.xfrBlob(blob);
-    if (ah.d_type == QType::A || ah.d_type == QType::AAAA) {
-      PBDNSMessage_DNSResponse_DNSRR* rr = response.add_rrs();
-      if (rr) {
-        rr->set_name(rrname.toString());
-        rr->set_type(ah.d_type);
-        rr->set_class_(ah.d_class);
-        rr->set_ttl(ah.d_ttl);
-        rr->set_rdata(blob.c_str(), blob.length());
-      }
-    }
-  }
-}
-#endif /* HAVE_PROTOBUF */
-
-void RemoteLogger::logResponse(const DNSQuestion& dr)
-{
-#ifdef HAVE_PROTOBUF
-  PBDNSMessage message;
-  message.set_type(PBDNSMessage_Type_DNSResponseType);
-  message.set_messageid(boost::uuids::to_string(dr.uniqueId));
-  message.set_socketfamily(dr.remote->sin4.sin_family == AF_INET ? PBDNSMessage_SocketFamily_INET : PBDNSMessage_SocketFamily_INET6);
-  message.set_socketprotocol(dr.tcp ? PBDNSMessage_SocketProtocol_TCP : PBDNSMessage_SocketProtocol_UDP);
-  if (dr.local->sin4.sin_family == AF_INET) {
-    message.set_from(&dr.local->sin4.sin_addr.s_addr, sizeof(dr.local->sin4.sin_addr.s_addr));
-  }
-  else if (dr.local->sin4.sin_family == AF_INET6) {
-    message.set_from(&dr.local->sin6.sin6_addr.s6_addr, sizeof(dr.local->sin6.sin6_addr.s6_addr));
-  }
-  if (dr.remote->sin4.sin_family == AF_INET) {
-    message.set_to(&dr.remote->sin4.sin_addr.s_addr, sizeof(dr.remote->sin4.sin_addr.s_addr));
-  }
-  else if (dr.remote->sin4.sin_family == AF_INET6) {
-    message.set_to(&dr.remote->sin6.sin6_addr.s6_addr, sizeof(dr.remote->sin6.sin6_addr.s6_addr));
-  }
-  message.set_inbytes(dr.len);
-  struct timespec ts;
-  clock_gettime(CLOCK_REALTIME, &ts);
-  message.set_timesec(ts.tv_sec);
-  message.set_timeusec(ts.tv_nsec / 1000);
-  message.set_id(ntohs(dr.dh->id));
-
-  PBDNSMessage_DNSResponse response;
-  response.set_rcode(dr.dh->rcode);
-  addRRs((const char*) dr.dh, dr.len, response);
-  message.set_allocated_response(&response);
-
-
-  //cerr <<message.DebugString()<<endl;
-  std::string str;
-  message.SerializeToString(&str);
-  queueData(str);
-  message.release_response();
-#endif /* HAVE_PROTOBUF */
-}
diff --git a/pdns/dnsdist-remotelogger.hh b/pdns/dnsdist-remotelogger.hh
deleted file mode 100644 (file)
index 0e031bc..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-#pragma once
-#include "config.h"
-
-#include <condition_variable>
-#include <queue>
-
-class RemoteLogger
-{
-public:
-  RemoteLogger(const ComboAddress& remote, uint16_t timeout=2, uint64_t maxQueuedEntries=100, uint8_t reconnectWaitTime=1);
-  ~RemoteLogger();
-  void logQuery(const DNSQuestion& dq);
-  void logResponse(const DNSQuestion& dr);
-  std::string toString()
-  {
-    return d_remote.toStringWithPort();
-  }
-private:
-  bool reconnect();
-  bool sendData(const char* buffer, size_t bufferSize);
-  void worker();
-  void queueData(const std::string& data);
-
-  std::queue<std::string> d_writeQueue;
-  std::mutex d_writeMutex;
-  std::condition_variable d_queueCond;
-  ComboAddress d_remote;
-  uint64_t d_maxQueuedEntries;
-  int d_socket{-1};
-  uint16_t d_timeout;
-  uint8_t d_reconnectWaitTime;
-  std::thread d_thread;
-};
-
index eaeb974317a030ac3e7b03eae545d182ffdd4643..ebebb350697de85843c5468c5540be87855baee1 100644 (file)
@@ -420,6 +420,7 @@ void* tcpClientThread(int pipefd)
           break;
         }
 
+        dh = (struct dnsheader*) response;
         DNSQuestion dr(&qname, qtype, qclass, &ci.cs->local, &ci.remote, dh, responseSize, responseLen, true);
 #ifdef HAVE_PROTOBUF
         dr.uniqueId = dq.uniqueId;
index 9d96068f38099e4e34563f2152a31e157a191bbf..8fe289a089ce894b225a08ef1c6d11573eaa34a7 100644 (file)
@@ -62,7 +62,7 @@ dnsdist_SOURCES = \
        dnsdist-ecs.cc dnsdist-ecs.hh \
        dnsdist-lua.cc \
        dnsdist-lua2.cc \
-       dnsdist-remotelogger.cc dnsdist-remotelogger.hh \
+       dnsdist-protobuf.cc dnsdist-protobuf.hh \
        dnsdist-rings.cc \
        dnsdist-tcp.cc \
        dnsdist-web.cc \
@@ -82,6 +82,7 @@ dnsdist_SOURCES = \
        namespaces.hh \
        pdnsexception.hh \
        qtype.cc qtype.hh \
+       remote_logger.cc remote_logger.hh \
        sholder.hh \
        sodcrypto.cc sodcrypto.hh \
        sstuff.hh \
diff --git a/pdns/dnsdistdist/dnsdist-protobuf.cc b/pdns/dnsdistdist/dnsdist-protobuf.cc
new file mode 120000 (symlink)
index 0000000..a100895
--- /dev/null
@@ -0,0 +1 @@
+../dnsdist-protobuf.cc
\ No newline at end of file
diff --git a/pdns/dnsdistdist/dnsdist-protobuf.hh b/pdns/dnsdistdist/dnsdist-protobuf.hh
new file mode 120000 (symlink)
index 0000000..dd11fbf
--- /dev/null
@@ -0,0 +1 @@
+../dnsdist-protobuf.hh
\ No newline at end of file
diff --git a/pdns/dnsdistdist/dnsdist-remotelogger.cc b/pdns/dnsdistdist/dnsdist-remotelogger.cc
deleted file mode 120000 (symlink)
index 9a5d9ea..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../dnsdist-remotelogger.cc
\ No newline at end of file
diff --git a/pdns/dnsdistdist/dnsdist-remotelogger.hh b/pdns/dnsdistdist/dnsdist-remotelogger.hh
deleted file mode 120000 (symlink)
index e9f1306..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../dnsdist-remotelogger.hh
\ No newline at end of file
diff --git a/pdns/dnsdistdist/remote_logger.cc b/pdns/dnsdistdist/remote_logger.cc
new file mode 120000 (symlink)
index 0000000..d1bf076
--- /dev/null
@@ -0,0 +1 @@
+../remote_logger.cc
\ No newline at end of file
diff --git a/pdns/dnsdistdist/remote_logger.hh b/pdns/dnsdistdist/remote_logger.hh
new file mode 120000 (symlink)
index 0000000..a6051d1
--- /dev/null
@@ -0,0 +1 @@
+../remote_logger.hh
\ No newline at end of file
index 62cd5ffaab45868f19235aeb8ba3167a154f9cbe..1a1e8d1ec6df6cc0fdc897109739a59a7916cc64 100644 (file)
@@ -1,6 +1,5 @@
 #include <boost/uuid/uuid.hpp>
 #include <boost/uuid/uuid_generators.hpp>
-#include <boost/uuid/uuid_io.hpp>
 
 #include "dnsmessage.pb.h"
 #include "iputils.hh"
@@ -151,22 +150,27 @@ int main(int argc, char **argv)
     if (!dh->qr) {
       boost::uuids::uuid uniqueId = uuidGenerator();
       ids[dh->id] = uniqueId;
-      message.set_messageid(boost::uuids::to_string(uniqueId));
-      question.set_qname(qname.toString());
-      question.set_qtype(qtype);
-      question.set_qclass(qclass);
-      message.set_allocated_question(&question);
+      std::string* messageId = message.mutable_messageid();
+      messageId->resize(uniqueId.size());
+      std::copy(uniqueId.begin(), uniqueId.end(), messageId->begin());
     }
     else {
       const auto& it = ids.find(dh->id);
       if (it != ids.end()) {
-        message.set_messageid(boost::uuids::to_string(it->second));
+        std::string* messageId = message.mutable_messageid();
+        messageId->resize(it->second.size());
+        std::copy(it->second.begin(), it->second.end(), messageId->begin());
       }
+
       response.set_rcode(dh->rcode);
       addRRs((const char*) dh, pr.d_len, response);
       message.set_allocated_response(&response);
     }
 
+    question.set_qname(qname.toString());
+    question.set_qtype(qtype);
+    question.set_qclass(qclass);
+    message.set_allocated_question(&question);
     std::string str;
     //cerr<<message.DebugString()<<endl;
     message.SerializeToString(&str);
index 5e7514eb1a2842a96271b69cd4e0afa342219103..9435a19db20514571aadfa13891e1d6771d5293c 100644 (file)
@@ -4,7 +4,8 @@
 #include "dolog.hh"
 #include "ednsoptions.hh"
 #include "lock.hh"
-#include "dnsdist-remotelogger.hh"
+#include "remote_logger.hh"
+#include "dnsdist-protobuf.hh"
 
 class MaxQPSIPRule : public DNSRule
 {
@@ -734,7 +735,11 @@ public:
   }
   DNSAction::Action operator()(DNSQuestion* dq, string* ruleresult) const override
   {
-    d_logger->logQuery(*dq);
+#ifdef HAVE_PROTOBUF
+    std::string data;
+    protobufMessageFromQuestion(*dq, data);
+    d_logger->queueData(data);
+#endif /* HAVE_PROTOBUF */
     return Action::None;
   }
   string toString() const override
@@ -753,7 +758,11 @@ public:
   }
   DNSResponseAction::Action operator()(DNSQuestion* dq, string* ruleresult) const override
   {
-    d_logger->logResponse(*dq);
+#ifdef HAVE_PROTOBUF
+    std::string data;
+    protobufMessageFromResponse(*dq, data);
+    d_logger->queueData(data);
+#endif /* HAVE_PROTOBUF */
     return Action::None;
   }
   string toString() const override
index 0aaf769e4caaa428f5a4edbc3bb8c045cf47ef50..39363bc1e173b8a679837451859b54db91e8b9b9 100644 (file)
@@ -85,7 +85,6 @@ extern SortList g_sortlist;
 #ifdef HAVE_PROTOBUF
 #include <boost/uuid/uuid.hpp>
 #include <boost/uuid/uuid_generators.hpp>
-#include <boost/uuid/uuid_io.hpp>
 #include "dnsmessage.pb.h"
 #endif
 
@@ -616,7 +615,10 @@ catch(...)
 #ifdef HAVE_PROTOBUF
 static void protobufFillMessageFromDC(PBDNSMessage& message, const DNSComboWriter* dc)
 {
-  message.set_messageid(boost::uuids::to_string(dc->d_uuid));
+  std::string* messageId = message.mutable_messageid();
+  messageId->resize(dc->d_uuid.size());
+  std::copy(dc->d_uuid.begin(), dc->d_uuid.end(), messageId->begin());
+
   message.set_socketfamily(dc->d_remote.sin4.sin_family == AF_INET ? PBDNSMessage_SocketFamily_INET : PBDNSMessage_SocketFamily_INET6);
   message.set_socketprotocol(dc->d_tcp ? PBDNSMessage_SocketProtocol_TCP : PBDNSMessage_SocketProtocol_UDP);
   if (dc->d_local.sin4.sin_family == AF_INET) {
@@ -646,6 +648,11 @@ static void protobufFillMessageFromDC(PBDNSMessage& message, const DNSComboWrite
   message.set_timesec(ts.tv_sec);
   message.set_timeusec(ts.tv_nsec / 1000);
   message.set_id(ntohs(dc->d_mdp.d_header.id));
+
+  PBDNSMessage_DNSQuestion* question = message.mutable_question();
+  question->set_qname(dc->d_mdp.d_qname.toString());
+  question->set_qtype(dc->d_mdp.d_qtype);
+  question->set_qclass(dc->d_mdp.d_qclass);
 }
 
 static void protobufLogQuery(const std::shared_ptr<RemoteLogger>& logger, const DNSComboWriter* dc)
@@ -655,12 +662,6 @@ static void protobufLogQuery(const std::shared_ptr<RemoteLogger>& logger, const
   message.set_inbytes(dc->d_query.length());
   protobufFillMessageFromDC(message, dc);
 
-  PBDNSMessage_DNSQuestion question;
-  question.set_qname(dc->d_mdp.d_qname.toString());
-  question.set_qtype(dc->d_mdp.d_qtype);
-  question.set_qclass(dc->d_mdp.d_qclass);
-  message.set_allocated_question(&question);
-
 //  cerr <<message.DebugString()<<endl;
   std::string str;
   message.SerializeToString(&str);