43 namespace ph = std::placeholders;
48 struct CtrlDhcp4Hooks {
49 int hooks_index_dhcp4_srv_configured_;
53 hooks_index_dhcp4_srv_configured_ = HooksManager::registerHook(
"dhcp4_srv_configured");
73 void signalHandler(
int signo) {
75 if (signo == SIGHUP) {
76 ControlledDhcpv4Srv::processCommand(
"config-reload",
78 }
else if ((signo == SIGTERM) || (signo == SIGINT)) {
79 ControlledDhcpv4Srv::processCommand(
"shutdown",
92 ControlledDhcpv4Srv::init(
const std::string& file_name) {
94 start_ = boost::posix_time::second_clock::universal_time();
102 string reason = comment ? comment->stringValue() :
103 "no details available";
114 signal_set_.reset(
new IOSignalSet(getIOService(), signalHandler));
116 signal_set_->add(SIGINT);
117 signal_set_->add(SIGHUP);
118 signal_set_->add(SIGTERM);
121 void ControlledDhcpv4Srv::cleanup() {
126 ControlledDhcpv4Srv::loadConfigFile(
const std::string& file_name) {
135 if (file_name.empty()) {
138 " Please use -c command line option.");
143 json = parser.
parseFile(file_name, Parser4Context::PARSER_DHCP4);
152 "a map, i.e., start with { and end with } and contain " 153 "at least an entry called 'Dhcp4' that itself is a map. " 155 <<
" is a valid JSON, but its top element is not a map." 156 " Did you forget to add { } around your configuration?");
160 result = ControlledDhcpv4Srv::processCommand(
"config-set", json);
166 "processCommand(\"config-set\", json)");
174 string reason = comment ? comment->stringValue() :
175 "no details available";
178 }
catch (
const std::exception& ex) {
181 CfgMgr::instance().rollback();
184 .arg(file_name).arg(ex.what());
186 << file_name <<
"': " << ex.
what());
190 .arg(MultiThreadingMgr::instance().getMode() ?
"yes" :
"no")
191 .arg(MultiThreadingMgr::instance().getThreadPoolSize())
192 .arg(MultiThreadingMgr::instance().getPacketQueueSize());
198 ControlledDhcpv4Srv::commandShutdownHandler(
const string&,
ConstElementPtr args) {
199 if (!ControlledDhcpv4Srv::getInstance()) {
207 if (args->getType() != Element::map) {
213 if (param->getType() != Element::integer) {
215 "parameter 'exit-value' is not an integer"));
218 exit_value = param->intValue();
222 ControlledDhcpv4Srv::getInstance()->shutdownServer(exit_value);
227 ControlledDhcpv4Srv::commandLibReloadHandler(
const string&,
ConstElementPtr) {
234 MultiThreadingMgr::instance().getThreadPool().reset();
239 HooksManager::prepareUnloadLibraries();
240 static_cast<void>(HooksManager::unloadLibraries());
241 bool status = HooksManager::loadLibraries(loaded);
244 "(WARNING: libreload is deprecated).");
246 }
catch (
const std::exception& ex) {
252 "Hooks libraries successfully reloaded" 253 " (WARNING: libreload is deprecated).");
258 ControlledDhcpv4Srv::commandConfigReloadHandler(
const string&,
261 std::string file = ControlledDhcpv4Srv::getInstance()->getConfigFile();
264 auto result = loadConfigFile(file);
267 }
catch (
const std::exception& ex) {
274 "Config reload failed: " +
string(ex.what())));
279 ControlledDhcpv4Srv::commandConfigGetHandler(
const string&,
281 ConstElementPtr config = CfgMgr::instance().getCurrentCfg()->toElement();
287 ControlledDhcpv4Srv::commandConfigWriteHandler(
const string&,
292 if (args->getType() != Element::map) {
296 if (filename_param) {
297 if (filename_param->getType() != Element::string) {
299 "passed parameter 'filename' is not a string"));
301 filename = filename_param->stringValue();
305 if (filename.empty()) {
308 filename = getConfigFile();
311 if (filename.empty()) {
313 "Please specify filename explicitly."));
320 size = writeConfigFile(filename, cfg);
332 params->set(
"size", Element::create(static_cast<long long>(size)));
333 params->set(
"filename", Element::create(filename));
336 + filename +
" successful", params));
340 ControlledDhcpv4Srv::commandConfigSetHandler(
const string&,
349 message =
"Missing mandatory 'arguments' parameter.";
351 dhcp4 = args->get(
"Dhcp4");
353 message =
"Missing mandatory 'Dhcp4' parameter.";
354 }
else if (dhcp4->getType() != Element::map) {
355 message =
"'Dhcp4' parameter expected to be a map.";
360 if (message.empty()) {
361 for (
auto obj : args->mapValue()) {
362 const string& obj_name = obj.first;
363 if (obj_name !=
"Dhcp4") {
366 if (message.empty()) {
367 message =
"Unsupported '" + obj_name +
"' parameter";
369 message +=
" (and '" + obj_name +
"')";
373 if (!message.empty()) {
378 if (!message.empty()) {
391 MultiThreadingMgr::instance().apply(
false, 0, 0);
396 CfgMgr::instance().rollback();
402 Daemon::configureLogger(dhcp4, CfgMgr::instance().getStagingCfg());
406 CfgMgr::instance().getStagingCfg()->applyLoggingCfg();
417 CfgMgr::instance().getStagingCfg()->applyLoggingCfg();
420 CfgMgr::instance().commit();
421 }
else if (CfgMgr::instance().getCurrentCfg()->getSequence() != 0) {
428 CfgMgr::instance().getCurrentCfg()->applyLoggingCfg();
440 ControlledDhcpv4Srv::commandConfigTestHandler(
const string&,
449 message =
"Missing mandatory 'arguments' parameter.";
451 dhcp4 = args->get(
"Dhcp4");
453 message =
"Missing mandatory 'Dhcp4' parameter.";
454 }
else if (dhcp4->getType() != Element::map) {
455 message =
"'Dhcp4' parameter expected to be a map.";
460 if (message.empty()) {
461 for (
auto obj : args->mapValue()) {
462 const string& obj_name = obj.first;
463 if (obj_name !=
"Dhcp4") {
466 if (message.empty()) {
467 message =
"Unsupported '" + obj_name +
"' parameter";
469 message +=
" (and '" + obj_name +
"')";
473 if (!message.empty()) {
478 if (!message.empty()) {
491 CfgMgr::instance().rollback();
494 return (checkConfig(dhcp4));
498 ControlledDhcpv4Srv::commandDhcpDisableHandler(
const std::string&,
500 std::ostringstream message;
501 int64_t max_period = 0;
512 if (args->getType() != Element::map) {
513 message <<
"arguments for the 'dhcp-disable' command must be a map";
518 if (max_period_element) {
520 if (max_period_element->getType() != Element::integer) {
521 message <<
"'max-period' argument must be a number";
525 max_period = max_period_element->intValue();
526 if (max_period <= 0) {
527 message <<
"'max-period' must be positive integer";
533 if (origin_element) {
535 if (origin_element->getType() != Element::string) {
536 message <<
"'origin' argument must be a string";
539 origin = origin_element->stringValue();
540 if (origin ==
"ha-partner") {
541 type = NetworkState::Origin::HA_COMMAND;
542 }
else if (origin !=
"user") {
543 if (origin.empty()) {
544 origin =
"(empty string)";
546 message <<
"invalid value used for 'origin' parameter: " 555 if (message.tellp() == 0) {
556 message <<
"DHCPv4 service disabled";
557 if (max_period > 0) {
558 message <<
" for " << max_period <<
" seconds";
563 network_state_->delayedEnableAll(static_cast<unsigned>(max_period),
566 network_state_->disableService(type);
577 ControlledDhcpv4Srv::commandDhcpEnableHandler(
const std::string&,
579 std::ostringstream message;
589 if (args->getType() != Element::map) {
590 message <<
"arguments for the 'dhcp-enable' command must be a map";
595 if (origin_element) {
597 if (origin_element->getType() != Element::string) {
598 message <<
"'origin' argument must be a string";
601 origin = origin_element->stringValue();
602 if (origin ==
"ha-partner") {
603 type = NetworkState::Origin::HA_COMMAND;
604 }
else if (origin !=
"user") {
605 if (origin.empty()) {
606 origin =
"(empty string)";
608 message <<
"invalid value used for 'origin' parameter: " 617 if (message.tellp() == 0) {
618 network_state_->enableService(type);
622 "DHCP service successfully enabled"));
630 ControlledDhcpv4Srv::commandVersionGetHandler(
const string&,
ConstElementPtr) {
631 ElementPtr extended = Element::create(Dhcpv4Srv::getVersion(
true));
633 arguments->set(
"extended", extended);
635 Dhcpv4Srv::getVersion(
false),
641 ControlledDhcpv4Srv::commandBuildReportHandler(
const string&,
649 ControlledDhcpv4Srv::commandLeasesReclaimHandler(
const string&,
656 message =
"Missing mandatory 'remove' parameter.";
660 message =
"Missing mandatory 'remove' parameter.";
661 }
else if (remove_name->getType() != Element::boolean) {
662 message =
"'remove' parameter expected to be a boolean.";
664 bool remove_lease = remove_name->boolValue();
665 server_->alloc_engine_->reclaimExpiredLeases4(0, 0, remove_lease);
667 message =
"Reclamation of expired leases is complete.";
675 ControlledDhcpv4Srv::commandServerTagGetHandler(
const std::string&,
677 const std::string& tag =
678 CfgMgr::instance().getCurrentCfg()->getServerTag();
680 response->set(
"server-tag", Element::create(tag));
686 ControlledDhcpv4Srv::commandConfigBackendPullHandler(
const std::string&,
688 auto ctl_info = CfgMgr::instance().getCurrentCfg()->getConfigControlInfo();
697 if (TimerMgr::instance()->isTimerRegistered(
"Dhcp4CBFetchTimer")) {
698 TimerMgr::instance()->cancel(
"Dhcp4CBFetchTimer");
699 TimerMgr::instance()->setup(
"Dhcp4CBFetchTimer");
706 auto srv_cfg = CfgMgr::instance().getCurrentCfg();
707 auto mode = CBControlDHCPv4::FetchMode::FETCH_UPDATE;
708 server_->getCBControl()->databaseConfigFetch(srv_cfg, mode);
709 }
catch (
const std::exception& ex) {
713 "On demand configuration update failed: " +
717 "On demand configuration update successful."));
721 ControlledDhcpv4Srv::commandStatusGetHandler(
const string&,
724 status->set(
"pid", Element::create(static_cast<int>(getpid())));
726 auto now = boost::posix_time::second_clock::universal_time();
728 if (!start_.is_not_a_date_time()) {
729 auto uptime = now - start_;
730 status->set(
"uptime", Element::create(uptime.total_seconds()));
733 auto last_commit = CfgMgr::instance().getCurrentCfg()->getLastCommitTime();
734 if (!last_commit.is_not_a_date_time()) {
735 auto reload = now - last_commit;
736 status->set(
"reload", Element::create(reload.total_seconds()));
739 auto& mt_mgr = MultiThreadingMgr::instance();
740 if (mt_mgr.getMode()) {
741 status->set(
"multi-threading-enabled", Element::create(
true));
742 status->set(
"thread-pool-size", Element::create(static_cast<int32_t>(
743 MultiThreadingMgr::instance().getThreadPoolSize())));
744 status->set(
"packet-queue-size", Element::create(static_cast<int32_t>(
745 MultiThreadingMgr::instance().getPacketQueueSize())));
746 ElementPtr queue_stats = Element::createList();
747 queue_stats->add(Element::create(mt_mgr.getThreadPool().getQueueStat(10)));
748 queue_stats->add(Element::create(mt_mgr.getThreadPool().getQueueStat(100)));
749 queue_stats->add(Element::create(mt_mgr.getThreadPool().getQueueStat(1000)));
750 status->set(
"packet-queue-statistics", queue_stats);
753 status->set(
"multi-threading-enabled", Element::create(
false));
757 ElementPtr socket_errors(Element::createList());
758 for (
IfacePtr const& interface : IfaceMgr::instance().getIfaces()) {
759 for (std::string
const&
error : interface->getErrors()) {
760 socket_errors->add(Element::create(
error));
766 if (socket_errors->empty()) {
767 sockets->set(
"status", Element::create(
"ready"));
770 CfgMgr::instance().getCurrentCfg()->getCfgIface()->getReconnectCtl());
771 if (reconnect_ctl && reconnect_ctl->retriesLeft()) {
772 sockets->set(
"status", Element::create(
"retrying"));
774 sockets->set(
"status", Element::create(
"failed"));
776 sockets->set(
"errors", socket_errors);
778 status->set(
"sockets", sockets);
784 ControlledDhcpv4Srv::commandStatisticSetMaxSampleCountAllHandler(
const string&,
786 StatsMgr& stats_mgr = StatsMgr::instance();
790 CfgMgr::instance().getCurrentCfg()->addConfiguredGlobal(
791 "statistic-default-sample-count", Element::create(max_samples));
796 ControlledDhcpv4Srv::commandStatisticSetMaxSampleAgeAllHandler(
const string&,
798 StatsMgr& stats_mgr = StatsMgr::instance();
803 CfgMgr::instance().getCurrentCfg()->addConfiguredGlobal(
804 "statistic-default-sample-age", Element::create(max_age));
809 ControlledDhcpv4Srv::processCommand(
const string& command,
811 string txt = args ? args->str() :
"(none)";
814 .arg(command).arg(txt);
820 "Server object not initialized, so can't process command '" +
821 command +
"', arguments: '" + txt +
"'.");
826 if (command ==
"shutdown") {
827 return (srv->commandShutdownHandler(command, args));
829 }
else if (command ==
"libreload") {
830 return (srv->commandLibReloadHandler(command, args));
832 }
else if (command ==
"config-reload") {
833 return (srv->commandConfigReloadHandler(command, args));
835 }
else if (command ==
"config-set") {
836 return (srv->commandConfigSetHandler(command, args));
838 }
else if (command ==
"config-get") {
839 return (srv->commandConfigGetHandler(command, args));
841 }
else if (command ==
"config-test") {
842 return (srv->commandConfigTestHandler(command, args));
844 }
else if (command ==
"dhcp-disable") {
845 return (srv->commandDhcpDisableHandler(command, args));
847 }
else if (command ==
"dhcp-enable") {
848 return (srv->commandDhcpEnableHandler(command, args));
850 }
else if (command ==
"version-get") {
851 return (srv->commandVersionGetHandler(command, args));
853 }
else if (command ==
"build-report") {
854 return (srv->commandBuildReportHandler(command, args));
856 }
else if (command ==
"leases-reclaim") {
857 return (srv->commandLeasesReclaimHandler(command, args));
859 }
else if (command ==
"config-write") {
860 return (srv->commandConfigWriteHandler(command, args));
862 }
else if (command ==
"server-tag-get") {
863 return (srv->commandServerTagGetHandler(command, args));
865 }
else if (command ==
"config-backend-pull") {
866 return (srv->commandConfigBackendPullHandler(command, args));
868 }
else if (command ==
"status-get") {
869 return (srv->commandStatusGetHandler(command, args));
877 + command +
"': " + ex.
what() +
878 ", params: '" + txt +
"'"));
887 std::ostringstream err;
890 err <<
"Server object not initialized, can't process config.";
907 }
catch (
const std::exception& ex) {
908 err <<
"Failed to process configuration:" << ex.what();
914 DatabaseConnection::db_lost_callback_ =
915 std::bind(&ControlledDhcpv4Srv::dbLostCallback, srv, ph::_1);
917 DatabaseConnection::db_recovered_callback_ =
918 std::bind(&ControlledDhcpv4Srv::dbRecoveredCallback, srv, ph::_1);
920 DatabaseConnection::db_failed_callback_ =
921 std::bind(&ControlledDhcpv4Srv::dbFailedCallback, srv, ph::_1);
923 CfgDbAccessPtr cfg_db = CfgMgr::instance().getStagingCfg()->getCfgDbAccess();
924 string params =
"universe=4";
925 if (cfg_db->getExtendedInfoTablesEnabled()) {
926 params +=
" extended-info-tables=true";
928 cfg_db->setAppendedParameters(params);
929 cfg_db->createManagers();
932 }
catch (
const std::exception& ex) {
933 err <<
"Unable to open database: " << ex.what();
940 }
catch (
const std::exception& ex) {
941 err <<
"Error starting DHCP_DDNS client after server reconfiguration: " 948 Dhcp4to6Ipc::instance().open();
949 }
catch (
const std::exception& ex) {
950 err <<
"error starting DHCPv4-over-DHCPv6 IPC " 951 " after server reconfiguration: " << ex.what();
958 qc = CfgMgr::instance().getStagingCfg()->getDHCPQueueControl();
959 if (IfaceMgr::instance().configureDHCPPacketQueue(AF_INET, qc)) {
961 .arg(IfaceMgr::instance().getPacketQueue4()->getInfoStr());
964 }
catch (
const std::exception& ex) {
965 err <<
"Error setting packet queue controls after server reconfiguration: " 972 CfgIface::open_sockets_failed_callback_ =
973 std::bind(&ControlledDhcpv4Srv::openSocketsFailedCallback, srv, ph::_1);
982 CfgMgr::instance().getStagingCfg()->getCfgIface()->
984 getInstance()->useBroadcast());
988 CfgMgr::instance().getStagingCfg()->getCfgExpiration()->
989 setupTimers(&ControlledDhcpv4Srv::reclaimExpiredLeases,
990 &ControlledDhcpv4Srv::deleteExpiredReclaimedLeases,
993 }
catch (
const std::exception& ex) {
994 err <<
"unable to setup timers for periodically running the" 995 " reclamation of the expired leases: " 1001 auto ctl_info = CfgMgr::instance().getStagingCfg()->getConfigControlInfo();
1003 long fetch_time =
static_cast<long>(ctl_info->getConfigFetchWaitTime());
1006 if (fetch_time > 0) {
1012 if (!server_->inTestMode()) {
1013 fetch_time = 1000 * fetch_time;
1016 boost::shared_ptr<unsigned> failure_count(
new unsigned(0));
1017 TimerMgr::instance()->
1018 registerTimer(
"Dhcp4CBFetchTimer",
1019 std::bind(&ControlledDhcpv4Srv::cbFetchUpdates,
1020 server_, CfgMgr::instance().getStagingCfg(),
1024 TimerMgr::instance()->setup(
"Dhcp4CBFetchTimer");
1030 LibDHCP::commitRuntimeOptionDefs();
1037 if (HooksManager::calloutsPresent(Hooks.hooks_index_dhcp4_srv_configured_)) {
1040 callout_handle->setArgument(
"io_context", srv->
getIOService());
1042 callout_handle->setArgument(
"json_config", config);
1043 callout_handle->setArgument(
"server_config", CfgMgr::instance().getStagingCfg());
1045 HooksManager::callCallouts(Hooks.hooks_index_dhcp4_srv_configured_,
1049 if (callout_handle->getStatus() == CalloutHandle::NEXT_STEP_DROP) {
1052 callout_handle->getArgument(
"error", error);
1054 error =
"unknown error";
1065 CfgMultiThreading::apply(CfgMgr::instance().getStagingCfg()->getDHCPMultiThreading());
1066 }
catch (
const std::exception& ex) {
1067 err <<
"Error applying multi threading settings: " 1084 std::ostringstream err;
1087 err <<
"Server object not initialized, can't process config.";
1094 ControlledDhcpv4Srv::ControlledDhcpv4Srv(uint16_t server_port ,
1095 uint16_t client_port )
1099 "There is another Dhcpv4Srv instance already.");
1117 CommandMgr::instance().registerCommand(
"build-report",
1118 std::bind(&ControlledDhcpv4Srv::commandBuildReportHandler,
this, ph::_1, ph::_2));
1120 CommandMgr::instance().registerCommand(
"config-backend-pull",
1121 std::bind(&ControlledDhcpv4Srv::commandConfigBackendPullHandler,
this, ph::_1, ph::_2));
1123 CommandMgr::instance().registerCommand(
"config-get",
1124 std::bind(&ControlledDhcpv4Srv::commandConfigGetHandler,
this, ph::_1, ph::_2));
1126 CommandMgr::instance().registerCommand(
"config-reload",
1127 std::bind(&ControlledDhcpv4Srv::commandConfigReloadHandler,
this, ph::_1, ph::_2));
1129 CommandMgr::instance().registerCommand(
"config-set",
1130 std::bind(&ControlledDhcpv4Srv::commandConfigSetHandler,
this, ph::_1, ph::_2));
1132 CommandMgr::instance().registerCommand(
"config-test",
1133 std::bind(&ControlledDhcpv4Srv::commandConfigTestHandler,
this, ph::_1, ph::_2));
1135 CommandMgr::instance().registerCommand(
"config-write",
1136 std::bind(&ControlledDhcpv4Srv::commandConfigWriteHandler,
this, ph::_1, ph::_2));
1138 CommandMgr::instance().registerCommand(
"dhcp-enable",
1139 std::bind(&ControlledDhcpv4Srv::commandDhcpEnableHandler,
this, ph::_1, ph::_2));
1141 CommandMgr::instance().registerCommand(
"dhcp-disable",
1142 std::bind(&ControlledDhcpv4Srv::commandDhcpDisableHandler,
this, ph::_1, ph::_2));
1144 CommandMgr::instance().registerCommand(
"libreload",
1145 std::bind(&ControlledDhcpv4Srv::commandLibReloadHandler,
this, ph::_1, ph::_2));
1147 CommandMgr::instance().registerCommand(
"leases-reclaim",
1148 std::bind(&ControlledDhcpv4Srv::commandLeasesReclaimHandler,
this, ph::_1, ph::_2));
1150 CommandMgr::instance().registerCommand(
"server-tag-get",
1151 std::bind(&ControlledDhcpv4Srv::commandServerTagGetHandler,
this, ph::_1, ph::_2));
1153 CommandMgr::instance().registerCommand(
"shutdown",
1154 std::bind(&ControlledDhcpv4Srv::commandShutdownHandler,
this, ph::_1, ph::_2));
1156 CommandMgr::instance().registerCommand(
"status-get",
1157 std::bind(&ControlledDhcpv4Srv::commandStatusGetHandler,
this, ph::_1, ph::_2));
1159 CommandMgr::instance().registerCommand(
"version-get",
1160 std::bind(&ControlledDhcpv4Srv::commandVersionGetHandler,
this, ph::_1, ph::_2));
1163 CommandMgr::instance().registerCommand(
"statistic-get",
1164 std::bind(&StatsMgr::statisticGetHandler, ph::_1, ph::_2));
1166 CommandMgr::instance().registerCommand(
"statistic-reset",
1167 std::bind(&StatsMgr::statisticResetHandler, ph::_1, ph::_2));
1169 CommandMgr::instance().registerCommand(
"statistic-remove",
1170 std::bind(&StatsMgr::statisticRemoveHandler, ph::_1, ph::_2));
1172 CommandMgr::instance().registerCommand(
"statistic-get-all",
1173 std::bind(&StatsMgr::statisticGetAllHandler, ph::_1, ph::_2));
1175 CommandMgr::instance().registerCommand(
"statistic-reset-all",
1176 std::bind(&StatsMgr::statisticResetAllHandler, ph::_1, ph::_2));
1178 CommandMgr::instance().registerCommand(
"statistic-remove-all",
1179 std::bind(&StatsMgr::statisticRemoveAllHandler, ph::_1, ph::_2));
1181 CommandMgr::instance().registerCommand(
"statistic-sample-age-set",
1182 std::bind(&StatsMgr::statisticSetMaxSampleAgeHandler, ph::_1, ph::_2));
1184 CommandMgr::instance().registerCommand(
"statistic-sample-age-set-all",
1185 std::bind(&ControlledDhcpv4Srv::commandStatisticSetMaxSampleAgeAllHandler,
this, ph::_1, ph::_2));
1187 CommandMgr::instance().registerCommand(
"statistic-sample-count-set",
1188 std::bind(&StatsMgr::statisticSetMaxSampleCountHandler, ph::_1, ph::_2));
1190 CommandMgr::instance().registerCommand(
"statistic-sample-count-set-all",
1191 std::bind(&ControlledDhcpv4Srv::commandStatisticSetMaxSampleCountAllHandler,
this, ph::_1, ph::_2));
1212 timer_mgr_->unregisterTimers();
1215 CommandMgr::instance().closeCommandSocket();
1218 CommandMgr::instance().deregisterCommand(
"build-report");
1219 CommandMgr::instance().deregisterCommand(
"config-backend-pull");
1220 CommandMgr::instance().deregisterCommand(
"config-get");
1221 CommandMgr::instance().deregisterCommand(
"config-reload");
1222 CommandMgr::instance().deregisterCommand(
"config-set");
1223 CommandMgr::instance().deregisterCommand(
"config-test");
1224 CommandMgr::instance().deregisterCommand(
"config-write");
1225 CommandMgr::instance().deregisterCommand(
"dhcp-disable");
1226 CommandMgr::instance().deregisterCommand(
"dhcp-enable");
1227 CommandMgr::instance().deregisterCommand(
"leases-reclaim");
1228 CommandMgr::instance().deregisterCommand(
"libreload");
1229 CommandMgr::instance().deregisterCommand(
"server-tag-get");
1230 CommandMgr::instance().deregisterCommand(
"shutdown");
1231 CommandMgr::instance().deregisterCommand(
"statistic-get");
1232 CommandMgr::instance().deregisterCommand(
"statistic-get-all");
1233 CommandMgr::instance().deregisterCommand(
"statistic-remove");
1234 CommandMgr::instance().deregisterCommand(
"statistic-remove-all");
1235 CommandMgr::instance().deregisterCommand(
"statistic-reset");
1236 CommandMgr::instance().deregisterCommand(
"statistic-reset-all");
1237 CommandMgr::instance().deregisterCommand(
"statistic-sample-age-set");
1238 CommandMgr::instance().deregisterCommand(
"statistic-sample-age-set-all");
1239 CommandMgr::instance().deregisterCommand(
"statistic-sample-count-set");
1240 CommandMgr::instance().deregisterCommand(
"statistic-sample-count-set-all");
1241 CommandMgr::instance().deregisterCommand(
"status-get");
1242 CommandMgr::instance().deregisterCommand(
"version-get");
1260 ControlledDhcpv4Srv::reclaimExpiredLeases(
const size_t max_leases,
1261 const uint16_t timeout,
1262 const bool remove_lease,
1263 const uint16_t max_unwarned_cycles) {
1265 server_->
alloc_engine_->reclaimExpiredLeases4(max_leases, timeout,
1267 max_unwarned_cycles);
1268 }
catch (
const std::exception& ex) {
1277 ControlledDhcpv4Srv::deleteExpiredReclaimedLeases(
const uint32_t secs) {
1278 server_->
alloc_engine_->deleteExpiredReclaimedLeases4(secs);
1284 ControlledDhcpv4Srv::dbLostCallback(
ReconnectCtlPtr db_reconnect_ctl) {
1285 if (!db_reconnect_ctl) {
1292 if (db_reconnect_ctl->retriesLeft() == db_reconnect_ctl->maxRetries() &&
1293 db_reconnect_ctl->alterServiceState()) {
1301 if (!db_reconnect_ctl->retriesLeft() ||
1302 !db_reconnect_ctl->retryInterval()) {
1304 .arg(db_reconnect_ctl->retriesLeft())
1305 .arg(db_reconnect_ctl->retryInterval());
1306 if (db_reconnect_ctl->exitOnFailure()) {
1316 ControlledDhcpv4Srv::dbRecoveredCallback(
ReconnectCtlPtr db_reconnect_ctl) {
1317 if (!db_reconnect_ctl) {
1324 if (db_reconnect_ctl->alterServiceState()) {
1330 db_reconnect_ctl->resetRetries();
1336 ControlledDhcpv4Srv::dbFailedCallback(
ReconnectCtlPtr db_reconnect_ctl) {
1337 if (!db_reconnect_ctl) {
1344 .arg(db_reconnect_ctl->maxRetries());
1346 if (db_reconnect_ctl->exitOnFailure()) {
1354 ControlledDhcpv4Srv::openSocketsFailedCallback(
ReconnectCtlPtr reconnect_ctl) {
1355 if (!reconnect_ctl) {
1362 .arg(reconnect_ctl->maxRetries());
1364 if (reconnect_ctl->exitOnFailure()) {
1370 ControlledDhcpv4Srv::cbFetchUpdates(
const SrvConfigPtr& srv_cfg,
1371 boost::shared_ptr<unsigned> failure_count) {
1378 CBControlDHCPv4::FetchMode::FETCH_UPDATE);
1379 (*failure_count) = 0;
1381 }
catch (
const std::exception& ex) {
1388 if (++(*failure_count) > 10) {
RAII class creating a critical section.
const isc::log::MessageID DHCP4_RECLAIM_EXPIRED_LEASES_FAIL
#define LOG_WARN(LOGGER, MESSAGE)
Macro to conveniently test warn output and log it.
const isc::log::MessageID DHCP4_DB_RECONNECT_LOST_CONNECTION
const isc::log::MessageID DHCP4_OPEN_SOCKETS_FAILED
const isc::log::MessageID DHCP4_DYNAMIC_RECONFIGURATION_FAIL
static DbCallback db_lost_callback_
Optional callback function to invoke if an opened connection is lost.
isc::data::ElementPtr parseFile(const std::string &filename, ParserType parser_type)
Run the parser on the file specified.
#define LOG_INFO(LOGGER, MESSAGE)
Macro to conveniently test info output and log it.
ConstElementPtr createAnswer(const int status_code, const std::string &text, const ConstElementPtr &arg)
const int CONTROL_RESULT_SUCCESS
Status code indicating a successful operation.
static void setIOService(const isc::asiolink::IOServicePtr &io_service)
Sets IO service to be used by the Host Manager.
isc::data::ConstElementPtr statisticSetMaxSampleCountAllHandler(const isc::data::ConstElementPtr ¶ms)
Handles statistic-sample-count-set-all command.
Evaluation context, an interface to the expression evaluation.
boost::shared_ptr< ReconnectCtl > ReconnectCtlPtr
Pointer to an instance of ReconnectCtl.
isc::data::ConstElementPtr configureDhcp4Server(Dhcpv4Srv &server, isc::data::ConstElementPtr config_set, bool check_only)
Configure DHCPv4 server (Dhcpv4Srv) with a set of configuration values.
static void destroy()
Destroy lease manager.
const isc::log::MessageID DHCP4_DB_RECONNECT_NO_DB_CTL
boost::shared_ptr< Iface > IfacePtr
Type definition for the pointer to an Iface object.
const isc::log::MessageID DHCP4_DB_RECONNECT_FAILED
Manages a pool of asynchronous interval timers.
boost::shared_ptr< SrvConfig > SrvConfigPtr
Non-const pointer to the SrvConfig.
The network state is being altered by the DB connection recovery mechanics.
const isc::log::MessageID DHCP4_CB_ON_DEMAND_FETCH_UPDATES_FAIL
#define LOG_ERROR(LOGGER, MESSAGE)
Macro to conveniently test error output and log it.
boost::shared_ptr< IOService > IOServicePtr
Defines a smart pointer to an IOService instance.
const isc::log::MessageID DHCP4_MULTI_THREADING_INFO
const int CONTROL_RESULT_ERROR
Status code indicating a general failure.
boost::shared_ptr< Element > ElementPtr
const isc::log::MessageID DHCP4_DYNAMIC_RECONFIGURATION_SUCCESS
const isc::log::MessageID DHCP4_CONFIG_PACKET_QUEUE
const isc::log::MessageID DHCP4_CONFIG_UNSUPPORTED_OBJECT
virtual const char * what() const
Returns a C-style character string of the cause of the exception.
static DbCallback db_failed_callback_
Optional callback function to invoke if an opened connection recovery failed.
Statistics Manager class.
std::vector< HookLibInfo > HookLibsCollection
A storage for information about hook libraries.
const int CONTROL_RESULT_EMPTY
Status code indicating that the specified command was completed correctly, but failed to produce any ...
isc::log::Logger dhcp4_logger(DHCP4_APP_LOGGER_NAME)
Base logger for DHCPv4 server.
Origin
Origin of the network state transition.
const isc::log::MessageID DHCP4_DB_RECONNECT_SUCCEEDED
#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...
static const std::string FLUSH_RECLAIMED_TIMER_NAME
Name of the timer for flushing reclaimed leases.
asiolink::IOServicePtr & getIOService()
Returns pointer to the IO service used by the server.
virtual ~ControlledDhcpv4Srv()
Destructor.
Implements an asynchronous "signal" for IOService driven processing.
boost::shared_ptr< CfgDbAccess > CfgDbAccessPtr
A pointer to the CfgDbAccess.
static void create()
Creates new instance of the HostMgr.
const isc::log::MessageID DHCP4_CB_PERIODIC_FETCH_UPDATES_FAIL
A generic exception that is thrown when an unexpected error condition occurs.
static DbCallback db_recovered_callback_
Optional callback function to invoke if an opened connection recovery succeeded.
const isc::log::MessageID DHCP4_DYNAMIC_RECONFIGURATION
boost::shared_ptr< const Element > ConstElementPtr
isc::data::ConstElementPtr redactConfig(isc::data::ConstElementPtr const &config)
Redact a configuration.
uint32_t getMaxSampleCountDefault() const
Get default count limit.
void cleanup()
Performs cleanup, immediately before termination.
uint16_t getServerPort() const
Get UDP port on which server should listen.
const isc::log::MessageID DHCP4_CONFIG_UNRECOVERABLE_ERROR
ConstElementPtr redactConfig(ConstElementPtr const &element, list< string > const &json_path)
Redact a configuration.
boost::shared_ptr< AllocEngine > alloc_engine_
Allocation Engine.
const isc::log::MessageID DHCP4_OPEN_SOCKETS_NO_RECONNECT_CTL
const isc::log::MessageID DHCP4_DEPRECATED
This is a base class for exceptions thrown from the DNS library module.
ConstElementPtr parseAnswer(int &rcode, const ConstElementPtr &msg)
Defines the logger used by the top-level component of kea-lfc.
NetworkStatePtr network_state_
Holds information about disabled DHCP service and/or disabled subnet/network scopes.
void startD2()
Starts DHCP_DDNS client IO if DDNS updates are enabled.
const isc::log::MessageID DHCP4_CB_PERIODIC_FETCH_UPDATES_RETRIES_EXHAUSTED
void setExitValue(int value)
Sets the exit value.
boost::shared_ptr< CalloutHandle > CalloutHandlePtr
A shared pointer to a CalloutHandle object.
static const std::string RECLAIM_EXPIRED_TIMER_NAME
Name of the timer for reclaiming expired leases.
const isc::log::MessageID DHCP4_CONFIG_RECEIVED
This file contains several functions and constants that are used for handling commands and responses ...
const isc::log::MessageID DHCP4_HOOKS_LIBS_RELOAD_FAIL
const isc::log::MessageID DHCP4_CONFIG_LOAD_FAIL
A generic exception that is thrown if a function is called in a prohibited way.
const isc::log::MessageID DHCP4_NOT_RUNNING
#define LOG_DEBUG(LOGGER, LEVEL, MESSAGE)
Macro to conveniently test debug output and log it.
isc::data::ConstElementPtr statisticSetMaxSampleAgeAllHandler(const isc::data::ConstElementPtr ¶ms)
Handles statistic-sample-age-set-all command.
static ControlledDhcpv4Srv * getInstance()
Returns pointer to the sole instance of Dhcpv4Srv.
const isc::log::MessageID DHCP4_DB_RECONNECT_DISABLED
Controlled version of the DHCPv4 server.
std::string getConfigReport()
Defines the Dhcp4o6Ipc class.
static void setIOService(const isc::asiolink::IOServicePtr &io_service)
Sets IO service to be used by the Lease Manager.
const isc::log::MessageID DHCP4_COMMAND_RECEIVED
#define LOG_FATAL(LOGGER, MESSAGE)
Macro to conveniently test fatal output and log it.
void shutdown() override
Instructs the server to shut down.
CBControlDHCPv4Ptr getCBControl() const
Returns an object which controls access to the configuration backends.
static const TimerMgrPtr & instance()
Returns pointer to the sole instance of the TimerMgr.
const int DBG_DHCP4_COMMAND
Debug level used to log receiving commands.
NetworkStatePtr & getNetworkState()
Returns pointer to the network state used by the server.
const StatsDuration & getMaxSampleAgeDefault() const
Get default duration limit.
void shutdownServer(int exit_value)
Initiates shutdown procedure for the whole DHCPv4 server.
Contains declarations for loggers used by the DHCPv4 server component.
long toSeconds(const StatsDuration &dur)
Returns the number of seconds in a duration.