+#include <boost/smart_ptr/make_shared_array.hpp>
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
cout<<"Constructing UeberBackend"<<endl;
UeberBackend B("default");
cout<<"Picking first backend - if this is not what you want, edit launch line!"<<endl;
- DNSBackend *db = B.backends[0];
+ DNSBackend *db = B.backends[0].get();
cout << "Creating secondary zone " << zone << endl;
db->createSlaveDomain("127.0.0.1", zone, "", "_testschema");
cout << "Secondary zone created" << endl;
return 0;
}
+// NOLINTNEXTLINE(readability-function-cognitive-complexity): TODO Clean this function up.
int main(int argc, char** argv)
try
{
}
else if (cmds.at(0) == "b2b-migrate") {
if (cmds.size() < 3) {
- cerr<<"Usage: b2b-migrate OLD NEW"<<endl;
+ cerr << "Usage: b2b-migrate OLD NEW" << endl;
return 1;
}
- DNSBackend *src = nullptr;
- DNSBackend *tgt = nullptr;
+ if (cmds.at(1) == cmds.at(2)) {
+ cerr << "Error: b2b-migrate OLD NEW: OLD cannot be the same as NEW" << endl;
+ return 1;
+ }
- for(DNSBackend *b : BackendMakers().all()) {
- if (b->getPrefix() == cmds.at(1))
- src = b;
- if (b->getPrefix() == cmds.at(2))
- tgt = b;
+ unique_ptr<DNSBackend> src{nullptr};
+ unique_ptr<DNSBackend> tgt{nullptr};
+
+ for (auto& backend : BackendMakers().all()) {
+ if (backend->getPrefix() == cmds.at(1)) {
+ src = std::move(backend);
+ }
+ else if (backend->getPrefix() == cmds.at(2)) {
+ tgt = std::move(backend);
+ }
}
+
if (src == nullptr) {
cerr << "Unknown source backend '" << cmds.at(1) << "'" << endl;
return 1;
return 1;
}
- DNSBackend *db = nullptr;
+ std::unique_ptr<DNSBackend> matchingBackend{nullptr};
- for(DNSBackend *b : BackendMakers().all()) {
- if (b->getPrefix() == cmds.at(1))
- db = b;
+ for (auto& backend : BackendMakers().all()) {
+ if (backend->getPrefix() == cmds.at(1)) {
+ matchingBackend = std::move(backend);
+ }
}
- if (db == nullptr) {
+ if (matchingBackend == nullptr) {
cerr << "Unknown backend '" << cmds.at(1) << "'" << endl;
return 1;
}
- for(auto i=next(begin(cmds),2); i != end(cmds); ++i) {
- cerr<<"== "<<*i<<endl;
- cout<<db->directBackendCmd(*i);
+ for (auto i = next(begin(cmds), 2); i != end(cmds); ++i) {
+ cerr << "== " << *i << endl;
+ cout << matchingBackend->directBackendCmd(*i);
}
return 0;
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
+#include <memory>
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
bool UeberBackend::getDomainInfo(const DNSName& domain, DomainInfo& domainInfo, bool getSerial)
{
- for (auto* backend : backends) {
+ for (auto& backend : backends) {
if (backend->getDomainInfo(domain, domainInfo, getSerial)) {
return true;
}
bool UeberBackend::createDomain(const DNSName& domain, const DomainInfo::DomainKind kind, const vector<ComboAddress>& masters, const string& account)
{
- for (DNSBackend* mydb : backends) {
- if (mydb->createDomain(domain, kind, masters, account)) {
+ for (auto& backend : backends) {
+ if (backend->createDomain(domain, kind, masters, account)) {
return true;
}
}
bool UeberBackend::doesDNSSEC()
{
- for (auto* backend : backends) {
+ for (auto& backend : backends) {
if (backend->doesDNSSEC()) {
return true;
}
bool UeberBackend::addDomainKey(const DNSName& name, const DNSBackend::KeyData& key, int64_t& keyID)
{
keyID = -1;
- for (DNSBackend* backend : backends) {
+ for (auto& backend : backends) {
if (backend->addDomainKey(name, key, keyID)) {
return true;
}
}
bool UeberBackend::getDomainKeys(const DNSName& name, std::vector<DNSBackend::KeyData>& keys)
{
- for (DNSBackend* backend : backends) {
+ for (auto& backend : backends) {
if (backend->getDomainKeys(name, keys)) {
return true;
}
bool UeberBackend::getAllDomainMetadata(const DNSName& name, std::map<std::string, std::vector<std::string>>& meta)
{
- for (DNSBackend* backend : backends) {
+ for (auto& backend : backends) {
if (backend->getAllDomainMetadata(name, meta)) {
return true;
}
bool UeberBackend::getDomainMetadata(const DNSName& name, const std::string& kind, std::vector<std::string>& meta)
{
- for (DNSBackend* backend : backends) {
+ for (auto& backend : backends) {
if (backend->getDomainMetadata(name, kind, meta)) {
return true;
}
bool UeberBackend::setDomainMetadata(const DNSName& name, const std::string& kind, const std::vector<std::string>& meta)
{
- for (DNSBackend* backend : backends) {
+ for (auto& backend : backends) {
if (backend->setDomainMetadata(name, kind, meta)) {
return true;
}
bool UeberBackend::activateDomainKey(const DNSName& name, unsigned int keyID)
{
- for (DNSBackend* backend : backends) {
+ for (auto& backend : backends) {
if (backend->activateDomainKey(name, keyID)) {
return true;
}
bool UeberBackend::deactivateDomainKey(const DNSName& name, unsigned int keyID)
{
- for (DNSBackend* backend : backends) {
+ for (auto& backend : backends) {
if (backend->deactivateDomainKey(name, keyID)) {
return true;
}
bool UeberBackend::publishDomainKey(const DNSName& name, unsigned int keyID)
{
- for (DNSBackend* backend : backends) {
+ for (auto& backend : backends) {
if (backend->publishDomainKey(name, keyID)) {
return true;
}
bool UeberBackend::unpublishDomainKey(const DNSName& name, unsigned int keyID)
{
- for (DNSBackend* backend : backends) {
+ for (auto& backend : backends) {
if (backend->unpublishDomainKey(name, keyID)) {
return true;
}
bool UeberBackend::removeDomainKey(const DNSName& name, unsigned int keyID)
{
- for (DNSBackend* backend : backends) {
+ for (auto& backend : backends) {
if (backend->removeDomainKey(name, keyID)) {
return true;
}
bool UeberBackend::inTransaction()
{
- for (auto* backend : backends) {
+ for (auto& backend : backends) {
if (backend->inTransaction()) {
return true;
}
return false;
}
- soaData->db = backends.size() == 1 ? *backends.begin() : nullptr;
+ soaData->db = backends.size() == 1 ? backends.begin()->get() : nullptr;
// Leave database handle in a consistent state.
while (get(zoneRecord)) {
DLOG(g_log << Logger::Error << "has pos cache entry: " << shorter << endl);
fillSOAData(d_answers[0], *soaData);
- soaData->db = backends.size() == 1 ? *backends.begin() : nullptr;
+ soaData->db = backends.size() == 1 ? backends.begin()->get() : nullptr;
soaData->qname = shorter;
}
else if (cacheResult == CacheResult::NegativeMatch && d_negcache_ttl != 0U) {
return cacheResult;
}
-static std::vector<DNSBackend*>::iterator findBestMatchingBackend(std::vector<DNSBackend*>& backends, std::vector<std::pair<std::size_t, SOAData>>& bestMatches, const DNSName& shorter, SOAData* soaData)
+static std::vector<std::unique_ptr<DNSBackend>>::iterator findBestMatchingBackend(std::vector<std::unique_ptr<DNSBackend>>& backends, std::vector<std::pair<std::size_t, SOAData>>& bestMatches, const DNSName& shorter, SOAData* soaData)
{
auto backend = backends.begin();
for (auto bestMatch = bestMatches.begin(); backend != backends.end() && bestMatch != bestMatches.end(); ++backend, ++bestMatch) {
d_question.qname = domain;
d_question.zoneId = -1;
- for (auto* backend : backends) {
+ for (auto& backend : backends) {
if (backend->getSOA(domain, soaData)) {
if (domain != soaData.qname) {
throw PDNSException("getSOA() returned an SOA for the wrong zone. Question: '" + domain.toLogString() + "', answer: '" + soaData.qname.toLogString() + "'");
bool UeberBackend::superMasterAdd(const AutoPrimary& primary)
{
- for (auto* backend : backends) {
+ for (auto& backend : backends) {
if (backend->superMasterAdd(primary)) {
return true;
}
bool UeberBackend::autoPrimaryRemove(const AutoPrimary& primary)
{
- for (auto* backend : backends) {
+ for (auto& backend : backends) {
if (backend->autoPrimaryRemove(primary)) {
return true;
}
bool UeberBackend::autoPrimariesList(std::vector<AutoPrimary>& primaries)
{
- for (auto* backend : backends) {
+ for (auto& backend : backends) {
if (backend->autoPrimariesList(primaries)) {
return true;
}
bool UeberBackend::superMasterBackend(const string& ip, const DNSName& domain, const vector<DNSResourceRecord>& nsset, string* nameserver, string* account, DNSBackend** dnsBackend)
{
- for (auto* backend : backends) {
+ for (auto& backend : backends) {
if (backend->superMasterBackend(ip, domain, nsset, nameserver, account, dnsBackend)) {
return true;
}
backends = BackendMakers().all(pname == "key-only");
}
-static void del(DNSBackend* backend)
-{
- delete backend;
-}
-
-void UeberBackend::cleanup()
-{
- {
- auto instances = d_instances.lock();
- remove(instances->begin(), instances->end(), this);
- instances->resize(instances->size() - 1);
- }
-
- for_each(backends.begin(), backends.end(), del);
-}
-
// returns -1 for miss, 0 for negative match, 1 for hit
enum UeberBackend::CacheResult UeberBackend::cacheHas(const Question& question, vector<DNSZoneRecord>& resourceRecords) const
{
UeberBackend::~UeberBackend()
{
DLOG(g_log << Logger::Error << "UeberBackend destructor called, removing ourselves from instances, and deleting our backends" << endl);
- cleanup();
+
+ {
+ auto instances = d_instances.lock();
+ [[maybe_unused]] auto end = remove(instances->begin(), instances->end(), this);
+ instances->resize(instances->size() - 1);
+ }
+
+ backends.clear();
}
// this handle is more magic than most
// cout<<"UeberBackend::lookup("<<qname<<"|"<<DNSRecordContent::NumberToType(qtype.getCode())<<"): uncached"<<endl;
d_negcached = d_cached = false;
d_answers.clear();
- (d_handle.d_hinterBackend = backends[d_handle.i++])->lookup(d_handle.qtype, d_handle.qname, d_handle.zoneId, d_handle.pkt_p);
+ (d_handle.d_hinterBackend = backends[d_handle.i++].get())->lookup(d_handle.qtype, d_handle.qname, d_handle.zoneId, d_handle.pkt_p);
++(*s_backendQueries);
}
else if (cacheResult == CacheResult::NegativeMatch) {
//
bool UeberBackend::setTSIGKey(const DNSName& name, const DNSName& algorithm, const string& content)
{
- for (auto* backend : backends) {
+ for (auto& backend : backends) {
if (backend->setTSIGKey(name, algorithm, content)) {
return true;
}
algorithm.clear();
content.clear();
- for (auto* backend : backends) {
+ for (auto& backend : backends) {
if (backend->getTSIGKey(name, algorithm, content)) {
break;
}
{
keys.clear();
- for (auto* backend : backends) {
+ for (auto& backend : backends) {
if (backend->getTSIGKeys(keys)) {
return true;
}
bool UeberBackend::deleteTSIGKey(const DNSName& name)
{
- for (auto* backend : backends) {
+ for (auto& backend : backends) {
if (backend->deleteTSIGKey(name)) {
return true;
}
DLOG(g_log << "Backend #" << i << " of " << parent->backends.size()
<< " out of answers, taking next" << endl);
- d_hinterBackend = parent->backends[i++];
+ d_hinterBackend = parent->backends[i++].get();
d_hinterBackend->lookup(qtype, qname, zoneId, pkt_p);
++(*s_backendQueries);
}