14 #include <boost/bind.hpp>
24 name_change_sender_(), private_io_service_(),
25 registered_select_fd_(util::WatchSocket::SOCKET_NOT_VALID) {
39 d2_client_config_->enableUpdates(
false);
40 if (name_change_sender_) {
50 "D2ClientMgr cannot set DHCP-DDNS configuration to NULL.");
54 if (*d2_client_config_ != *new_config) {
57 if (!new_config->getEnableUpdates()) {
60 name_change_sender_.reset();
63 switch (new_config->getNcrProtocol()) {
67 new_config->getSenderIp(),
68 new_config->getSenderPort(),
69 new_config->getServerIp(),
70 new_config->getServerPort(),
71 new_config->getNcrFormat(),
73 new_config->getMaxQueueSize()));
79 << new_config->getNcrProtocol());
89 if (name_change_sender_) {
90 new_sender->assumeQueue(*name_change_sender_);
94 name_change_sender_ = new_sender;
99 d2_client_config_ = new_config;
101 .arg(!
ddnsEnabled() ?
"DHCP-DDNS updates disabled" :
102 "DHCP_DDNS updates enabled");
107 return (d2_client_config_->getEnableUpdates());
112 return (d2_client_config_);
117 bool& server_s,
bool& server_n)
const {
131 const uint8_t mask = ((client_n ? 2 : 0) + (client_s ? 1 : 0));
135 if (!d2_client_config_->getEnableUpdates()) {
141 server_s = d2_client_config_->getOverrideClientUpdate();
147 server_s = d2_client_config_->getEnableUpdates();
148 server_n = !server_s;
154 server_s = (d2_client_config_->getEnableUpdates() &&
155 d2_client_config_->getOverrideNoUpdate());
156 server_n = !server_s;
162 "Invalid client FQDN - N and S cannot both be 1");
169 const bool trailing_dot)
const {
170 std::string hostname = address.
toText();
171 std::replace(hostname.begin(), hostname.end(),
172 (address.
isV4() ?
'.' :
':'),
'-');
174 std::ostringstream gen_name;
175 gen_name << d2_client_config_->getGeneratedPrefix() <<
"-" << hostname;
176 return (
qualifyName(gen_name.str(), trailing_dot));
182 const bool trailing_dot)
const {
183 std::ostringstream gen_name;
185 gen_name << partial_name;
186 if (!d2_client_config_->getQualifyingSuffix().empty()) {
187 std::string str = gen_name.str();
188 size_t len = str.length();
189 if ((len > 0) && (str[len - 1] !=
'.')) {
193 gen_name << d2_client_config_->getQualifyingSuffix();
196 std::string str = gen_name.str();
197 size_t len = str.length();
202 if ((len > 0) && (str[len - 1] !=
'.')) {
209 if ((len > 0) && (str[len - 1] ==
'.')) {
210 gen_name.str(str.substr(0,len-1));
215 return (gen_name.str());
229 .arg(d2_client_config_->toText());
239 if (!name_change_sender_) {
243 if (!error_handler) {
248 client_error_handler_ = error_handler;
251 name_change_sender_->startSending(io_service);
256 registered_select_fd_ = name_change_sender_->getSelectFd();
264 return (name_change_sender_ && name_change_sender_->amSending());
277 name_change_sender_->stopSending();
290 name_change_sender_->sendRequest(ncr);
291 }
catch (
const std::exception& ex) {
293 .arg(ex.what()).arg((ncr ? ncr->toText() :
" NULL "));
303 if (!client_error_handler_) {
308 (client_error_handler_)(result, ncr);
309 }
catch (
const std::exception& ex) {
318 if (!name_change_sender_) {
322 return(name_change_sender_->getQueueSize());
327 if (!name_change_sender_) {
331 return(name_change_sender_->getQueueMaxSize());
338 if (!name_change_sender_) {
342 return (name_change_sender_->peekAt(index));
347 if (!name_change_sender_) {
351 name_change_sender_->clearSendQueue();
359 DHCPSRV_DHCP_DDNS_NCR_SENT).arg(ncr->toText());
369 " not in send mode");
372 return (name_change_sender_->getSelectFd());
377 if (!name_change_sender_) {
380 " name_change_sender is null");
383 name_change_sender_->runReadyIO();