Kea  1.9.9-git
d2_client_cfg.cc
Go to the documentation of this file.
1 // Copyright (C) 2013-2020 Internet Systems Consortium, Inc. ("ISC")
2 //
3 // This Source Code Form is subject to the terms of the Mozilla Public
4 // License, v. 2.0. If a copy of the MPL was not distributed with this
5 // file, You can obtain one at http://mozilla.org/MPL/2.0/.
6 
7 #include <config.h>
8 
9 #include <dhcp_ddns/ncr_udp.h>
10 #include <dhcpsrv/d2_client_cfg.h>
11 #include <dhcpsrv/cfgmgr.h>
12 #include <dhcpsrv/dhcpsrv_log.h>
13 
14 #include <string>
15 
16 using namespace std;
17 using namespace isc::asiolink;
18 using namespace isc::data;
19 using namespace isc::util;
20 
21 namespace isc {
22 namespace dhcp {
23 
25 const char* D2ClientConfig::DFT_SERVER_IP = "127.0.0.1";
26 const size_t D2ClientConfig::DFT_SERVER_PORT = 53001;
27 const char* D2ClientConfig::DFT_V4_SENDER_IP = "0.0.0.0";
28 const char* D2ClientConfig::DFT_V6_SENDER_IP = "::";
29 const size_t D2ClientConfig::DFT_SENDER_PORT = 0;
30 const size_t D2ClientConfig::DFT_MAX_QUEUE_SIZE = 1024;
31 const char* D2ClientConfig::DFT_NCR_PROTOCOL = "UDP";
32 const char* D2ClientConfig::DFT_NCR_FORMAT = "JSON";
33 const bool D2ClientConfig::DFT_OVERRIDE_NO_UPDATE = false;
34 const bool D2ClientConfig::DFT_OVERRIDE_CLIENT_UPDATE = false;
35 const char* D2ClientConfig::DFT_REPLACE_CLIENT_NAME_MODE = "NEVER";
36 const char* D2ClientConfig::DFT_GENERATED_PREFIX = "myhost";
37 const char* D2ClientConfig::DFT_HOSTNAME_CHAR_SET = "";
38 const char* D2ClientConfig::DFT_HOSTNAME_CHAR_REPLACEMENT = "";
39 
40 D2ClientConfig::ReplaceClientNameMode
41 D2ClientConfig::stringToReplaceClientNameMode(const std::string& mode_str) {
42  if (mode_str == "never") {
43  return (D2ClientConfig::RCM_NEVER);
44  }
45 
46  if (mode_str == "always") {
47  return (D2ClientConfig::RCM_ALWAYS);
48  }
49 
50  if (mode_str == "when-present") {
51  return (D2ClientConfig::RCM_WHEN_PRESENT);
52  }
53 
54  if (mode_str == "when-not-present") {
55  return (D2ClientConfig::RCM_WHEN_NOT_PRESENT);
56  }
57 
59  "Invalid ReplaceClientNameMode: " << mode_str);
60 }
61 
62 std::string
63 D2ClientConfig::replaceClientNameModeToString(const ReplaceClientNameMode& mode) {
64  switch (mode) {
65  case D2ClientConfig::RCM_NEVER:
66  return ("never");
67  case D2ClientConfig::RCM_ALWAYS:
68  return ("always");
69  case D2ClientConfig::RCM_WHEN_PRESENT:
70  return ("when-present");
71  case D2ClientConfig::RCM_WHEN_NOT_PRESENT:
72  return ("when-not-present");
73  default:
74  break;
75  }
76 
77  std::ostringstream stream;
78  stream << "unknown(" << mode << ")";
79  return (stream.str());
80 }
81 
82 D2ClientConfig::D2ClientConfig(const bool enable_updates,
83  const isc::asiolink::IOAddress& server_ip,
84  const size_t server_port,
85  const isc::asiolink::IOAddress& sender_ip,
86  const size_t sender_port,
87  const size_t max_queue_size,
88  const dhcp_ddns::
89  NameChangeProtocol& ncr_protocol,
90  const dhcp_ddns::
91  NameChangeFormat& ncr_format)
92  : enable_updates_(enable_updates),
93  server_ip_(server_ip),
94  server_port_(server_port),
95  sender_ip_(sender_ip),
96  sender_port_(sender_port),
97  max_queue_size_(max_queue_size),
98  ncr_protocol_(ncr_protocol),
99  ncr_format_(ncr_format) {
101 }
102 
104  : enable_updates_(false),
105  server_ip_(isc::asiolink::IOAddress(DFT_SERVER_IP)),
106  server_port_(DFT_SERVER_PORT),
107  sender_ip_(isc::asiolink::IOAddress(DFT_V4_SENDER_IP)),
108  sender_port_(DFT_SENDER_PORT),
109  max_queue_size_(DFT_MAX_QUEUE_SIZE),
110  ncr_protocol_(dhcp_ddns::stringToNcrProtocol(DFT_NCR_PROTOCOL)),
111  ncr_format_(dhcp_ddns::stringToNcrFormat(DFT_NCR_FORMAT)) {
113 }
114 
116 
117 void
119  enable_updates_ = enable;
120 }
121 
122 void
124  if (ncr_format_ != dhcp_ddns::FMT_JSON) {
125  isc_throw(D2ClientError, "D2ClientConfig: NCR Format: "
126  << dhcp_ddns::ncrFormatToString(ncr_format_)
127  << " is not yet supported");
128  }
129 
130  if (ncr_protocol_ != dhcp_ddns::NCR_UDP) {
131  isc_throw(D2ClientError, "D2ClientConfig: NCR Protocol: "
132  << dhcp_ddns::ncrProtocolToString(ncr_protocol_)
133  << " is not yet supported");
134  }
135 
136  if (sender_ip_.getFamily() != server_ip_.getFamily()) {
137  isc_throw(D2ClientError, "D2ClientConfig: address family mismatch: "
138  << "server-ip: " << server_ip_.toText()
139  << " is: " << (server_ip_.isV4() ? "IPv4" : "IPv6")
140  << " while sender-ip: " << sender_ip_.toText()
141  << " is: " << (sender_ip_.isV4() ? "IPv4" : "IPv6"));
142  }
143 
144  if (server_ip_ == sender_ip_ && server_port_ == sender_port_) {
145  isc_throw(D2ClientError, "D2ClientConfig: server and sender cannot"
146  " share the exact same IP address/port: "
147  << server_ip_.toText() << "/" << server_port_);
148  }
149 
152 }
153 
154 bool
156  return ((enable_updates_ == other.enable_updates_) &&
157  (server_ip_ == other.server_ip_) &&
158  (server_port_ == other.server_port_) &&
159  (sender_ip_ == other.sender_ip_) &&
160  (sender_port_ == other.sender_port_) &&
161  (max_queue_size_ == other.max_queue_size_) &&
162  (ncr_protocol_ == other.ncr_protocol_) &&
163  (ncr_format_ == other.ncr_format_));
164 }
165 
166 bool
168  return (!(*this == other));
169 }
170 
171 std::string
173  std::ostringstream stream;
174 
175  stream << "enable_updates: " << (enable_updates_ ? "yes" : "no");
176  if (enable_updates_) {
177  stream << ", server-ip: " << server_ip_.toText()
178  << ", server-port: " << server_port_
179  << ", sender-ip: " << sender_ip_.toText()
180  << ", sender-port: " << sender_port_
181  << ", max-queue-size: " << max_queue_size_
182  << ", ncr-protocol: " << ncrProtocolToString(ncr_protocol_)
183  << ", ncr-format: " << ncrFormatToString(ncr_format_);
184  }
185 
186 
187  return (stream.str());
188 }
189 
192  ElementPtr result = Element::createMap();
193  // Set user context
194  contextToElement(result);
195  // Set enable-updates
196  result->set("enable-updates", Element::create(enable_updates_));
197  // Set server-ip
198  result->set("server-ip", Element::create(server_ip_.toText()));
199  // Set server-port
200  result->set("server-port", Element::create(static_cast<long long>(server_port_)));
201  // Set sender-ip
202  result->set("sender-ip", Element::create(sender_ip_.toText()));
203  // Set sender-port
204  result->set("sender-port", Element::create(static_cast<long long>(sender_port_)));
205  // Set max-queue-size
206  result->set("max-queue-size", Element::create(static_cast<long long>(max_queue_size_)));
207  // Set ncr-protocol
208  result->set("ncr-protocol", Element::create(dhcp_ddns::ncrProtocolToString(ncr_protocol_)));
209  // Set ncr-format
210  result->set("ncr-format", Element::create(dhcp_ddns::ncrFormatToString(ncr_format_)));
211  // Set override-no-update
212  return (result);
213 }
214 
215 std::ostream&
216 operator<<(std::ostream& os, const D2ClientConfig& config) {
217  os << config.toText();
218  return (os);
219 }
220 
221 }; // namespace dhcp
222 }; // namespace isc
Defines the D2ClientConfig class.
bool operator!=(const D2ClientConfig &other) const
Compares two D2ClientConfigs for inequality.
NameChangeProtocol stringToNcrProtocol(const std::string &protocol_str)
Function which converts text labels to NameChangeProtocol enums.
Definition: ncr_io.cc:23
std::string toText() const
Generates a string representation of the class contents.
boost::shared_ptr< Element > ElementPtr
Definition: data.h:20
STL namespace.
NameChangeFormat
Defines the list of data wire formats supported.
Definition: ncr_msg.h:60
This file provides UDP socket based implementation for sending and receiving NameChangeRequests.
bool operator==(const D2ClientConfig &other) const
Compares two D2ClientConfigs for equality.
void contextToElement(data::ElementPtr map) const
Merge unparse a user_context object.
Definition: user_context.cc:15
D2ClientConfig()
Default constructor The default constructor creates an instance that has updates disabled.
#define isc_throw(type, stream)
A shortcut macro to insert known values into exception arguments.
A generic exception that is thrown if a parameter given to a method is considered invalid in that con...
std::string ncrProtocolToString(NameChangeProtocol protocol)
Function which converts NameChangeProtocol enums to text labels.
Definition: ncr_io.cc:36
Definition: edns.h:19
virtual isc::data::ElementPtr toElement() const
Unparse a configuration object.
An exception that is thrown if an error occurs while configuring the D2 DHCP DDNS client...
Definition: d2_client_cfg.h:33
Acts as a storage vault for D2 client configuration.
Definition: d2_client_cfg.h:56
virtual ~D2ClientConfig()
Destructor.
virtual void validateContents()
Validates member values.
Defines the logger used by the top-level component of kea-dhcp-ddns.
ReplaceClientNameMode
Defines the client name replacement modes.
Definition: d2_client_cfg.h:75
std::string ncrFormatToString(NameChangeFormat format)
Function which converts NameChangeFormat enums to text labels.
Definition: ncr_msg.cc:35
std::ostream & operator<<(std::ostream &os, const OpaqueDataTuple &tuple)
Inserts the OpaqueDataTuple as a string into stream.
NameChangeProtocol
Defines the list of socket protocols supported.
Definition: ncr_io.h:68
NameChangeFormat stringToNcrFormat(const std::string &fmt_str)
Function which converts labels to NameChangeFormat enum values.
Definition: ncr_msg.cc:26
void enableUpdates(bool enable)
Sets enable-updates flag to the given value.