1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
|
// Copyright (C) 2017-2018 Internet Systems Consortium, Inc. ("ISC")
//
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
#include <agent/simple_parser.h>
#include <cc/data.h>
#include <cc/dhcp_config_error.h>
#include <hooks/hooks_parser.h>
#include <boost/foreach.hpp>
using namespace isc::data;
namespace isc {
namespace agent {
/// @brief This sets of arrays define the default values in various scopes
/// of the Control Agent Configuration.
///
/// Each of those is documented in @file agent/simple_parser.cc. This
/// is different than most other comments in Kea code. The reason
/// for placing those in .cc rather than .h file is that it
/// is expected to be one centralized place to look at for
/// the default values. This is expected to be looked at also by
/// people who are not skilled in C or C++, so they may be
/// confused with the differences between declaration and definition.
/// As such, there's one file to look at that hopefully is readable
/// without any C or C++ skills.
///
/// @{
/// @brief This table defines default values for global options.
///
/// These are global Control Agent parameters.
const SimpleDefaults AgentSimpleParser::AGENT_DEFAULTS = {
{ "http-host", Element::string, "127.0.0.1"},
{ "http-port", Element::integer, "8000"}
};
/// @brief This table defines default values for control sockets.
///
const SimpleDefaults AgentSimpleParser::SOCKET_DEFAULTS = {
{ "socket-type", Element::string, "unix"}
};
/// @}
/// ---------------------------------------------------------------------------
/// --- end of default values -------------------------------------------------
/// ---------------------------------------------------------------------------
size_t AgentSimpleParser::setAllDefaults(const isc::data::ElementPtr& global) {
size_t cnt = 0;
// Set global defaults first.
cnt = setDefaults(global, AGENT_DEFAULTS);
// Now set the defaults for control-sockets, if any.
ConstElementPtr sockets = global->get("control-sockets");
if (sockets) {
ElementPtr d2 = boost::const_pointer_cast<Element>(sockets->get("d2"));
if (d2) {
cnt += SimpleParser::setDefaults(d2, SOCKET_DEFAULTS);
}
ElementPtr d4 = boost::const_pointer_cast<Element>(sockets->get("dhcp4"));
if (d4) {
cnt += SimpleParser::setDefaults(d4, SOCKET_DEFAULTS);
}
ElementPtr d6 = boost::const_pointer_cast<Element>(sockets->get("dhcp6"));
if (d6) {
cnt += SimpleParser::setDefaults(d6, SOCKET_DEFAULTS);
}
}
return (cnt);
}
void
AgentSimpleParser::parse(const CtrlAgentCfgContextPtr& ctx,
const isc::data::ConstElementPtr& config,
bool check_only) {
// Let's get the HTTP parameters first.
ctx->setHttpHost(SimpleParser::getString(config, "http-host"));
ctx->setHttpPort(SimpleParser::getIntType<uint16_t>(config, "http-port"));
// Control sockets are second.
ConstElementPtr ctrl_sockets = config->get("control-sockets");
if (ctrl_sockets) {
auto sockets_map = ctrl_sockets->mapValue();
for (auto cs = sockets_map.cbegin(); cs != sockets_map.cend(); ++cs) {
ctx->setControlSocketInfo(cs->second, cs->first);
}
}
// User context can be done at anytime.
ConstElementPtr user_context = config->get("user-context");
if (user_context) {
ctx->setContext(user_context);
}
// Finally, let's get the hook libs!
using namespace isc::hooks;
HooksConfig& libraries = ctx->getHooksConfig();
ConstElementPtr hooks = config->get("hooks-libraries");
if (hooks) {
HooksLibrariesParser hooks_parser;
hooks_parser.parse(libraries, hooks);
libraries.verifyLibraries(hooks->getPosition());
}
if (!check_only) {
// This occurs last as if it succeeds, there is no easy way
// revert it. As a result, the failure to commit a subsequent
// change causes problems when trying to roll back.
libraries.loadLibraries();
}
}
};
};
|