From: Aki Tuomi Date: Thu, 30 Jul 2015 17:23:29 +0000 (+0300) Subject: Add support for searchRecords to RemoteBackend X-Git-Tag: dnsdist-1.0.0-alpha1~248^2~58^2~2^2~4 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=efc5a8462765d26d4884c0fa72960b1b9f243f0a;p=thirdparty%2Fpdns.git Add support for searchRecords to RemoteBackend --- diff --git a/modules/remotebackend/httpconnector.cc b/modules/remotebackend/httpconnector.cc index d2d6cb7866..e809a1f254 100644 --- a/modules/remotebackend/httpconnector.cc +++ b/modules/remotebackend/httpconnector.cc @@ -245,6 +245,11 @@ void HTTPConnector::restful_requestbuilder(const std::string &method, const rapi req.POST()["query"] = sparam; req.preparePost(); verb = "POST"; + } else if (method == "searchRecords" || method == "searchComments") { + json2string(parameters["pattern"],sparam); + req.GET()["pattern"] = sparam; + req.GET()["maxResults"] = boost::lexical_cast(parameters["maxResults"].GetInt()); + verb = "GET"; } else { // perform normal get verb = "GET"; diff --git a/modules/remotebackend/remotebackend.cc b/modules/remotebackend/remotebackend.cc index 2bdb71c4c5..f1b3bad06f 100644 --- a/modules/remotebackend/remotebackend.cc +++ b/modules/remotebackend/remotebackend.cc @@ -954,6 +954,55 @@ string RemoteBackend::directBackendCmd(const string& querystr) { return getString(answer["result"]); } +bool RemoteBackend::searchRecords(const string &pattern, int maxResults, vector& result) +{ + rapidjson::Document query,answer; + rapidjson::Value parameters; + + query.SetObject(); + JSON_ADD_MEMBER(query, "method", "searchRecords", query.GetAllocator()); + parameters.SetObject(); + JSON_ADD_MEMBER(parameters, "pattern", pattern.c_str(), query.GetAllocator()); + JSON_ADD_MEMBER(parameters, "maxResults", maxResults, query.GetAllocator()); + query.AddMember("parameters", parameters, query.GetAllocator()); + + if (this->send(query) == false || this->recv(answer) == false) + return false; + + if (answer["result"].IsArray() == false) + return false; + + for(rapidjson::SizeType i = 0; i < answer["result"].Size(); i++) { + DNSResourceRecord rr; + rapidjson::Value value; + value = ""; + rr.qtype = getString(JSON_GET((*d_result)["result"][d_index], "qtype", value)); + rr.qname = getString(JSON_GET((*d_result)["result"][d_index], "qname", value)); + rr.qclass = QClass::IN; + rr.content = getString(JSON_GET((*d_result)["result"][d_index], "content",value)); + value = -1; + rr.ttl = getInt(JSON_GET((*d_result)["result"][d_index], "ttl",value)); + rr.domain_id = getInt(JSON_GET((*d_result)["result"][d_index],"domain_id",value)); + value = 1; + if (d_dnssec) + rr.auth = getInt(JSON_GET((*d_result)["result"][d_index],"auth", value)); + else + rr.auth = 1; + value = 0; + rr.scopeMask = getInt(JSON_GET((*d_result)["result"][d_index],"scopeMask", value)); + result.push_back(rr); + } + + return true; +} + +bool RemoteBackend::searchComments(const string &pattern, int maxResults, vector& result) +{ + // FIXME: Implement Comment API + return false; +} + + // some rapidjson helpers bool RemoteBackend::getBool(rapidjson::Value &value) { if (value.IsNull()) return false; diff --git a/modules/remotebackend/remotebackend.hh b/modules/remotebackend/remotebackend.hh index 89b8ee0c92..b1b18083a8 100644 --- a/modules/remotebackend/remotebackend.hh +++ b/modules/remotebackend/remotebackend.hh @@ -165,6 +165,8 @@ class RemoteBackend : public DNSBackend virtual bool deleteTSIGKey(const DNSName& name); virtual bool getTSIGKeys(std::vector< struct TSIGKey > &keys); 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); static DNSBackend *maker();