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 | // Copyright (C) 2017-2022 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/.
#ifndef CTRL_AGENT_COMMAND_MGR_H
#define CTRL_AGENT_COMMAND_MGR_H
#include <config/hooked_command_mgr.h>
#include <exceptions/exceptions.h>
#include <boost/noncopyable.hpp><--- Include file: not found. Please note: Cppcheck does not need standard library headers to get proper results.
#include <boost/shared_ptr.hpp><--- Include file: not found. Please note: Cppcheck does not need standard library headers to get proper results.
namespace isc {
namespace agent {
/// @brief Exception thrown when an error occurred during control command
/// forwarding.
class CommandForwardingError : public Exception {
public:
CommandForwardingError(const char* file, size_t line, const char* what) :
isc::Exception(file, line, what) { };
};
/// @brief Command Manager for Control Agent.
///
/// This is an implementation of the Command Manager within Control Agent.
/// In addition to the standard capabilities of the @ref HookedCommandMgr
/// it is also intended to forward commands to the respective Kea servers
/// when the command is not supported directly by the Control Agent.
///
/// The @ref CtrlAgentCommandMgr is implemented as a singleton. The commands
/// are registered using @c CtrlAgentCommandMgr::instance().registerCommand().
/// The @ref CtrlAgentResponseCreator uses the sole instance of the Command
/// Manager to handle incoming commands.
class CtrlAgentCommandMgr : public config::HookedCommandMgr,
public boost::noncopyable {
public:
/// @brief Returns sole instance of the Command Manager.
static CtrlAgentCommandMgr& instance();
/// @brief Triggers command processing.
///
/// This method overrides the @c BaseCommandMgr::processCommand to ensure
/// that the response is always wrapped in a list. The base implementation
/// returns a response map. Kea Control Agent forwards commands to multiple
/// daemons behind it and thus it must return a list of responses from
/// respective daemons. If an error occurs during command processing the
/// error response must also be wrapped in a list because caller expects
/// that CA always returns a list.
///
/// This method is an entry point for dealing with a command. Internally
/// it calls @c CtrlAgentCommandMgr::handleCommand.
///
/// @param cmd Pointer to the data element representing command in JSON
/// format.
/// @return Pointer to the response.
virtual isc::data::ConstElementPtr
processCommand(const isc::data::ConstElementPtr& cmd);<--- Function in derived class
/// @brief Handles the command having a given name and arguments.
///
/// This method extends the base implementation with the ability to forward
/// commands to Kea servers.
///
/// If the received command doesn't include 'service' parameter or this
/// parameter is blank, the command is first handled by the attached hooks
/// libraries, and if still unhandled, the Control Agent itself.
///
/// If the non-blank 'service' parameter has been specified the hooks
/// are executed. If the hooks process the command the result is returned
/// to the controlling client. Otherwise, the command is forwarded to each
/// Kea server listed in the 'service' parameter.
///
/// @param cmd_name Command name.
/// @param params Command arguments.
/// @param original_cmd Original command being processed.
///
/// @return Pointer to the const data element representing a list of
/// responses to the command. If the command has been handled by the CA,
/// this list includes one response.
virtual isc::data::ConstElementPtr
handleCommand(const std::string& cmd_name,<--- Function in derived class
const isc::data::ConstElementPtr& params,
const isc::data::ConstElementPtr& original_cmd);
private:
/// @brief Tries to forward received control command to a specified server.
///
/// @param service Contains name of the service where the command should be
/// forwarded.
/// @param cmd_name Command name.
/// @param command Pointer to the object representing the forwarded command.
///
/// @return Response to forwarded command.
/// @throw CommandForwardingError when an error occurred during forwarding.
isc::data::ConstElementPtr
forwardCommand(const std::string& service, const std::string& cmd_name,
const isc::data::ConstElementPtr& command);
/// @brief Private constructor.
///
/// The instance should be created using @ref CtrlAgentCommandMgr::instance,
/// thus the constructor is private.
CtrlAgentCommandMgr();
/// @brief Remote address of HTTP endpoint.
std::string remote_addr_;
};
} // end of namespace isc::agent
} // end of namespace isc
#endif
|