Kea 1.5.0
ca_cfg_mgr.cc
Go to the documentation of this file.
1// Copyright (C) 2016-2018 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#include <agent/ca_cfg_mgr.h>
9#include <agent/ca_log.h>
10#include <agent/simple_parser.h>
11#include <cc/simple_parser.h>
14
15using namespace isc::config;
16using namespace isc::dhcp;
17using namespace isc::process;
18using namespace isc::data;
19
20namespace isc {
21namespace agent {
22
24 :http_host_(""), http_port_(0) {
25}
26
28 : ConfigBase(), ctrl_sockets_(orig.ctrl_sockets_),
29 http_host_(orig.http_host_), http_port_(orig.http_port_),
30 hooks_config_(orig.hooks_config_) {
31}
32
35}
36
38}
39
40std::string
41CtrlAgentCfgMgr::getConfigSummary(const uint32_t /*selection*/) {
42
44
45 // First print the http stuff.
46 std::ostringstream s;
47 s << "listening on " << ctx->getHttpHost() << ", port "
48 << ctx->getHttpPort() << ", control sockets: ";
49
50 // Then print the control-sockets
51 s << ctx->getControlSocketInfoSummary();
52
53 // Finally, print the hook libraries names
54 const isc::hooks::HookLibsCollection libs = ctx->getHooksConfig().get();
55 s << ", " << libs.size() << " lib(s):";
56 for (auto lib = libs.begin(); lib != libs.end(); ++lib) {
57 s << lib->first << " ";
58 }
59
60 return (s.str());
61}
62
65 return (ConfigPtr(new CtrlAgentCfgContext()));
66}
67
70 // Do a sanity check first.
71 if (!config_set) {
72 isc_throw(DhcpConfigError, "Mandatory config parameter not provided");
73 }
74
76
77 // Set the defaults
78 ElementPtr cfg = boost::const_pointer_cast<Element>(config_set);
80
81 // And parse the configuration.
82 ConstElementPtr answer;
83 std::string excuse;
84 try {
85 // Do the actual parsing
86 AgentSimpleParser parser;
87 parser.parse(ctx, cfg, check_only);
88 } catch (const isc::Exception& ex) {
89 excuse = ex.what();
90 answer = createAnswer(CONTROL_RESULT_ERROR, excuse);
91 } catch (...) {
92 excuse = "undefined configuration parsing error";
93 answer = createAnswer(CONTROL_RESULT_ERROR, excuse);
94 }
95
96 // At this stage the answer was created only in case of exception.
97 if (answer) {
98 if (check_only) {
99 LOG_ERROR(agent_logger, CTRL_AGENT_CONFIG_CHECK_FAIL).arg(excuse);
100 } else {
101 LOG_ERROR(agent_logger, CTRL_AGENT_CONFIG_FAIL).arg(excuse);
102 }
103 return (answer);
104 }
105
106 if (check_only) {
108 "Configuration check successful");
109 } else {
111 "Configuration applied successfully.");
112 }
113
114 return (answer);
115}
116
118CtrlAgentCfgContext::getControlSocketInfo(const std::string& service) const {
119 auto si = ctrl_sockets_.find(service);
120 return ((si != ctrl_sockets_.end()) ? si->second : ConstElementPtr());
121}
122
123void
125 const std::string& service) {
126 ctrl_sockets_[service] = control_socket;
127}
128
129std::string
131 std::ostringstream s;
132 for (auto si = ctrl_sockets_.cbegin(); si != ctrl_sockets_.end(); ++si) {
133 if (s.tellp() != 0) {
134 s << " ";
135 }
136 s << si->first;
137 }
138
139 if (s.tellp() == 0) {
140 s << "none";
141 }
142
143 return (s.str());
144}
145
149 // Set user-context
151 // Set http-host
152 ca->set("http-host", Element::create(http_host_));
153 // Set http-port
154 ca->set("http-port", Element::create(static_cast<int64_t>(http_port_)));
155 // Set hooks-libraries
156 ca->set("hooks-libraries", hooks_config_.toElement());
157 // Set control-sockets
158 ElementPtr control_sockets = Element::createMap();
159 for (auto si = ctrl_sockets_.cbegin(); si != ctrl_sockets_.cend(); ++si) {
160 ConstElementPtr socket = UserContext::toElement(si->second);
161 control_sockets->set(si->first, socket);
162 }
163 ca->set("control-sockets", control_sockets);
164 // Set Control-agent
166 result->set("Control-agent", ca);
167
168 // Set Logging (not yet)
169
170 return (result);
171}
172
173} // namespace isc::agent
174} // 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 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:31
void setControlSocketInfo(const isc::data::ConstElementPtr &control_socket, const std::string &service)
Sets information about the control socket.
Definition: ca_cfg_mgr.cc:124
virtual isc::data::ElementPtr toElement() const
Unparse a configuration object.
Definition: ca_cfg_mgr.cc:147
CtrlAgentCfgContext()
Default constructor.
Definition: ca_cfg_mgr.cc:23
isc::data::ConstElementPtr getControlSocketInfo(const std::string &service) const
Returns information about control socket.
Definition: ca_cfg_mgr.cc:118
std::string getControlSocketInfoSummary() const
Returns socket configuration summary in a textual format.
Definition: ca_cfg_mgr.cc:130
CtrlAgentCfgMgr()
Constructor.
Definition: ca_cfg_mgr.cc:33
virtual std::string getConfigSummary(const uint32_t selection)
Returns configuration summary in the textual format.
Definition: ca_cfg_mgr.cc:41
CtrlAgentCfgContextPtr getCtrlAgentCfgContext()
Convenience method that returns the Control Agent configuration context.
Definition: ca_cfg_mgr.h:171
virtual process::ConfigPtr createNewContext()
Creates a new, blank CtrlAgentCfgContext context.
Definition: ca_cfg_mgr.cc:64
virtual isc::data::ConstElementPtr parse(isc::data::ConstElementPtr config, bool check_only)
Parses configuration of the Control Agent.
Definition: ca_cfg_mgr.cc:69
virtual ~CtrlAgentCfgMgr()
Destructor.
Definition: ca_cfg_mgr.cc:37
static ElementPtr create(const Position &pos=ZERO_POSITION())
Definition: data.cc:223
static ElementPtr createMap(const Position &pos=ZERO_POSITION())
Creates an empty MapElement type ElementPtr.
Definition: data.cc:268
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:31
Configuration Manager.
Definition: d_cfg_mgr.h:106
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
boost::shared_ptr< CtrlAgentCfgContext > CtrlAgentCfgContextPtr
Pointer to a configuration context.
Definition: ca_cfg_mgr.h:22
isc::log::Logger agent_logger("ctrl-agent")
Control Agent logger.
Definition: ca_log.h:18
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:23
boost::shared_ptr< Element > ElementPtr
Definition: data.h:22
std::vector< HookLibInfo > HookLibsCollection
A storage for information about hook libraries.
Definition: libinfo.h:31
boost::shared_ptr< ConfigBase > ConfigPtr
Non-const pointer to the SrvConfig.
Definition: config_base.h:119
Defines the logger used by the top-level component of kea-dhcp-ddns.
void contextToElement(data::ElementPtr map) const
Merge unparse a user_context object.
Definition: user_context.cc:15
static data::ElementPtr toElement(data::ConstElementPtr map)
Copy extracting comments an Element map.
Definition: user_context.cc:34