52namespace ph = std::placeholders;
57struct CtrlDhcp4Hooks {
58 int hooks_index_dhcp4_srv_configured_;
82void signalHandler(
int signo) {
84 if (signo == SIGHUP) {
86 }
else if ((signo == SIGTERM) || (signo == SIGINT)) {
101 start_ = boost::posix_time::second_clock::universal_time();
109 string reason = comment ? comment->stringValue() :
110 "no details available";
139 if (file_name.empty()) {
142 " Please use -c command line option.");
156 "a map, i.e., start with { and end with } and contain "
157 "at least an entry called 'Dhcp4' that itself is a map. "
159 <<
" is a valid JSON, but its top element is not a map."
160 " Did you forget to add { } around your configuration?");
170 "process command \"config-set\"");
178 string reason = comment ? comment->stringValue() :
179 "no details available";
188 }
catch (
const std::exception& ex) {
194 .arg(file_name).arg(ex.what());
196 << file_name <<
"': " << ex.what());
230 "parameter 'exit-value' is not an integer"));
233 exit_value = param->intValue();
246 "Illegal operation executing 'config-reload' on a different thread than main thread"));
258 if (Daemon::getShutdownOnFailure()) {
262 "Config reload failed: " +
string(ex.
what())));
263 }
catch (
const std::exception& ex) {
270 "Config reload failed: " +
string(ex.
what())));
306 if (filename_param) {
309 "passed parameter 'filename' is not a string"));
311 filename = filename_param->stringValue();
315 if (filename.empty()) {
319 if (filename.empty()) {
321 "Please specify filename explicitly."));
327 std::ostringstream msg;
328 msg <<
"not allowed to write config into " << filename
329 <<
": " << ex.
what();
354 + filename +
" successful", params));
362 "Illegal operation executing 'config-set' on a different thread than main thread"));
371 message =
"Missing mandatory 'arguments' parameter.";
373 dhcp4 = args->get(
"Dhcp4");
375 message =
"Missing mandatory 'Dhcp4' parameter.";
377 message =
"'Dhcp4' parameter expected to be a map.";
382 if (message.empty()) {
383 for (
auto const& obj : args->mapValue()) {
384 const string& obj_name = obj.first;
385 if (obj_name !=
"Dhcp4") {
388 if (message.empty()) {
389 message =
"Unsupported '" + obj_name +
"' parameter";
391 message +=
" (and '" + obj_name +
"')";
395 if (!message.empty()) {
400 if (!message.empty()) {
413 "Can not update configuration while lease file cleanup process is running."));
446 message =
"Reconfiguration triggered a fatal error: shutting down.";
475 }
catch (
const std::exception& ex) {
477 if (Daemon::getShutdownOnFailure()) {
482 std::ostringstream err;
483 err <<
"Error initializing hooks: "
500 "Illegal operation executing 'config-test' on a different thread than main thread"));
509 message =
"Missing mandatory 'arguments' parameter.";
511 dhcp4 = args->get(
"Dhcp4");
513 message =
"Missing mandatory 'Dhcp4' parameter.";
515 message =
"'Dhcp4' parameter expected to be a map.";
520 if (message.empty()) {
521 for (
auto const& obj : args->mapValue()) {
522 const string& obj_name = obj.first;
523 if (obj_name !=
"Dhcp4") {
526 if (message.empty()) {
527 message =
"Unsupported '" + obj_name +
"' parameter";
529 message +=
" (and '" + obj_name +
"')";
533 if (!message.empty()) {
538 if (!message.empty()) {
560 std::ostringstream message;
561 int64_t max_period = 0;
573 message <<
"arguments for the 'dhcp-disable' command must be a map";
578 if (max_period_element) {
581 message <<
"'max-period' argument must be a number";
585 max_period = max_period_element->intValue();
586 if (max_period <= 0) {
587 message <<
"'max-period' must be positive integer";
600 if (origin_id_element) {
602 type = origin_id_element->intValue();
604 message <<
"'origin-id' argument must be a number";
606 }
else if (origin_element) {
607 switch (origin_element->getType()) {
609 origin = origin_element->stringValue();
610 if (origin ==
"ha-partner") {
612 }
else if (origin !=
"user") {
613 if (origin.empty()) {
614 origin =
"(empty string)";
616 message <<
"invalid value used for 'origin' parameter: "
621 type = origin_element->intValue();
625 message <<
"'origin' argument must be a string or a number";
632 if (message.tellp() == 0) {
633 message <<
"DHCPv4 service disabled";
634 if (max_period > 0) {
635 message <<
" for " << max_period <<
" seconds";
640 network_state_->delayedEnableService(
static_cast<unsigned>(max_period),
656 std::ostringstream message;
667 message <<
"arguments for the 'dhcp-enable' command must be a map";
679 if (origin_id_element) {
681 type = origin_id_element->intValue();
683 message <<
"'origin-id' argument must be a number";
685 }
else if (origin_element) {
686 switch (origin_element->getType()) {
688 origin = origin_element->stringValue();
689 if (origin ==
"ha-partner") {
691 }
else if (origin !=
"user") {
692 if (origin.empty()) {
693 origin =
"(empty string)";
695 message <<
"invalid value used for 'origin' parameter: "
700 type = origin_element->intValue();
704 message <<
"'origin' argument must be a string or a number";
711 if (message.tellp() == 0) {
716 "DHCP service successfully enabled"));
731 }
catch (
const std::exception& ex) {
736 message =
"unknown error";
742 <<
" interfaces detected.";
745 msg <<
"Unexpected error while retrieving the list of detected interfaces: " << message;
755 "Illegal operation executing 'interface-redetect' on a different thread than main thread"));
764 }
catch (
const std::exception& ex) {
769 message =
"unknown error";
776 msg <<
"Unexpected error while retrieving the list of detected interfaces: " << message;
786 "Illegal operation executing 'interface-add' on a different thread than main thread"));
791 message =
"Missing mandatory 'arguments' parameter.";
794 message =
"arguments for the 'interface-add' command must be a map";
796 ifaces_config = args->get(
"interfaces");
797 if (!ifaces_config) {
798 message =
"Missing mandatory 'interfaces' map parameter in 'arguments'.";
800 auto map = args->mapValue();
801 for (
auto const& key : map) {
802 if (key.first !=
"interfaces") {
803 message =
"Unsupported '" + key.first +
"' map parameter in 'arguments'.";
810 if (!message.empty()) {
813 if (!ifaces_config->size()) {
820 std::set<std::string> seen;
821 auto running_ifaces = running_cfg->toElement()->get(
"interfaces");
822 if (running_ifaces && (running_ifaces->getType() ==
Element::list)) {
823 for (
auto const& item : running_ifaces->listValue()) {
824 seen.insert(item->stringValue());
828 for (
auto const& item : ifaces_config->listValue()) {
829 auto const&
str = item->stringValue();
830 if (seen.find(
str) != seen.end()) {
839 running_cfg->update(*cfg_iface);
841 }
catch (
const std::exception& ex) {
846 message =
"unknown error";
856 msg <<
"Updating used interfaces failed: " << message;
865 arguments->set(
"extended", extended);
888 message =
"Missing mandatory 'remove' parameter.";
892 message =
"Missing mandatory 'remove' parameter.";
894 message =
"'remove' parameter expected to be a boolean.";
896 bool remove_lease = remove_name->boolValue();
897 server_->alloc_engine_->reclaimExpiredLeases4(0, 0, remove_lease);
899 message =
"Reclamation of expired leases is complete.";
915 bool ignore_link_sel =
918 for (
auto const& entry : args->mapValue()) {
919 ostringstream errmsg;
920 if (entry.first ==
"interface") {
922 errmsg <<
"'interface' entry must be a string";
925 selector.
iface_name_ = entry.second->stringValue();
927 }
else if (entry.first ==
"address") {
929 errmsg <<
"'address' entry must be a string";
933 IOAddress addr(entry.second->stringValue());
935 errmsg <<
"bad 'address' entry: not IPv4";
940 }
catch (
const exception& ex) {
941 errmsg <<
"bad 'address' entry: " << ex.what();
944 }
else if (entry.first ==
"relay") {
946 errmsg <<
"'relay' entry must be a string";
950 IOAddress addr(entry.second->stringValue());
952 errmsg <<
"bad 'relay' entry: not IPv4";
957 }
catch (
const exception& ex) {
958 errmsg <<
"bad 'relay' entry: " << ex.what();
961 }
else if (entry.first ==
"local") {
963 errmsg <<
"'local' entry must be a string";
967 IOAddress addr(entry.second->stringValue());
969 errmsg <<
"bad 'local' entry: not IPv4";
974 }
catch (
const exception& ex) {
975 errmsg <<
"bad 'local' entry: " << ex.what();
978 }
else if (entry.first ==
"remote") {
980 errmsg <<
"'remote' entry must be a string";
984 IOAddress addr(entry.second->stringValue());
986 errmsg <<
"bad 'remote' entry: not IPv4";
991 }
catch (
const exception& ex) {
992 errmsg <<
"bad 'remote' entry: " << ex.what();
995 }
else if (entry.first ==
"link") {
997 errmsg <<
"'link' entry must be a string";
1001 IOAddress addr(entry.second->stringValue());
1003 errmsg <<
"bad 'link' entry: not IPv4";
1006 if (!ignore_link_sel) {
1010 }
catch (
const exception& ex) {
1011 errmsg <<
"bad 'link' entry: " << ex.what();
1014 }
else if (entry.first ==
"subnet") {
1016 if (args->contains(
"link") && !ignore_link_sel) {
1020 errmsg <<
"'subnet' entry must be a string";
1024 IOAddress addr(entry.second->stringValue());
1026 errmsg <<
"bad 'subnet' entry: not IPv4";
1031 }
catch (
const exception& ex) {
1032 errmsg <<
"bad 'subnet' entry: " << ex.what();
1035 }
else if (entry.first ==
"classes") {
1038 "'classes' entry must be a list"));
1040 for (
auto const& item : entry.second->listValue()) {
1042 errmsg <<
"'classes' entry must be a list of strings";
1046 if (!item->stringValue().empty()) {
1052 errmsg <<
"unknown entry '" << entry.first <<
"'";
1057 getCfgSubnets4()->selectSubnet(selector);
1062 subnet->getSharedNetwork(network);
1065 msg <<
"selected shared network '" << network->getName()
1066 <<
"' starting with subnet '" << subnet->toText()
1067 <<
"' id " << subnet->getID();
1069 msg <<
"selected subnet '" << subnet->toText()
1070 <<
"' id " << subnet->getID();
1088 for (
auto const& entry : args->mapValue()) {
1089 ostringstream errmsg;
1090 if (entry.first ==
"interface") {
1092 errmsg <<
"'interface' entry must be a string";
1095 selector.
iface_name_ = entry.second->stringValue();
1097 }
if (entry.first ==
"interface-id") {
1099 errmsg <<
"'interface-id' entry must be a string";
1103 string str = entry.second->stringValue();
1109 errmsg <<
"'interface-id' must be not empty";
1117 errmsg <<
"value of 'interface-id' was not recognized";
1120 }
else if (entry.first ==
"address") {
1122 errmsg <<
"'address' entry must be a string";
1126 IOAddress addr(entry.second->stringValue());
1128 errmsg <<
"bad 'address' entry: not IPv4";
1133 }
catch (
const exception& ex) {
1134 errmsg <<
"bad 'address' entry: " << ex.what();
1137 }
else if (entry.first ==
"relay") {
1139 errmsg <<
"'relay' entry must be a string";
1143 IOAddress addr(entry.second->stringValue());
1145 errmsg <<
"bad 'relay' entry: not IPv4";
1150 }
catch (
const exception& ex) {
1151 errmsg <<
"bad 'relay' entry: " << ex.what();
1154 }
else if (entry.first ==
"local") {
1156 errmsg <<
"'local' entry must be a string";
1160 IOAddress addr(entry.second->stringValue());
1162 errmsg <<
"bad 'local' entry: not IPv6";
1167 }
catch (
const exception& ex) {
1168 errmsg <<
"bad 'local' entry: " << ex.what();
1171 }
else if (entry.first ==
"remote") {
1173 errmsg <<
"'remote' entry must be a string";
1177 IOAddress addr(entry.second->stringValue());
1179 errmsg <<
"bad 'remote' entry: not IPv6";
1184 }
catch (
const exception& ex) {
1185 errmsg <<
"bad 'remote' entry: " << ex.what();
1188 }
else if (entry.first ==
"link") {
1190 errmsg <<
"'link' entry must be a string";
1194 IOAddress addr(entry.second->stringValue());
1196 errmsg <<
"bad 'link' entry: not IPv6";
1201 }
catch (
const exception& ex) {
1202 errmsg <<
"bad 'link' entry: " << ex.what();
1205 }
else if (entry.first ==
"subnet") {
1207 errmsg <<
"'subnet' entry must be a string";
1211 IOAddress addr(entry.second->stringValue());
1213 errmsg <<
"bad 'subnet' entry: not IPv4";
1218 }
catch (
const exception& ex) {
1219 errmsg <<
"bad 'subnet' entry: " << ex.what();
1222 }
else if (entry.first ==
"classes") {
1225 "'classes' entry must be a list"));
1227 for (
auto const& item : entry.second->listValue()) {
1229 errmsg <<
"'classes' entry must be a list of strings";
1233 if (!item->stringValue().empty()) {
1239 errmsg <<
"unknown entry '" << entry.first <<
"'";
1244 getCfgSubnets4()->selectSubnet4o6(selector);
1249 subnet->getSharedNetwork(network);
1252 msg <<
"selected shared network '" << network->getName()
1253 <<
"' starting with subnet '" << subnet->toText()
1254 <<
"' id " << subnet->getID();
1256 msg <<
"selected subnet '" << subnet->toText()
1257 <<
"' id " << subnet->getID();
1265 const std::string& tag =
1278 "Illegal operation executing 'config-backend-pull' on a different thread than main thread"));
1299 auto mode = CBControlDHCPv4::FetchMode::FETCH_UPDATE;
1300 server_->getCBControl()->databaseConfigFetch(srv_cfg, mode);
1301 }
catch (
const std::exception& ex) {
1305 "On demand configuration update failed: " +
1306 string(ex.what())));
1309 "On demand configuration update successful."));
1318 auto now = boost::posix_time::second_clock::universal_time();
1320 if (!
start_.is_not_a_date_time()) {
1321 auto uptime = now -
start_;
1326 if (!last_commit.is_not_a_date_time()) {
1327 auto reload = now - last_commit;
1332 if (mt_mgr.getMode()) {
1336 status->set(
"packet-queue-size",
Element::create(
static_cast<int32_t
>(
1339 queue_stats->add(
Element::create(mt_mgr.getThreadPool().getQueueStat(10)));
1340 queue_stats->add(
Element::create(mt_mgr.getThreadPool().getQueueStat(100)));
1341 queue_stats->add(
Element::create(mt_mgr.getThreadPool().getQueueStat(1000)));
1342 status->set(
"packet-queue-statistics", queue_stats);
1354 for (
auto const& entry : lm_info->mapValue()) {
1355 status->set(entry.first, entry.second);
1362 for (std::string
const&
error : interface->getErrors()) {
1369 if (socket_errors->empty()) {
1374 if (reconnect_ctl && reconnect_ctl->retriesLeft()) {
1379 sockets->set(
"errors", socket_errors);
1381 status->set(
"sockets", sockets);
1419 "no lease backend"));
1431 std::ostringstream err;
1434 err <<
"Server object not initialized, can't process config.";
1451 }
catch (
const std::exception& ex) {
1452 err <<
"Failed to process configuration:" << ex.what();
1462 std::bind(&ControlledDhcpv4Srv::dbLostCallback, srv, ph::_1);
1465 std::bind(&ControlledDhcpv4Srv::dbRecoveredCallback, srv, ph::_1);
1468 std::bind(&ControlledDhcpv4Srv::dbFailedCallback, srv, ph::_1);
1471 string params =
"universe=4";
1472 cfg_db->setAppendedParameters(params);
1473 cfg_db->createManagers();
1478 }
catch (
const std::exception& ex) {
1479 err <<
"Unable to open database: " << ex.what();
1486 }
catch (
const std::exception& ex) {
1487 err <<
"Error starting DHCP_DDNS client after server reconfiguration: "
1495 }
catch (
const std::exception& ex) {
1496 err <<
"error starting DHCPv4-over-DHCPv6 IPC "
1497 " after server reconfiguration: " << ex.what();
1510 }
catch (
const std::exception& ex) {
1511 err <<
"Error setting packet queue controls after server reconfiguration: "
1519 std::bind(&ControlledDhcpv4Srv::openSocketsFailedCallback, srv, ph::_1);
1535 setupTimers(&ControlledDhcpv4Srv::reclaimExpiredLeases,
1536 &ControlledDhcpv4Srv::deleteExpiredReclaimedLeases,
1539 }
catch (
const std::exception& ex) {
1540 err <<
"unable to setup timers for periodically running the"
1541 " reclamation of the expired leases: "
1542 << ex.what() <<
".";
1549 long fetch_time =
static_cast<long>(ctl_info->getConfigFetchWaitTime());
1552 if (fetch_time > 0) {
1558 if (!server_->inTestMode()) {
1559 fetch_time = 1000 * fetch_time;
1562 boost::shared_ptr<unsigned> failure_count(
new unsigned(0));
1564 registerTimer(
"Dhcp4CBFetchTimer",
1565 std::bind(&ControlledDhcpv4Srv::cbFetchUpdates,
1579 if (notify_libraries) {
1580 return (notify_libraries);
1589 }
catch (
const std::exception& ex) {
1590 err <<
"Error applying multi threading settings: "
1609 callout_handle->setArgument(
"io_context", srv->
getIOService());
1611 callout_handle->setArgument(
"json_config",
config);
1612 callout_handle->setArgument(
"server_config",
CfgMgr::instance().getStagingCfg());
1621 callout_handle->getArgument(
"error",
error);
1623 error =
"unknown error";
1638 "Server object not initialized, can't process config.");
1649 uint16_t client_port )
1653 "There is another Dhcpv4Srv instance already.");
1794 timer_mgr_->unregisterTimers();
1848ControlledDhcpv4Srv::reclaimExpiredLeases(
const size_t max_leases,
1849 const uint16_t timeout,
1850 const bool remove_lease,
1851 const uint16_t max_unwarned_cycles) {
1854 server_->
alloc_engine_->reclaimExpiredLeases4(max_leases, timeout,
1856 max_unwarned_cycles);
1860 getCfgExpiration()->getReclaimTimerWaitTime());
1862 }
catch (
const std::exception& ex) {
1871ControlledDhcpv4Srv::deleteExpiredReclaimedLeases(
const uint32_t secs) {
1873 server_->alloc_engine_->deleteExpiredReclaimedLeases4(secs);
1881ControlledDhcpv4Srv::dbLostCallback(
ReconnectCtlPtr db_reconnect_ctl) {
1882 if (!db_reconnect_ctl) {
1889 if (db_reconnect_ctl->retriesLeft() == db_reconnect_ctl->maxRetries() &&
1890 db_reconnect_ctl->alterServiceState()) {
1895 .arg(db_reconnect_ctl->id())
1896 .arg(db_reconnect_ctl->timerName());;
1900 if (!db_reconnect_ctl->retriesLeft() ||
1901 !db_reconnect_ctl->retryInterval()) {
1902 if (db_reconnect_ctl->exitOnFailure()) {
1904 .arg(db_reconnect_ctl->retriesLeft())
1905 .arg(db_reconnect_ctl->retryInterval())
1906 .arg(db_reconnect_ctl->id())
1907 .arg(db_reconnect_ctl->timerName());
1911 .arg(db_reconnect_ctl->retriesLeft())
1912 .arg(db_reconnect_ctl->retryInterval())
1913 .arg(db_reconnect_ctl->id())
1914 .arg(db_reconnect_ctl->timerName());
1923ControlledDhcpv4Srv::dbRecoveredCallback(
ReconnectCtlPtr db_reconnect_ctl) {
1924 if (!db_reconnect_ctl) {
1931 if (db_reconnect_ctl->retriesLeft() != db_reconnect_ctl->maxRetries() &&
1932 db_reconnect_ctl->alterServiceState()) {
1937 .arg(db_reconnect_ctl->id())
1938 .arg(db_reconnect_ctl->timerName());
1940 db_reconnect_ctl->resetRetries();
1946ControlledDhcpv4Srv::dbFailedCallback(
ReconnectCtlPtr db_reconnect_ctl) {
1947 if (!db_reconnect_ctl) {
1953 if (db_reconnect_ctl->exitOnFailure()) {
1955 .arg(db_reconnect_ctl->maxRetries())
1956 .arg(db_reconnect_ctl->id())
1957 .arg(db_reconnect_ctl->timerName());
1961 .arg(db_reconnect_ctl->maxRetries())
1962 .arg(db_reconnect_ctl->id())
1963 .arg(db_reconnect_ctl->timerName());
1970ControlledDhcpv4Srv::openSocketsFailedCallback(
ReconnectCtlPtr reconnect_ctl) {
1971 if (!reconnect_ctl) {
1977 if (reconnect_ctl->exitOnFailure()) {
1979 .arg(reconnect_ctl->maxRetries());
1983 .arg(reconnect_ctl->maxRetries());
1988ControlledDhcpv4Srv::cbFetchUpdates(
const SrvConfigPtr& srv_cfg,
1989 boost::shared_ptr<unsigned> failure_count) {
1991 MultiThreadingCriticalSection cs;
1995 server_->getCBControl()->databaseConfigFetch(srv_cfg,
1996 CBControlDHCPv4::FetchMode::FETCH_UPDATE);
1997 (*failure_count) = 0;
1999 }
catch (
const std::exception& ex) {
2006 if (++(*failure_count) > 10) {
A generic exception that is thrown if a parameter given to a method is considered invalid in that con...
This is a base class for exceptions thrown from the DNS library module.
virtual const char * what() const
Returns a C-style character string of the cause of the exception.
A generic exception that is thrown if an unrecoverable error occurs.
A generic exception that is thrown if a function is called in a prohibited way.
The IOAddress class represents an IP addresses (version agnostic).
bool isV6() const
Convenience function to check for an IPv6 address.
bool isV4() const
Convenience function to check for an IPv4 address.
static const IOAddress & IPV6_ZERO_ADDRESS()
Returns an IPv6 zero address.
static IOServiceMgr & instance()
Access the IOServiceMgr singleton instance.
size_t pollIOServices()
Poll IOService objects.
Implements an asynchronous "signal" for IOService driven processing.
static void setIOService(isc::asiolink::IOServicePtr io_service)
Set the I/O service.
virtual isc::data::ConstElementPtr processCommand(const isc::data::ConstElementPtr &cmd)
Triggers command processing.
void registerCommand(const std::string &cmd, CommandHandler handler)
Registers specified command handler for a given command.
static std::string getHash(const isc::data::ConstElementPtr &config)
returns a hash of a given Element structure
void deregisterCommand(const std::string &cmd)
Deregisters specified command handler.
static CommandMgr & instance()
CommandMgr is a singleton class.
static std::string DEFAULT_AUTHENTICATION_REALM
Default HTTP authentication realm.
static std::string SUPPORTED_SERVICE
Supported service.
void closeCommandSockets()
Close http control sockets.
static HttpCommandMgr & instance()
HttpCommandMgr is a singleton class.
void setIOService(const asiolink::IOServicePtr &io_service)
Sets IO service to be used by the http command manager.
static UnixCommandMgr & instance()
UnixCommandMgr is a singleton class.
void setIOService(const asiolink::IOServicePtr &io_service)
Sets IO service to be used by the unix command manager.
void closeCommandSockets()
Shuts down any open unix control sockets.
static ElementPtr create(const Position &pos=ZERO_POSITION())
Create a NullElement.
static ElementPtr createMap(const Position &pos=ZERO_POSITION())
Creates an empty MapElement type ElementPtr.
static ElementPtr createList(const Position &pos=ZERO_POSITION())
Creates an empty ListElement type ElementPtr.
static void setIOService(const isc::asiolink::IOServicePtr &io_service)
Sets IO service to be used by the database backends.
static DbCallback db_recovered_callback_
Optional callback function to invoke if an opened connection recovery succeeded.
static DbCallback db_failed_callback_
Optional callback function to invoke if an opened connection recovery failed.
static DbCallback db_lost_callback_
Optional callback function to invoke if an opened connection is lost.
RAII class to enable DB reconnect retries on server startup.
static const std::string FLUSH_RECLAIMED_TIMER_NAME
Name of the timer for flushing reclaimed leases.
static const std::string RECLAIM_EXPIRED_TIMER_NAME
Name of the timer for reclaiming expired leases.
Represents selection of interfaces for DHCP server.
static OpenSocketsFailedCallback open_sockets_failed_callback_
Optional callback function to invoke if all retries of the opening sockets fail.
static CfgMgr & instance()
returns a single instance of Configuration Manager
SrvConfigPtr getStagingCfg()
Returns a pointer to the staging configuration.
void commit()
Commits the staging configuration.
void clearStagingConfiguration()
Remove staging configuration.
SrvConfigPtr getCurrentCfg()
Returns a pointer to the current configuration.
static void apply(data::ConstElementPtr value)
apply multi threading configuration
void insert(const ClientClass &class_name)
Insert an element.
Controlled version of the DHCPv4 server.
isc::data::ConstElementPtr commandConfigReloadHandler(const std::string &command, isc::data::ConstElementPtr args)
Handler for processing 'config-reload' command.
isc::data::ConstElementPtr commandLeasesReclaimHandler(const std::string &command, isc::data::ConstElementPtr args)
Handler for processing 'leases-reclaim' command.
isc::data::ConstElementPtr commandLfcStartHandler(const std::string &command, isc::data::ConstElementPtr args)
handler for processing 'kea-lfc-start' command
virtual ~ControlledDhcpv4Srv()
Destructor.
isc::data::ConstElementPtr commandConfigSetHandler(const std::string &command, isc::data::ConstElementPtr args)
handler for processing 'config-set' command
isc::data::ConstElementPtr commandStatusGetHandler(const std::string &command, isc::data::ConstElementPtr args)
handler for processing 'status-get' command
isc::data::ConstElementPtr commandConfigGetHandler(const std::string &command, isc::data::ConstElementPtr args)
handler for processing 'config-get' command
isc::data::ConstElementPtr commandInterfaceRedetectHandler(const std::string &command, isc::data::ConstElementPtr args)
Handler for processing 'interface-redetect' command.
bool getShutdown() const
Return the server shutdown flag value.
isc::data::ConstElementPtr commandConfigWriteHandler(const std::string &command, isc::data::ConstElementPtr args)
handler for processing 'config-write' command
static isc::data::ConstElementPtr finishConfigHookLibraries(isc::data::ConstElementPtr config)
Configuration checker for hook libraries.
isc::data::ConstElementPtr commandInterfaceListHandler(const std::string &command, isc::data::ConstElementPtr args)
Handler for processing 'interface-list' command.
isc::data::ConstElementPtr commandShutdownHandler(const std::string &command, isc::data::ConstElementPtr args)
Handler for processing 'shutdown' command.
isc::data::ConstElementPtr loadConfigFile(const std::string &file_name)
Configure DHCPv4 server using the configuration file specified.
void cleanup()
Performs cleanup, immediately before termination.
isc::data::ConstElementPtr commandSubnet4o6SelectTestHandler(const std::string &command, isc::data::ConstElementPtr args)
Handler for processing 'subnet4o6-select-test' command.
isc::data::ConstElementPtr commandBuildReportHandler(const std::string &command, isc::data::ConstElementPtr args)
handler for processing 'build-report' command
ControlledDhcpv4Srv(uint16_t server_port=DHCP4_SERVER_PORT, uint16_t client_port=0)
Constructor.
isc::data::ConstElementPtr commandConfigTestHandler(const std::string &command, isc::data::ConstElementPtr args)
handler for processing 'config-test' command
isc::data::ConstElementPtr commandDhcpEnableHandler(const std::string &command, isc::data::ConstElementPtr args)
A handler for processing 'dhcp-enable' command.
isc::data::ConstElementPtr commandConfigBackendPullHandler(const std::string &command, isc::data::ConstElementPtr args)
handler for config-backend-pull command
isc::data::ConstElementPtr commandVersionGetHandler(const std::string &command, isc::data::ConstElementPtr args)
handler for processing 'version-get' command
static isc::data::ConstElementPtr checkConfig(isc::data::ConstElementPtr config)
Configuration checker.
isc::data::ConstElementPtr commandServerTagGetHandler(const std::string &command, isc::data::ConstElementPtr args)
handler for server-tag-get command
void init(const std::string &config_file)
Initializes the server.
isc::data::ConstElementPtr commandStatisticSetMaxSampleCountAllHandler(const std::string &command, isc::data::ConstElementPtr args)
handler for processing 'statistic-sample-count-set-all' command
isc::data::ConstElementPtr commandInterfaceAddHandler(const std::string &command, isc::data::ConstElementPtr args)
Handler for processing 'interface-add' command.
isc::data::ConstElementPtr commandSubnet4SelectTestHandler(const std::string &command, isc::data::ConstElementPtr args)
Handler for processing 'subnet4-select-test' command.
static isc::data::ConstElementPtr processConfig(isc::data::ConstElementPtr config)
Configuration processor.
static ControlledDhcpv4Srv * getInstance()
Returns pointer to the sole instance of Dhcpv4Srv.
virtual void shutdownServer(int exit_value)
Initiates shutdown procedure for the whole DHCPv4 server.
isc::data::ConstElementPtr commandConfigHashGetHandler(const std::string &command, isc::data::ConstElementPtr args)
handler for processing 'config-hash-get' command
isc::data::ConstElementPtr commandStatisticSetMaxSampleAgeAllHandler(const std::string &command, isc::data::ConstElementPtr args)
handler for processing 'statistic-sample-age-set-all' command
isc::data::ConstElementPtr commandDhcpDisableHandler(const std::string &command, isc::data::ConstElementPtr args)
A handler for processing 'dhcp-disable' command.
static Dhcp4to6Ipc & instance()
Returns pointer to the sole instance of Dhcp4to6Ipc.
virtual void open()
Open communication socket.
void startD2()
Starts DHCP_DDNS client IO if DDNS updates are enabled.
Dhcpv4Srv(uint16_t server_port=DHCP4_SERVER_PORT, uint16_t client_port=0, const bool use_bcast=true, const bool direct_response_desired=true)
Default constructor.
void shutdown() override
Instructs the server to shut down.
asiolink::IOServicePtr & getIOService()
Returns pointer to the IO service used by the server.
boost::shared_ptr< AllocEngine > alloc_engine_
Allocation Engine.
NetworkStatePtr & getNetworkState()
Returns pointer to the network state used by the server.
static std::string getVersion(bool extended)
returns Kea version on stdout and exit.
volatile bool shutdown_
Indicates if shutdown is in progress.
bool useBroadcast() const
Return bool value indicating that broadcast flags should be set on sockets.
NetworkStatePtr network_state_
Holds information about disabled DHCP service and/or disabled subnet/network scopes.
uint16_t getServerPort() const
Get UDP port on which server should listen.
static void create()
Creates new instance of the HostMgr.
size_t size() const
Return the number of interfaces.
const IfaceCollection & getIfaces()
Returns container with all interfaces.
void detectIfaces(bool update_only=false)
Detects network interfaces.
static IfaceMgr & instance()
IfaceMgr is a singleton class.
Parser for the configuration of interfaces.
void parseInterfacesList(const CfgIfacePtr &cfg_iface, isc::data::ConstElementPtr ifaces_list)
parses interfaces-list structure
static TrackingLeaseMgr & instance()
Return current lease manager.
static bool init_allocators_
Flag which indicates if allocators must be initialized.
static void destroy()
Destroy lease manager.
static bool haveInstance()
Indicates if the lease manager has been instantiated.
virtual data::ElementPtr getStatus() const
Return status information.
static void commitRuntimeOptionDefs()
Commits runtime option definitions.
Concrete implementation of a lease database backend using flat file.
static bool isLFCProcessRunning(const std::string file_name, Universe u)
Check if LFC is running.
static const unsigned int DB_CONNECTION
The network state is being altered by the DB connection recovery mechanics.
static const unsigned int USER_COMMAND
Origin of the network state transition.
static const unsigned int HA_REMOTE_COMMAND
The network state is being altered by a "dhcp-disable" or "dhcp-enable" command sent by a HA partner.
Evaluation context, an interface to the expression evaluation.
isc::data::ElementPtr parseFile(const std::string &filename, ParserType parser_type)
Run the parser on the file specified.
@ PARSER_DHCP4
This parser will parse the content as Dhcp4 config wrapped in a map (that's the regular config file).
RAII class creating a critical section for the receiver thread.
Manages a pool of asynchronous interval timers.
static const TimerMgrPtr & instance()
Returns pointer to the sole instance of the TimerMgr.
@ NEXT_STEP_DROP
drop the packet
static int registerHook(const std::string &name)
Register Hook.
static bool calloutsPresent(int index)
Are callouts present?
static boost::shared_ptr< CalloutHandle > createCalloutHandle()
Return callout handle.
static void callCallouts(int index, CalloutHandle &handle)
Calls the callouts for a given hook.
std::string getConfigFile() const
Returns config file name.
virtual size_t writeConfigFile(const std::string &config_file, isc::data::ConstElementPtr cfg=isc::data::ConstElementPtr()) const
Writes current configuration to specified file.
isc::asiolink::IOSignalSetPtr signal_set_
A pointer to the object installing custom signal handlers.
boost::posix_time::ptime start_
Timestamp of the start of the daemon.
void checkWriteConfigFile(std::string &file)
Checks the to-be-written configuration file name.
void setExitValue(int value)
Sets the exit value.
isc::data::ConstElementPtr redactConfig(isc::data::ConstElementPtr const &config)
Redact a configuration.
Statistics Manager class.
static StatsMgr & instance()
Statistics Manager accessor method.
RAII class creating a critical section.
static MultiThreadingMgr & instance()
Returns a single instance of Multi Threading Manager.
void apply(bool enabled, uint32_t thread_count, uint32_t queue_size)
Apply the multi-threading related settings.
This file contains several functions and constants that are used for handling commands and responses ...
Contains declarations for loggers used by the DHCPv4 server component.
Defines the Dhcp4o6Ipc class.
#define isc_throw(type, stream)
A shortcut macro to insert known values into exception arguments.
isc::data::ConstElementPtr statisticSetMaxSampleCountAllHandler(const isc::data::ConstElementPtr ¶ms)
Handles statistic-sample-count-set-all command.
static isc::data::ConstElementPtr statisticResetHandler(const std::string &name, const isc::data::ConstElementPtr ¶ms)
Handles statistic-reset command.
static isc::data::ConstElementPtr statisticGetAllHandler(const std::string &name, const isc::data::ConstElementPtr ¶ms)
Handles statistic-get-all command.
static isc::data::ConstElementPtr statisticRemoveHandler(const std::string &name, const isc::data::ConstElementPtr ¶ms)
Handles statistic-remove command.
static isc::data::ConstElementPtr statisticGetHandler(const std::string &name, const isc::data::ConstElementPtr ¶ms)
Handles statistic-get command.
static isc::data::ConstElementPtr statisticGlobalGetAllHandler(const std::string &name, const isc::data::ConstElementPtr ¶ms)
Handles statistic-global-get-all command.
isc::data::ConstElementPtr statisticSetMaxSampleAgeAllHandler(const isc::data::ConstElementPtr ¶ms)
Handles statistic-sample-age-set-all command.
static isc::data::ConstElementPtr statisticResetAllHandler(const std::string &name, const isc::data::ConstElementPtr ¶ms)
Handles statistic-reset-all command.
static isc::data::ConstElementPtr statisticSetMaxSampleAgeHandler(const std::string &name, const isc::data::ConstElementPtr ¶ms)
Handles statistic-sample-age-set command.
static isc::data::ConstElementPtr statisticRemoveAllHandler(const std::string &name, const isc::data::ConstElementPtr ¶ms)
Handles statistic-remove-all command.
static isc::data::ConstElementPtr statisticSetMaxSampleCountHandler(const std::string &name, const isc::data::ConstElementPtr ¶ms)
Handles statistic-sample-count-set command.
uint32_t getMaxSampleCountDefault() const
Get default count limit.
const StatsDuration & getMaxSampleAgeDefault() const
Get default duration limit.
#define LOG_ERROR(LOGGER, MESSAGE)
Macro to conveniently test error output and log it.
#define LOG_INFO(LOGGER, MESSAGE)
Macro to conveniently test info output and log it.
#define LOG_WARN(LOGGER, MESSAGE)
Macro to conveniently test warn output and log it.
#define LOG_FATAL(LOGGER, MESSAGE)
Macro to conveniently test fatal output and log it.
#define LOG_DEBUG(LOGGER, LEVEL, MESSAGE)
Macro to conveniently test debug output and log it.
boost::shared_ptr< IOService > IOServicePtr
Defines a smart pointer to an IOService instance.
const int CONTROL_RESULT_EMPTY
Status code indicating that the specified command was completed correctly, but failed to produce any ...
ConstElementPtr parseAnswer(int &rcode, const ConstElementPtr &msg)
Parses a standard config/command level answer and returns arguments or text status code.
ConstElementPtr createCommand(const std::string &command)
Creates a standard command message with no argument (of the form { "command": "my_command" }...
const int CONTROL_RESULT_ERROR
Status code indicating a general failure.
ConstElementPtr createAnswer(const int status_code, const std::string &text, const ConstElementPtr &arg)
Creates a standard config/command level answer message.
ConstElementPtr createAnswer()
Creates a standard config/command level success answer message (i.e.
const int CONTROL_RESULT_COMMAND_UNSUPPORTED
Status code indicating that the specified command is not supported.
const int CONTROL_RESULT_FATAL_ERROR
Status code indicating that the command was unsuccessful and the configuration could not be reverted ...
const int CONTROL_RESULT_SUCCESS
Status code indicating a successful operation.
boost::shared_ptr< const Element > ConstElementPtr
boost::shared_ptr< Element > ElementPtr
std::string getConfigReport()
const isc::log::MessageID DHCP4_NOT_RUNNING
const isc::log::MessageID DHCP4_DYNAMIC_RECONFIGURATION_FAIL
const isc::log::MessageID DHCP4_CONFIG_RECEIVED
const isc::log::MessageID DHCP4_DYNAMIC_RECONFIGURATION_SUCCESS
boost::shared_ptr< const Subnet4 > ConstSubnet4Ptr
A const pointer to a Subnet4 object.
const isc::log::MessageID DHCP4_FATAL_DB_RECONNECT_FAILED
boost::shared_ptr< CfgDbAccess > CfgDbAccessPtr
A pointer to the CfgDbAccess.
boost::shared_ptr< Iface > IfacePtr
Type definition for the pointer to an Iface object.
const isc::log::MessageID DHCP4_DB_RECONNECT_NO_DB_CTL
boost::shared_ptr< CfgIface > CfgIfacePtr
A pointer to the CfgIface .
const isc::log::MessageID DHCP4_CB_PERIODIC_FETCH_UPDATES_RETRIES_EXHAUSTED
const isc::log::MessageID DHCP4_CONFIG_PACKET_QUEUE
boost::shared_ptr< SrvConfig > SrvConfigPtr
Non-const pointer to the SrvConfig.
const isc::log::MessageID DHCP4_CB_ON_DEMAND_FETCH_UPDATES_FAIL
const isc::log::MessageID DHCP4_CONFIG_LOAD_FAIL
const int DBG_DHCP4_COMMAND
Debug level used to log receiving commands.
const isc::log::MessageID DHCP4_FATAL_OPEN_SOCKETS_FAILED
const isc::log::MessageID DHCP4_DB_RECONNECT_DISABLED
const isc::log::MessageID DHCP4_CONFIG_UNRECOVERABLE_ERROR
const int DBG_DHCP4_BASIC
Debug level used to trace basic operations within the code.
const isc::log::MessageID DHCP4_DB_RECONNECT_SUCCEEDED
isc::data::ConstElementPtr configureDhcp4Server(Dhcpv4Srv &server, isc::data::ConstElementPtr config_set, bool check_only, bool extra_checks)
Configure DHCPv4 server (Dhcpv4Srv) with a set of configuration values.
const isc::log::MessageID DHCP4_MULTI_THREADING_INFO
const isc::log::MessageID DHCP4_OPEN_SOCKETS_NO_RECONNECT_CTL
const isc::log::MessageID DHCP4_RECLAIM_EXPIRED_LEASES_SKIPPED
isc::log::Logger dhcp4_logger(DHCP4_APP_LOGGER_NAME)
Base logger for DHCPv4 server.
boost::shared_ptr< SharedNetwork4 > SharedNetwork4Ptr
Pointer to SharedNetwork4 object.
const isc::log::MessageID DHCP4_FATAL_DYNAMIC_RECONFIGURATION_FAIL
const isc::log::MessageID DHCP4_DB_RECONNECT_FAILED
const isc::log::MessageID DHCP4_OPEN_SOCKETS_FAILED
const isc::log::MessageID DHCP4_FATAL_DB_RECONNECT_DISABLED
const isc::log::MessageID DHCP4_DYNAMIC_RECONFIGURATION
const isc::log::MessageID DHCP4_RECLAIM_EXPIRED_LEASES_FAIL
boost::shared_ptr< Option > OptionPtr
const isc::log::MessageID DHCP4_CONFIG_UNSUPPORTED_OBJECT
const isc::log::MessageID DHCP4_CB_PERIODIC_FETCH_UPDATES_FAIL
const isc::log::MessageID DHCP4_DB_RECONNECT_LOST_CONNECTION
boost::shared_ptr< CalloutHandle > CalloutHandlePtr
A shared pointer to a CalloutHandle object.
long toSeconds(const StatsDuration &dur)
Returns the number of seconds in a duration.
void decodeFormattedHexString(const string &hex_string, vector< uint8_t > &binary)
Converts a formatted string of hexadecimal digits into a vector.
vector< uint8_t > quotedStringToBinary(const string "ed_string)
Converts a string in quotes into vector.
boost::shared_ptr< ReconnectCtl > ReconnectCtlPtr
Pointer to an instance of ReconnectCtl.
Defines the logger used by the top-level component of kea-lfc.
Subnet selector used to specify parameters used to select a subnet.
asiolink::IOAddress local_address_
Address on which the message was received.
bool dhcp4o6_
Specifies if the packet is DHCP4o6.
asiolink::IOAddress option_select_
RAI link select or subnet select option.
std::string iface_name_
Name of the interface on which the message was received.
asiolink::IOAddress ciaddr_
ciaddr from the client's message.
ClientClasses client_classes_
Classes that the client belongs to.
asiolink::IOAddress remote_address_
Source address of the message.
OptionPtr interface_id_
Interface id option.
asiolink::IOAddress first_relay_linkaddr_
First relay link address.
asiolink::IOAddress giaddr_
giaddr from the client's message.