Kea 2.5.8
hooks_config.cc
Go to the documentation of this file.
1// Copyright (C) 2017-2024 Internet Systems Consortium, Inc. ("ISC")
2//
3// This Source Code Form is subject to the terms of the Mozilla Public
4// License, v. 2.0. If a copy of the MPL was not distributed with this
5// file, You can obtain one at http://mozilla.org/MPL/2.0/.
6
7#include <config.h>
8
10#include <hooks/hooks_manager.h>
11
12using namespace std;
13using namespace isc;
14using namespace isc::data;
15
16namespace isc {
17namespace hooks {
18
19void
21 bool multi_threading_enabled) const {
22 // The code used to follow this logic:
23 //
24 // Check if the list of libraries has changed. If not, nothing is done
25 // - the command "DhcpN libreload" is required to reload the same
26 // libraries (this prevents needless reloads when anything else in the
27 // configuration is changed).
28 //
29 // We no longer rely on this. Parameters can change. And even if the
30 // parameters stay the same, they could point to files that could
31 // change. We can skip loading routines only if there were and there still
32 // are no libraries specified.
33 vector<string> current_libraries = HooksManager::getLibraryNames();
34 if (current_libraries.empty() && libraries_.empty()) {
35 return;
36 }
37
38 // Library list has changed, validate each of the libraries specified.
39 vector<string> lib_names = isc::hooks::extractNames(libraries_);
40 vector<string> error_libs = HooksManager::validateLibraries(lib_names,
41 multi_threading_enabled);
42 if (!error_libs.empty()) {
43
44 // Construct the list of libraries in error for the message.
45 string error_list = error_libs[0];
46 for (size_t i = 1; i < error_libs.size(); ++i) {
47 error_list += (string(", ") + error_libs[i]);
48 }
50 "hooks libraries failed to validate - "
51 "library or libraries in error are: "
52 << error_list << " (" << position << ")");
53 }
54}
55
56void
57HooksConfig::loadLibraries(bool multi_threading_enabled) const {
62 if (!HooksManager::loadLibraries(libraries_, multi_threading_enabled)) {
64 "One or more hook libraries failed to load");
65 }
66}
67
68bool
69HooksConfig::equal(const HooksConfig& other) const {
70
79 for (auto const& this_it : libraries_) {
80 bool match = false;
81 for (auto const& other_it : other.libraries_) {
82 if (this_it.first != other_it.first) {
83 continue;
84 }
85 if (isNull(this_it.second) && isNull(other_it.second)) {
86 match = true;
87 break;
88 }
89 if (isNull(this_it.second) || isNull(other_it.second)) {
90 continue;
91 }
92 if (this_it.second->equals(*other_it.second)) {
93 match = true;
94 break;
95 }
96 }
97 // No match found for the particular hooks library so return false.
98 if (!match) {
99 return (false);
100 }
101 }
102 return (true);
103}
104
107 // hooks-libraries is a list of maps
109 // Iterate through libraries
110 for (auto const& hl : libraries_) {
111 // Entries are maps
113 // Set the library name
114 map->set("library", Element::create(hl.first));
115 // Set parameters (not set vs set empty map)
116 if (!isNull(hl.second)) {
117 map->set("parameters", hl.second);
118 }
119 // Push to the list
120 result->add(map);
121 }
122 return (result);
123}
124
125}
126}
static ElementPtr create(const Position &pos=ZERO_POSITION())
Definition: data.cc:249
static ElementPtr createMap(const Position &pos=ZERO_POSITION())
Creates an empty MapElement type ElementPtr.
Definition: data.cc:304
static ElementPtr createList(const Position &pos=ZERO_POSITION())
Creates an empty ListElement type ElementPtr.
Definition: data.cc:299
Wrapper class that holds hooks libraries configuration.
Definition: hooks_config.h:36
bool equal(const HooksConfig &other) const
Compares two Hooks Config classes for equality.
Definition: hooks_config.cc:69
void verifyLibraries(const isc::data::Element::Position &position, bool multi_threading_enabled) const
Verifies that libraries stored in libraries_ are valid.
Definition: hooks_config.cc:20
isc::data::ElementPtr toElement() const
Unparse a configuration object.
void loadLibraries(bool multi_threading_enabled) const
Commits hooks libraries configuration.
Definition: hooks_config.cc:57
static std::vector< std::string > getLibraryNames()
Return list of loaded libraries.
static std::vector< std::string > validateLibraries(const std::vector< std::string > &libraries, bool multi_threading_enabled=false)
Validate library list.
static bool loadLibraries(const HookLibsCollection &libraries, bool multi_threading_enabled=false)
Load and reload libraries.
Exception thrown when a library failed to validate.
Definition: hooks_config.h:19
#define isc_throw(type, stream)
A shortcut macro to insert known values into exception arguments.
bool isNull(ConstElementPtr p)
Checks whether the given ElementPtr is a NULL pointer.
Definition: data.cc:1148
boost::shared_ptr< Element > ElementPtr
Definition: data.h:28
std::vector< std::string > extractNames(const isc::hooks::HookLibsCollection &libraries)
Extracts names from HookLibsCollection.
Definition: libinfo.cc:19
Defines the logger used by the top-level component of kea-lfc.
Represents the position of the data element within a configuration string.
Definition: data.h:94