From e3991e7e43faeacb3aaf1871c8aa32ddf974ff7f Mon Sep 17 00:00:00 2001 From: Aki Tuomi Date: Tue, 31 May 2016 14:09:59 +0300 Subject: [PATCH] remotebackend: Implement getAllDomains --- modules/remotebackend/httpconnector.cc | 3 ++ modules/remotebackend/remotebackend.cc | 72 ++++++++++++++++++-------- modules/remotebackend/remotebackend.hh | 3 ++ 3 files changed, 57 insertions(+), 21 deletions(-) diff --git a/modules/remotebackend/httpconnector.cc b/modules/remotebackend/httpconnector.cc index 9a8fdea1d..9f10fa9a3 100644 --- a/modules/remotebackend/httpconnector.cc +++ b/modules/remotebackend/httpconnector.cc @@ -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"; diff --git a/modules/remotebackend/remotebackend.cc b/modules/remotebackend/remotebackend.cc index a42a9204f..5261120db 100644 --- a/modules/remotebackend/remotebackend.cc +++ b/modules/remotebackend/remotebackend.cc @@ -531,31 +531,20 @@ bool RemoteBackend::getTSIGKeys(std::vector& 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(doubleFromJson(answer["result"], "notified_serial", -1)); - di.serial = static_cast(answer["result"]["serial"].number_value()); - di.last_check = static_cast(answer["result"]["last_check"].number_value()); + di.notified_serial = static_cast(doubleFromJson(obj, "notified_serial", -1)); + di.serial = static_cast(obj["serial"].number_value()); + di.last_check = static_cast(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 *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: diff --git a/modules/remotebackend/remotebackend.hh b/modules/remotebackend/remotebackend.hh index 8e0ffa5e6..1299ac7dc 100644 --- a/modules/remotebackend/remotebackend.hh +++ b/modules/remotebackend/remotebackend.hh @@ -167,6 +167,7 @@ class RemoteBackend : public DNSBackend virtual string directBackendCmd(const string& querystr); virtual bool searchRecords(const string &pattern, int maxResults, vector& result); virtual bool searchComments(const string &pattern, int maxResults, vector& result); + virtual void getAllDomains(vector *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 -- 2.40.0