return false;
}
-bool Bind2Backend::isMaster(const DNSName& name, const string &ip)
-{
- BB2DomainInfo bbd;
- if(!safeGetBBDomainInfo(name, &bbd))
- return false;
-
- if(bbd.d_kind != DomainInfo::Slave)
- return false;
-
- for(vector<string>::const_iterator iter = bbd.d_masters.begin(); iter != bbd.d_masters.end(); ++iter)
- if(*iter==ip)
- return true;
-
- return false;
-}
-
bool Bind2Backend::superMasterBackend(const string &ip, const DNSName& domain, const vector<DNSResourceRecord>&nsset, string *nameserver, string *account, DNSBackend **db)
{
// Check whether we have a configfile available.
void insertRecord(BB2DomainInfo& bbd, const DNSName &qname, const QType &qtype, const string &content, int ttl, const std::string& hashed=string(), bool *auth=0);
void rediscover(string *status=0) override;
- bool isMaster(const DNSName &name, const string &ip) override;
// for supermaster support
bool superMasterBackend(const string &ip, const DNSName &domain, const vector<DNSResourceRecord>&nsset, string *nameserver, string *account, DNSBackend **db) override;
declare(suffix, "remove-empty-non-terminals-from-zone-query", "remove all empty non-terminals from zone", "delete from records where domain_id=? and type is null");
declare(suffix, "delete-empty-non-terminal-query", "delete empty non-terminal from zone", "delete from records where domain_id=? and name=? and type is null");
- declare(suffix,"master-zone-query","Data", "select master from domains where name=? and type='SLAVE'");
-
declare(suffix,"info-zone-query","","select id,name,master,last_check,notified_serial,type,account from domains where name=?");
declare(suffix,"info-all-slaves-query","","select id,name,master,last_check from domains where type='SLAVE'");
declare(suffix, "remove-empty-non-terminals-from-zone-query", "remove all empty non-terminals from zone", "delete from records where domain_id=? and type is null");
declare(suffix, "delete-empty-non-terminal-query", "delete empty non-terminal from zone", "delete from records where domain_id=? and name=? and type is null");
- declare(suffix,"master-zone-query","Data", "select master from domains where name=? and type='SLAVE'");
-
declare(suffix,"info-zone-query","","select id,name,master,last_check,notified_serial,type,account from domains where name=?");
declare(suffix,"info-all-slaves-query","","select id,name,master,last_check from domains where type='SLAVE'");
declare(suffix, "remove-empty-non-terminals-from-zone-query", "remove all empty non-terminals from zone", "delete from records where domain_id=:domain_id and type is null");
declare(suffix, "delete-empty-non-terminal-query", "delete empty non-terminal from zone", "delete from records where domain_id=:domain_id and name=:qname and type is null");
- declare(suffix, "master-zone-query", "Data", "select master from domains where name=:domain and type='SLAVE'");
-
declare(suffix, "info-zone-query", "","select id,name,master,last_check,notified_serial,type,account from domains where name=:domain");
declare(suffix, "info-all-slaves-query", "","select id,name,master,last_check from domains where type='SLAVE'");
declare(suffix,"remove-empty-non-terminals-from-zone-query", "remove all empty non-terminals from zone", "delete from records where domain_id=$1 and type is null");
declare(suffix,"delete-empty-non-terminal-query", "delete empty non-terminal from zone", "delete from records where domain_id=$1 and name=$2 and type is null");
- declare(suffix,"master-zone-query","Data", "select master from domains where name=$1 and type='SLAVE'");
-
declare(suffix,"info-zone-query","","select id,name,master,last_check,notified_serial,type,account from domains where name=$1");
declare(suffix,"info-all-slaves-query","","select id,name,master,last_check from domains where type='SLAVE'");
declare(suffix, "remove-empty-non-terminals-from-zone-query", "remove all empty non-terminals from zone", "delete from records where domain_id=:domain_id and type is null");
declare(suffix, "delete-empty-non-terminal-query", "delete empty non-terminal from zone", "delete from records where domain_id=:domain_id and name=:qname and type is null");
-
- declare(suffix, "master-zone-query", "Data", "select master from domains where name=:domain and type='SLAVE'");
declare(suffix, "info-zone-query", "","select id,name,master,last_check,notified_serial,type,account from domains where name=:domain");
// SLAVE BACKEND
bool getDomainInfo(const DNSName& domain, DomainInfo &di, bool getSerial=true) override;
- bool isMaster(const DNSName& name, const string &ip) override;
void getUnfreshSlaveInfos(vector<DomainInfo>* domains) override;
void setFresh(uint32_t id) override;
virtual bool feedRecord(const DNSResourceRecord &rr, DNSName &ordername);
virtual bool getDomainInfo(const string &domain, DomainInfo &di);
- virtual bool isMaster(const string &name, const string &ip);
virtual void getUnfreshSlaveInfos(vector<DomainInfo>* domains);
virtual void setFresh(uint32_t id);
*/
}
-bool LUABackend::isMaster(const DNSName& domain, const string &ip) {
-
- if (f_lua_ismaster == 0)
- return false;
-
- if (logging)
- g_log << Logger::Error << backend_name << "(isMaster) BEGIN" << endl;
-
- lua_rawgeti(lua, LUA_REGISTRYINDEX, f_lua_ismaster);
-
- lua_pushstring(lua, domain.toString().c_str());
- lua_pushstring(lua, ip.c_str());
-
- if(lua_pcall(lua, 2, 1, f_lua_exec_error) != 0) {
- string e = backend_name + lua_tostring(lua, -1);
- lua_pop(lua, 1);
-
- throw runtime_error(e);
- }
-
- size_t returnedwhat = lua_type(lua, -1);
- bool ok = false;
-
- if (returnedwhat == LUA_TBOOLEAN)
- ok = lua_toboolean(lua, -1);
-
- lua_pop(lua, 1);
-
- if (logging)
- g_log << Logger::Info << backend_name << "(isMaster) END" << endl;
-
- return ok;
-}
-
bool LUABackend::getDomainInfo(const DNSName&domain, DomainInfo &di, bool getSerial) {
if (f_lua_getdomaininfo == 0)
return false;
-bool OdbxBackend::isMaster( const DNSName& domain, const string& ip )
-{
- try
- {
- DLOG( g_log.log( m_myname + " isMaster()", Logger::Debug ) );
-
- string stmt = getArg( "sql-master" );
- string& stmtref = strbind( ":name", escape( domain.makeLowerCase().toStringRootDot(), READ ), stmt );
-
- if( !execStmt( stmtref.c_str(), stmtref.size(), READ ) ) { return false; }
- if( !getRecord( READ ) ) { return false; }
-
- do
- {
- if( odbx_field_value( m_result, 0 ) != NULL )
- {
- if( !strcmp( odbx_field_value( m_result, 0 ), ip.c_str() ) )
- {
- while( getRecord( READ ) );
- return true;
- }
- }
- }
- while( getRecord( READ ) );
- }
- catch ( std::exception& e )
- {
- g_log.log( m_myname + " isMaster: Caught STL exception - " + e.what(), Logger::Error );
- return false;
- }
-
- return false;
-}
-
-
-
void OdbxBackend::getUnfreshSlaveInfos( vector<DomainInfo>* unfresh )
{
try
bool commitTransaction() override;
bool abortTransaction() override;
- bool isMaster( const DNSName& domain, const string& ip ) override;
bool getDomainInfo( const DNSName& domain, DomainInfo& di, bool getSerial=true ) override;
bool feedRecord( const DNSResourceRecord& rr, const DNSName& ordername ) override;
bool createSlaveDomain( const string& ip, const DNSName& domain, const string &nameserver, const string& account ) override;
"FROM Zonemasters "
"WHERE zone_id = :zoneid";
-static const char *isZoneMasterQueryKey = "PDNS_Is_Zone_Master_Query";
-static const char *isZoneMasterQueryDefaultSQL =
- "SELECT zm.master "
- "FROM Zones z JOIN Zonemasters zm ON z.id = zm.zone_id "
- "WHERE z.name = lower(:name) AND zm.master = :master";
-
static const char *deleteZoneQueryKey = "PDNS_Delete_Zone_Query";
static const char *deleteZoneQueryDefaultSQL =
"DELETE FROM Records WHERE zone_id = :zoneid";
zoneInfoQuerySQL = getArg("zone-info-query");
alsoNotifyQuerySQL = getArg("also-notify-query");
zoneMastersQuerySQL = getArg("zone-masters-query");
- isZoneMasterQuerySQL = getArg("is-zone-master-query");
deleteZoneQuerySQL = getArg("delete-zone-query");
zoneSetLastCheckQuerySQL = getArg("zone-set-last-check-query");
insertRecordQuerySQL = getArg("insert-record-query");
return masters;
}
-bool
-OracleBackend::isMaster (const DNSName& domain, const string &master)
-{
- sword rc;
- OCIStmt *stmt;
-
- openMasterConnection();
-
- stmt = prepare_query(masterSvcCtx, isZoneMasterQuerySQL, isZoneMasterQueryKey);
-
- DNSName_to_cbuf(mQueryZone, domain, sizeof(mQueryZone));
- string_to_cbuf(mQueryName, master, sizeof(mQueryName));
-
- char res_master[512];
- sb2 res_master_ind;
-
- bind_str_failokay(stmt, ":nsname", myServerName, sizeof(myServerName));
- bind_str(stmt, ":name", mQueryZone, sizeof(mQueryZone));
- bind_str(stmt, ":master", mQueryName, sizeof(mQueryName));
- define_output_str(stmt, 1, &res_master_ind, res_master, sizeof(res_master));
-
- rc = OCIStmtExecute(masterSvcCtx, stmt, oraerr, 1, 0, NULL, NULL, OCI_DEFAULT);
-
- if (rc == OCI_ERROR) {
- throw OracleException("Oracle isMaster", oraerr);
- }
-
- release_query(stmt, isZoneMasterQueryKey);
-
- if (rc != OCI_NO_DATA) {
- check_indicator(res_master_ind, false);
- return true;
- }
-
- return false;
-}
-
bool
OracleBackend::getDomainInfo (const DNSName& domain, DomainInfo &di)
{
declare(suffix, "zone-info-query", "", zoneInfoQueryDefaultSQL);
declare(suffix, "also-notify-query", "", alsoNotifyQueryDefaultSQL);
declare(suffix, "zone-masters-query", "", zoneMastersQueryDefaultSQL);
- declare(suffix, "is-zone-master-query", "", isZoneMasterQueryDefaultSQL);
declare(suffix, "delete-zone-query", "", deleteZoneQueryDefaultSQL);
declare(suffix, "zone-set-last-check-query", "", zoneSetLastCheckQueryDefaultSQL);
declare(suffix, "zone-set-notified-serial-query", "", zoneSetNotifiedSerialQueryDefaultSQL);
DNSName& after) override;
bool get(DNSResourceRecord &rr) override;
vector<string> getDomainMasters(const DNSName& domain, int zoneId) override;
- bool isMaster(const DNSName& domain, const string &master) override;
bool getDomainInfo(const DNSName& domain, DomainInfo &di) override;
void alsoNotifies(const DNSName& domain, set<string> *addrs) override;
void getUnfreshSlaveInfos(vector<DomainInfo>* domains) override;
string zoneInfoQuerySQL;
string alsoNotifyQuerySQL;
string zoneMastersQuerySQL;
- string isZoneMasterQuerySQL;
string deleteZoneQuerySQL;
string zoneSetLastCheckQuerySQL;
req.POST()["content"] = param["content"].string_value();
req.preparePost();
verb = "PUT";
- } else if (method == "isMaster") {
- addUrlComponent(parameters, "ip", ss);
- verb = "GET";
} else if (method == "superMasterBackend") {
std::stringstream ss2;
addUrlComponent(parameters, "ip", ss);
}
}
-bool RemoteBackend::isMaster(const DNSName& name, const string &ip)
-{
- Json query = Json::object{
- { "method", "isMaster" },
- { "parameters", Json::object {
- { "name", name.toString() },
- { "ip", ip }
- }}
- };
-
- Json answer;
- if (this->send(query) == false || this->recv(answer) == false)
- return false;
-
- return true;
-}
-
bool RemoteBackend::superMasterBackend(const string &ip, const DNSName& domain, const vector<DNSResourceRecord>&nsset, string* nameserver, string *account, DNSBackend **ddb)
{
Json::array rrset;
bool getDomainInfo(const DNSName& domain, DomainInfo& di, bool getSerial=true ) override;
void setNotified(uint32_t id, uint32_t serial) override;
bool doesDNSSEC() override;
- bool isMaster(const DNSName& name, const string &ip) override;
bool superMasterBackend(const string &ip, const DNSName& domain, const vector<DNSResourceRecord>&nsset, string *nameserver, string *account, DNSBackend **ddb) override;
bool createSlaveDomain(const string &ip, const DNSName& domain, const string& nameserver, const string &account) override;
bool replaceRRSet(uint32_t domain_id, const DNSName& qname, const QType& qt, const vector<DNSResourceRecord>& rrset) override;
BOOST_CHECK_EQUAL(di.backend, be);
}
-BOOST_AUTO_TEST_CASE(test_method_isMaster) {
- BOOST_TEST_MESSAGE("Testing isMaster method");
- BOOST_CHECK(be->isMaster(DNSName("ns1.unit.test."), "10.0.0.1"));
- BOOST_CHECK(!be->isMaster(DNSName("ns2.unit.test."), "10.0.0.2"));
-}
-
BOOST_AUTO_TEST_CASE(test_method_superMasterBackend) {
DNSResourceRecord rr;
std::vector<DNSResourceRecord> nsset;
d_listQuery=getArg("list-query");
d_listSubZoneQuery=getArg("list-subzone-query");
- d_MasterOfDomainsZoneQuery=getArg("master-zone-query");
d_InfoOfDomainsZoneQuery=getArg("info-zone-query");
d_InfoOfAllSlaveDomainsQuery=getArg("info-all-slaves-query");
d_SuperMasterInfoQuery=getArg("supermaster-query");
d_ANYIdQuery_stmt = NULL;
d_listQuery_stmt = NULL;
d_listSubZoneQuery_stmt = NULL;
- d_MasterOfDomainsZoneQuery_stmt = NULL;
d_InfoOfDomainsZoneQuery_stmt = NULL;
d_InfoOfAllSlaveDomainsQuery_stmt = NULL;
d_SuperMasterInfoQuery_stmt = NULL;
}
}
-bool GSQLBackend::isMaster(const DNSName &domain, const string &ip)
-{
- try {
- reconnectIfNeeded();
-
- d_MasterOfDomainsZoneQuery_stmt->
- bind("domain", domain)->
- execute()->
- getResult(d_result)->
- reset();
- }
- catch (SSqlException &e) {
- throw PDNSException("GSQLBackend unable to retrieve list of master domains: "+e.txtReason());
- }
-
- if(!d_result.empty()) {
- ASSERT_ROW_COLUMNS("master-zone-query", d_result[0], 1);
-
- // we can have multiple masters separated by commas
- vector<string> masters;
- stringtok(masters, d_result[0][0], " ,\t");
-
- for(const auto& master: masters) {
- const ComboAddress caMaster(master);
- if(ip == caMaster.toString())
- return true;
- }
- }
-
- // no matching master
- return false;
-}
-
bool GSQLBackend::setMaster(const DNSName &domain, const string &ip)
{
try {
bool list(const DNSName &target, int domain_id, bool include_disabled=false) override;
bool get(DNSResourceRecord &r) override;
void getAllDomains(vector<DomainInfo> *domains, bool include_disabled=false) override;
- bool isMaster(const DNSName &domain, const string &ip) override;
void alsoNotifies(const DNSName &domain, set<string> *ips) override;
bool startTransaction(const DNSName &domain, int domain_id=-1) override;
bool commitTransaction() override;
#include "comment.hh"
#include "dnsname.hh"
#include "dnsrecords.hh"
+#include "iputils.hh"
class DNSBackend;
struct DomainInfo
DNSName zone;
time_t last_check;
string account;
- vector<string> masters;
+ vector<string> masters; // FIXME use ComboAddress
DNSBackend *backend;
uint32_t id;
return DomainInfo::Native;
}
+ const bool isMaster(const ComboAddress& ip)
+ {
+ for( const auto& master: masters) {
+ const ComboAddress caMaster(master);
+ if(ip == caMaster)
+ return true;
+ }
+ return false;
+ }
+
};
struct TSIGKey {
}
//! returns true if master ip is master for domain name.
- virtual bool isMaster(const DNSName &name, const string &ip)
- {
- return false;
- }
-
//! starts the transaction for updating domain qname (FIXME: what is id?)
virtual bool startTransaction(const DNSName &qname, int id=-1)
{
g_log<<Logger::Error<<"Received NOTIFY for "<<p->qdomain<<" from "<<p->getRemote()<<" but we are master, rejecting"<<endl;
return RCode::Refused;
}
- else if(!db->isMaster(p->qdomain, p->getRemote().toString())) {
+ else if(!di.isMaster(p->getRemote())) {
g_log<<Logger::Error<<"Received NOTIFY for "<<p->qdomain<<" from "<<p->getRemote()<<" which is not a master"<<endl;
return RCode::Refused;
}
godbc-list-domain-keys-query=select cryptokeys.id, flags, active, content from domains, cryptokeys where cryptokeys.domain_id=domains.id and name=?
godbc-list-query=SELECT content,ttl,prio,type,domain_id,disabled,name,auth FROM records WHERE (disabled=0 OR ?) and domain_id=? order by name, type
godbc-list-subzone-query=SELECT content,ttl,prio,type,domain_id,disabled,name,auth FROM records WHERE disabled=0 and (name=? OR name like ?) and domain_id=?
-godbc-master-zone-query=select master from domains where name=? and type='SLAVE'
godbc-nullify-ordername-and-update-auth-query=update records set ordername=NULL,auth=? where domain_id=? and name=? and disabled=0
godbc-nullify-ordername-and-update-auth-type-query=update records set ordername=NULL,auth=? where domain_id=? and name=? and type=? and disabled=0
godbc-remove-domain-key-query=delete from cryptokeys where domain_id=(select id from domains where name=?) and cryptokeys.id=?