 |
Kea
1.5.0
|
Go to the documentation of this file.
17 #include <boost/algorithm/string/predicate.hpp>
28 if (boost::iequals(fmt_str,
"JSON")) {
41 std::ostringstream stream;
42 stream <<
"UNKNOWN(" <<
format <<
")";
43 return (stream.str());
53 const uint8_t DHCID_ID_HWADDR = 0x0;
56 const uint8_t DHCID_ID_CLIENTID = 0x1;
58 const uint8_t DHCID_ID_DUID = 0x2;
70 const std::vector<uint8_t>& wire_fqdn) {
75 const std::vector<uint8_t>& wire_fqdn) {
80 const std::vector<uint8_t>& wire_fqdn) {
102 const std::vector<uint8_t>& wire_fqdn) {
103 createDigest(DHCID_ID_CLIENTID, clientid_data, wire_fqdn);
108 const std::vector<uint8_t>& wire_fqdn) {
111 "unable to compute DHCID from the HW address, "
112 "NULL pointer has been specified");
113 }
else if (hwaddr->hwaddr_.empty()) {
115 "unable to compute DHCID from the HW address, "
116 "HW address is empty");
118 std::vector<uint8_t> hwaddr_data;
119 hwaddr_data.push_back(hwaddr->htype_);
120 hwaddr_data.insert(hwaddr_data.end(), hwaddr->hwaddr_.begin(),
121 hwaddr->hwaddr_.end());
122 createDigest(DHCID_ID_HWADDR, hwaddr_data, wire_fqdn);
128 const std::vector<uint8_t>& wire_fqdn) {
130 createDigest(DHCID_ID_DUID, duid.
getDuid(), wire_fqdn);
134 D2Dhcid::createDigest(
const uint8_t identifier_type,
135 const std::vector<uint8_t>& identifier_data,
136 const std::vector<uint8_t>& wire_fqdn) {
140 if (wire_fqdn.empty()) {
142 "empty FQDN used to create DHCID");
149 if (identifier_data.empty()) {
151 "empty DUID used to create DHCID");
155 std::vector<uint8_t> data = identifier_data;
158 data.insert(data.end(), wire_fqdn.begin(), wire_fqdn.end());
167 }
catch (
const std::exception& ex) {
169 "error while generating DHCID from DUID: "
181 bytes_.resize(3 + hash.getLength());
184 bytes_[1] = identifier_type;
188 std::memcpy(&bytes_[3], hash.getData(), hash.getLength());
202 : change_type_(
CHG_ADD), forward_change_(false),
203 reverse_change_(false), fqdn_(
""), ip_io_address_(
"0.0.0.0"),
204 dhcid_(), lease_expires_on_(), lease_length_(0), status_(
ST_NEW) {
208 const bool forward_change,
const bool reverse_change,
209 const std::string& fqdn,
const std::string& ip_address,
211 const uint64_t lease_expires_on,
212 const uint32_t lease_length)
213 : change_type_(change_type), forward_change_(forward_change),
214 reverse_change_(reverse_change), fqdn_(fqdn), ip_io_address_(
"0.0.0.0"),
215 dhcid_(dhcid), lease_expires_on_(lease_expires_on),
216 lease_length_(lease_length), status_(
ST_NEW) {
242 std::vector<uint8_t> vec;
246 std::string string_data(vec.begin(), vec.end());
277 std::string json =
toJSON();
278 uint16_t length = json.size();
305 "Malformed NameChangeRequest JSON: " << ex.
what());
309 ElementMap element_map = elements->mapValue();
321 element = ncr->getElement(
"change-type", element_map);
322 ncr->setChangeType(element);
324 element = ncr->getElement(
"forward-change", element_map);
325 ncr->setForwardChange(element);
327 element = ncr->getElement(
"reverse-change", element_map);
328 ncr->setReverseChange(element);
330 element = ncr->getElement(
"fqdn", element_map);
331 ncr->setFqdn(element);
333 element = ncr->getElement(
"ip-address", element_map);
334 ncr->setIpAddress(element);
336 element = ncr->getElement(
"dhcid", element_map);
337 ncr->setDhcid(element);
339 element = ncr->getElement(
"lease-expires-on", element_map);
340 ncr->setLeaseExpiresOn(element);
342 element = ncr->getElement(
"lease-length", element_map);
343 ncr->setLeaseLength(element);
348 ncr->validateContent();
359 std::ostringstream stream;
362 <<
"\"forward-change\":"
364 <<
"\"reverse-change\":"
366 <<
"\"fqdn\":\"" <<
getFqdn() <<
"\","
372 return (stream.str());
386 if (dhcid_.
getBytes().size() == 0) {
391 if (!forward_change_ && !reverse_change_) {
393 "Invalid Request, forward and reverse flags are both false");
401 ElementMap::const_iterator it = element_map.find(name);
402 if (it == element_map.end()) {
405 "NameChangeRequest value missing for: " << name );
414 change_type_ = value;
423 raw_value = element->intValue();
427 "Wrong data type for change_type: " << ex.
what());
433 "Invalid data value for change_type: " << raw_value);
442 forward_change_ = value;
450 value = element->boolValue();
454 "Wrong data type for forward-change: " << ex.
what());
463 reverse_change_ = value;
471 value = element->boolValue();
475 "Wrong data type for reverse_change: " << ex.
what());
485 setFqdn(element->stringValue());
493 }
catch (
const std::exception& ex) {
495 "Invalid FQDN value: " << value <<
", reason: "
507 "Invalid ip address string for ip_address: " << value);
539 "Invalid date-time string: [" << value <<
"]");
551 lease_length_ = value;
559 value = element->intValue();
563 "Wrong data type for lease_length: " << ex.
what());
567 if (value > std::numeric_limits<uint32_t>::max()) {
569 "is too large for unsigned 32-bit integer.");
573 "is negative. It must greater than or equal to zero ");
587 std::ostringstream stream;
589 stream <<
"Type: " <<
static_cast<int>(change_type_) <<
" (";
590 switch (change_type_) {
592 stream <<
"CHG_ADD)\n";
595 stream <<
"CHG_REMOVE)\n";
599 stream <<
"Invalid Value\n";
602 stream <<
"Forward Change: " << (forward_change_ ?
"yes" :
"no")
604 <<
"Reverse Change: " << (reverse_change_ ?
"yes" :
"no")
606 <<
"FQDN: [" << fqdn_ <<
"]" << std::endl
607 <<
"IP Address: [" << ip_io_address_ <<
"]" << std::endl
608 <<
"DHCID: [" << dhcid_.
toStr() <<
"]" << std::endl
610 <<
"Lease Length: " << lease_length_ << std::endl;
612 return (stream.str());
617 return ((change_type_ == other.change_type_) &&
618 (forward_change_ == other.forward_change_) &&
619 (reverse_change_ == other.reverse_change_) &&
620 (fqdn_ == other.fqdn_) &&
621 (ip_io_address_ == other.ip_io_address_) &&
622 (dhcid_ == other.dhcid_) &&
623 (lease_expires_on_ == other.lease_expires_on_) &&
624 (lease_length_ == other.lease_length_));
629 return (!(*
this == other));
This file provides the classes needed to embody, compose, and decompose DNS update requests that are ...
std::string toStr() const
Returns the DHCID value as a string of hexadecimal digits.
NameChangeRequest()
Default Constructor.
void validateContent()
Validates the content of a populated request.
uint64_t timeFromText64(const string &time_txt)
Convert textual DNSSEC time to integer, 64-bit version.
bool isForwardChange() const
Checks forward change flag.
void setLeaseExpiresOn(const std::string &value)
Sets the lease expiration based on the given string.
void setChangeType(const NameChangeType value)
Sets the change type to the given value.
static NameChangeRequestPtr fromFormat(const NameChangeFormat format, isc::util::InputBuffer &buffer)
Static method for creating a NameChangeRequest from a buffer containing a marshalled request in a giv...
The IOAddress class represents an IP addresses (version agnostic)
static NameChangeRequestPtr fromJSON(const std::string &json)
Static method for creating a NameChangeRequest from a string containing a JSON rendition of a request...
const D2Dhcid & getDhcid() const
Fetches the request DHCID.
boost::shared_ptr< NameChangeRequest > NameChangeRequestPtr
Defines a pointer to a NameChangeRequest.
Container class for handling the DHCID value within a NameChangeRequest.
void writeUint16(uint16_t data)
Write an unsigned 16-bit integer in host byte order into the buffer in network byte order.
std::string toText() const
Returns a text rendition of the contents of the request.
const std::vector< uint8_t > & getBytes() const
Returns a reference to the DHCID byte vector.
NameChangeType getChangeType() const
Fetches the request change type.
std::string toText(bool omit_final_dot=false) const
Convert the Name to a string.
A standard Data module exception that is thrown if a function is called for an Element that has a wro...
NameChangeType
Defines the types of DNS updates that can be requested.
void fromHWAddr(const isc::dhcp::HWAddrPtr &hwaddr, const std::vector< uint8_t > &wire_fqdn)
Sets the DHCID value based on the HW address and FQDN.
void setReverseChange(const bool value)
Sets the reverse change flag to the given value.
This is a base class for exceptions thrown from the DNS library module.
Defines the logger used by the top-level component of kea-dhcp-ddns.
boost::shared_ptr< HWAddr > HWAddrPtr
Shared pointer to a hardware address structure.
virtual const char * what() const
Returns a C-style character string of the cause of the exception.
D2Dhcid()
Default constructor.
std::string toJSON() const
Instance method for marshalling the contents of the request into a string of JSON text.
#define isc_throw(type, stream)
A shortcut macro to insert known values into exception arguments.
void digest(const void *data, const size_t data_len, const HashAlgorithm hash_algorithm, isc::util::OutputBuffer &result, size_t len)
Create an Hash digest for the given data.
A generic exception that is thrown if a parameter given to a method is considered invalid in that con...
void setStatus(const NameChangeStatus value)
Sets the request status to the given value.
std::string getIpAddress() const
Fetches the request IP address string.
std::string format(const std::string &format, const std::vector< std::string > &args)
Apply Formatting.
string timeToText64(uint64_t value)
Convert integral DNSSEC time to textual form, 64-bit version.
The Name class encapsulates DNS names.
A standard Data module exception that is thrown if a parse error is encountered when constructing an ...
bool operator!=(const NameChangeRequest &b)
The OutputBuffer class is a buffer abstraction for manipulating mutable data.
void setForwardChange(const bool value)
Sets the forward change flag to the given value.
Exception thrown when NameChangeRequest marshalling error occurs.
void setDhcid(const std::string &value)
Sets the DHCID based on the given string value.
void setIpAddress(const std::string &value)
Sets the IP address to the given value.
std::map< std::string, isc::data::ConstElementPtr > ElementMap
Defines a map of Elements, keyed by their string name.
Represents a DHCP-DDNS client request.
const std::vector< uint8_t > & getDuid() const
Returns a const reference to the actual DUID value.
void setFqdn(const std::string &value)
Sets the FQDN to the given value.
static ElementPtr fromJSON(const std::string &in, bool preproc=false)
These functions will parse the given string (JSON) representation of a compound element.
void fromStr(const std::string &data)
Sets the DHCID value based on the given string.
void toFormat(const NameChangeFormat format, isc::util::OutputBuffer &buffer) const
Instance method for marshalling the contents of the request into the given buffer in the given format...
A standard DNS module exception that is thrown if an out-of-range buffer operation is being performed...
isc::data::ConstElementPtr getElement(const std::string &name, const ElementMap &element_map) const
Given a name, finds and returns an element from a map of elements.
void fromClientId(const std::vector< uint8_t > &clientid_data, const std::vector< uint8_t > &wire_fqdn)
Sets the DHCID value based on the Client Identifier.
NameChangeFormat stringToNcrFormat(const std::string &fmt_str)
Function which converts labels to NameChangeFormat enum values.
std::string getLeaseExpiresOnStr() const
Fetches the request lease expiration as string.
void setLeaseLength(const uint32_t value)
Sets the lease length to the given value.
string encodeHex(const vector< uint8_t > &binary)
Encode binary data in the base16 ('hex') format.
const std::string getFqdn() const
Fetches the request FQDN.
bool isReverseChange() const
Checks reverse change flag.
std::ostream & operator<<(std::ostream &os, const D2Dhcid &dhcid)
An exception that is thrown if an error occurs within the IO module.
NameChangeStatus
Defines the runtime processing status values for requests.
boost::shared_ptr< Element > ElementPtr
Holds DUID (DHCPv6 Unique Identifier)
void writeData(const void *data, size_t len)
Copy an arbitrary length of data into the buffer.
boost::shared_ptr< const Element > ConstElementPtr
bool operator==(const NameChangeRequest &b)
void fromDUID(const isc::dhcp::DUID &duid, const std::vector< uint8_t > &wire_fqdn)
Sets the DHCID value based on the DUID and FQDN.
std::string ncrFormatToString(NameChangeFormat format)
Function which converts NameChangeFormat enums to text labels.
Exception thrown when there is an error occurred during computation of the DHCID.
NameChangeFormat
Defines the list of data wire formats supported.
void decodeHex(const string &input, vector< uint8_t > &result)
Decode a text encoded in the base16 ('hex') format into the original data.
uint32_t getLeaseLength() const
Fetches the request lease length.