51#include <hooks/dhcp/mysql_lb/mysql_lease_mgr.h>
52#include <hooks/dhcp/mysql_hb/mysql_host_data_source.h>
56#include <hooks/dhcp/pgsql_lb/pgsql_lease_mgr.h>
57#include <hooks/dhcp/pgsql_hb/pgsql_host_data_source.h>
60#include <boost/algorithm/string.hpp>
61#include <boost/lexical_cast.hpp>
67#include <netinet/in.h>
89MySqlLeaseMgrInit mysql_init_lease;
90MySqlHostDataSourceInit mysql_init_host;
96PgSqlLeaseMgrInit pgsql_init_lease;
97PgSqlHostDataSourceInit pgsql_init_host;
129 bool echo_client_id = getBoolean(global,
"echo-client-id");
130 cfg->setEchoClientId(echo_client_id);
133 uint32_t probation_period =
134 getUint32(global,
"decline-probation-period");
135 cfg->setDeclinePeriod(probation_period);
138 uint16_t dhcp4o6_port = getUint16(global,
"dhcp4o6-port");
139 cfg->setDhcp4o6Port(dhcp4o6_port);
144 cfg->setContext(user_context);
148 std::string server_tag = getString(global,
"server-tag");
149 cfg->setServerTag(server_tag);
165 bool ip_reservations_unique = getBoolean(global,
"ip-reservations-unique");
166 cfg->setIPReservationsUnique(ip_reservations_unique);
178 if (!dest || !from) {
190 for (
auto const& net : *networks) {
201 for (
auto const& subnet : *subnets) {
219 cfg->sanityChecksLifetime(
"valid-lifetime");
224 sharedNetworksSanityChecks(*networks, global->get(
"shared-networks"));
246 std::set<string> names;
249 for (
auto const& net : networks) {
254 bool authoritative = net->getAuthoritative();
255 string iface = net->getIface();
260 for (
auto const& subnet : *subnets) {
261 if (subnet->getAuthoritative() != authoritative) {
264 <<
" has different authoritative setting "
265 << subnet->getAuthoritative()
266 <<
" than the shared-network itself: "
271 iface = subnet->getIface();
275 if (subnet->getIface().empty()) {
279 if (subnet->getIface() != iface) {
281 <<
" has specified interface " << subnet->getIface()
282 <<
", but earlier subnet in the same shared-network"
283 <<
" or the shared-network itself used " << iface);
288 txt += subnet->toText() +
" ";
293 if (net->getName().empty()) {
295 << txt <<
" is missing mandatory 'name' parameter");
299 if (names.find(net->getName()) != names.end()) {
301 "name " << net->getName() <<
" defined twice.");
303 names.insert(net->getName());
333 bool sock_changed = (sock_cfg && current_sock_cfg &&
334 !sock_cfg->equals(*current_sock_cfg));
341 if (!sock_cfg || !current_sock_cfg || sock_changed) {
378 string parameter_name;
388 mutable_cfg = boost::const_pointer_cast<Element>(config_set);
403 Dhcp4ConfigParser global_parser;
406 global_parser.parseEarly(srv_config, mutable_cfg);
411 parameter_name =
"option-def";
414 parser.
parse(cfg_option_def, option_defs);
419 parameter_name =
"option-data";
422 parser.
parse(cfg_option, option_datas);
426 if (control_socket) {
427 mutable_cfg->remove(
"control-socket");
430 mutable_cfg->set(
"control-sockets", l);
434 if (control_sockets) {
435 parameter_name =
"control-sockets";
437 parser.
parse(*srv_config, control_sockets);
441 if (multi_threading) {
442 parameter_name =
"multi-threading";
444 parser.
parse(*srv_config, multi_threading);
447 bool multi_threading_enabled =
true;
448 uint32_t thread_count = 0;
449 uint32_t queue_size = 0;
451 multi_threading_enabled, thread_count, queue_size);
454 ConstElementPtr queue_control = mutable_cfg->get(
"dhcp-queue-control");
456 parameter_name =
"dhcp-queue-control";
458 srv_config->setDHCPQueueControl(parser.
parse(queue_control, multi_threading_enabled));
462 ConstElementPtr reservations_lookup_first = mutable_cfg->get(
"reservations-lookup-first");
463 if (reservations_lookup_first) {
464 parameter_name =
"reservations-lookup-first";
465 if (multi_threading_enabled) {
468 srv_config->setReservationsLookupFirst(reservations_lookup_first->boolValue());
472 mutable_cfg->get(
"host-reservation-identifiers");
473 if (hr_identifiers) {
474 parameter_name =
"host-reservation-identifiers";
476 parser.
parse(hr_identifiers);
481 parameter_name =
"sanity-checks";
483 parser.
parse(*srv_config, sanity_checks);
487 mutable_cfg->get(
"expired-leases-processing");
488 if (expiration_cfg) {
489 parameter_name =
"expired-leases-processing";
498 if (hooks_libraries) {
499 parameter_name =
"hooks-libraries";
501 HooksConfig& libraries = srv_config->getHooksConfig();
502 hooks_parser.parse(libraries, hooks_libraries);
504 multi_threading_enabled);
513 parameter_name =
"dhcp-ddns";
517 d2_client_cfg = parser.
parse(dhcp_ddns);
521 if (client_classes) {
522 parameter_name =
"client-classes";
525 parser.
parse(client_classes, AF_INET);
526 srv_config->setClientClassDictionary(dictionary);
531 if (lease_database) {
532 parameter_name =
"lease-database";
534 std::string access_string;
535 parser.
parse(access_string, lease_database);
537 cfg_db_access->setLeaseDbAccessString(access_string);
541 if (hosts_database) {
542 parameter_name =
"hosts-database";
544 std::string access_string;
545 parser.
parse(access_string, hosts_database);
547 cfg_db_access->setHostDbAccessString(access_string);
551 if (hosts_databases) {
552 parameter_name =
"hosts-databases";
554 for (
auto const& it : hosts_databases->listValue()) {
556 std::string access_string;
557 parser.
parse(access_string, it);
558 cfg_db_access->setHostDbAccessString(access_string);
564 if (shared_networks) {
565 parameter_name =
"shared-networks";
573 parser.parse(cfg, shared_networks);
577 global_parser.copySubnets4(srv_config->getCfgSubnets4(), cfg);
582 parameter_name =
"subnet4";
585 subnets_parser.
parse(srv_config, subnet4);
590 parameter_name =
"reservations";
592 HostReservationsListParser<HostReservationParser4> parser;
593 parser.parse(SUBNET_ID_GLOBAL, reservations, hosts);
594 for (
auto const& h : hosts) {
595 srv_config->getCfgHosts()->add(h);
600 if (config_control) {
601 parameter_name =
"config-control";
614 const std::map<std::string, ConstElementPtr>& values_map =
615 mutable_cfg->mapValue();
617 for (
auto const& config_pair : values_map) {
618 parameter_name = config_pair.first;
621 if ((config_pair.first ==
"option-def") ||
622 (config_pair.first ==
"option-data") ||
623 (config_pair.first ==
"control-socket") ||
624 (config_pair.first ==
"control-sockets") ||
625 (config_pair.first ==
"multi-threading") ||
626 (config_pair.first ==
"dhcp-queue-control") ||
627 (config_pair.first ==
"host-reservation-identifiers") ||
628 (config_pair.first ==
"interfaces-config") ||
629 (config_pair.first ==
"sanity-checks") ||
630 (config_pair.first ==
"expired-leases-processing") ||
631 (config_pair.first ==
"hooks-libraries") ||
632 (config_pair.first ==
"dhcp-ddns") ||
633 (config_pair.first ==
"client-classes") ||
634 (config_pair.first ==
"lease-database") ||
635 (config_pair.first ==
"hosts-database") ||
636 (config_pair.first ==
"hosts-databases") ||
637 (config_pair.first ==
"subnet4") ||
638 (config_pair.first ==
"shared-networks") ||
639 (config_pair.first ==
"reservations") ||
640 (config_pair.first ==
"config-control") ||
641 (config_pair.first ==
"loggers") ||
642 (config_pair.first ==
"compatibility")) {
656 if ( (config_pair.first ==
"renew-timer") ||
657 (config_pair.first ==
"rebind-timer") ||
658 (config_pair.first ==
"valid-lifetime") ||
659 (config_pair.first ==
"min-valid-lifetime") ||
660 (config_pair.first ==
"max-valid-lifetime") ||
661 (config_pair.first ==
"decline-probation-period") ||
662 (config_pair.first ==
"dhcp4o6-port") ||
663 (config_pair.first ==
"echo-client-id") ||
664 (config_pair.first ==
"match-client-id") ||
665 (config_pair.first ==
"authoritative") ||
666 (config_pair.first ==
"next-server") ||
667 (config_pair.first ==
"server-hostname") ||
668 (config_pair.first ==
"boot-file-name") ||
669 (config_pair.first ==
"server-tag") ||
670 (config_pair.first ==
"reservations-global") ||
671 (config_pair.first ==
"reservations-in-subnet") ||
672 (config_pair.first ==
"reservations-out-of-pool") ||
673 (config_pair.first ==
"calculate-tee-times") ||
674 (config_pair.first ==
"t1-percent") ||
675 (config_pair.first ==
"t2-percent") ||
676 (config_pair.first ==
"cache-threshold") ||
677 (config_pair.first ==
"cache-max-age") ||
678 (config_pair.first ==
"hostname-char-set") ||
679 (config_pair.first ==
"hostname-char-replacement") ||
680 (config_pair.first ==
"ddns-send-updates") ||
681 (config_pair.first ==
"ddns-override-no-update") ||
682 (config_pair.first ==
"ddns-override-client-update") ||
683 (config_pair.first ==
"ddns-replace-client-name") ||
684 (config_pair.first ==
"ddns-generated-prefix") ||
685 (config_pair.first ==
"ddns-qualifying-suffix") ||
686 (config_pair.first ==
"ddns-update-on-renew") ||
687 (config_pair.first ==
"ddns-use-conflict-resolution") ||
688 (config_pair.first ==
"ddns-conflict-resolution-mode") ||
689 (config_pair.first ==
"ddns-ttl-percent") ||
690 (config_pair.first ==
"store-extended-info") ||
691 (config_pair.first ==
"statistic-default-sample-count") ||
692 (config_pair.first ==
"statistic-default-sample-age") ||
693 (config_pair.first ==
"early-global-reservations-lookup") ||
694 (config_pair.first ==
"ip-reservations-unique") ||
695 (config_pair.first ==
"reservations-lookup-first") ||
696 (config_pair.first ==
"parked-packet-limit") ||
697 (config_pair.first ==
"allocator") ||
698 (config_pair.first ==
"offer-lifetime") ||
699 (config_pair.first ==
"stash-agent-options") ) {
706 if (config_pair.first ==
"user-context") {
712 "unsupported global configuration parameter: " << config_pair.first
713 <<
" (" << config_pair.second->getPosition() <<
")");
717 parameter_name =
"<post parsing>";
720 global_parser.parse(srv_config, mutable_cfg);
725 global_parser.sanityChecks(srv_config, mutable_cfg);
728 if (!d2_client_cfg) {
731 d2_client_cfg->validateContents();
732 srv_config->setD2ClientConfig(d2_client_cfg);
735 .arg(parameter_name).arg(ex.what());
746 "Control-socket, hook-libraries, and D2 configuration "
747 "were sanity checked, but not applied.");
755 bool check_only,
bool extra_checks) {
758 "Can't parse NULL config");
763 .arg(server.redactConfig(config_set)->str());
785 string params =
"universe=4 persist=false";
786 cfg_db->setAppendedParameters(params);
787 cfg_db->createManagers();
788 }
catch (
const std::exception& ex) {
794 std::ostringstream err;
804 }
catch (
const std::exception& ex) {
805 err <<
"Error setting packet queue controls after server reconfiguration: "
824 server.discardPackets();
825 server.getCBControl()->reset();
829 string parameter_name;
838 mutable_cfg = boost::const_pointer_cast<Element>(config_set);
842 parameter_name =
"interfaces-config";
846 parser.
parse(cfg_iface, ifaces_config);
850 .arg(parameter_name).arg(ex.what());
857 " processing error");
917 bool multi_threading_enabled =
true;
918 uint32_t thread_count = 0;
919 uint32_t queue_size = 0;
921 multi_threading_enabled, thread_count, queue_size);
922 libraries.loadLibraries(multi_threading_enabled);
946 server.getCBControl()->databaseConfigFetch(srv_config,
949 std::ostringstream err;
950 err <<
"during update from config backend database: " << ex.what();
956 std::ostringstream err;
957 err <<
"during update from config backend database: "
958 <<
"undefined configuration parsing error";
973 if (notify_libraries) {
974 return (notify_libraries);
981 }
catch (
const std::exception& ex) {
982 std::ostringstream err;
983 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.
static IOServiceMgr & instance()
Access the IOServiceMgr singleton instance.
static std::string getHash(const isc::data::ConstElementPtr &config)
returns a hash of a given Element structure
static CommandMgr & instance()
CommandMgr is a singleton class.
static HttpCommandMgr & instance()
HttpCommandMgr is a singleton class.
static ElementPtr create(const Position &pos=ZERO_POSITION())
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.
Parse Database Parameters.
void parse(std::string &access_string, isc::data::ConstElementPtr database_config)
Parse configuration value.
static CfgMgr & instance()
returns a single instance of Configuration Manager
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-sockets structure.
void parse(SrvConfig &srv_cfg, isc::data::ConstElementPtr value)
"Parses" control-sockets 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.
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 logRegistered()
Logs 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.
static IfaceMgr & instance()
IfaceMgr is a singleton class.
Parser for the configuration of interfaces.
void parse(const CfgIfacePtr &config, const isc::data::ConstElementPtr &values)
Parses content of the "interfaces-config".
static void logRegistered()
Logs out all registered backends.
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
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.
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.
Parser for hooks library list.
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.
static MultiThreadingMgr & instance()
Returns a single instance of Multi Threading Manager.
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)
boost::shared_ptr< HttpCommandConfig > HttpCommandConfigPtr
Pointer to a HttpCommandConfig object.
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.
SharedNetworksListParser< SharedNetwork4Parser > SharedNetworks4ListParser
Type of the shared networks list parser for IPv4.
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.
static data::ElementPtr toElement(data::ConstElementPtr map)
Copy an Element map.