// Copyright (C) 2014-2023 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this // file, You can obtain one at http://mozilla.org/MPL/2.0/. #ifndef DHCPSRV_CONFIG_H #define DHCPSRV_CONFIG_H #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace isc { namespace dhcp { class CfgMgr; /// @brief Convenience container for conveying DDNS behavioral parameters /// It is intended to be created per Packet exchange using the selected /// subnet passed into functions that require them class DdnsParams { public: /// @brief Default constructor DdnsParams() : subnet_(), d2_client_enabled_(false) {}; /// @brief Constructor for DHPCv4 subnets /// /// @param subnet Pointer to Subnet4 instance to use for fetching /// parameter values (typically this is the selected subnet). /// @param d2_client_enabled flag which indicates whether or not /// D2Client is enabled (typically the value should come from /// global D2Client configuration). DdnsParams(const Subnet4Ptr& subnet, bool d2_client_enabled) : subnet_(boost::dynamic_pointer_cast(subnet)), d2_client_enabled_(d2_client_enabled) {} /// @brief Constructor for DHPCv6 subnets /// /// @param subnet Pointer to Subnet6 instance to use for fetching /// parameter values (typically this is the selected subnet). /// @param d2_client_enabled flag which indicates whether or not /// D2Client is enabled (typically the value should come from /// global D2Client configuration). DdnsParams(const Subnet6Ptr& subnet, bool d2_client_enabled) : subnet_(boost::dynamic_pointer_cast(subnet)), d2_client_enabled_(d2_client_enabled) {} /// @brief Returns whether or not DHCP DDNS updating is enabled. /// The value is the logical AND of d2_client_enabled_ and /// the value returned by subnet_'s getDdnsSendUpdates(). /// /// @return True if updates are enabled, false otherwise or if /// subnet_ is empty. bool getEnableUpdates() const; /// @brief Returns whether or not Kea should perform updates, even if /// client requested no updates. /// /// @return The value from the subnet_ or false if subnet_ is empty. bool getOverrideNoUpdate() const; /// @brief Returns whether or not Kea should perform updates, even if /// client requested delegation. /// /// @return The value from the subnet_ or false if subnet_ is empty. bool getOverrideClientUpdate() const; /// @brief Returns how Kea should handle the domain-name supplied by /// the client. /// /// @return The value from the subnet_ or RCM_NEVER if subnet_ is empty. D2ClientConfig::ReplaceClientNameMode getReplaceClientNameMode() const; /// @brief Returns the Prefix Kea should use when generating domain-names. /// /// @return The value from the subnet_ or an empty string if subnet_ is empty. std::string getGeneratedPrefix() const; /// @brief Returns the suffix Kea should use when to qualify partial /// domain-names. /// /// @return The value from the subnet_ or an empty string if subnet_ is empty. std::string getQualifyingSuffix() const; /// @brief Returns the regular expression describing invalid characters /// for client hostnames. If empty, host name scrubbing should not be done. /// /// @return The value from the subnet_ or an empty string if subnet_ is empty. std::string getHostnameCharSet() const; /// @brief Returns the string to replace invalid characters when scrubbing /// hostnames. Meaningful only if hostname_char_set_ is not empty. /// /// @return The value from the subnet_ or an empty string if subnet_ is empty. std::string getHostnameCharReplacement() const; /// @brief Returns a regular expression string sanitizer /// /// If the value returned by getHostnameCharSet() is not empty, then it is /// used in conjunction the value returned by getHostnameCharReplacment() /// (which may be empty) to create and return a StringSanitizer instance. /// Otherwise it will return an empty pointer. /// /// @return pointer to the StringSanitizer instance or an empty pointer /// @throw BadValue if the compilation fails. isc::util::str::StringSanitizerPtr getHostnameSanitizer() const; /// @brief Returns whether or not DNS should be updated when leases renew. /// /// If this is true, DNS should always be updated when leases are /// extended (i.e. renewed/rebound) even if the DNS information /// has not changed. /// /// @return True if updates should always be performed. bool getUpdateOnRenew() const; /// @brief Returns percent of lease lifetime to use for TTL /// /// This value, if greater than zero, is used to calculate the lease lifetime /// passed to D2 in the NCR. Otherwise the value is calculated per RFC 4702. /// /// @return TTL percent as an Optional. util::Optional getTtlPercent() const; /// @brief Returns the DDNS config resolution mode for kea-dhcp-ddns /// /// This value is communicated to D2 via the NCR. /// /// @return the DDNS conflict resolution mode std::string getConflictResolutionMode() const; /// @brief Returns the subnet-id of the subnet associated with these parameters /// /// @return value of subnet-id (or 0 if no subnet is associated) SubnetID getSubnetId() const { if (subnet_) { return (subnet_->getID()); } else { return (0); } } private: /// @brief Subnet from which values should be fetched. SubnetPtr subnet_; /// @brief Flag indicating whether or not the D2Client is enabled. bool d2_client_enabled_; }; /// @brief Defines a pointer for DdnsParams instances. typedef boost::shared_ptr DdnsParamsPtr; /// @brief Specifies current DHCP configuration /// /// @todo Migrate all other configuration parameters from cfgmgr.h here class SrvConfig : public process::ConfigBase { public: /// @name Constants for selection of parameters returned by @c getConfigSummary /// //@{ /// Nothing selected static const uint32_t CFGSEL_NONE = 0x00000000; /// Number of IPv4 subnets static const uint32_t CFGSEL_SUBNET4 = 0x00000001; /// Number of IPv6 subnets static const uint32_t CFGSEL_SUBNET6 = 0x00000002; /// Number of enabled ifaces static const uint32_t CFGSEL_IFACE4 = 0x00000004; /// Number of v6 ifaces static const uint32_t CFGSEL_IFACE6 = 0x00000008; /// DDNS enabled/disabled static const uint32_t CFGSEL_DDNS = 0x00000010; /// Number of all subnets static const uint32_t CFGSEL_SUBNET = 0x00000003; /// Configured globals static const uint32_t CFGSEL_GLOBALS = 0x00000020; /// Config control info static const uint32_t CFGSEL_CFG_CTL = 0x00000040; /// IPv4 related config static const uint32_t CFGSEL_ALL4 = 0x00000035; /// IPv6 related config static const uint32_t CFGSEL_ALL6 = 0x0000003A; /// Whole config static const uint32_t CFGSEL_ALL = 0xFFFFFFFF; //@} /// @brief Default constructor. /// /// This constructor sets configuration sequence number to 0. SrvConfig(); /// @brief Constructor. /// /// Sets arbitrary configuration sequence number. /// /// @param sequence The configuration sequence. SrvConfig(const uint32_t sequence); /// @brief Returns summary of the configuration in the textual format. /// /// This method returns the brief text describing the current configuration. /// It may be used for logging purposes, e.g. when the new configuration is /// committed to notify a user about the changes in configuration. /// /// @todo Currently this method uses @c CfgMgr accessors to get the /// configuration parameters. Once these parameters are migrated from the /// @c CfgMgr this method will have to be modified accordingly. /// /// @todo Implement reporting a summary of interfaces being used for /// receiving and sending DHCP messages. This will be implemented with /// ticket #3512. /// /// @param selection Is a bitfield which describes the parts of the /// configuration to be returned. /// /// @return Summary of the configuration in the textual format. std::string getConfigSummary(const uint32_t selection) const; /// @brief Returns configuration sequence number. /// /// @return The configuration sequence number. uint32_t getSequence() const { return (sequence_); } /// @brief Compares configuration sequence with other sequence. /// /// This method compares sequence numbers of two configurations for /// equality. The sequence numbers are meant to be unique, so if /// they are equal it means that they point to the same configuration. /// /// @param other Configuration which sequence number should be /// compared with the sequence number of this configuration. /// /// @return true if sequence numbers are equal. bool sequenceEquals(const SrvConfig& other); /// @brief Returns non-const pointer to interface configuration. /// /// This function returns a non-const pointer to the interface /// configuration. /// /// @return Object representing configuration of interfaces. CfgIfacePtr getCfgIface() { return (cfg_iface_); } /// @brief Returns const pointer to interface configuration. /// /// This function returns a const pointer to the interface /// configuration. /// /// @return Object representing configuration of interfaces. ConstCfgIfacePtr getCfgIface() const { return (cfg_iface_); } /// @brief Return pointer to non-const object representing user-defined /// option definitions. /// /// This function returns a pointer to the object which represents the /// user defined option definitions grouped by option space name. /// /// @return Pointer to an object holding option definitions. CfgOptionDefPtr getCfgOptionDef() { return (cfg_option_def_); } /// @brief Returns pointer to the const object representing user-defined /// option definitions. /// /// This function returns a pointer to the object which represents the /// user defined option definitions grouped by option space name. /// /// @return Pointer to an object holding option definitions. ConstCfgOptionDefPtr getCfgOptionDef() const { return (cfg_option_def_); } /// @brief Returns pointer to the non-const object holding options. /// /// This method returns a pointer to the object which holds instances /// of the options to be returned to the clients belonging to any subnet. /// /// @return Pointer to the object holding options. CfgOptionPtr getCfgOption() { return (cfg_option_); } /// @brief Returns pointer to the const object holding options. /// /// This method returns a pointer to the object which holds instances /// of the options to be returned to the clients belonging to any subnet. /// /// @return Pointer to the object holding options. const ConstCfgOptionPtr getCfgOption() const { return (cfg_option_); } /// @brief Returns pointer to non-const object holding subnets configuration /// for DHCPv4. /// /// @return Pointer to the object holding subnets configuration for DHCPv4. CfgSubnets4Ptr getCfgSubnets4() { return (cfg_subnets4_); } /// @brief Returns pointer to non-const object holding configuration of /// shared networks in DHCPv4; /// /// @return Pointer to the object holding shared networks configuration /// for DHCPv4. CfgSharedNetworks4Ptr getCfgSharedNetworks4() const { return (cfg_shared_networks4_); } /// @brief Returns pointer to non-const object holding configuration of /// shared networks in DHCPv6. /// /// @return Pointer to the object holding shared networks configuration /// for DHCPv6. CfgSharedNetworks6Ptr getCfgSharedNetworks6() const { return (cfg_shared_networks6_); } /// @brief Returns pointer to const object holding subnets configuration for /// DHCPv4. /// /// @return Pointer to the object holding subnets configuration for DHCPv4. ConstCfgSubnets4Ptr getCfgSubnets4() const { return (cfg_subnets4_); } /// @brief Returns pointer to non-const object holding subnets configuration /// for DHCPv6. /// /// @return Pointer to the object holding subnets configuration for DHCPv6. CfgSubnets6Ptr getCfgSubnets6() { return (cfg_subnets6_); } /// @brief Returns pointer to const object holding subnets configuration for /// DHCPv6. /// /// @return Pointer to the object holding subnets configuration for DHCPv6. ConstCfgSubnets6Ptr getCfgSubnets6() const { return (cfg_subnets6_); } /// @brief Returns pointer to the non-const objects representing host /// reservations for different IPv4 and IPv6 subnets. /// /// @return Pointer to the non-const object holding host reservations. CfgHostsPtr getCfgHosts() { return (cfg_hosts_); } /// @brief Returns pointer to the const objects representing host /// reservations for different IPv4 and IPv6 subnets. /// /// @return Pointer to the const object holding host reservations. ConstCfgHostsPtr getCfgHosts() const { return (cfg_hosts_); } /// @brief Returns pointer to the non-const object representing /// set of RSOO-enabled options. /// /// @return Pointer to the non-const object holding RSOO-enabled /// options. CfgRSOOPtr getCfgRSOO() { return (cfg_rsoo_); } /// @brief Returns pointer to the const object representing set /// of RSOO-enabled options. /// /// @return Pointer to the const object holding RSOO-enabled options. ConstCfgRSOOPtr getCfgRSOO() const { return (cfg_rsoo_); } /// @brief Returns pointer to the object holding configuration pertaining /// to processing expired leases. /// /// @return Pointer to the object holding configuration pertaining to /// processing expired leases. CfgExpirationPtr getCfgExpiration() { return (cfg_expiration_); } /// @brief Returns pointer to the const object holding configuration /// pertaining to processing expired leases. /// /// @return Pointer to the const object holding configuration pertaining to /// processing expired leases. ConstCfgExpirationPtr getCfgExpiration() const { return (cfg_expiration_); } /// @brief Returns pointer to the object holding configuration of the /// server identifier. /// /// @return Pointer to the object holding configuration of the server /// identifier. CfgDUIDPtr getCfgDUID() { return (cfg_duid_); } /// @brief Returns const pointer to the object holding configuration /// of the server identifier. /// /// @return Const pointer to the object holding configuration of the server /// identifier. ConstCfgDUIDPtr getCfgDUID() const { return (cfg_duid_); } /// @brief Returns pointer to the object holding configuration of the /// lease and host database connection parameters. /// /// @return Pointer to the object holding configuration of the lease and /// host database connection parameters. CfgDbAccessPtr getCfgDbAccess() { return (cfg_db_access_); } /// @brief Returns const pointer to the object holding configuration of /// the lease and host database connection parameters. /// /// @return Const pointer to the object holding configuration of the lease /// and host database connection parameters. ConstCfgDbAccessPtr getCfgDbAccess() const { return (cfg_db_access_); } /// @brief Returns pointer to the object holding general configuration /// for host reservations in DHCPv4. /// /// @return Pointer to the object holding general configuration for host /// reservations in DHCPv4. CfgHostOperationsPtr getCfgHostOperations4() { return (cfg_host_operations4_); } /// @brief Returns const pointer to the object holding general configuration /// for host reservations in DHCPv4. /// /// @return Const pointer to the object holding general configuration for /// host reservations in DHCPv4. ConstCfgHostOperationsPtr getCfgHostOperations4() const { return (cfg_host_operations4_); } /// @brief Returns pointer to the object holding general configuration /// for host reservations in DHCPv6. /// /// @return Pointer to the object holding general configuration for host /// reservations in DHCPv6. CfgHostOperationsPtr getCfgHostOperations6() { return (cfg_host_operations6_); } /// @brief Returns const pointer to the object holding general configuration /// for host reservations in DHCPv6. /// /// @return Const pointer to the object holding general configuration for /// host reservations in DHCPv6. ConstCfgHostOperationsPtr getCfgHostOperations6() const { return (cfg_host_operations6_); } /// @brief Returns non-const pointer to object holding sanity checks flags /// /// @return Pointer to object holding sanity checks flags CfgConsistencyPtr getConsistency() { return (cfg_consist_); } /// @brief Returns const pointer to object holding sanity checks flags /// /// @return Const pointer to object holding sanity checks flags ConstCfgConsistencyPtr getConsistency() const { return (cfg_consist_); } //@} /// @brief Returns non-const reference to an array that stores /// MAC/hardware address sources. /// /// @return non-const reference to MAC/hardware address sources CfgMACSource& getMACSources() { return (cfg_mac_source_); } /// @brief Returns const reference to an array that stores /// MAC/hardware address sources. /// /// @return const reference to MAC/hardware address sources const CfgMACSource& getMACSources() const { return (cfg_mac_source_); } /// @brief Returns information about control socket /// /// @return pointer to the Element that holds control-socket map const isc::data::ConstElementPtr getControlSocketInfo() const { return (control_socket_); } /// @brief Sets information about the control socket /// /// @param control_socket Element that holds control-socket map void setControlSocketInfo(const isc::data::ConstElementPtr& control_socket) { control_socket_ = control_socket; } /// @brief Returns DHCP queue control information /// /// @return pointer to the DHCP queue control information const isc::data::ConstElementPtr getDHCPQueueControl() const { return (dhcp_queue_control_); } /// @brief Sets information about the dhcp queue control /// /// @param dhcp_queue_control new dhcp queue control information void setDHCPQueueControl(const isc::data::ConstElementPtr dhcp_queue_control) { dhcp_queue_control_ = dhcp_queue_control; } /// @brief Returns DHCP multi threading information /// /// @return pointer to the DHCP multi threading information const isc::data::ConstElementPtr getDHCPMultiThreading() const { return (dhcp_multi_threading_); } /// @brief Sets information about the dhcp multi threading /// /// @param dhcp_multi_threading new dhcp multi threading information void setDHCPMultiThreading(const isc::data::ConstElementPtr dhcp_multi_threading) { dhcp_multi_threading_ = dhcp_multi_threading; } /// @brief Returns pointer to the dictionary of global client /// class definitions /// /// @return Pointer to the dictionary of global client class definitions ClientClassDictionaryPtr getClientClassDictionary() { return (class_dictionary_); } /// @brief Returns pointer to const dictionary of global client /// class definitions /// /// @return Pointer to const dictionary of global client class definitions const ClientClassDictionaryPtr getClientClassDictionary() const { return (class_dictionary_); } /// @brief Sets the client class dictionary /// /// @param dictionary pointer to the new class dictionary void setClientClassDictionary(const ClientClassDictionaryPtr& dictionary) { class_dictionary_ = dictionary; } /// @brief Returns non-const reference to configured hooks libraries. /// /// @return non-const reference to configured hooks libraries. isc::hooks::HooksConfig& getHooksConfig() { return (hooks_config_); } /// @brief Returns const reference to configured hooks libraries. /// /// @return const reference to configured hooks libraries. const isc::hooks::HooksConfig& getHooksConfig() const { return (hooks_config_); } /// @brief Fetches the DDNS parameters for a given DHCPv4 subnet. /// /// Creates a DdnsParams structure which retain and thereafter /// use the given subnet to fetch DDNS behavioral parameters. /// The values are fetched with the inheritance scope mode /// of Network::ALL. /// /// @param subnet DHCPv4 Subnet for which DDNS parameters are desired. /// @return pointer to DddnParams instance DdnsParamsPtr getDdnsParams(const Subnet4Ptr& subnet) const; /// @brief Fetches the DDNS parameters for a given DHCPv6 subnet. /// /// Creates a DdnsParams structure which retain and thereafter /// use the given subnet to fetch DDNS behavioral parameters. /// The values are fetched with the inheritance scope mode /// of Network::ALL. /// /// @param subnet DHCPv6 Subnet for which DDNS parameters are desired. /// @return pointer to DddnParams instance DdnsParamsPtr getDdnsParams(const Subnet6Ptr& subnet) const; /// @brief Copies the current configuration to a new configuration. /// /// This method copies the parameters stored in the configuration to /// an object passed as parameter. The configuration sequence is not /// copied. /// /// @warning Some of the configuration objects are not copied at /// this point, e.g. subnets. This is because they contain quite complex /// data structures and they make use of pointers, so in many cases /// the default copy constructors can't be used. Implementing this /// requires quite a lot of time so this is left as is for now. /// The lack of ability to copy the entire configuration makes /// revert function of the @c CfgMgr unusable. /// /// @param [out] new_config An object to which the configuration will /// be copied. void copy(SrvConfig& new_config) const; /// @name Methods and operators used to compare configurations. /// //@{ /// /// @brief Compares two objects for equality. /// /// It ignores the configuration sequence number when checking for /// equality of objects. /// /// @param other An object to be compared with this object. /// /// @return true if two objects are equal, false otherwise. bool equals(const SrvConfig& other) const; /// @brief Compares two objects for inequality. /// /// It ignores the configuration sequence number when checking for /// inequality of objects. /// /// @param other An object to be compared with this object. /// /// @return true if two objects are not equal, false otherwise. bool nequals(const SrvConfig& other) const { return (!equals(other)); } /// @brief Equality operator. /// /// It ignores the configuration sequence number when checking for /// equality of objects. /// /// @param other An object to be compared with this object. /// /// @return true if two objects are equal, false otherwise. bool operator==(const SrvConfig& other) const { return (equals(other)); } /// @brief other An object to be compared with this object. /// /// It ignores the configuration sequence number when checking for /// inequality of objects. /// /// @param other An object to be compared with this object. /// /// @return true if two objects are not equal, false otherwise. bool operator!=(const SrvConfig& other) const { return (nequals(other)); } //@} /// @brief Merges the configuration specified as a parameter into /// this configuration. /// /// This method is used when two or more configurations held in the /// @c SrvConfig objects need to be combined into a single configuration. /// Specifically, when the configuration backend is used, then part of /// the server configuration comes from the configuration file and /// stored in the staging configuration. The other part of the /// configuration comes from the database. The configuration fetched /// from the database is stored in a separate @c SrvConfig instance /// and then merged into the staging configuration prior to committing /// it. /// /// The merging strategy depends on the underlying data being merged. /// For example: subnets are merged using the algorithm implemented /// in the @c CfgSubnets4. Other data structures are merged using the /// algorithms implemented in their respective configuration /// containers. /// /// The general rule is that the configuration data from the @c other /// object replaces configuration data held in this object instance. /// The data that do not overlap between the two objects is simply /// inserted into this configuration. /// /// Due to the nature of the client classes, i.e. they are ordered and /// depend on each other, individual classes are not merged. Instead, /// the new list of classes entirely replaces the existing list. It /// implies that client classes should not be defined in a config /// file if there are classes defined in the config backend for this /// server. /// /// @warning The call to @c merge may modify the data in the @c other /// object. Therefore, the caller must not rely on the data held /// in the @c other object after the call to @c merge. Also, the /// data held in @c other must not be modified after the call to /// @c merge because it may affect the merged configuration. /// /// The @c other parameter must be a @c SrvConfig or its derivation. /// /// This method calls either @c merge4 or @c merge6 based on /// /// Currently, the following parts of the configuration are merged: /// - globals /// - option definitions /// - options /// - client classes /// - via @c merge4 or @c merge6 depending on @c CfgMgr::family_: /// - shared networks /// - subnets /// /// @todo Add support for merging other configuration elements. /// /// @param other An object holding the configuration to be merged /// into this configuration. virtual void merge(ConfigBase& other); /// @brief Updates statistics. /// /// This method calls appropriate methods in child objects that update /// related statistics. See @ref CfgSubnets4::updateStatistics and /// @ref CfgSubnets6::updateStatistics for details. void updateStatistics(); /// @brief Removes statistics. /// /// This method calls appropriate methods in child objects that remove /// related statistics. See @ref CfgSubnets4::removeStatistics and /// @ref CfgSubnets6::removeStatistics for details. void removeStatistics(); /// @brief Sets decline probation-period /// /// Probation-period is the timer, expressed, in seconds, that specifies how /// long a lease is unavailable after reported as declined. /// /// @param decline_timer number of seconds after declined lease is restored void setDeclinePeriod(const uint32_t decline_timer) { decline_timer_ = decline_timer; } /// @brief Returns probation-period /// /// See @ref setDeclinePeriod for brief discussion. /// /// @return value of probation-period, expressed in seconds uint32_t getDeclinePeriod() const { return (decline_timer_); } /// @brief Sets whether server should send back client-id in DHCPv4 /// /// This is a compatibility flag. The default (true) is compliant with /// RFC6842. False is for backward compatibility. /// /// @param echo should the client-id be sent or not void setEchoClientId(const bool echo) { echo_v4_client_id_ = echo; } /// @brief Returns whether server should send back client-id in DHCPv4. /// /// @return true if client-id should be returned, false otherwise. bool getEchoClientId() const { return (echo_v4_client_id_); } /// @brief Sets DHCP4o6 IPC port /// /// DHCPv4-over-DHCPv6 uses a UDP socket for inter-server communication, /// this socket is bound and connected to this port and port + 1 /// /// @param port port and port + 1 to use void setDhcp4o6Port(uint16_t port) { dhcp4o6_port_ = port; } /// @brief Returns DHCP4o6 IPC port /// /// See @ref setDhcp4o6Port for brief discussion. /// /// @return value of DHCP4o6 IPC port uint16_t getDhcp4o6Port() const { return (dhcp4o6_port_); } /// @brief Returns pointer to the D2 client configuration /// /// @return Pointer to the D2 client configuration D2ClientConfigPtr getD2ClientConfig() { return (d2_client_config_); } /// @brief Returns pointer to const D2 client configuration /// /// @return Pointer to const D2 client configuration const D2ClientConfigPtr getD2ClientConfig() const { return (d2_client_config_); } /// @brief Sets the D2 client configuration /// /// @param d2_client_config pointer to the new D2 client configuration void setD2ClientConfig(const D2ClientConfigPtr& d2_client_config) { d2_client_config_ = d2_client_config; } /// @brief Returns non-const pointer to configured global parameters. /// /// This function returns a non-const pointer to the configured /// global parameters. /// /// @return Object representing configured global parameters. CfgGlobalsPtr getConfiguredGlobals() { return (configured_globals_); } /// @brief Returns const pointer to configured global parameters. /// /// This function returns a const pointer to the configured /// global parameters. /// /// @return Object representing configured global parameters. ConstCfgGlobalsPtr getConfiguredGlobals() const { return (configured_globals_); } /// @brief Returns pointer to a given configured global parameter /// /// @param name Name of the parameter to fetch. /// @return Pointer to the parameter if it exists, otherwise an /// empty pointer. isc::data::ConstElementPtr getConfiguredGlobal(std::string name) const { return (configured_globals_->get(name)); } /// @brief Returns pointer to a given configured global parameter /// /// @param index Index of the parameter to fetch. /// @return Pointer to the parameter if it exists, otherwise an /// empty pointer. isc::data::ConstElementPtr getConfiguredGlobal(int index) const { return (configured_globals_->get(index)); } /// @brief Removes all configured global parameters. /// /// @note This removes the default values too so either /// @c applyDefaultsConfiguredGlobals and @c mergeGlobals, /// or @c isc::data::SimpleParser::setDefaults and /// @c extractConfiguredGlobals should be called after. void clearConfiguredGlobals() { configured_globals_->clear(); lenient_option_parsing_ = false; ignore_dhcp_server_identifier_ = false; ignore_rai_link_selection_ = false; exclude_first_last_24_ = false; control_socket_.reset(); d2_client_config_.reset(new D2ClientConfig()); cfg_expiration_.reset(new CfgExpiration()); dhcp_multi_threading_.reset(); cfg_consist_.reset(new CfgConsistency()); cfg_duid_.reset(new CfgDUID()); dhcp_queue_control_.reset(); } /// @brief Applies defaults to global parameters. /// /// @param defaults vector of (name, type, value) defaults to apply. void applyDefaultsConfiguredGlobals(const isc::data::SimpleDefaults& defaults); /// @brief Saves scalar elements from the global scope of a configuration. void extractConfiguredGlobals(isc::data::ConstElementPtr config); /// @brief Adds a parameter to the collection configured globals /// /// @param name std::string name of the global to add. /// @param value ElementPtr containing the value of the global. void addConfiguredGlobal(const std::string& name, isc::data::ConstElementPtr value) { configured_globals_->set(name, value); } /// @brief Conducts sanity checks on global lifetime parameters. /// /// @param name Base name of the lifetime parameter. void sanityChecksLifetime(const std::string& name) const; /// @brief Conducts sanity checks on global lifetime parameters /// before merge from the external configuration to the target one. /// /// @param target_config Target configuration. /// @param name Base name of the lifetime parameter. void sanityChecksLifetime(const SrvConfig& target_config, const std::string& name) const; /// @brief Moves deprecated parameters from dhcp-ddns element to global element /// /// Given a server configuration element map, the following parameters are moved /// from dhcp-ddns to top-level (i.e. global) element if they do not already /// exist there: /// /// @code /// From dhcp-ddns: To (global): /// ------------------------------------------------------ /// override-no-update ddns-override-no-update /// override-client-update ddns-override-client-update /// replace-client-name ddns-replace-client-name /// generated-prefix ddns-generated-prefix /// qualifying-suffix ddns-qualifying-suffix /// hostname-char-set hostname-char-set /// hostname-char-replacement hostname-char-replacement /// @endcode /// /// Note that the whether or not the deprecated parameters are added /// to the global element, they are always removed from the dhcp-ddns /// element. /// /// @param srv_elem server top level map to alter static void moveDdnsParams(isc::data::ElementPtr srv_elem); /// @brief Configures the server to allow or disallow specifying multiple /// hosts with the same IP address/subnet. /// /// This setting is applied in @c CfgDbAccess and @c CfgHosts. This function /// should be called when the server is being configured using the configuration /// file, config-set command or via the configuration backend. /// /// @param unique Boolean value indicating if it is allowed (when false) /// or disallowed to specify multiple hosts with the same IP reservation. void setIPReservationsUnique(const bool unique); /// @brief Sets whether the server does host reservations lookup before lease /// lookup. /// /// @param first Boolean value indicating if host reservations lookup should /// be performed before lease lookup. void setReservationsLookupFirst(const bool first) { reservations_lookup_first_ = first; } /// @brief Returns whether the server does host reservations lookup before /// lease lookup. /// /// @return Boolean value indicating if host reservations lookup should be /// performed before lease lookup. bool getReservationsLookupFirst() const { return (reservations_lookup_first_); } /// @brief Unparse a configuration object /// /// @return a pointer to unparsed configuration virtual isc::data::ElementPtr toElement() const; /// @brief Set lenient option parsing compatibility flag. /// /// @param value the boolean value to be set when configuring lenient option /// parsing void setLenientOptionParsing(bool const value) { lenient_option_parsing_ = value; } /// @brief Get lenient option parsing compatibility flag. /// /// @return the configured value for lenient option parsing bool getLenientOptionParsing() const { return lenient_option_parsing_; } /// @brief Set ignore DHCP Server Identifier compatibility flag. /// /// @param value the boolean value to be set when configuring DHCP /// Server Identifier usage preferences. void setIgnoreServerIdentifier(bool const value) { ignore_dhcp_server_identifier_ = value; } /// @brief Get ignore DHCP Server Identifier compatibility flag. /// /// @return the configured value for DHCP Server Identifier usage preferences. bool getIgnoreServerIdentifier() const { return (ignore_dhcp_server_identifier_); } /// @brief Set ignore RAI Link Selection compatibility flag. /// /// @param value the boolean value to be set when configuring RAI Link /// Selection usage preferences void setIgnoreRAILinkSelection(bool const value) { ignore_rai_link_selection_ = value; } /// @brief Get ignore RAI Link Selection compatibility flag. /// /// @return the configured value for RAI Link Selection usage preferences bool getIgnoreRAILinkSelection() const { return ignore_rai_link_selection_; } /// @brief Set exclude .0 and .255 addresses in subnets bigger than /24 flag. /// /// @param value the boolean value to be set when excluding .0 .255 from /// subnets bigger than /24. void setExcludeFirstLast24(bool const value) { exclude_first_last_24_ = value; } /// @brief Get exclude .0 and .255 addresses in subnets bigger than /24 flag. /// /// @return the configured value for exclude .0 and .255 flag. bool getExcludeFirstLast24() const { return exclude_first_last_24_; } /// @brief Convenience method to propagate configuration parameters through /// inversion of control. /// /// To be used as a last resort when CfgMgr::instance().getCurrentCfg() /// can't be easily called from where the configuration parameter is used, /// usually because that particular library is lower in the dependency tree. /// Happens on configuration commit. void configureLowerLevelLibraries() const; private: /// @brief Merges the DHCPv4 configuration specified as a parameter into /// this configuration. /// /// This is called by @c merge() to handle v4 specifics, such as /// networks and subnets. /// /// @param other An object holding the configuration to be merged /// into this configuration. void merge4(SrvConfig& other); /// @brief Merges the DHCPv6 configuration specified as a parameter into /// this configuration. /// /// This is called by @c merge() to handle v4 specifics, such as /// networks and subnets. /// /// @param other An object holding the configuration to be merged /// into this configuration. void merge6(SrvConfig& other); /// @brief Merges the globals specified in the given configuration /// into this configuration. /// /// Configurable global values may be specified either via JSON /// configuration (e.g. "echo-client-id":true) or as global parameters /// within a configuration back end. Regardless of the source, these /// values once provided, are stored in @c SrvConfig::configured_globals_. /// Any such value that does not have an explicit specification should be /// considered "unspecified" at the global scope. /// /// This function adds the configured globals from the "other" config /// into this config's configured globals. If a value already exists /// in this config, it will be overwritten with the value from the /// "other" config. /// /// It then iterates over this merged list of globals, setting /// any of the corresponding SrvConfig members that map to a /// a configurable parameter (e.g. c@ SrvConfig::echo_client_id_, /// @c SrvConfig::server_tag_). /// /// @param other An object holding the configuration to be merged /// into this configuration. void mergeGlobals(SrvConfig& other); /// @brief Merges the global maps specified in the given configuration /// into this configuration. /// /// Configurable global values may be specified either via JSON /// configuration (e.g. "echo-client-id":true) or as global parameters /// within a configuration back end. Regardless of the source, these /// values once provided, are stored in @c SrvConfig::configured_globals_. /// Any such value that does not have an explicit specification should be /// considered "unspecified" at the global scope. /// /// This function adds the configured globals from the "other" config /// into this config's configured globals. If a value already exists /// in this config, it will be overwritten with the value from the /// "other" config. /// /// It then iterates over this merged list of globals, setting /// any of the corresponding SrvConfig members that map to a /// a configurable parameter (e.g. c@ SrvConfig::echo_client_id_, /// @c SrvConfig::server_tag_). /// /// @param other An object holding the configuration to be merged /// into this configuration. void mergeGlobalMaps(SrvConfig& other); /// @brief Sequence number identifying the configuration. uint32_t sequence_; /// @brief Interface configuration. /// /// Used to select interfaces on which the DHCP server will listen to /// queries. CfgIfacePtr cfg_iface_; /// @brief Pointer to option definitions configuration. /// /// This object holds the user-defined option definitions grouped /// by option space name. CfgOptionDefPtr cfg_option_def_; /// @brief Pointer to options (data) configuration. /// /// This object holds the instances of the options to be sent to clients /// connected to any subnet. CfgOptionPtr cfg_option_; /// @brief Pointer to subnets configuration for IPv4. CfgSubnets4Ptr cfg_subnets4_; /// @brief Pointer to subnets configuration for IPv6. CfgSubnets6Ptr cfg_subnets6_; /// @brief Pointer to IPv4 shared networks configuration. CfgSharedNetworks4Ptr cfg_shared_networks4_; /// @brief Pointer to IPv4 shared networks configuration. CfgSharedNetworks6Ptr cfg_shared_networks6_; /// @brief Pointer to the configuration for hosts reservation. /// /// This object holds a list of @c Host objects representing host /// reservations for different IPv4 and IPv6 subnets. CfgHostsPtr cfg_hosts_; /// @brief A list of configured MAC sources. CfgMACSource cfg_mac_source_; /// @brief Pointer to the configuration for RSOO-enabled options. /// /// This object holds a set of RSOO-enabled options. See /// RFC 6422 for the definition of the RSOO-enabled option. CfgRSOOPtr cfg_rsoo_; /// @brief Pointer to the configuration pertaining to processing of /// expired leases. CfgExpirationPtr cfg_expiration_; /// @brief Pointer to the configuration of the server identifier. CfgDUIDPtr cfg_duid_; /// @brief Pointer to the configuration of the lease and host database /// connection parameters. CfgDbAccessPtr cfg_db_access_; /// @brief Pointer to the general configuration for host reservations in /// DHCPv4. CfgHostOperationsPtr cfg_host_operations4_; /// @brief Pointer to the general configuration for host reservations in /// DHCPv6. CfgHostOperationsPtr cfg_host_operations6_; /// @brief Pointer to the control-socket information isc::data::ConstElementPtr control_socket_; /// @brief Pointer to the dhcp-queue-control information isc::data::ConstElementPtr dhcp_queue_control_; /// @brief Pointer to the multi-threading information isc::data::ConstElementPtr dhcp_multi_threading_; /// @brief Pointer to the dictionary of global client class definitions ClientClassDictionaryPtr class_dictionary_; /// @brief Configured hooks libraries. isc::hooks::HooksConfig hooks_config_; /// @brief Decline Period time /// /// This timer specifies decline probation period, the time after a declined /// lease is recovered back to available state. Expressed in seconds. uint32_t decline_timer_; /// @brief Indicates whether v4 server should send back client-id bool echo_v4_client_id_; /// @brief DHCP4o6 IPC port /// /// DHCPv4-over-DHCPv6 uses a UDP socket for interserver communication, /// this socket is bound and connected to this port and port + 1 uint16_t dhcp4o6_port_; /// @brief Stores D2 client configuration D2ClientConfigPtr d2_client_config_; /// @brief Stores the global parameters specified via configuration CfgGlobalsPtr configured_globals_; /// @brief Pointer to the configuration consistency settings CfgConsistencyPtr cfg_consist_; /// @name Compatibility flags /// //@{ /// @brief Indicates whether lenient option parsing is enabled bool lenient_option_parsing_; /// @brief Indicates whether DHCP server identifier option will be ignored bool ignore_dhcp_server_identifier_; /// @brief Indicates whether RAI link-selection suboptions will be ignored bool ignore_rai_link_selection_; /// @brief Indicates whether exclude .0 .255 from subnets bigger than /24. bool exclude_first_last_24_; //@} /// @brief Flag which indicates if the server should do host reservations /// lookup before lease lookup. This parameter has effect only when /// multi-threading is disabled. If multi-threading is enabled, host /// reservations lookup is always performed first. /// It default to false when multi-threading is disabled. bool reservations_lookup_first_; }; /// @name Pointers to the @c SrvConfig object. /// //@{ /// @brief Non-const pointer to the @c SrvConfig. typedef boost::shared_ptr SrvConfigPtr; /// @brief Const pointer to the @c SrvConfig. typedef boost::shared_ptr ConstSrvConfigPtr; //@} } // namespace dhcp } // namespace isc #endif // DHCPSRV_CONFIG_H