]> granicus.if.org Git - pdns/commitdiff
remotebackend: Implement getAllDomains
authorAki Tuomi <cmouse@cmouse.fi>
Tue, 31 May 2016 11:09:59 +0000 (14:09 +0300)
committerAki Tuomi <cmouse@cmouse.fi>
Tue, 31 May 2016 11:26:03 +0000 (14:26 +0300)
modules/remotebackend/httpconnector.cc
modules/remotebackend/remotebackend.cc
modules/remotebackend/remotebackend.hh

index 9a8fdea1d2410cfb6017f23325d8c82acefbbfaf..9f10fa9a381ef9208634f415b85cb137c6897854 100644 (file)
@@ -221,6 +221,9 @@ void HTTPConnector::restful_requestbuilder(const std::string &method, const Json
         req.GET()["pattern"] = parameters["pattern"].string_value();
         req.GET()["maxResults"] = std::to_string(parameters["maxResults"].int_value());
         verb = "GET";
+   } else if (method == "getAllDomains") {
+        req.GET()["includeDisabled"] = (parameters["include_disabled"].bool_value()?"true":"false");
+        verb = "GET";
     } else {
         // perform normal get
         verb = "GET";
index a42a9204fb57c1a85b22d8626dc2728546fe2f1e..5261120db12c5bf8ace3d1429486b1d3e30bab43 100644 (file)
@@ -531,31 +531,20 @@ bool RemoteBackend::getTSIGKeys(std::vector<struct TSIGKey>& keys) {
    return true;
 }
 
-bool RemoteBackend::getDomainInfo(const DNSName& domain, DomainInfo &di) {
-   if (domain.empty()) return false;
-   Json query = Json::object{
-     { "method", "getDomainInfo" },
-     { "parameters", Json::object {
-       { "name", domain.toString() }
-     }}
-   };
-
-   Json answer;
-   if (this->send(query) == false || this->recv(answer) == false)
-     return false;
-
-   di.id = intFromJson(answer["result"], "id", -1);
-   di.zone = DNSName(stringFromJson(answer["result"], "zone"));
-   for(const auto& master: answer["result"]["masters"].array_items())
+void RemoteBackend::parseDomainInfo(const Json &obj, DomainInfo &di)
+{
+   di.id = intFromJson(obj, "id", -1);
+   di.zone = DNSName(stringFromJson(obj, "zone"));
+   for(const auto& master: obj["masters"].array_items())
      di.masters.push_back(master.string_value());
 
-   di.notified_serial = static_cast<unsigned int>(doubleFromJson(answer["result"], "notified_serial", -1));
-   di.serial = static_cast<unsigned int>(answer["result"]["serial"].number_value());
-   di.last_check = static_cast<time_t>(answer["result"]["last_check"].number_value());
+   di.notified_serial = static_cast<unsigned int>(doubleFromJson(obj, "notified_serial", -1));
+   di.serial = static_cast<unsigned int>(obj["serial"].number_value());
+   di.last_check = static_cast<time_t>(obj["last_check"].number_value());
 
    string kind = "";
-   if (answer["result"]["kind"].is_string()) {
-     kind = stringFromJson(answer["result"], "kind");
+   if (obj["kind"].is_string()) {
+     kind = stringFromJson(obj, "kind");
    }
    if (kind == "master") {
       di.kind = DomainInfo::Master;
@@ -565,6 +554,22 @@ bool RemoteBackend::getDomainInfo(const DNSName& domain, DomainInfo &di) {
       di.kind = DomainInfo::Native;
    }
    di.backend = this;
+}
+
+bool RemoteBackend::getDomainInfo(const DNSName& domain, DomainInfo &di) {
+   if (domain.empty()) return false;
+   Json query = Json::object{
+     { "method", "getDomainInfo" },
+     { "parameters", Json::object {
+       { "name", domain.toString() }
+     }}
+   };
+
+   Json answer;
+   if (this->send(query) == false || this->recv(answer) == false)
+     return false;
+
+   this->parseDomainInfo(answer["result"], di);
    return true;
 }
 
@@ -905,6 +910,29 @@ bool RemoteBackend::searchComments(const string &pattern, int maxResults, vector
   return false;
 }
 
+void RemoteBackend::getAllDomains(vector<DomainInfo> *domains, bool include_disabled)
+{
+  Json query = Json::object{
+    { "method", "getAllDomains" },
+    { "parameters", Json::object{
+      { "include_disabled", include_disabled }
+    }}
+  };
+
+  Json answer;
+  if (this->send(query) == false || this->recv(answer) == false)
+    return;
+
+  if (answer["result"].is_array() == false)
+    return;
+  
+  for(const auto& row: answer["result"].array_items()) {
+    DomainInfo di;
+    this->parseDomainInfo(row, di);
+    domains->push_back(di);
+  }
+}
+
 DNSBackend *RemoteBackend::maker()
 {
    try {
@@ -916,6 +944,8 @@ DNSBackend *RemoteBackend::maker()
    };
 }
 
+
+
 class RemoteBackendFactory : public BackendFactory
 {
   public:
index 8e0ffa5e63de06a9225921421a6f3aa37be542a6..1299ac7dc2f9c0cac988ad62ae1aeebe6d64745a 100644 (file)
@@ -167,6 +167,7 @@ class RemoteBackend : public DNSBackend
   virtual string directBackendCmd(const string& querystr);
   virtual bool searchRecords(const string &pattern, int maxResults, vector<DNSResourceRecord>& result);
   virtual bool searchComments(const string &pattern, int maxResults, vector<Comment>& result);
+  virtual void getAllDomains(vector<DomainInfo> *domains, bool include_disabled=false);
 
   static DNSBackend *maker();
 
@@ -198,5 +199,7 @@ class RemoteBackend : public DNSBackend
       } catch (JsonException) {};
       throw JsonException("Json value not convertible to boolean");
     };
+
+    void parseDomainInfo(const json11::Json &obj, DomainInfo &di);
 };
 #endif