]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
remotebackend: Implement getUpdatedMasters 7448/head
authorAki Tuomi <cmouse@cmouse.fi>
Mon, 4 Feb 2019 13:12:48 +0000 (15:12 +0200)
committerAki Tuomi <cmouse@cmouse.fi>
Tue, 5 Feb 2019 11:53:50 +0000 (13:53 +0200)
docs/backends/remote.rst
modules/remotebackend/remotebackend.cc
modules/remotebackend/remotebackend.hh
modules/remotebackend/test-remotebackend.cc
modules/remotebackend/unittest.rb

index b00d372b3ab97710eae9f0cccfd9aa1c6d86ec14..54d0a03ba0b347fa91866cf8c47f8a6b7d5e0993 100644 (file)
@@ -1508,6 +1508,51 @@ Response:
 
     {"result":[{"qtype":"A", "qname":"www.example.com", "content":"203.0.113.2", "ttl": 60}]}
 
+
+``getUpdatedMasters``
+~~~~~~~~~~~~~~~~~
+
+Used to find out any updates to master domains. This is used to trigger notifications in master mode.
+
+-  Mandatory: no
+-  Parameters: none
+-  Reply: array of DomainInfo
+
+Example JSON/RPC
+''''''''''''''''
+
+Query:
+
+::
+
+    {"method": "getUpdatedMasters", "parameters": {}}
+
+Response:
+
+::
+
+    {"result":[{"id":1,"zone":"unit.test.","masters":["10.0.0.1"],"notified_serial":2,"serial":2,"last_check":1464693331,"kind":"master"}]}
+
+Example HTTP/RPC
+''''''''''''''''
+
+Query:
+
+.. code-block:: http
+
+    GET /dnsapi/getUpdatedMasters 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"],"notified_serial":2,"serial":2,"last_check":1464693331,"kind":"master"}]}
+
+
+
 Examples
 --------
 
index 068562e62456c066fc2ef7c8be9e0be9ba7b8d8c..2876d9becf84421e4deb19949417fb31e2894524 100644 (file)
@@ -908,6 +908,27 @@ void RemoteBackend::getAllDomains(vector<DomainInfo> *domains, bool include_disa
   }
 }
 
+void RemoteBackend::getUpdatedMasters(vector<DomainInfo>* domains)
+{
+  Json query = Json::object{
+   { "method", "getUpdatedMasters" },
+   { "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);
+  }
+}
+
 DNSBackend *RemoteBackend::maker()
 {
    try {
index 5747ef298983e3f819d60dd430de9dc7c0093558..34a59c8aa8478f05ccffb1dc8c6d57d0a0ca0119 100644 (file)
@@ -186,6 +186,7 @@ class RemoteBackend : public DNSBackend
   bool searchRecords(const string &pattern, int maxResults, vector<DNSResourceRecord>& result) override;
   bool searchComments(const string &pattern, int maxResults, vector<Comment>& result) override;
   void getAllDomains(vector<DomainInfo> *domains, bool include_disabled=false) override;
+  void getUpdatedMasters(vector<DomainInfo>* domains) override;
 
   static DNSBackend *maker();
 
index 3049127ef514647091c9f7d1de2ffa374c796689..266e79d0a7dc0a9e7899ce6db4505c74ee3634e0 100644 (file)
@@ -323,4 +323,21 @@ BOOST_AUTO_TEST_CASE(test_method_directBackendCmd) {
    BOOST_CHECK_EQUAL(be->directBackendCmd("PING 1234"), "PING 1234");
 }
 
+BOOST_AUTO_TEST_CASE(test_method_getUpdatedMasters) {
+   DomainInfo di;
+   BOOST_TEST_MESSAGE("Testing getUpdatedMasters method");
+   vector<DomainInfo> result;
+
+   be->getUpdatedMasters(&result);
+
+   BOOST_CHECK(result.size() > 0);
+
+   di = result[0];
+   BOOST_CHECK_EQUAL(di.zone.toString(), "master.test.");
+   BOOST_CHECK_EQUAL(di.serial, 2);
+   BOOST_CHECK_EQUAL(di.notified_serial, 2);
+   BOOST_CHECK_EQUAL(di.kind, DomainInfo::Master);
+   BOOST_CHECK_EQUAL(di.backend, be);
+}
+
 BOOST_AUTO_TEST_SUITE_END();
index 2f69350bd4c01354865e1451263ef9fab4b4a0ee..27ab3d50bc0e30864ce9acb2ff90d3210f44a870 100644 (file)
@@ -171,6 +171,17 @@ class Handler
                :kind => 'native'
        }]
      end
+     if args["name"] == "master.test."
+       return [{
+               :id => 2,
+               :zone => "master.test.",
+               :masters => ["10.0.0.1"],
+               :notified_serial => $notified_serial,
+               :serial => $notified_serial,
+               :last_check => Time.now.to_i,
+               :kind => 'master'
+       }]
+     end
      [false]
    end
 
@@ -252,5 +263,9 @@ class Handler
    def do_getalldomains(args)
      [do_getdomaininfo({'name'=>'unit.test.'})]
    end
+
+   def do_getupdatedmasters()
+     [do_getdomaininfo({'name'=>'master.test.'})]
+   end
 end