16#include <boost/scoped_ptr.hpp>
17#include <boost/algorithm/string/predicate.hpp>
32 const size_t dns_server_timeout,
35 : ip_address_(ip_address),
37 dns_server_timeout_(dns_server_timeout),
38 ncr_protocol_(ncr_protocol),
39 ncr_format_(ncr_format) {
45 port_(53001), dns_server_timeout_(500),
59 if (dns_server_timeout_ < 1) {
61 "D2Params: DNS server timeout must be larger than 0");
67 <<
" is not yet supported");
73 <<
" is not yet supported");
81 <<
", using " << ncrProtocolToString(ncr_protocol_);
87 return ((ip_address_ == other.ip_address_) &&
88 (port_ == other.port_) &&
89 (dns_server_timeout_ == other.dns_server_timeout_) &&
90 (ncr_protocol_ == other.ncr_protocol_) &&
91 (ncr_format_ == other.ncr_format_));
96 return (!(*
this == other));
101 std::ostringstream stream;
103 stream <<
", ip-address: " << ip_address_.toText()
104 <<
", port: " << port_
105 <<
", dns-server-timeout_: " << dns_server_timeout_
106 <<
", ncr-protocol: "
108 <<
", ncr-format: " << ncr_format_
111 return (stream.str());
131 const std::string& secret, std::string secret_file,
133 : name_(
name), algorithm_(algorithm), secret_(secret),
134 secret_file_(secret_file), digestbits_(digestbits), tsig_key_() {
161TSIGKeyInfo::remakeKey() {
166 std::ostringstream stream;
170 if (digestbits_ > 0) {
171 stream <<
":" << digestbits_;
174 tsig_key_.reset(
new D2TsigKey(stream.str()));
175 }
catch (
const std::exception& ex) {
176 isc_throw(D2CfgError,
"Cannot make D2TsigKey: " << ex.what());
190 if (!secret_file_.empty()) {
196 result->set(
"digest-bits",
209 : hostname_(hostname), ip_address_(ip_address), port_(port),
210 enabled_(enabled), tsig_key_info_(tsig_key_info),
211 inherited_key_(inherited_key) {
219 if (tsig_key_info_) {
220 return (tsig_key_info_->getName());
228 std::ostringstream stream;
230 return (stream.str());
245 if (tsig_key_info_ && !inherited_key_) {
262 const std::string& key_name)
263 : name_(
name), servers_(servers), key_name_(key_name) {
278 for (
auto const&
server : *servers_) {
280 servers->add(dns_server);
283 if (!servers->empty()) {
284 result->set(
"dns-servers", servers);
287 if (!key_name_.empty()) {
310 "DdnsDomainListMgr::setDomains: Domain list may not be null");
319 if (gotit != domains_->end()) {
320 wildcard_domain_ = gotit->second;
327 if ((
size() == 1) && (wildcard_domain_)) {
328 domain = wildcard_domain_;
335 size_t req_len = fqdn.size();
336 size_t match_len = 0;
338 for (
auto const& map_pair : *domains_) {
339 std::string domain_name = map_pair.first;
340 size_t dom_len = domain_name.size();
343 if (req_len < dom_len) {
348 if (req_len == dom_len) {
349 if (boost::iequals(fqdn, domain_name)) {
351 domain = map_pair.second;
359 size_t offset = req_len - dom_len;
360 if ((fqdn[offset - 1] ==
'.') &&
361 (boost::iequals(fqdn.substr(offset), domain_name))) {
364 if (dom_len > match_len) {
366 best_match = map_pair.second;
375 if (wildcard_domain_) {
376 domain = wildcard_domain_;
392 for (
auto const& domain : *domains_) {
393 ElementPtr ddns_domain = domain.second->toElement();
407 std::string algorithm =
getString(key_config,
"algorithm");
408 uint32_t digestbits =
getInteger(key_config,
"digest-bits");
409 std::string secret_file;
411 if (key_config->contains(
"secret-file")) {
412 secret_file =
getString(key_config,
"secret-file");
415 if (secret.empty()) {
417 <<
"' to not be empty");
419 }
catch (
const std::exception& ex) {
425 secret =
getString(key_config,
"secret");
432 }
catch (
const std::exception& ex) {
434 <<
" (" <<
getPosition(
"algorithm", key_config) <<
")");
440 if ((digestbits > 0) &&
441 ((digestbits < 80) ||
443 && (digestbits < 112)) ||
445 && (digestbits < 128)) ||
447 && (digestbits < 192)) ||
449 && (digestbits < 256)))) {
461 secret_file, digestbits));
462 }
catch (
const std::exception& ex) {
464 << key_config->getPosition() <<
")");
469 key_info->setContext(user_context);
481 for (
auto const& key_config : key_list->listValue()) {
485 if (keys->find(key->getName()) != keys->end()) {
488 <<
" (" <<
getPosition(
"name", key_config) <<
")");
491 (*keys)[key->getName()] = key;
503 std::string hostname =
getString(server_config,
"hostname");
504 std::string ip_address =
getString(server_config,
"ip-address");
505 uint32_t port =
getInteger(server_config,
"port");
506 std::string key_name =
getString(server_config,
"key-name");
512 bool inherited_key =
true;
513 if (key_name.empty()) {
514 std::string domain_key_name =
getString(domain_config,
"key-name");
515 if (!domain_key_name.empty()) {
516 key_name = domain_key_name;
519 inherited_key =
false;
521 if (!key_name.empty()) {
523 TSIGKeyInfoMap::iterator kit = keys->find(key_name);
524 if (kit != keys->end()) {
525 tsig_key_info = kit->second;
529 if (!tsig_key_info) {
532 <<
"undefined key: " << key_name <<
" ("
536 <<
"undefined key: " << key_name <<
" ("
543 if (hostname.empty() == ip_address.empty()) {
545 " of hostname or IP address"
546 <<
" (" << server_config->getPosition() <<
")");
550 if (!hostname.empty()) {
565 <<
" (" <<
getPosition(
"hostname", server_config) <<
")");
577 <<
" (" <<
getPosition(
"ip-address", server_config) <<
")");
583 server_info->setContext(user_context);
586 return (server_info);
597 for (
auto const& server_config : server_list->listValue()) {
599 parser.
parse(server_config, domain_config, keys);
600 servers->push_back(
server);
611 std::string key_name =
getString(domain_config,
"key-name");
617 servers_config = domain_config->get(
"dns-servers");
618 }
catch (
const std::exception& ex) {
620 <<
" (" << servers_config->getPosition() <<
")");
625 server_parser.
parse(servers_config, domain_config, keys);
626 if (servers->size() == 0) {
628 << servers_config->getPosition());
636 domain->setContext(user_context);
648 for (
auto const& domain_config : domain_list->listValue()) {
652 if (domains->find(domain->getName()) != domains->end()) {
655 <<
" (" <<
getPosition(
"name", domain_config) <<
")");
658 (*domains)[domain->getName()] = domain;
668 const std::string& mgr_name,
674 if (domains_config) {
679 mgr->setDomains(domains);
when the call the UDPServer carries on at the same position As a result
it forwards queries to a single upstream resolver and passes the answers back to the client It is constructed with the address of the forward server Queries are initiated with the question to ask the forward server
static ElementPtr create(const Position &pos=ZERO_POSITION())
static ElementPtr createMap(const Position &pos=ZERO_POSITION())
Creates an empty MapElement type ElementPtr.
static ElementPtr createList(const Position &pos=ZERO_POSITION())
Creates an empty ListElement type ElementPtr.
A generic exception that is thrown if a parameter given to a method is considered invalid in that con...
The IOAddress class represents an IP addresses (version agnostic)
std::string toText() const
Convert the address to a string.
An exception that is thrown if an error occurs within the IO module.
Exception thrown when the error during configuration handling occurs.
Acts as a storage vault for D2 global scalar parameters.
D2Params()
Default constructor The default constructor creates an instance that has updates disabled.
const isc::asiolink::IOAddress & getIpAddress() const
Return the IP address D2 listens on.
bool operator!=(const D2Params &other) const
Compares two D2Params's for inequality.
size_t getPort() const
Return the TCP/UPD port D2 listens on.
bool operator==(const D2Params &other) const
Compares two D2Params's for equality.
D2Params(const isc::asiolink::IOAddress &ip_address, const size_t port, const size_t dns_server_timeout, const dhcp_ddns::NameChangeProtocol &ncr_protocol, const dhcp_ddns::NameChangeFormat &ncr_format)
Constructor.
virtual ~D2Params()
Destructor.
std::string getConfigSummary() const
Return summary of the configuration used by D2.
std::string toText() const
Generates a string representation of the class contents.
virtual void validateContents()
Validates member values.
DdnsDomainListMgrPtr parse(data::ConstElementPtr mgr_config, const std::string &mgr_name, const TSIGKeyInfoMapPtr keys)
Performs the actual parsing of the given manager element.
Provides storage for and management of a list of DNS domains.
DdnsDomainListMgr(const std::string &name)
Constructor.
virtual bool matchDomain(const std::string &fqdn, DdnsDomainPtr &domain)
Matches a given name to a domain based on a longest match scheme.
void setDomains(DdnsDomainMapPtr domains)
Sets the manger's domain list to the given list of domains.
static const char * wildcard_domain_name_
defines the domain name for denoting the wildcard domain.
virtual ~DdnsDomainListMgr()
Destructor.
uint32_t size() const
Returns the number of domains in the domain list.
virtual isc::data::ElementPtr toElement() const
Unparse a configuration object.
Parser for a list of DdnsDomains.
DdnsDomainMapPtr parse(data::ConstElementPtr domain_list_config, const TSIGKeyInfoMapPtr keys)
Performs the actual parsing of the given list "ddns-domain" elements.
DdnsDomainPtr parse(data::ConstElementPtr domain_config, const TSIGKeyInfoMapPtr keys)
Performs the actual parsing of the given "ddns-domain" element.
Represents a DNS domain that is may be updated dynamically.
DdnsDomain(const std::string &name, DnsServerInfoStoragePtr servers, const std::string &key_name="")
Constructor.
virtual ~DdnsDomain()
Destructor.
virtual isc::data::ElementPtr toElement() const
Unparse a configuration object.
Parser for a list of DnsServerInfos.
DnsServerInfoStoragePtr parse(data::ConstElementPtr server_list_config, data::ConstElementPtr domain_config, const TSIGKeyInfoMapPtr keys)
Performs the actual parsing of the given list "dns-server" elements.
Parser for DnsServerInfo.
DnsServerInfoPtr parse(data::ConstElementPtr server_config, data::ConstElementPtr domain_config, const TSIGKeyInfoMapPtr keys)
Performs the actual parsing of the given "dns-server" element.
Represents a specific DNS Server.
std::string toText() const
Returns a text representation for the server.
const std::string getKeyName() const
Convenience method which returns the server's TSIG key name.
DnsServerInfo(const std::string &hostname, isc::asiolink::IOAddress ip_address, uint32_t port=STANDARD_DNS_PORT, bool enabled=true, const TSIGKeyInfoPtr &tsig_key_info=TSIGKeyInfoPtr(), bool inherited_key=true)
Constructor.
virtual isc::data::ElementPtr toElement() const
Unparse a configuration object.
uint32_t getPort() const
Getter which returns the server's port number.
const isc::asiolink::IOAddress & getIpAddress() const
Getter which returns the server's ip_address.
virtual ~DnsServerInfo()
Destructor.
TSIGKeyInfoMapPtr parse(data::ConstElementPtr key_list_config)
Performs the parsing of the given list "tsig-key" elements.
TSIGKeyInfoPtr parse(data::ConstElementPtr key_config)
Performs the actual parsing of the given "tsig-key" element.
static const char * HMAC_SHA224_STR
TSIGKeyInfo(const std::string &name, const std::string &algorithm, const std::string &secret, std::string secret_file="", uint32_t digestbits=0)
Constructor.
virtual ~TSIGKeyInfo()
Destructor.
static const char * HMAC_MD5_STR
Defines string values for the supported TSIG algorithms.
virtual isc::data::ElementPtr toElement() const
Unparse a configuration object.
static const char * HMAC_SHA1_STR
static const char * HMAC_SHA256_STR
static const dns::Name & stringToAlgorithmName(const std::string &algorithm_id)
Converts algorithm id to dns::TSIGKey algorithm dns::Name.
static const char * HMAC_SHA512_STR
static const char * HMAC_SHA384_STR
static const data::Element::Position & getPosition(const std::string &name, const data::ConstElementPtr parent)
Utility method that returns position of an element.
static std::string getString(isc::data::ConstElementPtr scope, const std::string &name)
Returns a string parameter from a scope.
static int64_t getInteger(isc::data::ConstElementPtr scope, const std::string &name)
Returns an integer parameter from a scope.
The Name class encapsulates DNS names.
std::string toText(bool omit_final_dot=false) const
Convert the Name to a string.
static const Name & HMACMD5_NAME()
Well known algorithm names as defined in RFC2845 and RFC4635.
static const Name & HMACSHA224_NAME()
static const Name & HMACSHA256_NAME()
static const Name & HMACSHA1_NAME()
static const Name & HMACSHA512_NAME()
static const Name & HMACSHA384_NAME()
#define isc_throw(type, stream)
A shortcut macro to insert known values into exception arguments.
#define LOG_WARN(LOGGER, MESSAGE)
Macro to conveniently test warn output and log it.
A wrapper interface for the ASIO library.
std::ostream & operator<<(std::ostream &os, const IOAddress &address)
Insert the IOAddress as a string into stream.
boost::shared_ptr< DdnsDomainListMgr > DdnsDomainListMgrPtr
Defines a pointer for DdnsDomain instances.
boost::shared_ptr< DdnsDomain > DdnsDomainPtr
Defines a pointer for DdnsDomain instances.
boost::shared_ptr< DdnsDomainMap > DdnsDomainMapPtr
Defines a pointer to DdnsDomain storage containers.
boost::shared_ptr< DnsServerInfo > DnsServerInfoPtr
Defines a pointer for DnsServerInfo instances.
std::map< std::string, DdnsDomainPtr > DdnsDomainMap
Defines a map of DdnsDomains, keyed by the domain name.
isc::log::Logger dhcp_to_d2_logger("dhcp-to-d2")
boost::shared_ptr< TSIGKeyInfo > TSIGKeyInfoPtr
Defines a pointer for TSIGKeyInfo instances.
std::vector< DnsServerInfoPtr > DnsServerInfoStorage
Defines a storage container for DnsServerInfo pointers.
std::map< std::string, TSIGKeyInfoPtr > TSIGKeyInfoMap
Defines a map of TSIGKeyInfos, keyed by the name.
boost::shared_ptr< DnsServerInfoStorage > DnsServerInfoStoragePtr
Defines a pointer to DnsServerInfo storage containers.
const isc::log::MessageID DHCP_DDNS_NO_MATCH
boost::shared_ptr< TSIGKeyInfoMap > TSIGKeyInfoMapPtr
Defines a pointer to map of TSIGkeyInfos.
boost::shared_ptr< const Element > ConstElementPtr
boost::shared_ptr< Element > ElementPtr
NameChangeFormat
Defines the list of data wire formats supported.
NameChangeProtocol
Defines the list of socket protocols supported.
std::string ncrProtocolToString(NameChangeProtocol protocol)
Function which converts NameChangeProtocol enums to text labels.
std::string ncrFormatToString(NameChangeFormat format)
Function which converts NameChangeFormat enums to text labels.
string getContent(string const &file_name)
Get the content of a regular file.
Defines the logger used by the top-level component of kea-lfc.
void contextToElement(data::ElementPtr map) const
Merge unparse a user_context object.