25 int hook_index_cb4_updated_;
29 hook_index_cb4_updated_ = HooksManager::registerHook(
"cb4_updated");
47 const boost::posix_time::ptime& lb_modification_time,
50 bool globals_fetched =
false;
59 if (!audit_entries.empty()) {
61 auto cfg = CfgMgr::instance().getCurrentCfg();
62 auto external_cfg = CfgMgr::instance().createExternalCfg();
66 auto range = index.equal_range(boost::make_tuple(
"dhcp4_global_parameter",
68 if (range.first != range.second) {
76 globals = getMgr().getPool()->getAllGlobalParameters4(backend_selector, server_selector);
77 addGlobalsToConfig(external_cfg, globals);
80 external_cfg->applyDefaultsConfiguredGlobals(SimpleParser4::GLOBAL4_DEFAULTS);
83 external_cfg->sanityChecksLifetime(
"valid-lifetime");
87 cfg->clearConfiguredGlobals();
88 CfgMgr::instance().mergeIntoCurrentCfg(external_cfg->getSequence());
89 globals_fetched =
true;
96 range = index.equal_range(boost::make_tuple(
"dhcp4_option_def",
98 for (
auto entry = range.first; entry != range.second; ++entry) {
99 cfg->getCfgOptionDef()->del((*entry)->getObjectId());
104 range = index.equal_range(boost::make_tuple(
"dhcp4_options",
106 for (
auto entry = range.first; entry != range.second; ++entry) {
107 cfg->getCfgOption()->del((*entry)->getObjectId());
110 range = index.equal_range(boost::make_tuple(
"dhcp4_shared_network",
112 for (
auto entry = range.first; entry != range.second; ++entry) {
113 cfg->getCfgSharedNetworks4()->del((*entry)->getObjectId());
116 range = index.equal_range(boost::make_tuple(
"dhcp4_subnet",
118 for (
auto entry = range.first; entry != range.second; ++entry) {
122 auto subnet = cfg->getCfgSubnets4()->getBySubnetId((*entry)->getObjectId());
126 subnet->getSharedNetwork(network);
129 network->del(subnet->getID());
132 cfg->getCfgSubnets4()->del((*entry)->getObjectId());
145 SrvConfigPtr external_cfg = CfgMgr::instance().createExternalCfg();
149 if (!globals_fetched && !audit_entries.empty()) {
150 updated_entries = fetchConfigElement(audit_entries,
"dhcp4_global_parameter");
152 if (!globals_fetched && (audit_entries.empty() || !updated_entries.empty())) {
154 globals = getMgr().getPool()->getModifiedGlobalParameters4(backend_selector, server_selector,
155 lb_modification_time);
156 addGlobalsToConfig(external_cfg, globals);
157 globals_fetched =
true;
161 if (!audit_entries.empty()) {
162 updated_entries = fetchConfigElement(audit_entries,
"dhcp4_option_def");
164 if (audit_entries.empty() || !updated_entries.empty()) {
166 getMgr().getPool()->getModifiedOptionDefs4(backend_selector, server_selector,
167 lb_modification_time);
168 for (
auto option_def = option_defs.begin(); option_def != option_defs.end(); ++option_def) {
169 if (!audit_entries.empty() && !
hasObjectId(updated_entries, (*option_def)->getId())) {
172 external_cfg->getCfgOptionDef()->add(*option_def);
177 if (!audit_entries.empty()) {
178 updated_entries = fetchConfigElement(audit_entries,
"dhcp4_options");
180 if (audit_entries.empty() || !updated_entries.empty()) {
181 OptionContainer options = getMgr().getPool()->getModifiedOptions4(backend_selector,
183 lb_modification_time);
184 for (
auto option = options.begin(); option != options.end(); ++option) {
185 if (!audit_entries.empty() && !
hasObjectId(updated_entries, (*option).getId())) {
188 external_cfg->getCfgOption()->add((*option), (*option).space_name_);
193 if (!audit_entries.empty()) {
194 updated_entries = fetchConfigElement(audit_entries,
"dhcp4_shared_network");
196 if (audit_entries.empty() || !updated_entries.empty()) {
198 getMgr().getPool()->getModifiedSharedNetworks4(backend_selector, server_selector,
199 lb_modification_time);
200 for (
auto network = networks.begin(); network != networks.end(); ++network) {
201 if (!audit_entries.empty() && !
hasObjectId(updated_entries, (*network)->getId())) {
208 return (CfgMgr::instance().getCurrentCfg()->getConfiguredGlobals());
210 external_cfg->getCfgSharedNetworks4()->add((*network));
215 if (!audit_entries.empty()) {
216 updated_entries = fetchConfigElement(audit_entries,
"dhcp4_subnet");
218 if (audit_entries.empty() || !updated_entries.empty()) {
219 Subnet4Collection subnets = getMgr().getPool()->getModifiedSubnets4(backend_selector,
221 lb_modification_time);
222 for (
auto subnet = subnets.begin(); subnet != subnets.end(); ++subnet) {
223 if (!audit_entries.empty() && !
hasObjectId(updated_entries, (*subnet)->getID())) {
230 return (CfgMgr::instance().getCurrentCfg()->getConfiguredGlobals());
232 external_cfg->getCfgSubnets4()->add((*subnet));
236 if (audit_entries.empty()) {
240 auto const& cfg = CfgMgr::instance().getStagingCfg();
241 external_cfg->sanityChecksLifetime(*cfg,
"valid-lifetime");
242 CfgMgr::instance().mergeIntoStagingCfg(external_cfg->getSequence());
244 if (globals_fetched) {
247 bool ip_unique =
true;
248 auto ip_unique_param = external_cfg->getConfiguredGlobal(
"ip-reservations-unique");
249 if (ip_unique_param && (ip_unique_param->getType() == Element::boolean)) {
250 ip_unique = ip_unique_param->boolValue();
254 if (!HostMgr::instance().setIPReservationsUnique(ip_unique)) {
258 external_cfg->addConfiguredGlobal(
"ip-reservations-unique", Element::create(
true));
261 auto const& cfg = CfgMgr::instance().getCurrentCfg();
262 external_cfg->sanityChecksLifetime(*cfg,
"valid-lifetime");
263 CfgMgr::instance().mergeIntoCurrentCfg(external_cfg->getSequence());
267 if (!audit_entries.empty() &&
268 HooksManager::calloutsPresent(hooks_.hook_index_cb4_updated_)) {
279 callout_handle->setArgument(
"audit_entries", ptr);
282 HooksManager::callCallouts(hooks_.hook_index_cb4_updated_, *callout_handle);
const isc::log::MessageID DHCPSRV_CFGMGR_CONFIG4_MERGED
#define LOG_WARN(LOGGER, MESSAGE)
Macro to conveniently test warn output and log it.
#define LOG_INFO(LOGGER, MESSAGE)
Macro to conveniently test info output and log it.
bool hasObjectId(const db::AuditEntryCollection &audit_entries, const uint64_t &object_id)
Checks if an object is in a collection od audit entries.
boost::shared_ptr< AuditEntryCollection > AuditEntryCollectionPtr
boost::shared_ptr< SrvConfig > SrvConfigPtr
Non-const pointer to the SrvConfig.
boost::multi_index_container< OptionDefinitionPtr, boost::multi_index::indexed_by< boost::multi_index::sequenced<>, boost::multi_index::hashed_non_unique< boost::multi_index::const_mem_fun< OptionDefinition, uint16_t,&OptionDefinition::getCode > >, boost::multi_index::hashed_non_unique< boost::multi_index::const_mem_fun< OptionDefinition, std::string,&OptionDefinition::getName > >, boost::multi_index::ordered_non_unique< boost::multi_index::const_mem_fun< data::BaseStampedElement, boost::posix_time::ptime,&data::StampedElement::getModificationTime > >, boost::multi_index::hashed_non_unique< boost::multi_index::tag< OptionIdIndexTag >, boost::multi_index::const_mem_fun< data::BaseStampedElement, uint64_t,&data::BaseStampedElement::getId > > >> OptionDefContainer
Multi index container for DHCP option definitions.
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 > >, boost::multi_index::ordered_non_unique< boost::multi_index::tag< SubnetServerIdIndexTag >, boost::multi_index::const_mem_fun< Network4, asiolink::IOAddress,&Network4::getServerId > >, boost::multi_index::ordered_non_unique< boost::multi_index::tag< SubnetModificationTimeIndexTag >, boost::multi_index::const_mem_fun< data::BaseStampedElement, boost::posix_time::ptime,&data::BaseStampedElement::getModificationTime > > >> Subnet4Collection
A collection of Subnet4 objects.
Wrapper class around callout handle which automatically resets handle's state.
boost::shared_ptr< const Element > ConstElementPtr
Server selector for associating objects in a database with specific servers.
boost::shared_ptr< SharedNetwork4 > SharedNetwork4Ptr
Pointer to SharedNetwork4 object.
Defines the logger used by the top-level component of kea-dhcp-ddns.
boost::multi_index_container< StampedValuePtr, boost::multi_index::indexed_by< boost::multi_index::hashed_non_unique< boost::multi_index::tag< StampedValueNameIndexTag >, boost::multi_index::const_mem_fun< StampedValue, std::string,&StampedValue::getName > >, boost::multi_index::ordered_non_unique< boost::multi_index::tag< StampedValueModificationTimeIndexTag >, boost::multi_index::const_mem_fun< BaseStampedElement, boost::posix_time::ptime,&BaseStampedElement::getModificationTime > > >> StampedValueCollection
Multi index container for StampedValue.
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< CalloutHandle > CalloutHandlePtr
A shared pointer to a CalloutHandle object.
boost::multi_index_container< OptionDescriptor, boost::multi_index::indexed_by< boost::multi_index::sequenced<>, boost::multi_index::hashed_non_unique< KeyFromKeyExtractor< boost::multi_index::const_mem_fun< Option, uint16_t,&Option::getType >, boost::multi_index::member< OptionDescriptor, OptionPtr,&OptionDescriptor::option_ > > >, boost::multi_index::hashed_non_unique< boost::multi_index::member< OptionDescriptor, bool,&OptionDescriptor::persistent_ > >, boost::multi_index::ordered_non_unique< boost::multi_index::const_mem_fun< data::BaseStampedElement, boost::posix_time::ptime,&data::BaseStampedElement::getModificationTime > >, boost::multi_index::hashed_non_unique< boost::multi_index::tag< OptionIdIndexTag >, boost::multi_index::const_mem_fun< data::BaseStampedElement, uint64_t,&data::BaseStampedElement::getId > > >> OptionContainer
Multi index container for DHCP option descriptors.
const isc::log::MessageID DHCPSRV_CFGMGR_IPV4_RESERVATIONS_NON_UNIQUE_IGNORED
isc::log::Logger dhcpsrv_logger("dhcpsrv")
DHCP server library Logger.
boost::multi_index_container< AuditEntryPtr, boost::multi_index::indexed_by< boost::multi_index::ordered_non_unique< boost::multi_index::tag< AuditEntryObjectTypeTag >, boost::multi_index::composite_key< AuditEntry, boost::multi_index::const_mem_fun< AuditEntry, std::string,&AuditEntry::getObjectType >, boost::multi_index::const_mem_fun< AuditEntry, AuditEntry::ModificationType,&AuditEntry::getModificationType > > >, boost::multi_index::ordered_non_unique< boost::multi_index::tag< AuditEntryModificationTimeIdTag >, boost::multi_index::composite_key< AuditEntry, boost::multi_index::const_mem_fun< AuditEntry, boost::posix_time::ptime,&AuditEntry::getModificationTime >, boost::multi_index::const_mem_fun< AuditEntry, uint64_t,&AuditEntry::getRevisionId > > >, boost::multi_index::hashed_non_unique< boost::multi_index::tag< AuditEntryObjectIdTag >, boost::multi_index::const_mem_fun< AuditEntry, uint64_t,&AuditEntry::getObjectId > > >> AuditEntryCollection
Multi index container holding AuditEntry instances.
Tag used to access index by object type.