]> git.ipfire.org Git - thirdparty/pdns.git/blobdiff - pdns/notify.cc
auth: switch circleci mssql image
[thirdparty/pdns.git] / pdns / notify.cc
index 270aaad3640e9470b26f338a90abcb285ef4a98c..1ec0c11d64ee7baed789f5b747c5eca93f69fce6 100644 (file)
@@ -24,6 +24,7 @@
 #endif
 #include <bitset>
 #include "dnsparser.hh"
+#include "dns_random.hh"
 #include "iputils.hh"
 #include <boost/program_options.hpp>
 
@@ -52,13 +53,15 @@ ArgvMap &arg()
 }
 
 void usage() {
-  cerr<<"Syntax: pdns_notify IP_ADDRESS[:PORT] DOMAIN"<<endl;
+  cerr<<"Syntax: pdns_notify IP_ADDRESS/HOSTNAME[:PORT] DOMAIN"<<endl;
 }
 
 int main(int argc, char** argv)
 try
 {
   set<ComboAddress> addrs;
+  ::arg().set("rng")="auto";
+  ::arg().set("entropy-source")="/dev/urandom";
 
   for(int n=1 ; n < argc; ++n) {
     if ((string) argv[n] == "--help") {
@@ -107,31 +110,57 @@ try
     if(sock < 0)
       throw runtime_error("Creating socket for incoming packets: "+stringerror());
     if(connect(sock, (struct sockaddr*)&addr, addr.getSocklen()) < 0) {
-      cerr<<"Failed to connect PowerDNS socket to address "+addr.toString()+": "+stringerror()<<endl;
+      cerr<<"Failed to connect to address "+addr.toStringWithPort()+": "+stringerror()<<endl;
       continue;
     }
     vector<uint8_t> outpacket;
     DNSPacketWriter pw(outpacket, DNSName(argv[2]), QType::SOA, 1, Opcode::Notify);
-    pw.getHeader()->id = random();
-
+    pw.getHeader()->id = dns_random(UINT16_MAX);
 
     if(send(sock, &outpacket[0], outpacket.size(), 0) < 0) {
-      cerr<<"Unable to send notify to PowerDNS: "+stringerror()<<endl;
+      cerr<<"Unable to send notify to "<<addr.toStringWithPort()<<": "+stringerror()<<endl;
       continue;
     }
 
     char buffer[1500];
+    fd_set rfds;
+    FD_ZERO(&rfds);
+    FD_SET(sock, &rfds);
+    fd_set errfds;
+    FD_ZERO(&errfds);
+    FD_SET(sock, &errfds);
+    int len;
+    struct timeval tv;
+    bool timeout = true;
+
+    for(int tries=0; tries<60; tries++) {
+      tv.tv_sec = 1;
+      tv.tv_usec = 0;
+      if ((len = select(sock+1, &rfds, nullptr, &errfds, &tv)) > 0) {
+        len = recv(sock, buffer, sizeof(buffer), 0);
+        timeout = false;
+        break;
+      }
+    }
 
-    int len=recv(sock, buffer, sizeof(buffer),0);
     if(len < 0) {
-      cerr<<"Unable to receive notification response from PowerDNS: "+stringerror()<<endl;
+      cerr<<"Unable to receive notification response from "<<addr.toStringWithPort()<<": "+stringerror()<<endl;
+      continue;
+    } else if (timeout) {
+      cerr<<"Unable to receive notification response from "<<addr.toStringWithPort()<<": Timed out"<<endl;
+      continue;
+    } else if (len == 0) {
+      cerr<<"Unable to receive notification response from "<<addr.toStringWithPort()<<": EOF"<<endl;
       continue;
     }
 
     string packet(buffer, len);
     MOADNSParser mdp(false, packet);
 
-    cerr<<addr.toString()<<": Received notification response with error: "<<RCode::to_s(mdp.d_header.rcode)<<endl;
+    if (mdp.d_header.rcode == 0)
+      cerr<<"Successfully notified "<<addr.toStringWithPort()<<endl;
+    else
+      cerr<<"Received notification response with error from "<<addr.toStringWithPort()<<": "<<RCode::to_s(mdp.d_header.rcode)<<endl;
     cerr<<"For: '"<<mdp.d_qname<<"'"<<endl;
   }
 }