// this is so the geoipbackend can set this pointer if loaded for lua-record.cc
std::function<std::string(const std::string&, int)> g_getGeo;
-bool DNSBackend::getAuth(const DNSName &target, SOAData *sd)
+bool DNSBackend::getAuth(const DNSName& target, SOAData* sd)
{
return this->getSOA(target, *sd);
}
-void DNSBackend::setArgPrefix(const string &prefix)
+void DNSBackend::setArgPrefix(const string& prefix)
{
- d_prefix=prefix;
+ d_prefix = prefix;
}
-bool DNSBackend::mustDo(const string &key)
+bool DNSBackend::mustDo(const string& key)
{
- return arg().mustDo(d_prefix+"-"+key);
+ return arg().mustDo(d_prefix + "-" + key);
}
-const string &DNSBackend::getArg(const string &key)
+const string& DNSBackend::getArg(const string& key)
{
- return arg()[d_prefix+"-"+key];
+ return arg()[d_prefix + "-" + key];
}
-int DNSBackend::getArgAsNum(const string &key)
+int DNSBackend::getArgAsNum(const string& key)
{
- return arg().asNum(d_prefix+"-"+key);
+ return arg().asNum(d_prefix + "-" + key);
}
-void BackendFactory::declare(const string &suffix, const string ¶m, const string &help, const string &value)
+void BackendFactory::declare(const string& suffix, const string& param, const string& help, const string& value)
{
- string fullname=d_name+suffix+"-"+param;
- arg().set(fullname,help)=value;
- arg().setDefault(fullname,value);
+ string fullname = d_name + suffix + "-" + param;
+ arg().set(fullname, help) = value;
+ arg().setDefault(fullname, value);
}
-const string &BackendFactory::getName() const
+const string& BackendFactory::getName() const
{
return d_name;
}
-BackendMakerClass &BackendMakers()
+BackendMakerClass& BackendMakers()
{
static BackendMakerClass bmc;
return bmc;
}
-void BackendMakerClass::report(BackendFactory *bf)
+void BackendMakerClass::report(BackendFactory* bf)
{
- d_repository[bf->getName()]=bf;
+ d_repository[bf->getName()] = bf;
}
void BackendMakerClass::clear()
load_all();
vector<string> ret;
// copy(d_repository.begin(), d_repository.end(),back_inserter(ret));
- for(d_repository_t::const_iterator i=d_repository.begin();i!=d_repository.end();++i)
+ for (d_repository_t::const_iterator i = d_repository.begin(); i != d_repository.end(); ++i)
ret.push_back(i->first);
return ret;
}
void BackendMakerClass::load_all()
{
auto directoryError = pdns::visit_directory(arg()["module-dir"], [this]([[maybe_unused]] ino_t inodeNumber, const std::string_view& name) {
- if (boost::starts_with(name, "lib") &&
- name.size() > 13 &&
- boost::ends_with(name, "backend.so")) {
+ if (boost::starts_with(name, "lib") && name.size() > 13 && boost::ends_with(name, "backend.so")) {
load(std::string(name));
}
return true;
});
if (directoryError) {
- g_log<<Logger::Error<<"Unable to open module directory '"<<arg()["module-dir"]<<"': "<<*directoryError<<endl;
+ g_log << Logger::Error << "Unable to open module directory '" << arg()["module-dir"] << "': " << *directoryError << endl;
}
}
-void BackendMakerClass::load(const string &module)
+void BackendMakerClass::load(const string& module)
{
bool res;
- if(module.find('.')==string::npos)
- res=UeberBackend::loadmodule(arg()["module-dir"]+"/lib"+module+"backend.so");
- else if(module[0]=='/' || (module[0]=='.' && module[1]=='/') || (module[0]=='.' && module[1]=='.')) // absolute or current path
- res=UeberBackend::loadmodule(module);
+ if (module.find('.') == string::npos)
+ res = UeberBackend::loadmodule(arg()["module-dir"] + "/lib" + module + "backend.so");
+ else if (module[0] == '/' || (module[0] == '.' && module[1] == '/') || (module[0] == '.' && module[1] == '.')) // absolute or current path
+ res = UeberBackend::loadmodule(module);
else
- res=UeberBackend::loadmodule(arg()["module-dir"]+"/"+module);
+ res = UeberBackend::loadmodule(arg()["module-dir"] + "/" + module);
- if(res==false) {
- g_log<<Logger::Error<<"DNSBackend unable to load module in "<<module<<endl;
+ if (res == false) {
+ g_log << Logger::Error << "DNSBackend unable to load module in " << module << endl;
exit(1);
}
}
-void BackendMakerClass::launch(const string &instr)
+void BackendMakerClass::launch(const string& instr)
{
// if(instr.empty())
// throw ArgException("Not launching any backends - nameserver won't function");
vector<string> parts;
- stringtok(parts,instr,", ");
+ stringtok(parts, instr, ", ");
for (const auto& part : parts)
if (count(parts.begin(), parts.end(), part) > 1)
throw ArgException("Refusing to launch multiple backends with the same name '" + part + "', verify all 'launch' statements in your configuration");
- for(const auto & part : parts) {
+ for (const auto& part : parts) {
string module, name;
- vector<string>pparts;
- stringtok(pparts,part,": ");
- module=pparts[0];
- if(pparts.size()>1)
- name="-"+pparts[1];
+ vector<string> pparts;
+ stringtok(pparts, part, ": ");
+ module = pparts[0];
+ if (pparts.size() > 1)
+ name = "-" + pparts[1];
- if(d_repository.find(module)==d_repository.end()) {
+ if (d_repository.find(module) == d_repository.end()) {
// this is *so* userfriendly
load(module);
- if(d_repository.find(module)==d_repository.end())
- throw ArgException("Trying to launch unknown backend '"+module+"'");
+ if (d_repository.find(module) == d_repository.end())
+ throw ArgException("Trying to launch unknown backend '" + module + "'");
}
d_repository[module]->declareArguments(name);
d_instances.emplace_back(module, name);
vector<std::unique_ptr<DNSBackend>> BackendMakerClass::all(bool metadataOnly)
{
- if(d_instances.empty()) {
+ if (d_instances.empty()) {
throw PDNSException("No database backends configured for launch, unable to function");
}
ret.push_back(std::move(made));
}
}
- catch(const PDNSException &ae) {
+ catch (const PDNSException& ae) {
g_log << Logger::Error << "Caught an exception instantiating a backend (" << current << "): " << ae.reason << endl;
g_log << Logger::Error << "Cleaning up" << endl;
ret.clear();
throw;
- } catch(...) {
+ }
+ catch (...) {
// and cleanup
g_log << Logger::Error << "Caught an exception instantiating a backend (" << current << "), cleaning up" << endl;
ret.clear();
\param sd SOAData which is filled with the SOA details
\param unmodifiedSerial bool if set, serial will be returned as stored in the backend (maybe 0)
*/
-bool DNSBackend::getSOA(const DNSName &domain, SOAData &sd)
+bool DNSBackend::getSOA(const DNSName& domain, SOAData& sd)
{
- this->lookup(QType(QType::SOA),domain,-1);
+ this->lookup(QType(QType::SOA), domain, -1);
S.inc("backend-queries");
DNSResourceRecord rr;
- int hits=0;
+ int hits = 0;
sd.db = nullptr;
{
// cout<<"DNSBackend::get(DNSZoneRecord&) called - translating into DNSResourceRecord query"<<endl;
DNSResourceRecord rr;
- if(!this->get(rr))
+ if (!this->get(rr))
return false;
dzr.auth = rr.auth;
dzr.domain_id = rr.domain_id;
dzr.scopeMask = rr.scopeMask;
- if(rr.qtype.getCode() == QType::TXT && !rr.content.empty() && rr.content[0]!='"')
- rr.content = "\""+ rr.content + "\"";
+ if (rr.qtype.getCode() == QType::TXT && !rr.content.empty() && rr.content[0] != '"')
+ rr.content = "\"" + rr.content + "\"";
try {
dzr.dr = DNSRecord(rr);
}
- catch(...) {
- while(this->get(rr));
+ catch (...) {
+ while (this->get(rr))
+ ;
throw;
}
return true;
sd.domain_id = in.domain_id;
sd.ttl = in.dr.d_ttl;
- auto src=getRR<SOARecordContent>(in.dr);
+ auto src = getRR<SOARecordContent>(in.dr);
sd.nameserver = src->d_mname;
sd.rname = src->d_rname;
sd.serial = src->d_st.serial;
std::shared_ptr<DNSRecordContent> makeSOAContent(const SOAData& sd)
{
- struct soatimes st;
- st.serial = sd.serial;
- st.refresh = sd.refresh;
- st.retry = sd.retry;
- st.expire = sd.expire;
- st.minimum = sd.minimum;
- return std::make_shared<SOARecordContent>(sd.nameserver, sd.rname, st);
+ struct soatimes st;
+ st.serial = sd.serial;
+ st.refresh = sd.refresh;
+ st.retry = sd.retry;
+ st.expire = sd.expire;
+ st.minimum = sd.minimum;
+ return std::make_shared<SOARecordContent>(sd.nameserver, sd.rname, st);
}
-void fillSOAData(const string &content, SOAData &data)
+void fillSOAData(const string& content, SOAData& data)
{
- vector<string>parts;
+ vector<string> parts;
parts.reserve(7);
stringtok(parts, content);
pdns::checked_stoi_into(data.expire, parts.at(5));
pdns::checked_stoi_into(data.minimum, parts.at(6));
}
- catch(const std::out_of_range& oor) {
+ catch (const std::out_of_range& oor) {
throw PDNSException("Out of range exception parsing '" + content + "'");
}
}
struct DomainInfo
{
- DomainInfo() : last_check(0), backend(nullptr), id(0), notified_serial(0), receivedNotify(false), serial(0), kind(DomainInfo::Native) {}
+ DomainInfo() :
+ last_check(0), backend(nullptr), id(0), notified_serial(0), receivedNotify(false), serial(0), kind(DomainInfo::Native) {}
DNSName zone;
DNSName catalog;
string options;
string account;
vector<ComboAddress> primaries;
- DNSBackend *backend{};
+ DNSBackend* backend{};
uint32_t id{};
uint32_t notified_serial{};
All
} kind;
- [[nodiscard]] const char *getKindString() const
+ [[nodiscard]] const char* getKindString() const
{
return DomainInfo::getKindString(kind);
}
- static const char *getKindString(enum DomainKind kind)
+ static const char* getKindString(enum DomainKind kind)
{
const char* kinds[] = {"Master", "Slave", "Native", "Producer", "Consumer", "All"};
return kinds[kind];
}
};
-struct TSIGKey {
- DNSName name;
- DNSName algorithm;
- std::string key;
+struct TSIGKey
+{
+ DNSName name;
+ DNSName algorithm;
+ std::string key;
};
-struct AutoPrimary {
- AutoPrimary(const string& new_ip, const string& new_nameserver, const string& new_account) :
- ip(new_ip), nameserver(new_nameserver), account(new_account){};
- std::string ip;
- std::string nameserver;
- std::string account;
+struct AutoPrimary
+{
+ AutoPrimary(const string& new_ip, const string& new_nameserver, const string& new_account) :
+ ip(new_ip), nameserver(new_nameserver), account(new_account){};
+ std::string ip;
+ std::string nameserver;
+ std::string account;
};
class DNSPacket;
{
public:
//! lookup() initiates a lookup. A lookup without results should not throw!
- virtual void lookup(const QType &qtype, const DNSName &qdomain, int zoneId=-1, DNSPacket *pkt_p=nullptr)=0;
- virtual bool get(DNSResourceRecord &)=0; //!< retrieves one DNSResource record, returns false if no more were available
- virtual bool get(DNSZoneRecord &r);
+ virtual void lookup(const QType& qtype, const DNSName& qdomain, int zoneId = -1, DNSPacket* pkt_p = nullptr) = 0;
+ virtual bool get(DNSResourceRecord&) = 0; //!< retrieves one DNSResource record, returns false if no more were available
+ virtual bool get(DNSZoneRecord& r);
//! Initiates a list of the specified domain
/** Once initiated, DNSResourceRecord objects can be retrieved using get(). Should return false
if the backend does not consider itself responsible for the id passed.
\param domain_id ID of which a list is requested
*/
- virtual bool list(const DNSName &target, int domain_id, bool include_disabled=false)=0;
+ virtual bool list(const DNSName& target, int domain_id, bool include_disabled = false) = 0;
virtual ~DNSBackend() = default;
//! fills the soadata struct with the SOA details. Returns false if there is no SOA.
- virtual bool getSOA(const DNSName &name, SOAData &soadata);
+ virtual bool getSOA(const DNSName& name, SOAData& soadata);
virtual bool replaceRRSet(uint32_t /* domain_id */, const DNSName& /* qname */, const QType& /* qt */, const vector<DNSResourceRecord>& /* rrset */)
{
/** Determines if we are authoritative for a zone, and at what level */
virtual bool getAuth(const DNSName& target, SOAData* /* sd */);
- struct KeyData {
+ struct KeyData
+ {
std::string content;
unsigned int id{0};
unsigned int flags{0};
}
//! Can be called to seed the getArg() function with a prefix
- void setArgPrefix(const string &prefix);
+ void setArgPrefix(const string& prefix);
//! Add an entry for a super primary
virtual bool autoPrimaryAdd(const struct AutoPrimary& /* primary */)
}
const string& getPrefix() { return d_prefix; };
+
protected:
- bool mustDo(const string &key);
- const string &getArg(const string &key);
- int getArgAsNum(const string &key);
+ bool mustDo(const string& key);
+ const string& getArg(const string& key);
+ int getArgAsNum(const string& key);
private:
string d_prefix;
class BackendFactory
{
public:
- BackendFactory(const string &name) : d_name(name) {}
+ BackendFactory(const string& name) :
+ d_name(name) {}
virtual ~BackendFactory() = default;
- virtual DNSBackend *make(const string &suffix)=0;
- virtual DNSBackend *makeMetadataOnly(const string &suffix)
+ virtual DNSBackend* make(const string& suffix) = 0;
+ virtual DNSBackend* makeMetadataOnly(const string& suffix)
{
return this->make(suffix);
}
[[nodiscard]] const string& getName() const;
protected:
- void declare(const string &suffix, const string ¶m, const string &explanation, const string &value);
+ void declare(const string& suffix, const string& param, const string& explanation, const string& value);
private:
const string d_name;
class BackendMakerClass
{
public:
- void report(BackendFactory *bf);
- void launch(const string &instr);
- vector<std::unique_ptr<DNSBackend>> all(bool metadataOnly=false);
- void load(const string &module);
+ void report(BackendFactory* bf);
+ void launch(const string& instr);
+ vector<std::unique_ptr<DNSBackend>> all(bool metadataOnly = false);
+ void load(const string& module);
[[nodiscard]] size_t numLauncheable() const;
vector<string> getModules();
void clear();
private:
void load_all();
- using d_repository_t = map<string, BackendFactory *>;
+ using d_repository_t = map<string, BackendFactory*>;
d_repository_t d_repository;
- vector<pair<string,string> >d_instances;
+ vector<pair<string, string>> d_instances;
};
-extern BackendMakerClass &BackendMakers();
+extern BackendMakerClass& BackendMakers();
//! Exception that can be thrown by a DNSBackend to indicate a failure
class DBException : public PDNSException
{
public:
- DBException(const string &reason_) : PDNSException(reason_){}
+ DBException(const string& reason_) :
+ PDNSException(reason_) {}
};
-
struct SOAData
{
- SOAData() : domain_id(-1) {};
+ SOAData() :
+ domain_id(-1){};
DNSName qname;
DNSName nameserver;
uint32_t retry{};
uint32_t expire{};
uint32_t minimum{};
- DNSBackend *db{};
+ DNSBackend* db{};
int domain_id{};
[[nodiscard]] uint32_t getNegativeTTL() const { return min(ttl, minimum); }
};
/** helper function for both DNSPacket and addSOARecord() - converts a line into a struct, for easier parsing */
-void fillSOAData(const string &content, SOAData &data);
+void fillSOAData(const string& content, SOAData& data);
// same but more karmic
void fillSOAData(const DNSZoneRecord& in, SOAData& data);
// the reverse