From 31b8de1fc496f972f401bee7d79fa0b31bcdf177 Mon Sep 17 00:00:00 2001 From: Wander Nauta Date: Thu, 28 Mar 2024 20:12:29 +0100 Subject: [PATCH 1/4] Hook DNSName formatting into fmt library --- dns-storage.cc | 5 +++++ dns-storage.hh | 3 ++- dnsmon.cc | 24 ++++++++++++------------ simplomon.hh | 7 +++---- 4 files changed, 22 insertions(+), 17 deletions(-) diff --git a/dns-storage.cc b/dns-storage.cc index ba16885..4fba7b6 100644 --- a/dns-storage.cc +++ b/dns-storage.cc @@ -224,3 +224,8 @@ std::string DNSName::toString() const str << *this; return str.str(); } + +std::string format_as(const DNSName& name) +{ + return name.toString(); +} diff --git a/dns-storage.hh b/dns-storage.hh index 514bbc5..0fe0403 100644 --- a/dns-storage.hh +++ b/dns-storage.hh @@ -166,8 +166,9 @@ struct DNSName std::deque d_name; }; -// printing, concatenation +// printing, fmt formatting, concatenation std::ostream & operator<<(std::ostream &os, const DNSName& d); +std::string format_as(const DNSName& name); DNSName operator+(const DNSName& a, const DNSName& b); DNSName makeDNSName(const std::string& str); diff --git a/dnsmon.cc b/dnsmon.cc index 6056553..27d70f2 100644 --- a/dnsmon.cc +++ b/dnsmon.cc @@ -110,7 +110,7 @@ CheckResult DNSChecker::perform() double timeo=0.5; if(!waitForData(sock, &timeo)) { // timeout return fmt::format("Timeout asking DNS question for {}|{} to {}", - d_qname.toString(), toString(d_qtype), d_nsip.toStringWithPort()); + d_qname, toString(d_qtype), d_nsip.toStringWithPort()); } @@ -129,7 +129,7 @@ CheckResult DNSChecker::perform() if((RCode)dmr.dh.rcode != RCode::Noerror) { return fmt::format("Got DNS response with RCode {} from {} for question {}|{}", - toString((RCode)dmr.dh.rcode), d_qname.toString(), d_nsip.toStringWithPort(), toString(d_qtype)); + toString((RCode)dmr.dh.rcode), d_qname, d_nsip.toStringWithPort(), toString(d_qtype)); } std::unique_ptr rr; @@ -148,12 +148,12 @@ CheckResult DNSChecker::perform() for(const auto& a : d_acceptable) acc.insert(makeDNSName(a)); if(!acc.count(dynamic_cast(rr.get())->d_name)) { - return fmt::format("Unacceptable DNS answer {} for question {} from {}. Acceptable: {}", rr->toString(), d_qname.toString(), d_nsip.toStringWithPort(), d_acceptable); + return fmt::format("Unacceptable DNS answer {} for question {} from {}. Acceptable: {}", rr->toString(), d_qname, d_nsip.toStringWithPort(), d_acceptable); } else matches++; } else if(!d_acceptable.count(rr->toString())) { - return fmt::format("Unacceptable DNS answer {} for question {} from {}. Acceptable: {}", rr->toString(), d_qname.toString(), d_nsip.toStringWithPort(), d_acceptable); + return fmt::format("Unacceptable DNS answer {} for question {} from {}. Acceptable: {}", rr->toString(), d_qname, d_nsip.toStringWithPort(), d_acceptable); } else matches++; } @@ -166,7 +166,7 @@ CheckResult DNSChecker::perform() return ""; } else { - return fmt::format("No matching answer to question {}|{} to {} was received", d_qname.toString(), toString(d_qtype), d_nsip.toStringWithPort()); + return fmt::format("No matching answer to question {}|{} to {} was received", d_qname, toString(d_qtype), d_nsip.toStringWithPort()); } } @@ -203,7 +203,7 @@ CheckResult DNSSOAChecker::perform() double timeo=0.5; if(!waitForData(sock, &timeo)) { // timeout return fmt::format("Timeout asking DNS question for {}|{} to {}", - d_domain.toString(), toString(DNSType::SOA), s.toStringWithPort()); + d_domain, toString(DNSType::SOA), s.toStringWithPort()); } string resp = SRecvfrom(sock, 65535, server); @@ -220,7 +220,7 @@ CheckResult DNSSOAChecker::perform() if((RCode)dmr.dh.rcode != RCode::Noerror) { return fmt::format("Got DNS response with RCode {} for question {}|{}", - toString((RCode)dmr.dh.rcode), d_domain.toString(), toString(DNSType::SOA)); + toString((RCode)dmr.dh.rcode), d_domain, toString(DNSType::SOA)); } std::unique_ptr rr; @@ -279,7 +279,7 @@ CheckResult RRSIGChecker::perform() double timeo=1.0; if(!waitForData(sock, &timeo)) { // timeout return fmt::format("Timeout asking DNS question for {}|{} to {}", - d_qname.toString(), toString(d_qtype), d_nsip.toStringWithPort()); + d_qname, toString(d_qtype), d_nsip.toStringWithPort()); } @@ -295,7 +295,7 @@ CheckResult RRSIGChecker::perform() if((RCode)dmr.dh.rcode != RCode::Noerror) { return fmt::format("Got DNS response with RCode {} from {} for question {}|{}", - toString((RCode)dmr.dh.rcode), d_qname.toString(), d_nsip.toStringWithPort(), toString(d_qtype)); + toString((RCode)dmr.dh.rcode), d_qname, d_nsip.toStringWithPort(), toString(d_qtype)); } std::unique_ptr rr; @@ -319,10 +319,10 @@ CheckResult RRSIGChecker::perform() if(now + d_minDays * 86400 > expire) return fmt::format("Got RRSIG that expires in {:.0f} days for {}|{} from {}, valid from {:%Y-%m-%d %H:%M} to {:%Y-%m-%d %H:%M} UTC", (expire - now)/86400.0, - d_qname.toString(), toString(d_qtype), d_nsip.toStringWithPort(), tmstart, tmend); + d_qname, toString(d_qtype), d_nsip.toStringWithPort(), tmstart, tmend); else if(now < inception) { fmt::print("Got RRSIG that is not yet active for {}|{} from {}, valid from {:%Y-%m-%d %H:%M} to {:%Y-%m-%d %H:%M} UTC\n", - d_qname.toString(), toString(d_qtype), d_nsip.toStringWithPort(), tmstart, tmend); + d_qname, toString(d_qtype), d_nsip.toStringWithPort(), tmstart, tmend); } else @@ -330,7 +330,7 @@ CheckResult RRSIGChecker::perform() } } if(!valid) - return fmt::format("Did not find an active RRSIG for {}|{} over at server {}", d_qname.toString(), toString(d_qtype), d_nsip.toStringWithPort()); + return fmt::format("Did not find an active RRSIG for {}|{} over at server {}", d_qname, toString(d_qtype), d_nsip.toStringWithPort()); return ""; } diff --git a/simplomon.hh b/simplomon.hh index e65ef81..6c89798 100644 --- a/simplomon.hh +++ b/simplomon.hh @@ -118,7 +118,7 @@ public: std::string getDescription() override { return fmt::format("DNS check, server {}, qname {}, qtype {}, acceptable: {}", - d_nsip.toStringWithPort(), d_qname.toString(), toString(d_qtype), d_acceptable); + d_nsip.toStringWithPort(), d_qname, toString(d_qtype), d_acceptable); } private: ComboAddress d_nsip; @@ -138,7 +138,7 @@ public: std::string getDescription() override { return fmt::format("RRSIG check, server {}, qname {}, qtype {}, minDays: {}", - d_nsip.toStringWithPort(), d_qname.toString(), toString(d_qtype), d_minDays); + d_nsip.toStringWithPort(), d_qname, toString(d_qtype), d_minDays); } private: @@ -159,8 +159,7 @@ public: { std::vector servers; for(const auto& s : d_servers) servers.push_back(s.toStringWithPort()); - return fmt::format("DNS SOA check, servers {}, domain {}", - servers, d_domain.toString()); + return fmt::format("DNS SOA check, servers {}, domain {}", servers, d_domain); } private: From 445de86ca6a5b78d80a294f45a40834c0cee843e Mon Sep 17 00:00:00 2001 From: Wander Nauta Date: Thu, 28 Mar 2024 20:23:55 +0100 Subject: [PATCH 2/4] Hook DNSType formatting into fmt library --- dnsmon.cc | 31 +++++++++++++------------------ nenum.hh | 4 +++- simplomon.hh | 7 +++---- 3 files changed, 19 insertions(+), 23 deletions(-) diff --git a/dnsmon.cc b/dnsmon.cc index 27d70f2..d57d85b 100644 --- a/dnsmon.cc +++ b/dnsmon.cc @@ -109,8 +109,7 @@ CheckResult DNSChecker::perform() double timeo=0.5; if(!waitForData(sock, &timeo)) { // timeout - return fmt::format("Timeout asking DNS question for {}|{} to {}", - d_qname, toString(d_qtype), d_nsip.toStringWithPort()); + return fmt::format("Timeout asking DNS question for {}|{} to {}", d_qname, d_qtype, d_nsip.toStringWithPort()); } @@ -129,7 +128,7 @@ CheckResult DNSChecker::perform() if((RCode)dmr.dh.rcode != RCode::Noerror) { return fmt::format("Got DNS response with RCode {} from {} for question {}|{}", - toString((RCode)dmr.dh.rcode), d_qname, d_nsip.toStringWithPort(), toString(d_qtype)); + toString((RCode)dmr.dh.rcode), d_qname, d_nsip.toStringWithPort(), d_qtype); } std::unique_ptr rr; @@ -166,7 +165,7 @@ CheckResult DNSChecker::perform() return ""; } else { - return fmt::format("No matching answer to question {}|{} to {} was received", d_qname, toString(d_qtype), d_nsip.toStringWithPort()); + return fmt::format("No matching answer to question {}|{} to {} was received", d_qname, d_qtype, d_nsip.toStringWithPort()); } } @@ -202,8 +201,7 @@ CheckResult DNSSOAChecker::perform() double timeo=0.5; if(!waitForData(sock, &timeo)) { // timeout - return fmt::format("Timeout asking DNS question for {}|{} to {}", - d_domain, toString(DNSType::SOA), s.toStringWithPort()); + return fmt::format("Timeout asking DNS question for {}|{} to {}", d_domain, DNSType::SOA, s.toStringWithPort()); } string resp = SRecvfrom(sock, 65535, server); @@ -220,7 +218,7 @@ CheckResult DNSSOAChecker::perform() if((RCode)dmr.dh.rcode != RCode::Noerror) { return fmt::format("Got DNS response with RCode {} for question {}|{}", - toString((RCode)dmr.dh.rcode), d_domain, toString(DNSType::SOA)); + toString((RCode)dmr.dh.rcode), d_domain, DNSType::SOA); } std::unique_ptr rr; @@ -233,13 +231,11 @@ CheckResult DNSSOAChecker::perform() } } if(!matches) { - return fmt::format("DNS server {} did not return a SOA for {}", - s.toStringWithPort(), d_domain.toString()); + return fmt::format("DNS server {} did not return a SOA for {}", s.toStringWithPort(), d_domain); } } if(harvest.size() != 1) { - return fmt::format("Had different SOA records for {}: {}", - d_domain.toString(), harvest); + return fmt::format("Had different SOA records for {}: {}", d_domain, harvest); } else { return ""; @@ -278,8 +274,7 @@ CheckResult RRSIGChecker::perform() double timeo=1.0; if(!waitForData(sock, &timeo)) { // timeout - return fmt::format("Timeout asking DNS question for {}|{} to {}", - d_qname, toString(d_qtype), d_nsip.toStringWithPort()); + return fmt::format("Timeout asking DNS question for {}|{} to {}", d_qname, d_qtype, d_nsip.toStringWithPort()); } @@ -295,7 +290,7 @@ CheckResult RRSIGChecker::perform() if((RCode)dmr.dh.rcode != RCode::Noerror) { return fmt::format("Got DNS response with RCode {} from {} for question {}|{}", - toString((RCode)dmr.dh.rcode), d_qname, d_nsip.toStringWithPort(), toString(d_qtype)); + toString((RCode)dmr.dh.rcode), d_qname, d_nsip.toStringWithPort(), d_qtype); } std::unique_ptr rr; @@ -304,7 +299,7 @@ CheckResult RRSIGChecker::perform() if(rrsection == DNSSection::Answer && dt == DNSType::RRSIG && dn == d_qname) { auto rrsig = dynamic_cast(rr.get()); if(rrsig->d_type != d_qtype) { - fmt::print("Skipping wrong type {}\n", toString(rrsig->d_type)); + fmt::print("Skipping wrong type {}\n", rrsig->d_type); continue; } struct tm tmstart={}, tmend={}; @@ -319,10 +314,10 @@ CheckResult RRSIGChecker::perform() if(now + d_minDays * 86400 > expire) return fmt::format("Got RRSIG that expires in {:.0f} days for {}|{} from {}, valid from {:%Y-%m-%d %H:%M} to {:%Y-%m-%d %H:%M} UTC", (expire - now)/86400.0, - d_qname, toString(d_qtype), d_nsip.toStringWithPort(), tmstart, tmend); + d_qname, d_qtype, d_nsip.toStringWithPort(), tmstart, tmend); else if(now < inception) { fmt::print("Got RRSIG that is not yet active for {}|{} from {}, valid from {:%Y-%m-%d %H:%M} to {:%Y-%m-%d %H:%M} UTC\n", - d_qname, toString(d_qtype), d_nsip.toStringWithPort(), tmstart, tmend); + d_qname, d_qtype, d_nsip.toStringWithPort(), tmstart, tmend); } else @@ -330,7 +325,7 @@ CheckResult RRSIGChecker::perform() } } if(!valid) - return fmt::format("Did not find an active RRSIG for {}|{} over at server {}", d_qname, toString(d_qtype), d_nsip.toStringWithPort()); + return fmt::format("Did not find an active RRSIG for {}|{} over at server {}", d_qname, d_qtype, d_nsip.toStringWithPort()); return ""; } diff --git a/nenum.hh b/nenum.hh index 672e5d8..c5e0fc8 100644 --- a/nenum.hh +++ b/nenum.hh @@ -37,7 +37,9 @@ inline x make##x(const char* from) { \ } \ inline std::ostream& operator<<(std::ostream &os, const x& s) { \ os << toString(s); return os; } \ - +inline std::string format_as(const x& s) { \ + return toString(s); } \ + #define COMBOENUM4(x, a1,b1,a2,b2,a3,b3,a4,b4) enum class x : uint16_t { \ a1=b1, a2=b2, a3=b3, a4=b4 }; SMARTENUMSTART(x) SENUM4(x, a1, a2, a3,a4) \ SMARTENUMEND(x) diff --git a/simplomon.hh b/simplomon.hh index 6c89798..a5d8b93 100644 --- a/simplomon.hh +++ b/simplomon.hh @@ -118,7 +118,7 @@ public: std::string getDescription() override { return fmt::format("DNS check, server {}, qname {}, qtype {}, acceptable: {}", - d_nsip.toStringWithPort(), d_qname, toString(d_qtype), d_acceptable); + d_nsip.toStringWithPort(), d_qname, d_qtype, d_acceptable); } private: ComboAddress d_nsip; @@ -138,7 +138,7 @@ public: std::string getDescription() override { return fmt::format("RRSIG check, server {}, qname {}, qtype {}, minDays: {}", - d_nsip.toStringWithPort(), d_qname, toString(d_qtype), d_minDays); + d_nsip.toStringWithPort(), d_qname, d_qtype, d_minDays); } private: @@ -303,8 +303,7 @@ public: std::string getCheckerName() override { return "smtp"; } std::string getDescription() override { - return fmt::format("SMTP check for {}", - d_server.toStringWithPort()); + return fmt::format("SMTP check for {}", d_server.toStringWithPort()); } private: From 221a1c90a4e98debdf823aee3748fbb7ecc0bd22 Mon Sep 17 00:00:00 2001 From: Wander Nauta Date: Thu, 28 Mar 2024 20:28:14 +0100 Subject: [PATCH 3/4] Use enum fmt formatting for RCodes --- dnsmon.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/dnsmon.cc b/dnsmon.cc index d57d85b..f9e1ec0 100644 --- a/dnsmon.cc +++ b/dnsmon.cc @@ -128,7 +128,7 @@ CheckResult DNSChecker::perform() if((RCode)dmr.dh.rcode != RCode::Noerror) { return fmt::format("Got DNS response with RCode {} from {} for question {}|{}", - toString((RCode)dmr.dh.rcode), d_qname, d_nsip.toStringWithPort(), d_qtype); + (RCode)dmr.dh.rcode, d_qname, d_nsip.toStringWithPort(), d_qtype); } std::unique_ptr rr; @@ -218,7 +218,7 @@ CheckResult DNSSOAChecker::perform() if((RCode)dmr.dh.rcode != RCode::Noerror) { return fmt::format("Got DNS response with RCode {} for question {}|{}", - toString((RCode)dmr.dh.rcode), d_domain, DNSType::SOA); + (RCode)dmr.dh.rcode, d_domain, DNSType::SOA); } std::unique_ptr rr; @@ -290,7 +290,7 @@ CheckResult RRSIGChecker::perform() if((RCode)dmr.dh.rcode != RCode::Noerror) { return fmt::format("Got DNS response with RCode {} from {} for question {}|{}", - toString((RCode)dmr.dh.rcode), d_qname, d_nsip.toStringWithPort(), d_qtype); + (RCode)dmr.dh.rcode, d_qname, d_nsip.toStringWithPort(), d_qtype); } std::unique_ptr rr; From e682fd63f05939e16a878ea40d1554fafcb2ddc7 Mon Sep 17 00:00:00 2001 From: Wander Nauta Date: Sun, 7 Apr 2024 10:49:05 +0200 Subject: [PATCH 4/4] Use format_as in fmt calls in sendQuery function --- support.cc | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/support.cc b/support.cc index 043985a..be95020 100644 --- a/support.cc +++ b/support.cc @@ -43,9 +43,7 @@ static DNSMessageReader sendQuery(const vector& resolvers, DNSName } if(dmr.dh.tc) { - throw std::runtime_error(fmt::format("Needed to do TCP DNS for {}|{} which we can't", - dn.toString(), toString(dt)) - ); + throw std::runtime_error(fmt::format("Needed to do TCP DNS for {}|{} which we can't", dn, dt)); // shit } else @@ -54,9 +52,7 @@ static DNSMessageReader sendQuery(const vector& resolvers, DNSName catch(...){} } } - throw std::runtime_error(fmt::format("No DNS server could be reached or responded trying to resolve '{}|{}'", - dn.toString(), toString(dt)) - ); + throw std::runtime_error(fmt::format("No DNS server could be reached or responded trying to resolve '{}|{}'", dn, dt)); }