From: Pieter Lexis Date: Mon, 20 Jan 2020 14:27:44 +0000 (+0100) Subject: Remote: Implement getUnfreshSlaveInfos and setFresh X-Git-Tag: auth-4.3.0-beta1~2^2 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=refs%2Fpull%2F8732%2Fhead;p=thirdparty%2Fpdns.git Remote: Implement getUnfreshSlaveInfos and setFresh --- diff --git a/docs/backends/remote.rst b/docs/backends/remote.rst index 6cb2653cc1..0a02b32749 100644 --- a/docs/backends/remote.rst +++ b/docs/backends/remote.rst @@ -148,6 +148,7 @@ Methods required for different features ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ :Always required: ``initialize``, ``lookup`` :Master operation: ``list``, ``getUpdatedMasters``, ``setNotified`` +:Slave operation: ``getUnfreshSlaveInfos``, ``startTransaction``, ``commitTransaction``, ``abortTransaction``, ``feedRecord``, ``setFresh`` ``initialize`` ~~~~~~~~~~~~~~ @@ -1557,6 +1558,92 @@ Response: Content-Length: 135 {"result":[{"id":1,"zone":"unit.test.","masters":["10.0.0.1"],"notified_serial":2,"serial":2,"last_check":1464693331,"kind":"master"}]} +``getUnfreshSlaveInfos`` +~~~~~~~~~~~~~~~~~~~~~~~~ + +Used to find out if slave zones need checking of the master's SOA Serial. + +- Mandatory: no +- Parameters: none +- Reply: array of DomainInfo or at least the ``id``, ``zone``, ``serial`` and ``last_check`` fields + +Example JSON/RPC +'''''''''''''''' + +Query: + +.. code-block:: json + + {"method": "getUnfreshSlaveInfos", "parameters": {}} + +Response: + +.. code-block:: json + + {"result":[{"id":1,"zone":"unit.test.","masters":["10.0.0.1"],"serial":2,"last_check":1464693331,"kind":"slave"}]} + +Example HTTP/RPC +'''''''''''''''' + +Query: + +.. code-block:: http + + GET /dnsapi/getUnfreshSlaveInfos HTTP/1.1 + +Response: + +.. code-block:: http + + HTTP/1.1 200 OK + Content-Type: text/javascript; charset=utf-8 + Content-Length: 135 + {"result":[{"id":1,"zone":"unit.test.","masters":["10.0.0.1"],"serial":2,"last_check":1464693331,"kind":"slave"}]} + +``setFresh`` +~~~~~~~~~~~~ + +Called when a slave freshness check succeeded. This does not indicate the +zone was updated on the master. + +- Mandatory: No +- Parameters: id +- Reply: true for success, false for failure + +Example JSON/RPC +'''''''''''''''' + +Query: + +.. code-block:: json + + {"method":"setFresh","parameters":{"id":1}} + +Response: + +.. code-block:: json + + {"result":true} + +Example HTTP/RPC +'''''''''''''''' + +Query: + +.. code-block:: http + + PATCH /dnsapi/setFresh/1 HTTP/1.1 + Content-Type: application/x-www-form-urlencoded + Content-Length: 0 + +Response: + +.. code-block:: http + + HTTP/1.1 200 OK + Content-Type: text/javascript; charset=utf-8 + + {"result":true} Examples diff --git a/modules/remotebackend/httpconnector.cc b/modules/remotebackend/httpconnector.cc index bf74849590..5c923ae4d2 100644 --- a/modules/remotebackend/httpconnector.cc +++ b/modules/remotebackend/httpconnector.cc @@ -237,6 +237,9 @@ void HTTPConnector::restful_requestbuilder(const std::string &method, const Json req.POST()["serial"] = std::to_string(parameters["serial"].number_value()); req.preparePost(); verb = "PATCH"; + } else if (method == "setFresh") { + req.preparePost(); + verb = "PATCH"; } else if (method == "directBackendCmd") { req.POST()["query"] = parameters["query"].string_value(); req.preparePost(); diff --git a/modules/remotebackend/remotebackend.cc b/modules/remotebackend/remotebackend.cc index 2c20cd306a..f7640b1355 100644 --- a/modules/remotebackend/remotebackend.cc +++ b/modules/remotebackend/remotebackend.cc @@ -932,6 +932,40 @@ void RemoteBackend::getUpdatedMasters(vector* domains) } } +void RemoteBackend::getUnfreshSlaveInfos(vector* domains) { + Json query = Json::object{ + { "method", "getUnfreshSlaveInfos" }, + { "parameters", Json::object{ } }, + }; + + 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); + } +} + +void RemoteBackend::setFresh(uint32_t domain_id) { + Json query = Json::object{ + { "method", "setFresh" }, + { "parameters", Json::object { + { "id", static_cast(domain_id) } + }} + }; + + Json answer; + if (this->send(query) == false || this->recv(answer) == false) { + g_log< *domains, bool include_disabled=false) override; void getUpdatedMasters(vector* domains) override; void alsoNotifies(const DNSName &domain, set *ips) override; + void getUnfreshSlaveInfos(vector* domains) override; + void setFresh(uint32_t domain_id) override; static DNSBackend *maker();