From: Aki Tuomi Date: Fri, 14 Feb 2020 11:20:26 +0000 (+0200) Subject: dynhandler: Allow specifying master IP on retrieve X-Git-Tag: rec-4.4.0-beta1~25^2~2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c708d394bce8eaab990c719eff9739d54cefe853;p=thirdparty%2Fpdns.git dynhandler: Allow specifying master IP on retrieve Setting master IP allows overriding master location. This will also override slave requirement checks, allowing fetch of NATIVE and MASTER zones. --- diff --git a/pdns/dynhandler.cc b/pdns/dynhandler.cc index ced536034b..dc60be2abe 100644 --- a/pdns/dynhandler.cc +++ b/pdns/dynhandler.cc @@ -239,8 +239,8 @@ string DLNotifyRetrieveHandler(const vector&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&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<