mirror of
https://gitlab.isc.org/isc-projects/kea
synced 2025-08-29 13:07:50 +00:00
[3329] Moved dhcp::D2ClientMgr into its own header and source.
d2_client.h and .cc was split into four files: D2ClientConfig class is now in d2_client_cfg.h/cc D2ClientMgr class is now in d2_client_mgr.h/cc
This commit is contained in:
parent
e200b6ca36
commit
14b17e2992
@ -39,7 +39,8 @@ libb10_dhcpsrv_la_SOURCES =
|
|||||||
libb10_dhcpsrv_la_SOURCES += addr_utilities.cc addr_utilities.h
|
libb10_dhcpsrv_la_SOURCES += addr_utilities.cc addr_utilities.h
|
||||||
libb10_dhcpsrv_la_SOURCES += alloc_engine.cc alloc_engine.h
|
libb10_dhcpsrv_la_SOURCES += alloc_engine.cc alloc_engine.h
|
||||||
libb10_dhcpsrv_la_SOURCES += callout_handle_store.h
|
libb10_dhcpsrv_la_SOURCES += callout_handle_store.h
|
||||||
libb10_dhcpsrv_la_SOURCES += d2_client.cc d2_client.h
|
libb10_dhcpsrv_la_SOURCES += d2_client_cfg.cc d2_client_cfg.h
|
||||||
|
libb10_dhcpsrv_la_SOURCES += d2_client_mgr.cc d2_client_mgr.h
|
||||||
libb10_dhcpsrv_la_SOURCES += dbaccess_parser.cc dbaccess_parser.h
|
libb10_dhcpsrv_la_SOURCES += dbaccess_parser.cc dbaccess_parser.h
|
||||||
libb10_dhcpsrv_la_SOURCES += dhcpsrv_log.cc dhcpsrv_log.h
|
libb10_dhcpsrv_la_SOURCES += dhcpsrv_log.cc dhcpsrv_log.h
|
||||||
libb10_dhcpsrv_la_SOURCES += cfgmgr.cc cfgmgr.h
|
libb10_dhcpsrv_la_SOURCES += cfgmgr.cc cfgmgr.h
|
||||||
|
@ -20,7 +20,7 @@
|
|||||||
#include <dhcp/option_definition.h>
|
#include <dhcp/option_definition.h>
|
||||||
#include <dhcp/option_space.h>
|
#include <dhcp/option_space.h>
|
||||||
#include <dhcp/classify.h>
|
#include <dhcp/classify.h>
|
||||||
#include <dhcpsrv/d2_client.h>
|
#include <dhcpsrv/d2_client_mgr.h>
|
||||||
#include <dhcpsrv/option_space_container.h>
|
#include <dhcpsrv/option_space_container.h>
|
||||||
#include <dhcpsrv/pool.h>
|
#include <dhcpsrv/pool.h>
|
||||||
#include <dhcpsrv/subnet.h>
|
#include <dhcpsrv/subnet.h>
|
||||||
|
141
src/lib/dhcpsrv/d2_client_cfg.cc
Normal file
141
src/lib/dhcpsrv/d2_client_cfg.cc
Normal file
@ -0,0 +1,141 @@
|
|||||||
|
// Copyright (C) 2013-2014 Internet Systems Consortium, Inc. ("ISC")
|
||||||
|
//
|
||||||
|
// Permission to use, copy, modify, and/or distribute this software for any
|
||||||
|
// purpose with or without fee is hereby granted, provided that the above
|
||||||
|
// copyright notice and this permission notice appear in all copies.
|
||||||
|
//
|
||||||
|
// THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
|
||||||
|
// REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||||
|
// AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
|
||||||
|
// INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
||||||
|
// LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
|
||||||
|
// OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
||||||
|
// PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
|
||||||
|
#include <dhcp_ddns/ncr_udp.h>
|
||||||
|
#include <dhcpsrv/d2_client_cfg.h>
|
||||||
|
#include <dhcpsrv/dhcpsrv_log.h>
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
namespace isc {
|
||||||
|
namespace dhcp {
|
||||||
|
|
||||||
|
D2ClientConfig::D2ClientConfig(const bool enable_updates,
|
||||||
|
const isc::asiolink::IOAddress& server_ip,
|
||||||
|
const size_t server_port,
|
||||||
|
const dhcp_ddns::
|
||||||
|
NameChangeProtocol& ncr_protocol,
|
||||||
|
const dhcp_ddns::
|
||||||
|
NameChangeFormat& ncr_format,
|
||||||
|
const bool always_include_fqdn,
|
||||||
|
const bool override_no_update,
|
||||||
|
const bool override_client_update,
|
||||||
|
const bool replace_client_name,
|
||||||
|
const std::string& generated_prefix,
|
||||||
|
const std::string& qualifying_suffix)
|
||||||
|
: enable_updates_(enable_updates),
|
||||||
|
server_ip_(server_ip),
|
||||||
|
server_port_(server_port),
|
||||||
|
ncr_protocol_(ncr_protocol),
|
||||||
|
ncr_format_(ncr_format),
|
||||||
|
always_include_fqdn_(always_include_fqdn),
|
||||||
|
override_no_update_(override_no_update),
|
||||||
|
override_client_update_(override_client_update),
|
||||||
|
replace_client_name_(replace_client_name),
|
||||||
|
generated_prefix_(generated_prefix),
|
||||||
|
qualifying_suffix_(qualifying_suffix) {
|
||||||
|
validateContents();
|
||||||
|
}
|
||||||
|
|
||||||
|
D2ClientConfig::D2ClientConfig()
|
||||||
|
: enable_updates_(false),
|
||||||
|
server_ip_(isc::asiolink::IOAddress("0.0.0.0")),
|
||||||
|
server_port_(0),
|
||||||
|
ncr_protocol_(dhcp_ddns::NCR_UDP),
|
||||||
|
ncr_format_(dhcp_ddns::FMT_JSON),
|
||||||
|
always_include_fqdn_(false),
|
||||||
|
override_no_update_(false),
|
||||||
|
override_client_update_(false),
|
||||||
|
replace_client_name_(false),
|
||||||
|
generated_prefix_("myhost"),
|
||||||
|
qualifying_suffix_("example.com") {
|
||||||
|
validateContents();
|
||||||
|
}
|
||||||
|
|
||||||
|
D2ClientConfig::~D2ClientConfig(){};
|
||||||
|
|
||||||
|
void
|
||||||
|
D2ClientConfig::validateContents() {
|
||||||
|
if (ncr_format_ != dhcp_ddns::FMT_JSON) {
|
||||||
|
isc_throw(D2ClientError, "D2ClientConfig: NCR Format:"
|
||||||
|
<< dhcp_ddns::ncrFormatToString(ncr_format_)
|
||||||
|
<< " is not yet supported");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ncr_protocol_ != dhcp_ddns::NCR_UDP) {
|
||||||
|
isc_throw(D2ClientError, "D2ClientConfig: NCR Protocol:"
|
||||||
|
<< dhcp_ddns::ncrProtocolToString(ncr_protocol_)
|
||||||
|
<< " is not yet supported");
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @todo perhaps more validation we should do yet?
|
||||||
|
/// Are there any invalid combinations of options we need to test against?
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
D2ClientConfig::operator == (const D2ClientConfig& other) const {
|
||||||
|
return ((enable_updates_ == other.enable_updates_) &&
|
||||||
|
(server_ip_ == other.server_ip_) &&
|
||||||
|
(server_port_ == other.server_port_) &&
|
||||||
|
(ncr_protocol_ == other.ncr_protocol_) &&
|
||||||
|
(ncr_format_ == other.ncr_format_) &&
|
||||||
|
(always_include_fqdn_ == other.always_include_fqdn_) &&
|
||||||
|
(override_no_update_ == other.override_no_update_) &&
|
||||||
|
(override_client_update_ == other.override_client_update_) &&
|
||||||
|
(replace_client_name_ == other.replace_client_name_) &&
|
||||||
|
(generated_prefix_ == other.generated_prefix_) &&
|
||||||
|
(qualifying_suffix_ == other.qualifying_suffix_));
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
D2ClientConfig::operator != (const D2ClientConfig& other) const {
|
||||||
|
return (!(*this == other));
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string
|
||||||
|
D2ClientConfig::toText() const {
|
||||||
|
std::ostringstream stream;
|
||||||
|
|
||||||
|
stream << "enable_updates: " << (enable_updates_ ? "yes" : "no");
|
||||||
|
if (enable_updates_) {
|
||||||
|
stream << ", server_ip: " << server_ip_.toText()
|
||||||
|
<< ", server_port: " << server_port_
|
||||||
|
<< ", ncr_protocol: " << ncr_protocol_
|
||||||
|
<< ", ncr_format: " << ncr_format_
|
||||||
|
<< ", always_include_fqdn: " << (always_include_fqdn_ ?
|
||||||
|
"yes" : "no")
|
||||||
|
<< ", override_no_update: " << (override_no_update_ ?
|
||||||
|
"yes" : "no")
|
||||||
|
<< ", override_client_update: " << (override_client_update_ ?
|
||||||
|
"yes" : "no")
|
||||||
|
<< ", replace_client_name: " << (replace_client_name_ ?
|
||||||
|
"yes" : "no")
|
||||||
|
<< ", generated_prefix: [" << generated_prefix_ << "]"
|
||||||
|
<< ", qualifying_suffix: [" << qualifying_suffix_ << "]";
|
||||||
|
}
|
||||||
|
|
||||||
|
return (stream.str());
|
||||||
|
}
|
||||||
|
|
||||||
|
std::ostream&
|
||||||
|
operator<<(std::ostream& os, const D2ClientConfig& config) {
|
||||||
|
os << config.toText();
|
||||||
|
return (os);
|
||||||
|
}
|
||||||
|
|
||||||
|
}; // namespace dhcp
|
||||||
|
|
||||||
|
}; // namespace isc
|
217
src/lib/dhcpsrv/d2_client_cfg.h
Normal file
217
src/lib/dhcpsrv/d2_client_cfg.h
Normal file
@ -0,0 +1,217 @@
|
|||||||
|
// Copyright (C) 2013-2014 Internet Systems Consortium, Inc. ("ISC")
|
||||||
|
//
|
||||||
|
// Permission to use, copy, modify, and/or distribute this software for any
|
||||||
|
// purpose with or without fee is hereby granted, provided that the above
|
||||||
|
// copyright notice and this permission notice appear in all copies.
|
||||||
|
//
|
||||||
|
// THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
|
||||||
|
// REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||||
|
// AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
|
||||||
|
// INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
||||||
|
// LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
|
||||||
|
// OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
||||||
|
// PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
|
||||||
|
#ifndef D2_CLIENT_CFG_H
|
||||||
|
#define D2_CLIENT_CFG_H
|
||||||
|
|
||||||
|
/// @file d2_client_cfg.h Defines the D2ClientConfig class.
|
||||||
|
/// This file defines the classes Kea uses to manage configuration needed to
|
||||||
|
/// act as a client of the b10-dhcp-ddns module (aka D2).
|
||||||
|
///
|
||||||
|
#include <asiolink/io_address.h>
|
||||||
|
#include <dhcp_ddns/ncr_io.h>
|
||||||
|
#include <exceptions/exceptions.h>
|
||||||
|
|
||||||
|
#include <boost/shared_ptr.hpp>
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
namespace isc {
|
||||||
|
namespace dhcp {
|
||||||
|
|
||||||
|
|
||||||
|
/// An exception that is thrown if an error occurs while configuring
|
||||||
|
/// the D2 DHCP DDNS client.
|
||||||
|
class D2ClientError : public isc::Exception {
|
||||||
|
public:
|
||||||
|
|
||||||
|
/// @brief constructor
|
||||||
|
///
|
||||||
|
/// @param file name of the file, where exception occurred
|
||||||
|
/// @param line line of the file, where exception occurred
|
||||||
|
/// @param what text description of the issue that caused exception
|
||||||
|
D2ClientError(const char* file, size_t line, const char* what)
|
||||||
|
: isc::Exception(file, line, what) {}
|
||||||
|
};
|
||||||
|
|
||||||
|
/// @brief Acts as a storage vault for D2 client configuration
|
||||||
|
///
|
||||||
|
/// A simple container class for storing and retrieving the configuration
|
||||||
|
/// parameters associated with DHCP-DDNS and acting as a client of D2.
|
||||||
|
/// Instances of this class may be constructed through configuration parsing.
|
||||||
|
///
|
||||||
|
class D2ClientConfig {
|
||||||
|
public:
|
||||||
|
/// @brief Constructor
|
||||||
|
///
|
||||||
|
/// @param enable_updates Enables DHCP-DDNS updates
|
||||||
|
/// @param server_ip IP address of the b10-dhcp-ddns server (IPv4 or IPv6)
|
||||||
|
/// @param server_port IP port of the b10-dhcp-ddns server
|
||||||
|
/// @param ncr_protocol Socket protocol to use with b10-dhcp-ddns
|
||||||
|
/// Currently only UDP is supported.
|
||||||
|
/// @param ncr_format Format of the b10-dhcp-ddns requests.
|
||||||
|
/// Currently only JSON format is supported.
|
||||||
|
/// @param always_include_fqdn Enables always including the FQDN option in
|
||||||
|
/// DHCP responses.
|
||||||
|
/// @param override_no_update Enables updates, even if clients request no
|
||||||
|
/// updates.
|
||||||
|
/// @param override_client_update Perform updates, even if client requested
|
||||||
|
/// delegation.
|
||||||
|
/// @param replace_client_name enables replacement of the domain-name
|
||||||
|
/// supplied by the client with a generated name.
|
||||||
|
/// @param generated_prefix Prefix to use when generating domain-names.
|
||||||
|
/// @param qualifying_suffix Suffix to use to qualify partial domain-names.
|
||||||
|
///
|
||||||
|
/// @throw D2ClientError if given an invalid protocol or format.
|
||||||
|
D2ClientConfig(const bool enable_updates,
|
||||||
|
const isc::asiolink::IOAddress& server_ip,
|
||||||
|
const size_t server_port,
|
||||||
|
const dhcp_ddns::NameChangeProtocol& ncr_protocol,
|
||||||
|
const dhcp_ddns::NameChangeFormat& ncr_format,
|
||||||
|
const bool always_include_fqdn,
|
||||||
|
const bool override_no_update,
|
||||||
|
const bool override_client_update,
|
||||||
|
const bool replace_client_name,
|
||||||
|
const std::string& generated_prefix,
|
||||||
|
const std::string& qualifying_suffix);
|
||||||
|
|
||||||
|
/// @brief Default constructor
|
||||||
|
/// The default constructor creates an instance that has updates disabled.
|
||||||
|
D2ClientConfig();
|
||||||
|
|
||||||
|
/// @brief Destructor
|
||||||
|
virtual ~D2ClientConfig();
|
||||||
|
|
||||||
|
/// @brief Return whether or not DHCP-DDNS updating is enabled.
|
||||||
|
bool getEnableUpdates() const {
|
||||||
|
return(enable_updates_);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @brief Return the IP address of b10-dhcp-ddns (IPv4 or IPv6).
|
||||||
|
const isc::asiolink::IOAddress& getServerIp() const {
|
||||||
|
return(server_ip_);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @brief Return the IP port of b10-dhcp-ddns.
|
||||||
|
size_t getServerPort() const {
|
||||||
|
return(server_port_);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @brief Return the socket protocol to use with b10-dhcp-ddns.
|
||||||
|
const dhcp_ddns::NameChangeProtocol& getNcrProtocol() const {
|
||||||
|
return(ncr_protocol_);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @brief Return the b10-dhcp-ddns request format.
|
||||||
|
const dhcp_ddns::NameChangeFormat& getNcrFormat() const {
|
||||||
|
return(ncr_format_);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @brief Return whether or not FQDN is always included in DHCP responses.
|
||||||
|
bool getAlwaysIncludeFqdn() const {
|
||||||
|
return(always_include_fqdn_);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @brief Return if updates are done even if clients request no updates.
|
||||||
|
bool getOverrideNoUpdate() const {
|
||||||
|
return(override_no_update_);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @brief Return if updates are done even when clients request delegation.
|
||||||
|
bool getOverrideClientUpdate() const {
|
||||||
|
return(override_client_update_);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @brief Return whether or not client's domain-name is always replaced.
|
||||||
|
bool getReplaceClientName() const {
|
||||||
|
return(replace_client_name_);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @brief Return the prefix to use when generating domain-names.
|
||||||
|
const std::string& getGeneratedPrefix() const {
|
||||||
|
return(generated_prefix_);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @brief Return the suffix to use to qualify partial domain-names.
|
||||||
|
const std::string& getQualifyingSuffix() const {
|
||||||
|
return(qualifying_suffix_);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @brief Compares two D2ClientConfigs for equality
|
||||||
|
bool operator == (const D2ClientConfig& other) const;
|
||||||
|
|
||||||
|
/// @brief Compares two D2ClientConfigs for inequality
|
||||||
|
bool operator != (const D2ClientConfig& other) const;
|
||||||
|
|
||||||
|
/// @brief Generates a string representation of the class contents.
|
||||||
|
std::string toText() const;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
/// @brief Validates member values.
|
||||||
|
///
|
||||||
|
/// Method is used by the constructor to validate member contents.
|
||||||
|
///
|
||||||
|
/// @throw D2ClientError if given an invalid protocol or format.
|
||||||
|
virtual void validateContents();
|
||||||
|
|
||||||
|
private:
|
||||||
|
/// @brief Indicates whether or not DHCP DDNS updating is enabled.
|
||||||
|
bool enable_updates_;
|
||||||
|
|
||||||
|
/// @brief IP address of the b10-dhcp-ddns server (IPv4 or IPv6).
|
||||||
|
isc::asiolink::IOAddress server_ip_;
|
||||||
|
|
||||||
|
/// @brief IP port of the b10-dhcp-ddns server.
|
||||||
|
size_t server_port_;
|
||||||
|
|
||||||
|
/// @brief The socket protocol to use with b10-dhcp-ddns.
|
||||||
|
/// Currently only UDP is supported.
|
||||||
|
dhcp_ddns::NameChangeProtocol ncr_protocol_;
|
||||||
|
|
||||||
|
/// @brief Format of the b10-dhcp-ddns requests.
|
||||||
|
/// Currently only JSON format is supported.
|
||||||
|
dhcp_ddns::NameChangeFormat ncr_format_;
|
||||||
|
|
||||||
|
/// @brief Should Kea always include the FQDN option in its response.
|
||||||
|
bool always_include_fqdn_;
|
||||||
|
|
||||||
|
/// @brief Should Kea perform updates, even if client requested no updates.
|
||||||
|
/// Overrides the client request for no updates via the N flag.
|
||||||
|
bool override_no_update_;
|
||||||
|
|
||||||
|
/// @brief Should Kea perform updates, even if client requested delegation.
|
||||||
|
bool override_client_update_;
|
||||||
|
|
||||||
|
/// @brief Should Kea replace the domain-name supplied by the client.
|
||||||
|
bool replace_client_name_;
|
||||||
|
|
||||||
|
/// @brief Prefix Kea should use when generating domain-names.
|
||||||
|
std::string generated_prefix_;
|
||||||
|
|
||||||
|
/// @brief Suffix Kea should use when to qualify partial domain-names.
|
||||||
|
std::string qualifying_suffix_;
|
||||||
|
};
|
||||||
|
|
||||||
|
std::ostream&
|
||||||
|
operator<<(std::ostream& os, const D2ClientConfig& config);
|
||||||
|
|
||||||
|
/// @brief Defines a pointer for D2ClientConfig instances.
|
||||||
|
typedef boost::shared_ptr<D2ClientConfig> D2ClientConfigPtr;
|
||||||
|
|
||||||
|
} // namespace isc
|
||||||
|
} // namespace dhcp
|
||||||
|
|
||||||
|
#endif
|
@ -1,4 +1,4 @@
|
|||||||
// Copyright (C) 2013-2014 Internet Systems Consortium, Inc. ("ISC")
|
// Copyright (C) 2014 Internet Systems Consortium, Inc. ("ISC")
|
||||||
//
|
//
|
||||||
// Permission to use, copy, modify, and/or distribute this software for any
|
// Permission to use, copy, modify, and/or distribute this software for any
|
||||||
// purpose with or without fee is hereby granted, provided that the above
|
// purpose with or without fee is hereby granted, provided that the above
|
||||||
@ -13,7 +13,7 @@
|
|||||||
// PERFORMANCE OF THIS SOFTWARE.
|
// PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
|
||||||
#include <dhcp_ddns/ncr_udp.h>
|
#include <dhcp_ddns/ncr_udp.h>
|
||||||
#include <dhcpsrv/d2_client.h>
|
#include <dhcpsrv/d2_client_mgr.h>
|
||||||
#include <dhcpsrv/dhcpsrv_log.h>
|
#include <dhcpsrv/dhcpsrv_log.h>
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
@ -23,125 +23,6 @@ using namespace std;
|
|||||||
namespace isc {
|
namespace isc {
|
||||||
namespace dhcp {
|
namespace dhcp {
|
||||||
|
|
||||||
//***************************** D2ClientConfig ********************************
|
|
||||||
|
|
||||||
D2ClientConfig::D2ClientConfig(const bool enable_updates,
|
|
||||||
const isc::asiolink::IOAddress& server_ip,
|
|
||||||
const size_t server_port,
|
|
||||||
const dhcp_ddns::
|
|
||||||
NameChangeProtocol& ncr_protocol,
|
|
||||||
const dhcp_ddns::
|
|
||||||
NameChangeFormat& ncr_format,
|
|
||||||
const bool always_include_fqdn,
|
|
||||||
const bool override_no_update,
|
|
||||||
const bool override_client_update,
|
|
||||||
const bool replace_client_name,
|
|
||||||
const std::string& generated_prefix,
|
|
||||||
const std::string& qualifying_suffix)
|
|
||||||
: enable_updates_(enable_updates),
|
|
||||||
server_ip_(server_ip),
|
|
||||||
server_port_(server_port),
|
|
||||||
ncr_protocol_(ncr_protocol),
|
|
||||||
ncr_format_(ncr_format),
|
|
||||||
always_include_fqdn_(always_include_fqdn),
|
|
||||||
override_no_update_(override_no_update),
|
|
||||||
override_client_update_(override_client_update),
|
|
||||||
replace_client_name_(replace_client_name),
|
|
||||||
generated_prefix_(generated_prefix),
|
|
||||||
qualifying_suffix_(qualifying_suffix) {
|
|
||||||
validateContents();
|
|
||||||
}
|
|
||||||
|
|
||||||
D2ClientConfig::D2ClientConfig()
|
|
||||||
: enable_updates_(false),
|
|
||||||
server_ip_(isc::asiolink::IOAddress("0.0.0.0")),
|
|
||||||
server_port_(0),
|
|
||||||
ncr_protocol_(dhcp_ddns::NCR_UDP),
|
|
||||||
ncr_format_(dhcp_ddns::FMT_JSON),
|
|
||||||
always_include_fqdn_(false),
|
|
||||||
override_no_update_(false),
|
|
||||||
override_client_update_(false),
|
|
||||||
replace_client_name_(false),
|
|
||||||
generated_prefix_("myhost"),
|
|
||||||
qualifying_suffix_("example.com") {
|
|
||||||
validateContents();
|
|
||||||
}
|
|
||||||
|
|
||||||
D2ClientConfig::~D2ClientConfig(){};
|
|
||||||
|
|
||||||
void
|
|
||||||
D2ClientConfig::validateContents() {
|
|
||||||
if (ncr_format_ != dhcp_ddns::FMT_JSON) {
|
|
||||||
isc_throw(D2ClientError, "D2ClientConfig: NCR Format:"
|
|
||||||
<< dhcp_ddns::ncrFormatToString(ncr_format_)
|
|
||||||
<< " is not yet supported");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ncr_protocol_ != dhcp_ddns::NCR_UDP) {
|
|
||||||
isc_throw(D2ClientError, "D2ClientConfig: NCR Protocol:"
|
|
||||||
<< dhcp_ddns::ncrProtocolToString(ncr_protocol_)
|
|
||||||
<< " is not yet supported");
|
|
||||||
}
|
|
||||||
|
|
||||||
/// @todo perhaps more validation we should do yet?
|
|
||||||
/// Are there any invalid combinations of options we need to test against?
|
|
||||||
}
|
|
||||||
|
|
||||||
bool
|
|
||||||
D2ClientConfig::operator == (const D2ClientConfig& other) const {
|
|
||||||
return ((enable_updates_ == other.enable_updates_) &&
|
|
||||||
(server_ip_ == other.server_ip_) &&
|
|
||||||
(server_port_ == other.server_port_) &&
|
|
||||||
(ncr_protocol_ == other.ncr_protocol_) &&
|
|
||||||
(ncr_format_ == other.ncr_format_) &&
|
|
||||||
(always_include_fqdn_ == other.always_include_fqdn_) &&
|
|
||||||
(override_no_update_ == other.override_no_update_) &&
|
|
||||||
(override_client_update_ == other.override_client_update_) &&
|
|
||||||
(replace_client_name_ == other.replace_client_name_) &&
|
|
||||||
(generated_prefix_ == other.generated_prefix_) &&
|
|
||||||
(qualifying_suffix_ == other.qualifying_suffix_));
|
|
||||||
}
|
|
||||||
|
|
||||||
bool
|
|
||||||
D2ClientConfig::operator != (const D2ClientConfig& other) const {
|
|
||||||
return (!(*this == other));
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string
|
|
||||||
D2ClientConfig::toText() const {
|
|
||||||
std::ostringstream stream;
|
|
||||||
|
|
||||||
stream << "enable_updates: " << (enable_updates_ ? "yes" : "no");
|
|
||||||
if (enable_updates_) {
|
|
||||||
stream << ", server_ip: " << server_ip_.toText()
|
|
||||||
<< ", server_port: " << server_port_
|
|
||||||
<< ", ncr_protocol: " << ncr_protocol_
|
|
||||||
<< ", ncr_format: " << ncr_format_
|
|
||||||
<< ", always_include_fqdn: " << (always_include_fqdn_ ?
|
|
||||||
"yes" : "no")
|
|
||||||
<< ", override_no_update: " << (override_no_update_ ?
|
|
||||||
"yes" : "no")
|
|
||||||
<< ", override_client_update: " << (override_client_update_ ?
|
|
||||||
"yes" : "no")
|
|
||||||
<< ", replace_client_name: " << (replace_client_name_ ?
|
|
||||||
"yes" : "no")
|
|
||||||
<< ", generated_prefix: [" << generated_prefix_ << "]"
|
|
||||||
<< ", qualifying_suffix: [" << qualifying_suffix_ << "]";
|
|
||||||
}
|
|
||||||
|
|
||||||
return (stream.str());
|
|
||||||
}
|
|
||||||
|
|
||||||
std::ostream&
|
|
||||||
operator<<(std::ostream& os, const D2ClientConfig& config) {
|
|
||||||
os << config.toText();
|
|
||||||
return (os);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//******************************** D2ClientMgr ********************************
|
|
||||||
|
|
||||||
|
|
||||||
D2ClientMgr::D2ClientMgr() : d2_client_config_(new D2ClientConfig()),
|
D2ClientMgr::D2ClientMgr() : d2_client_config_(new D2ClientConfig()),
|
||||||
name_change_sender_(), private_io_service_(), sender_io_service_(NULL) {
|
name_change_sender_(), private_io_service_(), sender_io_service_(NULL) {
|
||||||
// Default constructor initializes with a disabled configuration.
|
// Default constructor initializes with a disabled configuration.
|
@ -1,4 +1,4 @@
|
|||||||
// Copyright (C) 2013-2014 Internet Systems Consortium, Inc. ("ISC")
|
// Copyright (C) 2014 Internet Systems Consortium, Inc. ("ISC")
|
||||||
//
|
//
|
||||||
// Permission to use, copy, modify, and/or distribute this software for any
|
// Permission to use, copy, modify, and/or distribute this software for any
|
||||||
// purpose with or without fee is hereby granted, provided that the above
|
// purpose with or without fee is hereby granted, provided that the above
|
||||||
@ -12,15 +12,16 @@
|
|||||||
// OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
// OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
||||||
// PERFORMANCE OF THIS SOFTWARE.
|
// PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
|
||||||
#ifndef D2_CLIENT_H
|
#ifndef D2_CLIENT_MGR_H
|
||||||
#define D2_CLIENT_H
|
#define D2_CLIENT_MGR_H
|
||||||
|
|
||||||
/// @file d2_client.h Defines the D2ClientConfig and D2ClientMgr classes.
|
/// @file d2_client_mgr.h Defines the D2ClientMgr class.
|
||||||
/// This file defines the classes Kea uses to act as a client of the b10-
|
/// This file defines the class Kea uses to act as a client of the
|
||||||
/// dhcp-ddns module (aka D2).
|
/// b10-dhcp-ddns module (aka D2).
|
||||||
///
|
///
|
||||||
#include <asiolink/io_address.h>
|
#include <asiolink/io_address.h>
|
||||||
#include <dhcp_ddns/ncr_io.h>
|
#include <dhcp_ddns/ncr_io.h>
|
||||||
|
#include <dhcpsrv/d2_client_cfg.h>
|
||||||
#include <exceptions/exceptions.h>
|
#include <exceptions/exceptions.h>
|
||||||
|
|
||||||
#include <boost/shared_ptr.hpp>
|
#include <boost/shared_ptr.hpp>
|
||||||
@ -32,185 +33,6 @@
|
|||||||
namespace isc {
|
namespace isc {
|
||||||
namespace dhcp {
|
namespace dhcp {
|
||||||
|
|
||||||
|
|
||||||
/// An exception that is thrown if an error occurs while configuring
|
|
||||||
/// the D2 DHCP DDNS client.
|
|
||||||
class D2ClientError : public isc::Exception {
|
|
||||||
public:
|
|
||||||
|
|
||||||
/// @brief constructor
|
|
||||||
///
|
|
||||||
/// @param file name of the file, where exception occurred
|
|
||||||
/// @param line line of the file, where exception occurred
|
|
||||||
/// @param what text description of the issue that caused exception
|
|
||||||
D2ClientError(const char* file, size_t line, const char* what)
|
|
||||||
: isc::Exception(file, line, what) {}
|
|
||||||
};
|
|
||||||
|
|
||||||
/// @brief Acts as a storage vault for D2 client configuration
|
|
||||||
///
|
|
||||||
/// A simple container class for storing and retrieving the configuration
|
|
||||||
/// parameters associated with DHCP-DDNS and acting as a client of D2.
|
|
||||||
/// Instances of this class may be constructed through configuration parsing.
|
|
||||||
///
|
|
||||||
class D2ClientConfig {
|
|
||||||
public:
|
|
||||||
/// @brief Constructor
|
|
||||||
///
|
|
||||||
/// @param enable_updates Enables DHCP-DDNS updates
|
|
||||||
/// @param server_ip IP address of the b10-dhcp-ddns server (IPv4 or IPv6)
|
|
||||||
/// @param server_port IP port of the b10-dhcp-ddns server
|
|
||||||
/// @param ncr_protocol Socket protocol to use with b10-dhcp-ddns
|
|
||||||
/// Currently only UDP is supported.
|
|
||||||
/// @param ncr_format Format of the b10-dhcp-ddns requests.
|
|
||||||
/// Currently only JSON format is supported.
|
|
||||||
/// @param always_include_fqdn Enables always including the FQDN option in
|
|
||||||
/// DHCP responses.
|
|
||||||
/// @param override_no_update Enables updates, even if clients request no
|
|
||||||
/// updates.
|
|
||||||
/// @param override_client_update Perform updates, even if client requested
|
|
||||||
/// delegation.
|
|
||||||
/// @param replace_client_name enables replacement of the domain-name
|
|
||||||
/// supplied by the client with a generated name.
|
|
||||||
/// @param generated_prefix Prefix to use when generating domain-names.
|
|
||||||
/// @param qualifying_suffix Suffix to use to qualify partial domain-names.
|
|
||||||
///
|
|
||||||
/// @throw D2ClientError if given an invalid protocol or format.
|
|
||||||
D2ClientConfig(const bool enable_updates,
|
|
||||||
const isc::asiolink::IOAddress& server_ip,
|
|
||||||
const size_t server_port,
|
|
||||||
const dhcp_ddns::NameChangeProtocol& ncr_protocol,
|
|
||||||
const dhcp_ddns::NameChangeFormat& ncr_format,
|
|
||||||
const bool always_include_fqdn,
|
|
||||||
const bool override_no_update,
|
|
||||||
const bool override_client_update,
|
|
||||||
const bool replace_client_name,
|
|
||||||
const std::string& generated_prefix,
|
|
||||||
const std::string& qualifying_suffix);
|
|
||||||
|
|
||||||
/// @brief Default constructor
|
|
||||||
/// The default constructor creates an instance that has updates disabled.
|
|
||||||
D2ClientConfig();
|
|
||||||
|
|
||||||
/// @brief Destructor
|
|
||||||
virtual ~D2ClientConfig();
|
|
||||||
|
|
||||||
/// @brief Return whether or not DHCP-DDNS updating is enabled.
|
|
||||||
bool getEnableUpdates() const {
|
|
||||||
return(enable_updates_);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// @brief Return the IP address of b10-dhcp-ddns (IPv4 or IPv6).
|
|
||||||
const isc::asiolink::IOAddress& getServerIp() const {
|
|
||||||
return(server_ip_);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// @brief Return the IP port of b10-dhcp-ddns.
|
|
||||||
size_t getServerPort() const {
|
|
||||||
return(server_port_);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// @brief Return the socket protocol to use with b10-dhcp-ddns.
|
|
||||||
const dhcp_ddns::NameChangeProtocol& getNcrProtocol() const {
|
|
||||||
return(ncr_protocol_);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// @brief Return the b10-dhcp-ddns request format.
|
|
||||||
const dhcp_ddns::NameChangeFormat& getNcrFormat() const {
|
|
||||||
return(ncr_format_);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// @brief Return whether or not FQDN is always included in DHCP responses.
|
|
||||||
bool getAlwaysIncludeFqdn() const {
|
|
||||||
return(always_include_fqdn_);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// @brief Return if updates are done even if clients request no updates.
|
|
||||||
bool getOverrideNoUpdate() const {
|
|
||||||
return(override_no_update_);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// @brief Return if updates are done even when clients request delegation.
|
|
||||||
bool getOverrideClientUpdate() const {
|
|
||||||
return(override_client_update_);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// @brief Return whether or not client's domain-name is always replaced.
|
|
||||||
bool getReplaceClientName() const {
|
|
||||||
return(replace_client_name_);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// @brief Return the prefix to use when generating domain-names.
|
|
||||||
const std::string& getGeneratedPrefix() const {
|
|
||||||
return(generated_prefix_);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// @brief Return the suffix to use to qualify partial domain-names.
|
|
||||||
const std::string& getQualifyingSuffix() const {
|
|
||||||
return(qualifying_suffix_);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// @brief Compares two D2ClientConfigs for equality
|
|
||||||
bool operator == (const D2ClientConfig& other) const;
|
|
||||||
|
|
||||||
/// @brief Compares two D2ClientConfigs for inequality
|
|
||||||
bool operator != (const D2ClientConfig& other) const;
|
|
||||||
|
|
||||||
/// @brief Generates a string representation of the class contents.
|
|
||||||
std::string toText() const;
|
|
||||||
|
|
||||||
protected:
|
|
||||||
/// @brief Validates member values.
|
|
||||||
///
|
|
||||||
/// Method is used by the constructor to validate member contents.
|
|
||||||
///
|
|
||||||
/// @throw D2ClientError if given an invalid protocol or format.
|
|
||||||
virtual void validateContents();
|
|
||||||
|
|
||||||
private:
|
|
||||||
/// @brief Indicates whether or not DHCP DDNS updating is enabled.
|
|
||||||
bool enable_updates_;
|
|
||||||
|
|
||||||
/// @brief IP address of the b10-dhcp-ddns server (IPv4 or IPv6).
|
|
||||||
isc::asiolink::IOAddress server_ip_;
|
|
||||||
|
|
||||||
/// @brief IP port of the b10-dhcp-ddns server.
|
|
||||||
size_t server_port_;
|
|
||||||
|
|
||||||
/// @brief The socket protocol to use with b10-dhcp-ddns.
|
|
||||||
/// Currently only UDP is supported.
|
|
||||||
dhcp_ddns::NameChangeProtocol ncr_protocol_;
|
|
||||||
|
|
||||||
/// @brief Format of the b10-dhcp-ddns requests.
|
|
||||||
/// Currently only JSON format is supported.
|
|
||||||
dhcp_ddns::NameChangeFormat ncr_format_;
|
|
||||||
|
|
||||||
/// @brief Should Kea always include the FQDN option in its response.
|
|
||||||
bool always_include_fqdn_;
|
|
||||||
|
|
||||||
/// @brief Should Kea perform updates, even if client requested no updates.
|
|
||||||
/// Overrides the client request for no updates via the N flag.
|
|
||||||
bool override_no_update_;
|
|
||||||
|
|
||||||
/// @brief Should Kea perform updates, even if client requested delegation.
|
|
||||||
bool override_client_update_;
|
|
||||||
|
|
||||||
/// @brief Should Kea replace the domain-name supplied by the client.
|
|
||||||
bool replace_client_name_;
|
|
||||||
|
|
||||||
/// @brief Prefix Kea should use when generating domain-names.
|
|
||||||
std::string generated_prefix_;
|
|
||||||
|
|
||||||
/// @brief Suffix Kea should use when to qualify partial domain-names.
|
|
||||||
std::string qualifying_suffix_;
|
|
||||||
};
|
|
||||||
|
|
||||||
std::ostream&
|
|
||||||
operator<<(std::ostream& os, const D2ClientConfig& config);
|
|
||||||
|
|
||||||
/// @brief Defines a pointer for D2ClientConfig instances.
|
|
||||||
typedef boost::shared_ptr<D2ClientConfig> D2ClientConfigPtr;
|
|
||||||
|
|
||||||
/// @brief Defines the type for D2 IO error handler.
|
/// @brief Defines the type for D2 IO error handler.
|
||||||
/// This callback is invoked when a send to b10-dhcp-ddns completes with a
|
/// This callback is invoked when a send to b10-dhcp-ddns completes with a
|
||||||
/// failed status. This provides the application layer (Kea) with a means to
|
/// failed status. This provides the application layer (Kea) with a means to
|
@ -18,7 +18,7 @@
|
|||||||
#include <asiolink/io_address.h>
|
#include <asiolink/io_address.h>
|
||||||
#include <cc/data.h>
|
#include <cc/data.h>
|
||||||
#include <dhcp/option_definition.h>
|
#include <dhcp/option_definition.h>
|
||||||
#include <dhcpsrv/d2_client.h>
|
#include <dhcpsrv/d2_client_cfg.h>
|
||||||
#include <dhcpsrv/dhcp_config_parser.h>
|
#include <dhcpsrv/dhcp_config_parser.h>
|
||||||
#include <dhcpsrv/option_space_container.h>
|
#include <dhcpsrv/option_space_container.h>
|
||||||
#include <dhcpsrv/subnet.h>
|
#include <dhcpsrv/subnet.h>
|
||||||
|
@ -15,7 +15,7 @@
|
|||||||
#include <config.h>
|
#include <config.h>
|
||||||
#include <dhcp/option4_client_fqdn.h>
|
#include <dhcp/option4_client_fqdn.h>
|
||||||
#include <dhcp/option6_client_fqdn.h>
|
#include <dhcp/option6_client_fqdn.h>
|
||||||
#include <dhcpsrv/d2_client.h>
|
#include <dhcpsrv/d2_client_mgr.h>
|
||||||
#include <exceptions/exceptions.h>
|
#include <exceptions/exceptions.h>
|
||||||
|
|
||||||
#include <gtest/gtest.h>
|
#include <gtest/gtest.h>
|
||||||
|
@ -19,7 +19,7 @@
|
|||||||
#include <asio.hpp>
|
#include <asio.hpp>
|
||||||
#include <asiolink/io_service.h>
|
#include <asiolink/io_service.h>
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
#include <dhcpsrv/d2_client.h>
|
#include <dhcpsrv/d2_client_mgr.h>
|
||||||
#include <exceptions/exceptions.h>
|
#include <exceptions/exceptions.h>
|
||||||
|
|
||||||
#include <boost/function.hpp>
|
#include <boost/function.hpp>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user