From e99b4250cd2ed412d0b48db379c9f75cedc13db6 Mon Sep 17 00:00:00 2001 From: Aki Tuomi Date: Mon, 4 Feb 2019 15:12:48 +0200 Subject: [PATCH] remotebackend: Implement getUpdatedMasters --- docs/backends/remote.rst | 45 +++++++++++++++++++++ modules/remotebackend/remotebackend.cc | 21 ++++++++++ modules/remotebackend/remotebackend.hh | 1 + modules/remotebackend/test-remotebackend.cc | 17 ++++++++ modules/remotebackend/unittest.rb | 15 +++++++ 5 files changed, 99 insertions(+) diff --git a/docs/backends/remote.rst b/docs/backends/remote.rst index b00d372b3a..54d0a03ba0 100644 --- a/docs/backends/remote.rst +++ b/docs/backends/remote.rst @@ -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 -------- diff --git a/modules/remotebackend/remotebackend.cc b/modules/remotebackend/remotebackend.cc index 068562e624..2876d9becf 100644 --- a/modules/remotebackend/remotebackend.cc +++ b/modules/remotebackend/remotebackend.cc @@ -908,6 +908,27 @@ void RemoteBackend::getAllDomains(vector *domains, bool include_disa } } +void RemoteBackend::getUpdatedMasters(vector* 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 { diff --git a/modules/remotebackend/remotebackend.hh b/modules/remotebackend/remotebackend.hh index 5747ef2989..34a59c8aa8 100644 --- a/modules/remotebackend/remotebackend.hh +++ b/modules/remotebackend/remotebackend.hh @@ -186,6 +186,7 @@ class RemoteBackend : public DNSBackend bool searchRecords(const string &pattern, int maxResults, vector& result) override; bool searchComments(const string &pattern, int maxResults, vector& result) override; void getAllDomains(vector *domains, bool include_disabled=false) override; + void getUpdatedMasters(vector* domains) override; static DNSBackend *maker(); diff --git a/modules/remotebackend/test-remotebackend.cc b/modules/remotebackend/test-remotebackend.cc index 3049127ef5..266e79d0a7 100644 --- a/modules/remotebackend/test-remotebackend.cc +++ b/modules/remotebackend/test-remotebackend.cc @@ -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 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(); diff --git a/modules/remotebackend/unittest.rb b/modules/remotebackend/unittest.rb index 2f69350bd4..27ab3d50bc 100644 --- a/modules/remotebackend/unittest.rb +++ b/modules/remotebackend/unittest.rb @@ -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 -- 2.47.2