15#include <boost/foreach.hpp> 
   26    int hook_index_cb6_updated_; 
 
   48                                     const boost::posix_time::ptime& lb_modification_time,
 
   50    bool globals_fetched = 
false;
 
   51    auto reconfig = audit_entries.empty();
 
   52    auto cb_update = !reconfig;
 
   69        auto range = index.equal_range(boost::make_tuple(
"dhcp6_global_parameter",
 
   71        if (range.first != range.second) {
 
   79            globals = 
getMgr().getPool()->getAllGlobalParameters6(backend_selector, server_selector);
 
   86            external_cfg->sanityChecksLifetime(
"preferred-lifetime");
 
   87            external_cfg->sanityChecksLifetime(
"valid-lifetime");
 
   88            external_cfg->sanityChecksDdnsTtlParameters();
 
   92            current_cfg->clearConfiguredGlobals();
 
   94            globals_fetched = 
true;
 
  101            range = index.equal_range(boost::make_tuple(
"dhcp6_option_def",
 
  103            BOOST_FOREACH(
auto const& entry, range) {
 
  104                current_cfg->getCfgOptionDef()->del(entry->getObjectId());
 
  109            range = index.equal_range(boost::make_tuple(
"dhcp6_options",
 
  111            BOOST_FOREACH(
auto const& entry, range) {
 
  112                current_cfg->getCfgOption()->del(entry->getObjectId());
 
  115            range = index.equal_range(boost::make_tuple(
"dhcp6_client_class",
 
  117            BOOST_FOREACH(
auto const& entry, range) {
 
  118                current_cfg->getClientClassDictionary()->removeClass(entry->getObjectId());
 
  121            range = index.equal_range(boost::make_tuple(
"dhcp6_shared_network",
 
  123            BOOST_FOREACH(
auto const& entry, range) {
 
  124                current_cfg->getCfgSharedNetworks6()->del(entry->getObjectId());
 
  127            range = index.equal_range(boost::make_tuple(
"dhcp6_subnet",
 
  129            BOOST_FOREACH(
auto const& entry, range) {
 
  133                auto subnet = current_cfg->getCfgSubnets6()->getBySubnetId(entry->getObjectId());
 
  137                    subnet->getSharedNetwork(network);
 
  140                        network->del(subnet->getID());
 
  143                    current_cfg->getCfgSubnets6()->del(entry->getObjectId());
 
  160    if (!globals_fetched) {
 
  164        if (reconfig || !updated_entries.empty()) {
 
  166            globals = 
getMgr().getPool()->getModifiedGlobalParameters6(backend_selector, server_selector,
 
  167                                                                       lb_modification_time);
 
  169            globals_fetched = 
true;
 
  177    if (reconfig || !updated_entries.empty()) {
 
  179            getMgr().getPool()->getModifiedOptionDefs6(backend_selector, server_selector,
 
  180                                                       lb_modification_time);
 
  181        for (
auto const& option_def : option_defs) {
 
  182            if (!audit_entries.empty() && !
hasObjectId(updated_entries, option_def->getId())) {
 
  185            external_cfg->getCfgOptionDef()->add(option_def);
 
  193    if (reconfig || !updated_entries.empty()) {
 
  196                                                                          lb_modification_time);
 
  197        for (
auto const& option : options) {
 
  198            if (!audit_entries.empty() && !
hasObjectId(updated_entries, option.getId())) {
 
  201            external_cfg->getCfgOption()->add(option, option.space_name_);
 
  209    if (reconfig || !updated_entries.empty()) {
 
  217        client_classes.
createOptions(external_cfg->getCfgOptionDef());
 
  220        external_cfg->setClientClassDictionary(boost::make_shared<ClientClassDictionary>(client_classes));
 
  226    std::string global_allocator;
 
  229        global_allocator = allocator->stringValue();
 
  233    std::string global_pd_allocator;
 
  236        global_pd_allocator = allocator->stringValue();
 
  242    auto allocator_changed = 
false;
 
  248            allocator_changed = (global_allocator != allocator->stringValue());
 
  253        if (!allocator_changed) {
 
  256                allocator_changed = (global_pd_allocator != allocator->stringValue());
 
  266    if (allocator_changed || reconfig) {
 
  269        networks = 
getMgr().getPool()->getAllSharedNetworks6(backend_selector, server_selector);
 
  270    } 
else if (!updated_entries.empty()) {
 
  271        networks = 
getMgr().getPool()->getModifiedSharedNetworks6(backend_selector, server_selector,
 
  272                                                                  lb_modification_time);
 
  274    for (
auto const& network : networks) {
 
  275        if (!allocator_changed && cb_update && !
hasObjectId(updated_entries, network->getId())) {
 
  284        network->setDefaultAllocatorType(global_allocator);
 
  285        network->setDefaultPdAllocatorType(global_pd_allocator);
 
  286        external_cfg->getCfgSharedNetworks6()->add(network);
 
  294    if (allocator_changed || reconfig) {
 
  297        subnets = 
getMgr().getPool()->getAllSubnets6(backend_selector, server_selector);
 
  299    } 
else if (!updated_entries.empty()) {
 
  302        subnets = 
getMgr().getPool()->getModifiedSubnets6(backend_selector,
 
  304                                                          lb_modification_time);
 
  307    for (
auto const& subnet : subnets) {
 
  308        if (!audit_entries.empty() && !
hasObjectId(updated_entries, subnet->getID())) {
 
  317        subnet->setDefaultAllocatorType(global_allocator);
 
  318        subnet->setDefaultPdAllocatorType(global_pd_allocator);
 
  319        external_cfg->getCfgSubnets6()->add(subnet);
 
  327        external_cfg->sanityChecksLifetime(*cfg, 
"preferred-lifetime");
 
  328        external_cfg->sanityChecksLifetime(*cfg, 
"valid-lifetime");
 
  329        external_cfg->sanityChecksDdnsTtlParameters();
 
  333        if (globals_fetched) {
 
  336            bool ip_unique = 
true;
 
  337            auto ip_unique_param = external_cfg->getConfiguredGlobal(
"ip-reservations-unique");
 
  339                ip_unique = ip_unique_param->boolValue();
 
  347                external_cfg->addConfiguredGlobal(
"ip-reservations-unique", 
Element::create(
true));
 
  351        external_cfg->sanityChecksLifetime(*cfg, 
"preferred-lifetime");
 
  352        external_cfg->sanityChecksLifetime(*cfg, 
"valid-lifetime");
 
  353        external_cfg->sanityChecksDdnsTtlParameters();
 
  371        callout_handle->setArgument(
"audit_entries", ptr);
 
 
static ElementPtr create(const Position &pos=ZERO_POSITION())
Server selector for associating objects in a database with specific servers.
void translateAndAddGlobalsToConfig(SrvConfigPtr external_cfg, data::StampedValueCollection &cb_globals, data::SimpleKeywords global_lists) const
virtual void databaseConfigApply(const db::BackendSelector &backend_selector, const db::ServerSelector &server_selector, const boost::posix_time::ptime &lb_modification_time, const db::AuditEntryCollection &audit_entries)
DHCPv6 server specific method to fetch and apply back end configuration into the local configuration.
SrvConfigPtr createExternalCfg()
Creates an external configuration and returns pointer to it.
static CfgMgr & instance()
returns a single instance of Configuration Manager
void mergeIntoStagingCfg(const uint32_t seq)
Merges external configuration with the given sequence number into the staging configuration.
void mergeIntoCurrentCfg(const uint32_t seq)
Merges external configuration with the given sequence number into the current configuration.
SrvConfigPtr getStagingCfg()
Returns a pointer to the staging configuration.
SrvConfigPtr getCurrentCfg()
Returns a pointer to the current configuration.
Maintains a list of ClientClassDef's.
void encapsulateOptions() const
Iterates over the classes in the dictionary and encapsulates suboptions.
void createOptions(const CfgOptionDefPtr &cfg_option_def)
Iterates over the classes in the dictionary and recreates the options.
void initMatchExpr(uint16_t family)
Iterates over the classes in the dictionary and ensures that that match expressions are initialized.
static HostMgr & instance()
Returns a sole instance of the HostMgr.
static const isc::data::SimpleDefaults GLOBAL6_DEFAULTS
This table defines default global values for DHCPv6.
static const isc::data::SimpleKeywords GLOBAL6_LIST_PARAMETERS
static int registerHook(const std::string &name)
Register Hook.
static bool calloutsPresent(int index)
Are callouts present?
static boost::shared_ptr< CalloutHandle > createCalloutHandle()
Return callout handle.
static void callCallouts(int index, CalloutHandle &handle)
Calls the callouts for a given hook.
Wrapper class around callout handle which automatically resets handle's state.
db::AuditEntryCollection fetchConfigElement(const db::AuditEntryCollection &audit_entries, const std::string &object_type) const
ConfigBackendDHCPv6Mgr & getMgr() const
#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.
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< 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.
boost::shared_ptr< AuditEntryCollection > AuditEntryCollectionPtr
isc::log::Logger dhcpsrv_logger("dhcpsrv")
DHCP server library Logger.
boost::shared_ptr< const CfgGlobals > ConstCfgGlobalsPtr
Const shared pointer to a CfgGlobals instance.
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 > >, boost::multi_index::hashed_non_unique< boost::multi_index::member< OptionDescriptor, bool, &OptionDescriptor::cancelled_ > >, boost::multi_index::hashed_non_unique< boost::multi_index::composite_key< OptionDescriptor, KeyFromKeyExtractor< boost::multi_index::const_mem_fun< Option, uint16_t, &Option::getType >, boost::multi_index::member< OptionDescriptor, OptionPtr, &OptionDescriptor::option_ > >, boost::multi_index::member< OptionDescriptor, ClientClasses, &OptionDescriptor::client_classes_ > > > > > OptionContainer
Multi index container for DHCP option descriptors.
boost::multi_index_container< SharedNetwork6Ptr, 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< SharedNetwork6, std::string, &SharedNetwork6::getName > >, 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 > > > > SharedNetwork6Collection
Multi index container holding shared networks.
boost::multi_index_container< Subnet6Ptr, 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< SubnetModificationTimeIndexTag >, boost::multi_index::const_mem_fun< data::BaseStampedElement, boost::posix_time::ptime, &data::BaseStampedElement::getModificationTime > > > > Subnet6Collection
A collection of Subnet6 objects.
boost::shared_ptr< SrvConfig > SrvConfigPtr
Non-const pointer to the SrvConfig.
const isc::log::MessageID DHCPSRV_CFGMGR_CONFIG6_MERGED
boost::shared_ptr< SharedNetwork6 > SharedNetwork6Ptr
Pointer to SharedNetwork6 object.
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.
const isc::log::MessageID DHCPSRV_CFGMGR_IPV6_RESERVATIONS_NON_UNIQUE_IGNORED
boost::shared_ptr< CalloutHandle > CalloutHandlePtr
A shared pointer to a CalloutHandle object.
bool hasObjectId(const db::AuditEntryCollection &audit_entries, const uint64_t &object_id)
Checks if an object is in a collection od audit entries.
Defines the logger used by the top-level component of kea-lfc.
Tag used to access index by object type.