return bbd;
}
-bool Bind2Backend::createSlaveDomain(const string& ip, const DNSName& domain, const string& nameserver, const string& account, int* zoneId)
+bool Bind2Backend::createSlaveDomain(const string& ip, const DNSName& domain, const string& nameserver, const string& account)
{
string filename = getArg("supermaster-destdir") + '/' + domain.toStringNoDot();
bbd.setCtime();
safePutBBDomainInfo(bbd);
- if (zoneId) {
- if (!safeGetBBDomainInfo(domain, &bbd))
- return false;
- *zoneId = bbd.d_id;
- }
-
return true;
}
// for supermaster support
bool superMasterBackend(const string& ip, const DNSName& domain, const vector<DNSResourceRecord>& nsset, string* nameserver, string* account, DNSBackend** db) override;
static std::mutex s_supermaster_config_lock;
- bool createSlaveDomain(const string& ip, const DNSName& domain, const string& nameserver, const string& account, int* zoneId = nullptr) override;
+ bool createSlaveDomain(const string& ip, const DNSName& domain, const string& nameserver, const string& account) override;
private:
void setupDNSSEC();
declare(suffix, "supermaster-name-to-ips", "", "select ip,account from supermasters where nameserver=$1 and account=$2");
declare(suffix, "supermaster-add", "", "insert into supermasters (ip, nameserver, account) values ($1,$2,$3)");
- declare(suffix, "insert-zone-query", "", "insert into domains (type,name,master,account,last_check, notified_serial) values($1,$2,$3,$4,null,null) returning id");
+ declare(suffix, "insert-zone-query", "", "insert into domains (type,name,master,account,last_check, notified_serial) values($1,$2,$3,$4,null,null)");
declare(suffix, "insert-record-query", "", "insert into records (content,ttl,prio,type,domain_id,disabled,name,ordername,auth) values ($1,$2,$3,$4,$5,$6,$7,$8,$9)");
declare(suffix, "insert-empty-non-terminal-order-query", "insert empty non-terminal in zone", "insert into records (type,domain_id,disabled,name,ordername,auth,ttl,prio,content) values (null,$1,false,$2,$3,$4,null,null,null)");
});
}
-bool LMDBBackend::createDomain(const DNSName& domain, const DomainInfo::DomainKind kind, const vector<ComboAddress>& masters, const string& account, int* zoneId)
+bool LMDBBackend::createDomain(const DNSName& domain, const DomainInfo::DomainKind kind, const vector<ComboAddress>& masters, const string& account)
{
DomainInfo di;
di.account = account;
txn.put(di);
-
- if (zoneId != nullptr) {
- *zoneId = txn.get<0>(domain, di);
- }
-
txn.commit();
}
bool list(const DNSName& target, int id, bool include_disabled) override;
bool getDomainInfo(const DNSName& domain, DomainInfo& di, bool getserial = true) override;
- bool createDomain(const DNSName& domain, const DomainInfo::DomainKind kind, const vector<ComboAddress>& masters, const string& account, int* zoneId) override;
+ bool createDomain(const DNSName& domain, const DomainInfo::DomainKind kind, const vector<ComboAddress>& masters, const string& account) override;
bool startTransaction(const DNSName& domain, int domain_id = -1) override;
bool commitTransaction() override;
return true;
}
-bool RemoteBackend::createSlaveDomain(const string& ip, const DNSName& domain, const string& nameserver, const string& account, int* zoneId)
+bool RemoteBackend::createSlaveDomain(const string& ip, const DNSName& domain, const string& nameserver, const string& account)
{
Json query = Json::object{
{"method", "createSlaveDomain"},
void setNotified(uint32_t id, uint32_t serial) override;
bool doesDNSSEC() 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, int* zoneId = nullptr) 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;
bool feedRecord(const DNSResourceRecord& r, const DNSName& ordername, bool ordernameIsNSEC3 = false) override;
bool feedEnts(int domain_id, map<DNSName, bool>& nonterm) override;
return false;
}
-bool GSQLBackend::createDomain(const DNSName &domain, const DomainInfo::DomainKind kind, const vector<ComboAddress> &masters, const string &account, int* zoneId)
+bool GSQLBackend::createDomain(const DNSName& domain, const DomainInfo::DomainKind kind, const vector<ComboAddress>& masters, const string& account)
{
vector<string> masters_s;
masters_s.reserve(masters.size());
try {
reconnectIfNeeded();
+ // clang-format off
d_InsertZoneQuery_stmt->
bind("type", toUpper(DomainInfo::getKindString(kind)))->
bind("domain", domain)->
bind("masters", boost::join(masters_s, ", "))->
bind("account", account)->
- execute();
-
- if (zoneId != nullptr) {
- if (d_InsertZoneQuery_stmt->hasNextRow()) {
- SSqlStatement::row_t row;
- d_InsertZoneQuery_stmt->nextRow(row);
- *zoneId = std::stoi(row[0]);
- d_InsertZoneQuery_stmt->reset();
- return true;
- } else {
- d_InsertZoneQuery_stmt->reset();
- }
-
- d_InfoOfDomainsZoneQuery_stmt->
- bind("domain", domain)->
- execute();
- if (!d_InfoOfDomainsZoneQuery_stmt->hasNextRow()) {
- d_InfoOfDomainsZoneQuery_stmt->reset();
- return false;
- }
- SSqlStatement::row_t row;
- d_InfoOfDomainsZoneQuery_stmt->nextRow(row);
- ASSERT_ROW_COLUMNS("info-zone-query", row, 7);
- *zoneId = std::stoi(row[0]);
- d_InfoOfDomainsZoneQuery_stmt->reset();
- } else {
- d_InsertZoneQuery_stmt->reset();
- }
- return true;
+ execute()->
+ reset();
+ // clang-format on
}
catch(SSqlException &e) {
throw PDNSException("Database error trying to insert new domain '"+domain.toLogString()+"': "+ e.txtReason());
return true;
}
-bool GSQLBackend::createSlaveDomain(const string& ip, const DNSName& domain, const string& nameserver, const string& account, int* zoneId)
+bool GSQLBackend::createSlaveDomain(const string& ip, const DNSName& domain, const string& nameserver, const string& account)
{
string name;
vector<ComboAddress> masters({ComboAddress(ip, 53)});
masters = tmp;
}
}
- createDomain(domain, DomainInfo::Slave, masters, account, zoneId);
+ createDomain(domain, DomainInfo::Slave, masters, account);
}
catch(SSqlException &e) {
throw PDNSException("Database error trying to insert new slave domain '"+domain.toLogString()+"': "+ e.txtReason());
bool feedRecord(const DNSResourceRecord &r, const DNSName &ordername, bool ordernameIsNSEC3=false) override;
bool feedEnts(int domain_id, map<DNSName,bool>& nonterm) override;
bool feedEnts3(int domain_id, const DNSName &domain, map<DNSName,bool> &nonterm, const NSEC3PARAMRecordContent& ns3prc, bool narrow) override;
- bool createDomain(const DNSName &domain, const DomainInfo::DomainKind kind, const vector<ComboAddress> &masters, const string &account, int* zoneId=nullptr) override;
- bool createSlaveDomain(const string& ip, const DNSName& domain, const string& nameserver, const string& account, int* zoneId = nullptr) override;
+ bool createDomain(const DNSName& domain, const DomainInfo::DomainKind kind, const vector<ComboAddress>& masters, const string& account) override;
+ bool createSlaveDomain(const string& ip, const DNSName& domain, const string& nameserver, const string& account) override;
bool deleteDomain(const DNSName &domain) override;
bool superMasterAdd(const string &ip, const string &nameserver, const string &account) override;
bool superMasterBackend(const string &ip, const DNSName &domain, const vector<DNSResourceRecord>&nsset, string *nameserver, string *account, DNSBackend **db) override;
}
//! called by PowerDNS to create a new domain
- virtual bool createDomain(const DNSName &domain, const DomainInfo::DomainKind kind, const vector<ComboAddress> &masters, const string &account, int* zoneId = nullptr)
+ virtual bool createDomain(const DNSName& domain, const DomainInfo::DomainKind kind, const vector<ComboAddress>& masters, const string& account)
{
return false;
}
//! called by PowerDNS to create a slave record for a superMaster
- virtual bool createSlaveDomain(const string& ip, const DNSName& domain, const string& nameserver, const string& account, int* zoneId = nullptr)
+ virtual bool createSlaveDomain(const string& ip, const DNSName& domain, const string& nameserver, const string& account)
{
return false;
}
return RCode::Refused;
}
try {
- int zoneId{-1};
- db->createSlaveDomain(remote.toString(), p.qdomain, nameserver, account, &zoneId);
- g_zoneCache.add(p.qdomain, zoneId);
+ db->createSlaveDomain(remote.toString(), p.qdomain, nameserver, account);
+ DomainInfo di;
+ if (!db->getDomainInfo(p.qdomain, di, false)) {
+ g_log << Logger::Error << "Failed to create " << p.qdomain << " for potential supermaster " << remote << endl;
+ return RCode::ServFail;
+ }
+ g_zoneCache.add(p.qdomain, di.id);
if (tsigkeyname.empty() == false) {
vector<string> meta;
meta.push_back(tsigkeyname.toStringNoDot());
bool UeberBackend::createDomain(const DNSName &domain, const DomainInfo::DomainKind kind, const vector<ComboAddress> &masters, const string &account)
{
- bool success = false;
- int zoneId;
for(DNSBackend* mydb : backends) {
- if(mydb->createDomain(domain, kind, masters, account, &zoneId)) {
- success = true;
- break;
+ if (mydb->createDomain(domain, kind, masters, account)) {
+ return true;
}
}
- if (success) {
- g_zoneCache.add(domain, zoneId); // make new zone visible
- }
- return success;
+ return false;
}
bool UeberBackend::doesDNSSEC()
#include "zoneparser-tng.hh"
#include "common_startup.hh"
#include "auth-caches.hh"
+#include "auth-zonecache.hh"
#include "threadname.hh"
#include "tsigutils.hh"
di.backend->commitTransaction();
+ g_zoneCache.add(zonename, di.id); // make new zone visible
+
fillZone(B, zonename, resp, shouldDoRRSets(req));
resp->status = 201;
return;