Kea 2.7.6
ca_cfg_mgr.cc
Go to the documentation of this file.
1// Copyright (C) 2016-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
9#include <agent/ca_cfg_mgr.h>
10#include <agent/ca_log.h>
11#include <agent/simple_parser.h>
12#include <cc/simple_parser.h>
16
17using namespace isc::config;
18using namespace isc::dhcp;
19using namespace isc::process;
20using namespace isc::data;
21
22namespace isc {
23namespace agent {
24
26 : http_host_(""), http_port_(0), http_headers_(),
27 trust_anchor_(""), cert_file_(""), key_file_(""), cert_required_(true) {
28}
29
31 : ConfigBase(), ctrl_sockets_(orig.ctrl_sockets_),
32 http_host_(orig.http_host_), http_port_(orig.http_port_),
33 http_headers_(orig.http_headers_),
34 trust_anchor_(orig.trust_anchor_), cert_file_(orig.cert_file_),
35 key_file_(orig.key_file_), cert_required_(orig.cert_required_),
36 hooks_config_(orig.hooks_config_), auth_config_(orig.auth_config_) {
37}
38
42
45
46std::string
47CtrlAgentCfgMgr::getConfigSummary(const uint32_t /*selection*/) {
48
50
51 // First print the http stuff.
52 std::ostringstream s;
53 s << "listening on " << ctx->getHttpHost() << ", port "
54 << ctx->getHttpPort();
55
56 // When TLS is setup print its config.
57 if (!ctx->getTrustAnchor().empty()) {
58 s << ", trust anchor " << ctx->getTrustAnchor()
59 << ", cert file " << ctx->getCertFile()
60 << ", key file " << ctx->getKeyFile();
61 if (ctx->getCertRequired()) {
62 s << ", client certs are required";
63 } else {
64 s << ", client certs are optional";
65 }
66 }
67 s << ", control sockets: ";
68
69 // Then print the control-sockets
70 s << ctx->getControlSocketInfoSummary();
71
72 // Add something if authentication is required.
73 const isc::http::HttpAuthConfigPtr& auth = ctx->getAuthConfig();
74 if (auth && !auth->empty()) {
75 s << ", requires basic HTTP authentication";
76 }
77
78 // Finally, print the hook libraries names
79 const isc::hooks::HookLibsCollection libs = ctx->getHooksConfig().get();
80 s << ", " << libs.size() << " lib(s):";
81 for (auto const& lib : libs) {
82 s << lib.first << " ";
83 }
84
85 return (s.str());
86}
87
92
94CtrlAgentCfgMgr::parse(ConstElementPtr config_set, bool check_only) {
95 // Do a sanity check first.
96 if (!config_set) {
97 isc_throw(DhcpConfigError, "Mandatory config parameter not provided");
98 }
99
101
102 // Set the defaults
103 ElementPtr cfg = boost::const_pointer_cast<Element>(config_set);
105
106 // And parse the configuration.
107 ConstElementPtr answer;
108 std::string excuse;
109 try {
110 // Do the actual parsing
111 AgentSimpleParser parser;
112 parser.checkTlsSetup(cfg);
113 parser.parse(ctx, cfg, check_only);
114 } catch (const isc::Exception& ex) {
115 excuse = ex.what();
116 answer = createAnswer(CONTROL_RESULT_ERROR, excuse);
117 } catch (...) {
118 excuse = "undefined configuration parsing error";
119 answer = createAnswer(CONTROL_RESULT_ERROR, excuse);
120 }
121
122 // At this stage the answer was created only in case of exception.
123 if (answer) {
124 if (check_only) {
126 } else {
128 }
129 return (answer);
130 }
131
132 if (check_only) {
134 "Configuration check successful");
135 } else {
137 "Configuration applied successfully.");
138 }
139
140 return (answer);
141}
142
143std::list<std::list<std::string>>
145 static std::list<std::list<std::string>> const list({
146 {"authentication", "clients", "[]"},
147 {"hooks-libraries", "[]", "parameters", "*"},
148 });
149 return list;
150}
151
153CtrlAgentCfgContext::getControlSocketInfo(const std::string& service) const {
154 auto si = ctrl_sockets_.find(service);
155 return ((si != ctrl_sockets_.end()) ? si->second : ConstElementPtr());
156}
157
158void
160 const std::string& service) {
161 ctrl_sockets_[service] = control_socket;
162}
163
164std::string
166 std::ostringstream s;
167 for (auto const& si : ctrl_sockets_) {
168 if (s.tellp() != 0) {
169 s << " ";
170 }
171 s << si.first;
172 }
173
174 if (s.tellp() == 0) {
175 s << "none";
176 }
177
178 return (s.str());
179}
180
184 // Set user-context
186 // Set http-host
187 ca->set("http-host", Element::create(http_host_));
188 // Set http-port
189 ca->set("http-port", Element::create(static_cast<int64_t>(http_port_)));
190 // Set http-headers
191 if (!http_headers_.empty()) {
192 ca->set("http-headers", CfgHttpHeaderstoElement(http_headers_));
193 }
194 // Set TLS setup when enabled
195 if (!trust_anchor_.empty()) {
196 ca->set("trust-anchor", Element::create(trust_anchor_));
197 ca->set("cert-file", Element::create(cert_file_));
198 ca->set("key-file", Element::create(key_file_));
199 ca->set("cert-required", Element::create(cert_required_));
200 }
201 // Set authentication
202 if (auth_config_) {
203 ca->set("authentication", auth_config_->toElement());
204 }
205 ca->set("hooks-libraries", hooks_config_.toElement());
206 // Set control-sockets
207 ElementPtr control_sockets = Element::createMap();
208 for (auto const& si : ctrl_sockets_) {
209 ConstElementPtr socket = UserContext::toElement(si.second);
210 control_sockets->set(si.first, socket);
211 }
212 ca->set("control-sockets", control_sockets);
213 // Set Control-agent
215 result->set("Control-agent", ca);
216
217 return (result);
218}
219
220} // namespace isc::agent
221} // namespace isc
This is a base class for exceptions thrown from the DNS library module.
virtual const char * what() const
Returns a C-style character string of the cause of the exception.
void checkTlsSetup(const isc::data::ConstElementPtr &config)
Check TLS setup consistency i.e.
void parse(const CtrlAgentCfgContextPtr &ctx, const isc::data::ConstElementPtr &config, bool check_only)
Parses the control agent configuration.
static size_t setAllDefaults(const isc::data::ElementPtr &global)
Sets all defaults for Control Agent configuration.
Control Agent Configuration Context.
Definition ca_cfg_mgr.h:33
void setControlSocketInfo(const isc::data::ConstElementPtr &control_socket, const std::string &service)
Sets information about the control socket.
virtual isc::data::ElementPtr toElement() const
Unparse a configuration object.
CtrlAgentCfgContext()
Default constructor.
Definition ca_cfg_mgr.cc:25
isc::data::ConstElementPtr getControlSocketInfo(const std::string &service) const
Returns information about control socket.
std::string getControlSocketInfoSummary() const
Returns socket configuration summary in a textual format.
std::list< std::list< std::string > > jsonPathsToRedact() const final override
Return a list of all paths that contain passwords or secrets.
CtrlAgentCfgMgr()
Constructor.
Definition ca_cfg_mgr.cc:39
virtual process::ConfigPtr createNewContext() override
Creates a new, blank CtrlAgentCfgContext context.
Definition ca_cfg_mgr.cc:89
virtual isc::data::ConstElementPtr parse(isc::data::ConstElementPtr config, bool check_only) override
Parses configuration of the Control Agent.
Definition ca_cfg_mgr.cc:94
CtrlAgentCfgContextPtr getCtrlAgentCfgContext()
Convenience method that returns the Control Agent configuration context.
Definition ca_cfg_mgr.h:284
virtual std::string getConfigSummary(const uint32_t selection) override
Returns configuration summary in the textual format.
Definition ca_cfg_mgr.cc:47
virtual ~CtrlAgentCfgMgr()
Destructor.
Definition ca_cfg_mgr.cc:43
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
To be removed. Please use ConfigError instead.
isc::data::ElementPtr toElement() const
Unparse a configuration object.
Base class for all configurations.
Definition config_base.h:33
virtual isc::data::ElementPtr toElement() const
Converts to Element representation.
Configuration Manager.
Definition d_cfg_mgr.h:108
This file contains several functions and constants that are used for handling commands and responses ...
#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.
Definition macros.h:32
const isc::log::MessageID CTRL_AGENT_CONFIG_CHECK_FAIL
Definition ca_messages.h:15
boost::shared_ptr< CtrlAgentCfgContext > CtrlAgentCfgContextPtr
Pointer to a configuration context.
Definition ca_cfg_mgr.h:24
isc::log::Logger agent_logger("ctrl-agent")
Control Agent logger.
Definition ca_log.h:18
const isc::log::MessageID CTRL_AGENT_CONFIG_FAIL
Definition ca_messages.h:16
const int CONTROL_RESULT_ERROR
Status code indicating a general failure.
ConstElementPtr createAnswer()
Creates a standard config/command level success answer message (i.e.
const int CONTROL_RESULT_SUCCESS
Status code indicating a successful operation.
boost::shared_ptr< const Element > ConstElementPtr
Definition data.h:29
boost::shared_ptr< Element > ElementPtr
Definition data.h:28
std::vector< HookLibInfo > HookLibsCollection
A storage for information about hook libraries.
Definition libinfo.h:31
boost::shared_ptr< HttpAuthConfig > HttpAuthConfigPtr
Type of shared pointers to HTTP authentication configuration.
Definition auth_config.h:97
boost::shared_ptr< ConfigBase > ConfigPtr
Non-const pointer to the ConfigBase.
Defines the logger used by the top-level component of kea-lfc.
void contextToElement(data::ElementPtr map) const
Merge unparse a user_context object.
static data::ElementPtr toElement(data::ConstElementPtr map)
Copy an Element map.