47#include <boost/algorithm/string.hpp>
48#include <boost/lexical_cast.hpp>
54#include <netinet/in.h>
98 bool echo_client_id =
getBoolean(global,
"echo-client-id");
99 cfg->setEchoClientId(echo_client_id);
102 uint32_t probation_period =
103 getUint32(global,
"decline-probation-period");
104 cfg->setDeclinePeriod(probation_period);
107 uint16_t dhcp4o6_port =
getUint16(global,
"dhcp4o6-port");
108 cfg->setDhcp4o6Port(dhcp4o6_port);
113 cfg->setContext(user_context);
117 std::string server_tag =
getString(global,
"server-tag");
118 cfg->setServerTag(server_tag);
134 bool ip_reservations_unique =
getBoolean(global,
"ip-reservations-unique");
135 cfg->setIPReservationsUnique(ip_reservations_unique);
147 if (!dest || !from) {
159 for (
auto const& net : *networks) {
170 for (
auto const& subnet : *subnets) {
188 cfg->sanityChecksLifetime(
"valid-lifetime");
193 sharedNetworksSanityChecks(*networks, global->get(
"shared-networks"));
215 std::set<string> names;
218 for (
auto const& net : networks) {
223 bool authoritative = net->getAuthoritative();
224 string iface = net->getIface();
229 for (
auto const& subnet : *subnets) {
230 if (subnet->getAuthoritative() != authoritative) {
233 <<
" has different authoritative setting "
234 << subnet->getAuthoritative()
235 <<
" than the shared-network itself: "
240 iface = subnet->getIface();
244 if (subnet->getIface().empty()) {
248 if (subnet->getIface() != iface) {
250 <<
" has specified interface " << subnet->getIface()
251 <<
", but earlier subnet in the same shared-network"
252 <<
" or the shared-network itself used " << iface);
257 txt += subnet->toText() +
" ";
262 if (net->getName().empty()) {
264 << txt <<
" is missing mandatory 'name' parameter");
268 if (names.find(net->getName()) != names.end()) {
270 "name " << net->getName() <<
" defined twice.");
272 names.insert(net->getName());
302 bool sock_changed = (sock_cfg && current_sock_cfg &&
303 !sock_cfg->equals(*current_sock_cfg));
310 if (!sock_cfg || !current_sock_cfg || sock_changed) {
347 string parameter_name;
357 mutable_cfg = boost::const_pointer_cast<Element>(config_set);
363 srv_config->moveDdnsParams(mutable_cfg);
382 Dhcp4ConfigParser global_parser;
385 global_parser.parseEarly(srv_config, mutable_cfg);
390 parameter_name =
"option-def";
393 parser.
parse(cfg_option_def, option_defs);
398 parameter_name =
"option-data";
401 parser.
parse(cfg_option, option_datas);
405 if (control_socket) {
406 parameter_name =
"control-socket";
408 parser.
parse(*srv_config, control_socket);
412 if (multi_threading) {
413 parameter_name =
"multi-threading";
415 parser.
parse(*srv_config, multi_threading);
418 bool multi_threading_enabled =
true;
419 uint32_t thread_count = 0;
420 uint32_t queue_size = 0;
422 multi_threading_enabled, thread_count, queue_size);
425 ConstElementPtr queue_control = mutable_cfg->get(
"dhcp-queue-control");
427 parameter_name =
"dhcp-queue-control";
429 srv_config->setDHCPQueueControl(parser.
parse(queue_control, multi_threading_enabled));
433 ConstElementPtr reservations_lookup_first = mutable_cfg->get(
"reservations-lookup-first");
434 if (reservations_lookup_first) {
435 parameter_name =
"reservations-lookup-first";
436 if (multi_threading_enabled) {
439 srv_config->setReservationsLookupFirst(reservations_lookup_first->boolValue());
443 mutable_cfg->get(
"host-reservation-identifiers");
444 if (hr_identifiers) {
445 parameter_name =
"host-reservation-identifiers";
447 parser.
parse(hr_identifiers);
452 parameter_name =
"sanity-checks";
454 parser.
parse(*srv_config, sanity_checks);
458 mutable_cfg->get(
"expired-leases-processing");
459 if (expiration_cfg) {
460 parameter_name =
"expired-leases-processing";
469 if (hooks_libraries) {
470 parameter_name =
"hooks-libraries";
472 HooksConfig& libraries = srv_config->getHooksConfig();
473 hooks_parser.
parse(libraries, hooks_libraries);
475 multi_threading_enabled);
484 parameter_name =
"dhcp-ddns";
488 d2_client_cfg = parser.
parse(dhcp_ddns);
492 if (client_classes) {
493 parameter_name =
"client-classes";
496 parser.
parse(client_classes, AF_INET);
497 srv_config->setClientClassDictionary(dictionary);
502 if (lease_database) {
503 parameter_name =
"lease-database";
505 std::string access_string;
506 parser.
parse(access_string, lease_database);
508 cfg_db_access->setLeaseDbAccessString(access_string);
512 if (hosts_database) {
513 parameter_name =
"hosts-database";
515 std::string access_string;
516 parser.
parse(access_string, hosts_database);
518 cfg_db_access->setHostDbAccessString(access_string);
522 if (hosts_databases) {
523 parameter_name =
"hosts-databases";
525 for (
auto const& it : hosts_databases->listValue()) {
527 std::string access_string;
528 parser.
parse(access_string, it);
529 cfg_db_access->setHostDbAccessString(access_string);
535 if (shared_networks) {
536 parameter_name =
"shared-networks";
544 parser.
parse(cfg, shared_networks);
548 global_parser.copySubnets4(srv_config->getCfgSubnets4(), cfg);
553 parameter_name =
"subnet4";
556 subnets_parser.
parse(srv_config, subnet4);
561 parameter_name =
"reservations";
564 parser.
parse(SUBNET_ID_GLOBAL, reservations, hosts);
565 for (
auto const& h : hosts) {
566 srv_config->getCfgHosts()->add(h);
571 if (config_control) {
572 parameter_name =
"config-control";
585 const std::map<std::string, ConstElementPtr>& values_map =
586 mutable_cfg->mapValue();
588 for (
auto const& config_pair : values_map) {
589 parameter_name = config_pair.first;
592 if ((config_pair.first ==
"option-def") ||
593 (config_pair.first ==
"option-data") ||
594 (config_pair.first ==
"control-socket") ||
595 (config_pair.first ==
"multi-threading") ||
596 (config_pair.first ==
"dhcp-queue-control") ||
597 (config_pair.first ==
"host-reservation-identifiers") ||
598 (config_pair.first ==
"interfaces-config") ||
599 (config_pair.first ==
"sanity-checks") ||
600 (config_pair.first ==
"expired-leases-processing") ||
601 (config_pair.first ==
"hooks-libraries") ||
602 (config_pair.first ==
"dhcp-ddns") ||
603 (config_pair.first ==
"client-classes") ||
604 (config_pair.first ==
"lease-database") ||
605 (config_pair.first ==
"hosts-database") ||
606 (config_pair.first ==
"hosts-databases") ||
607 (config_pair.first ==
"subnet4") ||
608 (config_pair.first ==
"shared-networks") ||
609 (config_pair.first ==
"reservations") ||
610 (config_pair.first ==
"config-control") ||
611 (config_pair.first ==
"loggers") ||
612 (config_pair.first ==
"compatibility")) {
626 if ( (config_pair.first ==
"renew-timer") ||
627 (config_pair.first ==
"rebind-timer") ||
628 (config_pair.first ==
"valid-lifetime") ||
629 (config_pair.first ==
"min-valid-lifetime") ||
630 (config_pair.first ==
"max-valid-lifetime") ||
631 (config_pair.first ==
"decline-probation-period") ||
632 (config_pair.first ==
"dhcp4o6-port") ||
633 (config_pair.first ==
"echo-client-id") ||
634 (config_pair.first ==
"match-client-id") ||
635 (config_pair.first ==
"authoritative") ||
636 (config_pair.first ==
"next-server") ||
637 (config_pair.first ==
"server-hostname") ||
638 (config_pair.first ==
"boot-file-name") ||
639 (config_pair.first ==
"server-tag") ||
640 (config_pair.first ==
"reservation-mode") ||
641 (config_pair.first ==
"reservations-global") ||
642 (config_pair.first ==
"reservations-in-subnet") ||
643 (config_pair.first ==
"reservations-out-of-pool") ||
644 (config_pair.first ==
"calculate-tee-times") ||
645 (config_pair.first ==
"t1-percent") ||
646 (config_pair.first ==
"t2-percent") ||
647 (config_pair.first ==
"cache-threshold") ||
648 (config_pair.first ==
"cache-max-age") ||
649 (config_pair.first ==
"hostname-char-set") ||
650 (config_pair.first ==
"hostname-char-replacement") ||
651 (config_pair.first ==
"ddns-send-updates") ||
652 (config_pair.first ==
"ddns-override-no-update") ||
653 (config_pair.first ==
"ddns-override-client-update") ||
654 (config_pair.first ==
"ddns-replace-client-name") ||
655 (config_pair.first ==
"ddns-generated-prefix") ||
656 (config_pair.first ==
"ddns-qualifying-suffix") ||
657 (config_pair.first ==
"ddns-update-on-renew") ||
658 (config_pair.first ==
"ddns-use-conflict-resolution") ||
659 (config_pair.first ==
"ddns-conflict-resolution-mode") ||
660 (config_pair.first ==
"ddns-ttl-percent") ||
661 (config_pair.first ==
"store-extended-info") ||
662 (config_pair.first ==
"statistic-default-sample-count") ||
663 (config_pair.first ==
"statistic-default-sample-age") ||
664 (config_pair.first ==
"early-global-reservations-lookup") ||
665 (config_pair.first ==
"ip-reservations-unique") ||
666 (config_pair.first ==
"reservations-lookup-first") ||
667 (config_pair.first ==
"parked-packet-limit") ||
668 (config_pair.first ==
"allocator") ||
669 (config_pair.first ==
"offer-lifetime") ) {
676 if (config_pair.first ==
"user-context") {
682 "unsupported global configuration parameter: " << config_pair.first
683 <<
" (" << config_pair.second->getPosition() <<
")");
687 parameter_name =
"<post parsing>";
690 global_parser.parse(srv_config, mutable_cfg);
695 global_parser.sanityChecks(srv_config, mutable_cfg);
698 if (!d2_client_cfg) {
701 d2_client_cfg->validateContents();
702 srv_config->setD2ClientConfig(d2_client_cfg);
705 .arg(parameter_name).arg(ex.
what());
716 "Control-socket, hook-libraries, and D2 configuration "
717 "were sanity checked, but not applied.");
725 bool check_only,
bool extra_checks) {
728 "Can't parse NULL config");
751 string params =
"universe=4 persist=false";
752 if (cfg_db->getExtendedInfoTablesEnabled()) {
753 params +=
" extended-info-tables=true";
755 cfg_db->setAppendedParameters(params);
756 cfg_db->createManagers();
757 }
catch (
const std::exception& ex) {
763 std::ostringstream err;
773 }
catch (
const std::exception& ex) {
774 err <<
"Error setting packet queue controls after server reconfiguration: "
798 string parameter_name;
807 mutable_cfg = boost::const_pointer_cast<Element>(config_set);
811 parameter_name =
"interfaces-config";
815 parser.
parse(cfg_iface, ifaces_config);
819 .arg(parameter_name).arg(ex.
what());
826 " processing error");
886 bool multi_threading_enabled =
true;
887 uint32_t thread_count = 0;
888 uint32_t queue_size = 0;
890 multi_threading_enabled, thread_count, queue_size);
912 std::ostringstream err;
913 err <<
"during update from config backend database: " << ex.
what();
919 std::ostringstream err;
920 err <<
"during update from config backend database: "
921 <<
"undefined configuration parsing error";
936 if (notify_libraries) {
937 return (notify_libraries);
944 }
catch (
const std::exception& ex) {
945 std::ostringstream err;
946 err <<
"Error initializing hooks: "
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.
void clearIOServices()
Clear the list of IOService objects.
static IOServiceMgr & instance()
Access the IOServiceMgr singleton instance.
void pollIOServices()
Poll IOService objects.
static std::string getHash(const isc::data::ConstElementPtr &config)
returns a hash of a given Element structure
void closeCommandSocket()
Shuts down any open control sockets.
static CommandMgr & instance()
CommandMgr is a singleton class.
void openCommandSocket(const isc::data::ConstElementPtr &socket_info)
Opens control socket with parameters specified in socket_info.
static ElementPtr create(const Position &pos=ZERO_POSITION())
static ElementPtr createMap(const Position &pos=ZERO_POSITION())
Creates an empty MapElement type ElementPtr.
static std::string getString(isc::data::ConstElementPtr scope, const std::string &name)
Returns a string parameter from a scope.
uint32_t getUint32(isc::data::ConstElementPtr scope, const std::string &name)
Returns a value converted to uint32_t.
static bool getBoolean(isc::data::ConstElementPtr scope, const std::string &name)
Returns a boolean parameter from a scope.
uint16_t getUint16(isc::data::ConstElementPtr scope, const std::string &name)
Returns a value converted to uint16_t.
Parse Database Parameters.
void parse(std::string &access_string, isc::data::ConstElementPtr database_config)
Parse configuration value.
static void moveReservationMode(isc::data::ElementPtr config)
Moves deprecated reservation-mode parameter to new reservations flags.
void setD2ClientConfig(D2ClientConfigPtr &new_config)
Updates the DHCP-DDNS client configuration to the given value.
static CfgMgr & instance()
returns a single instance of Configuration Manager
SrvConfigPtr getStagingCfg()
Returns a pointer to the staging configuration.
SrvConfigPtr getCurrentCfg()
Returns a pointer to the current configuration.
static void extract(data::ConstElementPtr value, bool &enabled, uint32_t &thread_count, uint32_t &queue_size)
Extract multi-threading parameters from a given configuration.
Parser for a list of client class definitions.
ClientClassDictionaryPtr parse(isc::data::ConstElementPtr class_def_list, uint16_t family, bool check_dependencies=true)
Parse configuration entries.
void parse(isc::data::ConstElementPtr cfg, isc::dhcp::SrvConfig &srv_cfg)
Parse compatibility flags.
Parser for the control-socket structure.
void parse(SrvConfig &srv_cfg, isc::data::ConstElementPtr value)
"Parses" control-socket structure
static isc::data::ConstElementPtr finishConfigHookLibraries(isc::data::ConstElementPtr config)
Configuration checker for hook libraries.
Parser for D2ClientConfig.
D2ClientConfigPtr parse(isc::data::ConstElementPtr d2_client_cfg)
Parses a given dhcp-ddns element into D2ClientConfig.
static size_t setAllDefaults(isc::data::ConstElementPtr d2_config)
Sets all defaults for D2 client configuration.
Acts as a storage vault for D2 client configuration.
Parser for the configuration of DHCP packet queue controls.
data::ElementPtr parse(const isc::data::ConstElementPtr &control_elem, bool multi_threading_enabled)
Parses content of the "dhcp-queue-control".
To be removed. Please use ConfigError instead.
CBControlDHCPv4Ptr getCBControl() const
Returns an object which controls access to the configuration backends.
void discardPackets()
Discards parked packets Clears the packet parking lots of all packets.
Parser for the configuration parameters pertaining to the processing of expired leases.
void parse(isc::data::ConstElementPtr expiration_config, isc::dhcp::CfgExpirationPtr expiration)
Parses parameters in the JSON map, pertaining to the processing of the expired leases.
static void printRegistered()
Prints out all registered backends.
Parser for a list of host identifiers for DHCPv4.
void parse(isc::data::ConstElementPtr ids_list)
Parses a list of host identifiers.
Parser for a list of host reservations for a subnet.
void parse(const SubnetID &subnet_id, isc::data::ConstElementPtr hr_list, HostCollection &hosts_list)
Parses a list of host reservation entries for a subnet.
static IfaceMgr & instance()
IfaceMgr is a singleton class.
void closeSockets()
Closes all open sockets.
Parser for the configuration of interfaces.
void parse(const CfgIfacePtr &config, const isc::data::ConstElementPtr &values)
Parses content of the "interfaces-config".
static void setRuntimeOptionDefs(const OptionDefSpaceContainer &defs)
Copies option definitions created at runtime.
static void revertRuntimeOptionDefs()
Reverts uncommitted changes to runtime option definitions.
Simple parser for multi-threading structure.
void parse(SrvConfig &srv_cfg, const isc::data::ConstElementPtr &value)
parses JSON structure.
Parser for option data values within a subnet.
void parse(const CfgOptionPtr &cfg, isc::data::ConstElementPtr option_data_list, bool encapsulate=true)
Parses a list of options, instantiates them and stores in cfg.
Parser for a list of option definitions.
void parse(CfgOptionDefPtr cfg, isc::data::ConstElementPtr def_list)
Parses a list of option definitions, create them and store in cfg.
Class of option definition space container.
Simple parser for sanity-checks structure.
void parse(SrvConfig &srv_cfg, const isc::data::ConstElementPtr &value)
parses JSON structure
Parser for a list of shared networks.
void parse(CfgSharedNetworksTypePtr &cfg, const data::ConstElementPtr &shared_networks_list_data)
Parses a list of shared networks.
static size_t deriveParameters(isc::data::ElementPtr global)
Derives (inherits) all parameters from global to more specific scopes.
static size_t setAllDefaults(isc::data::ElementPtr global)
Sets all defaults for DHCPv4 configuration.
static const uint32_t CFGSEL_ALL4
IPv4 related config.
static void resetSubnetID()
Resets subnet-id counter to its initial value (1).
this class parses list of DHCP4 subnets
size_t parse(SrvConfigPtr cfg, data::ConstElementPtr subnets_list, bool encapsulate_options=true)
parses contents of the list
static const TimerMgrPtr & instance()
Returns pointer to the sole instance of the TimerMgr.
Wrapper class that holds hooks libraries configuration.
void verifyLibraries(const isc::data::Element::Position &position, bool multi_threading_enabled) const
Verifies that libraries stored in libraries_ are valid.
void loadLibraries(bool multi_threading_enabled) const
Commits hooks libraries configuration.
Parser for hooks library list.
void parse(HooksConfig &libraries, isc::data::ConstElementPtr value)
Parses parameters value.
static bool unloadLibraries()
Unload libraries.
static void prepareUnloadLibraries()
Prepare the unloading of libraries.
Implements parser for config control information, "config-control".
ConfigControlInfoPtr parse(const data::ConstElementPtr &config_control)
Parses a configuration control Element.
isc::data::ConstElementPtr redactConfig(isc::data::ConstElementPtr const &config)
Redact a configuration.
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.
Parsers for client class definitions.
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.
#define isc_throw(type, stream)
A shortcut macro to insert known values into exception arguments.
#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_DEBUG(LOGGER, LEVEL, MESSAGE)
Macro to conveniently test debug output and log it.
const int CONTROL_RESULT_ERROR
Status code indicating a general failure.
ConstElementPtr createAnswer()
Creates a standard config/command level success answer message (i.e.
ConstElementPtr parseAnswer(int &rcode, const ConstElementPtr &msg)
const int CONTROL_RESULT_SUCCESS
Status code indicating a successful operation.
boost::shared_ptr< const Element > ConstElementPtr
boost::shared_ptr< Element > ElementPtr
void configureCommandChannel()
Initialize the command channel based on the staging configuration.
const isc::log::MessageID DHCP4_CONFIG_START
boost::shared_ptr< D2ClientConfig > D2ClientConfigPtr
Defines a pointer for D2ClientConfig instances.
const isc::log::MessageID DHCP4_PARSER_EXCEPTION
boost::shared_ptr< CfgOption > CfgOptionPtr
Non-const pointer.
boost::shared_ptr< CfgOptionDef > CfgOptionDefPtr
Non-const pointer.
boost::shared_ptr< CfgDbAccess > CfgDbAccessPtr
A pointer to the CfgDbAccess.
const isc::log::MessageID DHCP4_RESERVATIONS_LOOKUP_FIRST_ENABLED
isc::data::ConstElementPtr processDhcp4Config(isc::data::ConstElementPtr config_set)
Process a DHCPv4 confguration and return an answer stating if the configuration is valid,...
boost::shared_ptr< CfgIface > CfgIfacePtr
A pointer to the CfgIface .
const isc::log::MessageID DHCP4_CONFIG_PACKET_QUEUE
const isc::log::MessageID DHCP4_PARSER_COMMIT_EXCEPTION
boost::shared_ptr< SrvConfig > SrvConfigPtr
Non-const pointer to the SrvConfig.
const isc::log::MessageID DHCP4_PARSER_FAIL
std::vector< HostPtr > HostCollection
Collection of the Host objects.
boost::multi_index_container< Subnet4Ptr, boost::multi_index::indexed_by< boost::multi_index::ordered_unique< boost::multi_index::tag< SubnetSubnetIdIndexTag >, boost::multi_index::const_mem_fun< Subnet, SubnetID, &Subnet::getID > >, boost::multi_index::ordered_unique< boost::multi_index::tag< SubnetPrefixIndexTag >, boost::multi_index::const_mem_fun< Subnet, std::string, &Subnet::toText > > > > Subnet4SimpleCollection
A simple collection of Subnet4 objects.
const int DBG_DHCP4_COMMAND
Debug level used to log receiving commands.
const isc::log::MessageID DHCP4_PARSER_COMMIT_FAIL
boost::shared_ptr< ClientClassDictionary > ClientClassDictionaryPtr
Defines a pointer to a ClientClassDictionary.
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.
boost::shared_ptr< CfgSubnets4 > CfgSubnets4Ptr
Non-const pointer.
const isc::log::MessageID DHCP4_CONFIG_COMPLETE
boost::multi_index_container< SharedNetwork4Ptr, boost::multi_index::indexed_by< boost::multi_index::random_access< boost::multi_index::tag< SharedNetworkRandomAccessIndexTag > >, boost::multi_index::hashed_non_unique< boost::multi_index::tag< SharedNetworkIdIndexTag >, boost::multi_index::const_mem_fun< data::BaseStampedElement, uint64_t, &data::BaseStampedElement::getId > >, boost::multi_index::ordered_unique< boost::multi_index::tag< SharedNetworkNameIndexTag >, boost::multi_index::const_mem_fun< SharedNetwork4, std::string, &SharedNetwork4::getName > >, boost::multi_index::ordered_non_unique< boost::multi_index::tag< SharedNetworkServerIdIndexTag >, boost::multi_index::const_mem_fun< Network4, asiolink::IOAddress, &Network4::getServerId > >, boost::multi_index::ordered_non_unique< boost::multi_index::tag< SharedNetworkModificationTimeIndexTag >, boost::multi_index::const_mem_fun< data::BaseStampedElement, boost::posix_time::ptime, &data::BaseStampedElement::getModificationTime > > > > SharedNetwork4Collection
Multi index container holding shared networks.
boost::shared_ptr< CfgSharedNetworks4 > CfgSharedNetworks4Ptr
Pointer to the configuration of IPv4 shared networks.
isc::log::Logger dhcp4_logger(DHCP4_APP_LOGGER_NAME)
Base logger for DHCPv4 server.
boost::shared_ptr< ConfigControlInfo > ConfigControlInfoPtr
Defines a pointer to a ConfigControlInfo.
Defines the logger used by the top-level component of kea-lfc.