]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
Remote: Implement getUnfreshSlaveInfos and setFresh 8732/head
authorPieter Lexis <pieter.lexis@powerdns.com>
Mon, 20 Jan 2020 14:27:44 +0000 (15:27 +0100)
committerPieter Lexis <pieter.lexis@powerdns.com>
Tue, 21 Jan 2020 13:40:25 +0000 (14:40 +0100)
docs/backends/remote.rst
modules/remotebackend/httpconnector.cc
modules/remotebackend/remotebackend.cc
modules/remotebackend/remotebackend.hh

index 6cb2653cc10069508698a12cf90e540440dbc582..0a02b327491375f9b5ebef6716fb25b3ba06c02f 100644 (file)
@@ -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
index bf74849590e59fffc1905c427732fee045db66f2..5c923ae4d2c18f234f0c3956b2795b720fc5aa96 100644 (file)
@@ -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();
index 2c20cd306a678bddea867ba3ea95a118b5542b21..f7640b135588e6c8df465bd507a5311b738f38d9 100644 (file)
@@ -932,6 +932,40 @@ void RemoteBackend::getUpdatedMasters(vector<DomainInfo>* domains)
   }
 }
 
+void RemoteBackend::getUnfreshSlaveInfos(vector<DomainInfo>* 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<double>(domain_id) }
+     }}
+   };
+
+   Json answer;
+   if (this->send(query) == false || this->recv(answer) == false) {
+      g_log<<Logger::Error<<kBackendId<<" Failed to execute RPC for RemoteBackend::setFresh("<<domain_id<<")"<<endl;
+   }
+}
+
 DNSBackend *RemoteBackend::maker()
 {
    try {
index 647da8cdd953744bf60cc6d9f883471aeff465a9..19c0e9360cd742672df6a2d0befebf4afebcdce8 100644 (file)
@@ -190,6 +190,8 @@ class RemoteBackend : public DNSBackend
   void getAllDomains(vector<DomainInfo> *domains, bool include_disabled=false) override;
   void getUpdatedMasters(vector<DomainInfo>* domains) override;
   void alsoNotifies(const DNSName &domain, set<string> *ips) override;
+  void getUnfreshSlaveInfos(vector<DomainInfo>* domains) override;
+  void setFresh(uint32_t domain_id) override;
 
   static DNSBackend *maker();