]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
dynhandler: Allow specifying master IP on retrieve
authorAki Tuomi <cmouse@cmouse.fi>
Fri, 14 Feb 2020 11:20:26 +0000 (13:20 +0200)
committerAki Tuomi <cmouse@cmouse.fi>
Wed, 19 Aug 2020 07:34:42 +0000 (10:34 +0300)
Setting master IP allows overriding master location. This will
also override slave requirement checks, allowing fetch of NATIVE
and MASTER zones.

pdns/dynhandler.cc

index ced536034b01d919ff7e6c8b30f0091b26395a5d..dc60be2abe9e419e70fbc8aee1a1d146031d8d02 100644 (file)
@@ -239,8 +239,8 @@ string DLNotifyRetrieveHandler(const vector<string>&parts, Utility::pid_t ppid)
 {
   extern CommunicatorClass Communicator;
   ostringstream os;
-  if(parts.size()!=2)
-    return "syntax: retrieve domain";
+  if(parts.size()!=2 && parts.size()!=3)
+    return "syntax: retrieve domain [ip]";
 
   DNSName domain;
   try {
@@ -249,17 +249,34 @@ string DLNotifyRetrieveHandler(const vector<string>&parts, Utility::pid_t ppid)
     return "Failed to parse domain as valid DNS name";
   }
 
+  ComboAddress master_ip;
+  bool override_master = false;
+  if (parts.size() == 3) {
+    try {
+      master_ip = ComboAddress{parts[2], 53};
+    } catch (...) {
+      return "Invalid master address";
+    }
+    override_master = true;
+  }
+
   DomainInfo di;
   UeberBackend B;
-  if(!B.getDomainInfo(domain, di))
-    return "Domain '"+domain.toString()+"' unknown";
-  
-  if(di.kind != DomainInfo::Slave || di.masters.empty())
+  if(!B.getDomainInfo(domain, di)) {
+    return " Domain '"+domain.toString()+"' unknown";
+  }
+
+  if (override_master) {
+    di.masters.clear();
+    di.masters.push_back(master_ip);
+  }
+
+  if(!override_master && (di.kind != DomainInfo::Slave || di.masters.empty()))
     return "Domain '"+domain.toString()+"' is not a slave domain (or has no master defined)";
 
   shuffle(di.masters.begin(), di.masters.end(), pdns::dns_random_engine());
   auto master = di.masters.front();
-  Communicator.addSuckRequest(domain, master);
+  Communicator.addSuckRequest(domain, master, override_master);
   g_log<<Logger::Warning<<"Retrieval request for domain '"<<domain<<"' from master '"<<master<<"' received from operator"<<endl;
   return "Added retrieval request for '"+domain.toLogString()+"' from master "+master.toLogString();
 }