#endif
#include <bitset>
#include "dnsparser.hh"
+#include "dns_random.hh"
#include "iputils.hh"
#include <boost/program_options.hpp>
}
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") {
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;
}
}