]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
ixfrutils: add timeout to readSerialFromMaster
authorPieter Lexis <pieter.lexis@powerdns.com>
Fri, 24 Aug 2018 14:50:22 +0000 (16:50 +0200)
committerPieter Lexis <pieter.lexis@powerdns.com>
Fri, 24 Aug 2018 15:02:18 +0000 (17:02 +0200)
Make the error messages better in ixfrdist

pdns/ixfrdist.cc
pdns/ixfrutils.cc
pdns/ixfrutils.hh

index 4a768ddf4b984f777971578620dc25124e2460e6..24b930aff7ac0bdac32f480f6929038516933c0a 100644 (file)
@@ -287,7 +287,7 @@ void updateThread(const string& workdir, const uint16_t& keep, const uint16_t& a
           g_log<<Logger::Info<<", will update."<<endl;
         }
       } catch (runtime_error &e) {
-        g_log<<Logger::Warning<<"Unable to get SOA serial update for '"<<domain<<"': "<<e.what()<<endl;
+        g_log<<Logger::Warning<<"Unable to get SOA serial update for '"<<domain<<"' from master "<<master.toStringWithPort()<<": "<<e.what()<<endl;
         continue;
       }
       // Now get the full zone!
index 9617779ab0b766d21bb0a900b9abbb56cee45ad8..180b494291f99b193414db31bbcfe7e9a04049c4 100644 (file)
@@ -29,7 +29,7 @@
 #include "zoneparser-tng.hh"
 #include "dnsparser.hh"
 
-uint32_t getSerialFromMaster(const ComboAddress& master, const DNSName& zone, shared_ptr<SOARecordContent>& sr, const TSIGTriplet& tt)
+uint32_t getSerialFromMaster(const ComboAddress& master, const DNSName& zone, shared_ptr<SOARecordContent>& sr, const TSIGTriplet& tt, const uint16_t timeout)
 {
   vector<uint8_t> packet;
   DNSPacketWriter pw(packet, zone, QType::SOA);
@@ -49,10 +49,14 @@ uint32_t getSerialFromMaster(const ComboAddress& master, const DNSName& zone, sh
   s.writen(msg);
 
   string reply;
-  s.read(reply);
+  char buf[4096];
+  // will throw a NetworkError on timeout
+  s.readWithTimeout(buf, sizeof(buf), timeout);
+  reply.assign(buf);
+
   MOADNSParser mdp(false, reply);
   if(mdp.d_header.rcode) {
-    throw std::runtime_error("Unable to retrieve SOA serial from master '"+master.toStringWithPort()+"': "+RCode::to_s(mdp.d_header.rcode));
+    throw std::runtime_error("RCODE from response is not NoError but " + RCode::to_s(mdp.d_header.rcode));
   }
   for(const auto& r: mdp.d_answers) {
     if(r.first.d_type == QType::SOA) {
index f7e0c5a8486d51d4e6ba924b56fa80de1a478e84..1f31c974cec7dcaeab8555fe062726a4852f4015 100644 (file)
@@ -49,7 +49,7 @@ typedef multi_index_container <
     > /* indexed_by */
 > /* multi_index_container */ records_t;
 
-uint32_t getSerialFromMaster(const ComboAddress& master, const DNSName& zone, shared_ptr<SOARecordContent>& sr, const TSIGTriplet& tt = TSIGTriplet());
+uint32_t getSerialFromMaster(const ComboAddress& master, const DNSName& zone, shared_ptr<SOARecordContent>& sr, const TSIGTriplet& tt = TSIGTriplet(), const uint16_t timeout = 2);
 uint32_t getSerialsFromDir(const std::string& dir);
 uint32_t getSerialFromRecords(const records_t& records, DNSRecord& soaret);
 void writeZoneToDisk(const records_t& records, const DNSName& zone, const std::string& directory);