From 2c85c1fd1114b8fef3ecec8a0062658929f16be1 Mon Sep 17 00:00:00 2001 From: Otto Moerbeek Date: Wed, 12 Jun 2024 11:28:25 +0200 Subject: [PATCH] rec: add nsName into outgoing protobuf request/response messages As there is no good existing field, I opted to add it as a meta field. We might want to make this optional, potentially clients could not expect this. TBD. --- contrib/ProtobufLogger.py | 2 +- pdns/recursordist/lwres.cc | 28 +++++++++++++++++----------- 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/contrib/ProtobufLogger.py b/contrib/ProtobufLogger.py index 760f82ed50..9cd6143422 100644 --- a/contrib/ProtobufLogger.py +++ b/contrib/ProtobufLogger.py @@ -286,7 +286,7 @@ class PDNSPBConnHandler(object): for entry in mt.value.intVal: values = ', '.join([values, str(entry)]) if values != '' else str(entry) - print('- %s -> %s' % (mt.key, values)) + print('- (meta) %s -> %s' % (mt.key, values)) def getRequestorSubnet(self, msg): requestorstr = None diff --git a/pdns/recursordist/lwres.cc b/pdns/recursordist/lwres.cc index 95f3dca2a2..7cc83ec6e7 100644 --- a/pdns/recursordist/lwres.cc +++ b/pdns/recursordist/lwres.cc @@ -154,7 +154,7 @@ static void logFstreamResponse(const std::shared_ptr>>& outgoingLoggers, const boost::optional& initialRequestId, const boost::uuids::uuid& uuid, const ComboAddress& address, const DNSName& domain, int type, uint16_t qid, bool doTCP, bool tls, size_t bytes, const boost::optional& srcmask) +static void logOutgoingQuery(const std::shared_ptr>>& outgoingLoggers, const boost::optional& initialRequestId, const boost::uuids::uuid& uuid, const ComboAddress& address, const DNSName& domain, int type, uint16_t qid, bool doTCP, bool tls, size_t bytes, const boost::optional& srcmask, const std::string& nsName) { if (!outgoingLoggers) { return; @@ -204,6 +204,9 @@ static void logOutgoingQuery(const std::shared_ptrlogQueries()) { remoteLoggerQueueData(*logger, buffer); @@ -211,7 +214,7 @@ static void logOutgoingQuery(const std::shared_ptr>>& outgoingLoggers, const boost::optional& initialRequestId, const boost::uuids::uuid& uuid, const ComboAddress& address, const DNSName& domain, int type, uint16_t qid, bool doTCP, bool tls, const boost::optional& srcmask, size_t bytes, int rcode, const std::vector& records, const struct timeval& queryTime, const std::set& exportTypes) +static void logIncomingResponse(const std::shared_ptr>>& outgoingLoggers, const boost::optional& initialRequestId, const boost::uuids::uuid& uuid, const ComboAddress& address, const DNSName& domain, int type, uint16_t qid, bool doTCP, bool tls, const boost::optional& srcmask, size_t bytes, int rcode, const std::vector& records, const struct timeval& queryTime, const std::set& exportTypes, const std::string nsName) { if (!outgoingLoggers) { return; @@ -259,6 +262,9 @@ static void logIncomingResponse(const std::shared_ptrrd = sendRDQuery; pw.getHeader()->id = qid; @@ -446,7 +456,7 @@ static LWResult::Result asyncresolve(const ComboAddress& address, const DNSName& if (outgoingLoggers) { uuid = getUniqueID(); - logOutgoingQuery(outgoingLoggers, context.d_initialRequestId, uuid, address, domain, type, qid, doTCP, dnsOverTLS, vpacket.size(), srcmask); + logOutgoingQuery(outgoingLoggers, context.d_initialRequestId, uuid, address, domain, type, qid, doTCP, dnsOverTLS, vpacket.size(), srcmask, nsName); } srcmask = boost::none; // this is also our return value, even if EDNS0Level == 0 @@ -503,10 +513,6 @@ static LWResult::Result asyncresolve(const ComboAddress& address, const DNSName& // peer has closed it on error, so we retry. At some point we // *will* get a new connection, so this loop is not endless. isNew = true; // tcpconnect() might throw for new connections. In that case, we want to break the loop, scanbuild complains here, which is a false positive afaik - std::string nsName; - if (!context.d_nsName.empty()) { - nsName = context.d_nsName.toStringNoDot(); - } isNew = tcpconnect(address, connection, dnsOverTLS, nsName); ret = tcpsendrecv(address, connection, localip, vpacket, len, buf); #ifdef HAVE_FSTRM @@ -533,7 +539,7 @@ static LWResult::Result asyncresolve(const ComboAddress& address, const DNSName& if (ret != LWResult::Result::Success) { // includes 'timeout' if (outgoingLoggers) { - logIncomingResponse(outgoingLoggers, context.d_initialRequestId, uuid, address, domain, type, qid, doTCP, dnsOverTLS, srcmask, 0, -1, {}, queryTime, exportTypes); + logIncomingResponse(outgoingLoggers, context.d_initialRequestId, uuid, address, domain, type, qid, doTCP, dnsOverTLS, srcmask, 0, -1, {}, queryTime, exportTypes, nsName); } return ret; } @@ -570,7 +576,7 @@ static LWResult::Result asyncresolve(const ComboAddress& address, const DNSName& if (mdp.d_header.rcode == RCode::FormErr && mdp.d_qname.empty() && mdp.d_qtype == 0 && mdp.d_qclass == 0) { if (outgoingLoggers) { - logIncomingResponse(outgoingLoggers, context.d_initialRequestId, uuid, address, domain, type, qid, doTCP, dnsOverTLS, srcmask, len, lwr->d_rcode, lwr->d_records, queryTime, exportTypes); + logIncomingResponse(outgoingLoggers, context.d_initialRequestId, uuid, address, domain, type, qid, doTCP, dnsOverTLS, srcmask, len, lwr->d_rcode, lwr->d_records, queryTime, exportTypes, nsName); } lwr->d_validpacket = true; return LWResult::Result::Success; // this is "success", the error is set in lwr->d_rcode @@ -617,7 +623,7 @@ static LWResult::Result asyncresolve(const ComboAddress& address, const DNSName& } if (outgoingLoggers) { - logIncomingResponse(outgoingLoggers, context.d_initialRequestId, uuid, address, domain, type, qid, doTCP, dnsOverTLS, srcmask, len, lwr->d_rcode, lwr->d_records, queryTime, exportTypes); + logIncomingResponse(outgoingLoggers, context.d_initialRequestId, uuid, address, domain, type, qid, doTCP, dnsOverTLS, srcmask, len, lwr->d_rcode, lwr->d_records, queryTime, exportTypes, nsName); } lwr->d_validpacket = true; @@ -635,7 +641,7 @@ static LWResult::Result asyncresolve(const ComboAddress& address, const DNSName& t_Counters.at(rec::Counter::serverParseError)++; if (outgoingLoggers) { - logIncomingResponse(outgoingLoggers, context.d_initialRequestId, uuid, address, domain, type, qid, doTCP, dnsOverTLS, srcmask, len, lwr->d_rcode, lwr->d_records, queryTime, exportTypes); + logIncomingResponse(outgoingLoggers, context.d_initialRequestId, uuid, address, domain, type, qid, doTCP, dnsOverTLS, srcmask, len, lwr->d_rcode, lwr->d_records, queryTime, exportTypes, nsName); } return LWResult::Result::Success; // success - oddly enough -- 2.47.2