qtype.cc \
rcpgenerator.cc rcpgenerator.hh \
rec-lua-conf.cc rec-lua-conf.hh \
+ rec-system-resolve.cc rec-system-resolve.hh \
rec_channel.cc rec_channel.hh \
rec_control.cc \
settings/cxxsupport.cc \
+ threadname.cc threadname.hh \
sillyrecords.cc \
sortlist.cc sortlist.hh \
svc-records.cc svc-records.hh \
#include "validate.hh"
#include "validate-recursor.hh"
#include "root-dnssec.hh"
+#include "rec-system-resolve.hh"
GlobalStateHolder<LuaConfigItems> g_luaconfs;
std::shared_ptr<DNSFilterEngine::Zone> zone = std::make_shared<DNSFilterEngine::Zone>();
if (primaries_.type() == typeid(string)) {
- params.zoneXFRParams.primaries.emplace_back(boost::get<std::string>(primaries_), 53);
+ params.zoneXFRParams.primaries.emplace_back(boost::get<std::string>(primaries_));
}
else {
for (const auto& primary : boost::get<std::vector<std::pair<int, std::string>>>(primaries_)) {
- params.zoneXFRParams.primaries.emplace_back(primary.second, 53);
+ params.zoneXFRParams.primaries.emplace_back(primary.second);
}
}
if (params.zoneXFRParams.localAddress != ComboAddress()) {
// We were passed a localAddress, check if its AF matches the primaries'
- for (const auto& primary : params.zoneXFRParams.primaries) {
+ for (const auto& nameOrIP : params.zoneXFRParams.primaries) {
+ auto primary = pdns::fromNameOrIP(nameOrIP, 53, lci.d_slog);
if (params.zoneXFRParams.localAddress.sin4.sin_family != primary.sin4.sin_family) {
throw PDNSException("Primary address(" + primary.toString() + ") is not of the same Address Family as the local address (" + params.zoneXFRParams.localAddress.toString() + ").");
}
wakeup = true;
condVar.notify_one();
}
+
+ComboAddress pdns::fromNameOrIP(const string& str, uint16_t defPort, Logr::log_t log)
+{
+ try {
+ ComboAddress addr = parseIPAndPort(str, defPort);
+ return addr;
+ }
+ catch (const PDNSException&) {
+ uint16_t port = defPort;
+ string::size_type pos = str.rfind(':');
+ if (pos != string::npos) {
+ port = pdns::checked_stoi<uint16_t>(str.substr(pos + 1));
+ }
+ auto& res = pdns::RecResolve::getInstance();
+ ComboAddress address = res.lookupAndRegister(str.substr(0, pos), time(nullptr));
+ if (address != ComboAddress()) {
+ address.setPort(port);
+ return address;
+ }
+ log->error(Logr::Error, "Could not resolve name", "name", Logging::Loggable(str));
+ throw PDNSException("Could not resolve " + str);
+ }
+}
#include "namespaces.hh"
#include "iputils.hh"
#include "lock.hh"
+#include "logr.hh"
/************************************************************************************************
The pdns::RecResolve class implements a facility to use the system configured resolver. At the moment
static bool s_selfResolveCheck;
};
+ ComboAddress fromNameOrIP(const string& str, uint16_t defPort, Logr::log_t log);
}
#include "axfr-retriever.hh"
#include "ixfr.hh"
#include "dnsrecords.hh"
+#include "rec-system-resolve.hh"
static const DNSName cZones("zones");
static const DNSName cVersion("version");
if (const auto ptr = getRR<PTRRecordContent>(record.second)) {
auto defsIter = params.d_defaults.find("");
const auto& name = record.first.first;
+ const auto& target = ptr->getContent();
auto groupKey = name;
groupKey.prependRawLabel("group");
// Look for group records matching the member
groupName = unquotify(groupName);
auto iter = params.d_defaults.find(groupName);
if (iter == params.d_defaults.end()) {
- logger->info(Logr::Debug, "No match for group in YAML config", "name", Logging::Loggable(name), "groupName", Logging::Loggable(groupName));
+ logger->info(Logr::Error, "No match for group in YAML config", "name", Logging::Loggable(name), "groupName", Logging::Loggable(groupName), "target", Logging::Loggable(target));
continue;
}
- logger->info(Logr::Debug, "Match for group in YAML config", "name", Logging::Loggable(name), "groupName", Logging::Loggable(groupName));
+ logger->info(Logr::Debug, "Match for group in YAML config", "name", Logging::Loggable(name), "groupName", Logging::Loggable(groupName), "target", Logging::Loggable(target));
defsIter = iter;
break;
}
}
if (defsIter == params.d_defaults.end()) {
- logger->info(Logr::Error, "No match for group in YAML config", "name", Logging::Loggable(name));
+ logger->info(Logr::Error, "No match for default group in YAML config", "name", Logging::Loggable(name), "target", Logging::Loggable(target));
continue;
}
- auto target = ptr->getContent();
pdns::rust::settings::rec::ForwardZone forward;
forward.zone = target.toString();
forward.recurse = defsIter->second.recurse;
/* full copy, as promised */
auto newZone = std::make_shared<CatalogZone>(*oldZone);
- for (const auto& primary : d_params.primaries) {
+ for (const auto& nameOrIp : d_params.primaries) {
try {
+ auto primary = pdns::fromNameOrIP(nameOrIp, 53, logger);
d_params.soaRecordContent = loadZoneFromServer(logger, primary, zoneName, newZone, d_params.tsigtriplet, d_params.maxReceivedMBytes, d_params.localAddress, d_params.xfrTimeout);
newZone->setSerial(d_params.soaRecordContent->d_st.serial);
newZone->setRefresh(d_params.soaRecordContent->d_st.refresh);
break;
}
catch (const std::exception& e) {
- logger->error(Logr::Warning, e.what(), "Unable to load zone, will retry", "from", Logging::Loggable(primary), "exception", Logging::Loggable("std::exception"), "refresh", Logging::Loggable(refresh));
+ logger->error(Logr::Warning, e.what(), "Unable to load zone, will retry", "from", Logging::Loggable(nameOrIp), "exception", Logging::Loggable("std::exception"), "refresh", Logging::Loggable(refresh));
// XXX Stats
}
catch (const PDNSException& e) {
- logger->error(Logr::Warning, e.reason, "Unable to load zone, will retry", "from", Logging::Loggable(primary), "exception", Logging::Loggable("PDNSException"), "refresh", Logging::Loggable(refresh));
+ logger->error(Logr::Warning, e.reason, "Unable to load zone, will retry", "from", Logging::Loggable(nameOrIp), "exception", Logging::Loggable("PDNSException"), "refresh", Logging::Loggable(refresh));
// XXX Stats
}
}
}
vector<pair<vector<DNSRecord>, vector<DNSRecord>>> deltas;
- for (const auto& primary : d_params.primaries) {
+ for (const auto& nameOrIp : d_params.primaries) {
+ auto primary = pdns::fromNameOrIP(nameOrIp, 53, logger);
auto soa = getRR<SOARecordContent>(soaRecord);
auto serial = soa ? soa->d_st.serial : 0;
logger->info(Logr::Info, "Getting IXFR deltas", "address", Logging::Loggable(primary), "ourserial", Logging::Loggable(serial));
struct ZoneXFRParams
{
std::string name;
- std::vector<ComboAddress> primaries;
+ std::vector<std::string> primaries;
ComboAddress localAddress;
std::shared_ptr<const SOARecordContent> soaRecordContent;
TSIGTriplet tsigtriplet;
return ret;
}
-static ComboAddress fromNameOrIP(const string& str, uint16_t defPort, Logr::log_t log)
-{
- try {
- ComboAddress addr = parseIPAndPort(str, defPort);
- return addr;
- }
- catch (const PDNSException&) {
- uint16_t port = defPort;
- string::size_type pos = str.rfind(':');
- if (pos != string::npos) {
- port = pdns::checked_stoi<uint16_t>(str.substr(pos + 1));
- }
- auto& res = pdns::RecResolve::getInstance();
- ComboAddress address = res.lookupAndRegister(str.substr(0, pos), time(nullptr));
- if (address != ComboAddress()) {
- address.setPort(port);
- return address;
- }
- log->error(Logr::Error, "Could not resolve name", "name", Logging::Loggable(str));
- throw PDNSException("Could not resolve " + str);
- }
-}
-
static void convertServersForAD(const std::string& zone, const std::string& input, SyncRes::AuthDomain& authDomain, const char* sepa, Logr::log_t log, bool verbose = true)
{
vector<string> servers;
vector<string> addresses;
for (auto& server : servers) {
- ComboAddress addr = fromNameOrIP(server, 53, log);
+ ComboAddress addr = pdns::fromNameOrIP(server, 53, log);
authDomain.d_servers.push_back(addr);
if (verbose) {
addresses.push_back(addr.toStringWithPort());
authDomain.d_name = DNSName(string(forward.zone));
authDomain.d_rdForward = forward.recurse;
for (const auto& forwarder : forward.forwarders) {
- ComboAddress addr = parseIPAndPort(string(forwarder), 53);
+ ComboAddress addr = pdns::fromNameOrIP(string(forwarder), 53, log);
authDomain.d_servers.emplace_back(addr);
}
(*newMap)[authDomain.d_name] = authDomain;
authDomain.d_name = DNSName(string(forward.zone));
authDomain.d_rdForward = forward.recurse;
for (const auto& forwarder : forward.forwarders) {
- ComboAddress addr = parseIPAndPort(string(forwarder), 53);
+ ComboAddress addr = pdns::fromNameOrIP(string(forwarder), 53, log);
authDomain.d_servers.emplace_back(addr);
}
(*newMap)[authDomain.d_name] = authDomain;
#include "zoneparser-tng.hh"
#include "threadname.hh"
#include "query-local-address.hh"
+#include "rec-system-resolve.hh"
Netmask makeNetmaskFromRPZ(const DNSName& name)
{
std::shared_ptr<DNSFilterEngine::Zone> newZone = std::make_shared<DNSFilterEngine::Zone>(*oldZone);
for (const auto& primary : params.zoneXFRParams.primaries) {
try {
- params.zoneXFRParams.soaRecordContent = loadRPZFromServer(logger, primary, zoneName, newZone, params.defpol, params.defpolOverrideLocal, params.maxTTL, params.zoneXFRParams.tsigtriplet, params.zoneXFRParams.maxReceivedMBytes, params.zoneXFRParams.localAddress, params.zoneXFRParams.xfrTimeout);
+ auto combo = pdns::fromNameOrIP(primary, 53, logger);
+ params.zoneXFRParams.soaRecordContent = loadRPZFromServer(logger, combo, zoneName, newZone, params.defpol, params.defpolOverrideLocal, params.maxTTL, params.zoneXFRParams.tsigtriplet, params.zoneXFRParams.maxReceivedMBytes, params.zoneXFRParams.localAddress, params.zoneXFRParams.xfrTimeout);
newZone->setSerial(params.zoneXFRParams.soaRecordContent->d_st.serial);
newZone->setRefresh(params.zoneXFRParams.soaRecordContent->d_st.refresh);
refresh = std::max(params.zoneXFRParams.refreshFromConf != 0 ? params.zoneXFRParams.refreshFromConf : newZone->getRefresh(), 1U);
}
vector<pair<vector<DNSRecord>, vector<DNSRecord>>> deltas;
- for (const auto& primary : params.zoneXFRParams.primaries) {
+ for (const auto& ipOrName : params.zoneXFRParams.primaries) {
+ auto primary = pdns::fromNameOrIP(ipOrName, 53, logger);
auto soa = getRR<SOARecordContent>(dnsRecord);
auto serial = soa ? soa->d_st.serial : 0;
SLOG(g_log << Logger::Info << "Getting IXFR deltas for " << zoneName << " from " << primary.toStringWithPort() << ", our serial: " << serial << endl,
};
for (const auto& address : rpz.zoneXFRParams.primaries) {
- rustrpz.addresses.emplace_back(address.toStringWithPort());
+ rustrpz.addresses.emplace_back(address);
}
rustrpz.name = rpz.zoneXFRParams.name;
rustrpz.defcontent = rpz.defcontent;
for (const auto& rpz : rpzs) {
RPZTrackerParams params;
for (const auto& address : rpz.addresses) {
- ComboAddress combo = ComboAddress(std::string(address), 53);
- params.zoneXFRParams.primaries.emplace_back(combo.toStringWithPort());
+ params.zoneXFRParams.primaries.emplace_back(address);
}
params.zoneXFRParams.name = std::string(rpz.name);
params.polName = std::string(rpz.policyName);
fwcatz.d_catz = std::make_shared<CatalogZone>();
for (const auto& address : catz.xfr.addresses) {
- ComboAddress combo = ComboAddress(std::string(address), 53);
- fwcatz.d_params.primaries.emplace_back(combo.toStringWithPort());
+ fwcatz.d_params.primaries.emplace_back(address);
}
fwcatz.d_params.name = std::string(catz.zone);
fwcatz.d_params.zoneSizeHint = catz.xfr.zoneSizeHint;
let msg = format!("{}: cannot be empty", addrfield);
return Err(ValidationError { msg });
}
- validate_vec(addrfield, vec, validate_socket_address)?;
+ validate_vec(addrfield, vec, validate_socket_address_or_name)?;
if local_address.is_empty() {
return Ok(());
}
let mut wrong = false;
let sa = SocketAddr::from_str(addr_str);
if sa.is_err() {
- let ip = IpAddr::from_str(addr_str).unwrap();
+ let ip = IpAddr::from_str(addr_str);
+ if ip.is_err() { // It is likely a name
+ continue;
+ }
+ let ip = ip.unwrap();
if local.is_ipv4() != ip.is_ipv4() || local.is_ipv6() != ip.is_ipv6() {
wrong = true;
}
}
impl ForwardingCatalogZone {
- pub fn validate(&self, _field: &str) -> Result<(), ValidationError> {
+ pub fn validate(&self, field: &str) -> Result<(), ValidationError> {
+ self.xfr.tsig.validate(&(field.to_owned() + ".xfr.tsig"))?;
+ if !self.xfr.addresses.is_empty() {
+ validate_address_family(&(field.to_owned() + ".xfr.addresses"), &(field.to_owned() + ".xfr.localAddress"), &self.xfr.addresses, &self.xfr.localAddress)?;
+ }
Ok(())
}