summaryrefslogtreecommitdiffstats
path: root/src/lib/cc/command_interpreter.h
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/lib/cc/command_interpreter.h204
1 files changed, 204 insertions, 0 deletions
diff --git a/src/lib/cc/command_interpreter.h b/src/lib/cc/command_interpreter.h
new file mode 100644
index 0000000..2b5b114
--- /dev/null
+++ b/src/lib/cc/command_interpreter.h
@@ -0,0 +1,204 @@
+// Copyright (C) 2009-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 COMMAND_INTERPRETER_H
+#define COMMAND_INTERPRETER_H
+
+#include <cc/data.h>
+#include <string>
+
+/// @file command_interpreter.h
+///
+/// This file contains several functions and constants that are used for
+/// handling commands and responses sent over control channel. The design
+/// is described here: https://gitlab.isc.org/isc-projects/kea/wikis/Stats-design, but also
+/// in @ref ctrlSocket section in the Developer's Guide.
+
+namespace isc {
+namespace config {
+
+/// @brief String used for commands ("command")
+extern const char *CONTROL_COMMAND;
+
+/// @brief String used for result, i.e. integer status ("result")
+extern const char *CONTROL_RESULT;
+
+/// @brief String used for storing textual description ("text")
+extern const char *CONTROL_TEXT;
+
+/// @brief String used for arguments map ("arguments")
+extern const char *CONTROL_ARGUMENTS;
+
+/// @brief String used for service list ("service")
+extern const char *CONTROL_SERVICE;
+
+/// @brief String used for remote address ("remote-address")
+extern const char *CONTROL_REMOTE_ADDRESS;
+
+/// @brief Status code indicating a successful operation
+const int CONTROL_RESULT_SUCCESS = 0;
+
+/// @brief Status code indicating a general failure
+const int CONTROL_RESULT_ERROR = 1;
+
+/// @brief Status code indicating that the specified command is not supported.
+const int CONTROL_RESULT_COMMAND_UNSUPPORTED = 2;
+
+/// @brief Status code indicating that the specified command was completed
+/// correctly, but failed to produce any results. For example, get
+/// completed the search, but couldn't find the object it was looking for.
+const int CONTROL_RESULT_EMPTY = 3;
+
+/// @brief A standard control channel exception that is thrown if a function
+/// is there is a problem with one of the messages
+class CtrlChannelError : public isc::Exception {
+public:
+ CtrlChannelError(const char* file, size_t line, const char* what) :
+ isc::Exception(file, line, what) {}
+};
+
+/// @brief Creates a standard config/command level success answer message
+/// (i.e. of the form { "result": 0 }
+/// @return Standard command/config success answer message
+isc::data::ConstElementPtr createAnswer();
+
+/// @brief Creates a standard config/command level answer message
+/// (i.e. of the form { "result": 1, "text": "Invalid command received" }
+///
+/// @param status_code The return code (0 for success)
+/// @param status_text A string to put into the "text" argument
+/// @return Standard command/config answer message
+isc::data::ConstElementPtr createAnswer(const int status_code,
+ const std::string& status_text);
+
+/// @brief Creates a standard config/command level answer message
+/// (i.e. of the form { "result": status_code, "arguments": arg }
+///
+/// @param status_code The return code (0 for success)
+/// @param arg The optional argument for the answer. This can be of
+/// any Element type. May be NULL.
+/// @return Standard command/config answer message
+isc::data::ConstElementPtr createAnswer(const int status_code,
+ const isc::data::ConstElementPtr& arg);
+
+/// @brief Creates a standard config/command level answer message
+///
+/// @param status_code The return code (0 for success)
+/// @param status textual representation of the status (used mostly for errors)
+/// @param arg The optional argument for the answer. This can be of
+/// any Element type. May be NULL.
+/// @return Standard command/config answer message
+isc::data::ConstElementPtr createAnswer(const int status_code,
+ const std::string& status,
+ const isc::data::ConstElementPtr& arg);
+
+/// @brief Parses a standard config/command level answer message.
+///
+/// @param status_code This value will be set to the return code contained in
+/// the message
+/// @param msg The message to parse
+/// @return The optional argument in the message.
+isc::data::ConstElementPtr parseAnswer(int &status_code,
+ const isc::data::ConstElementPtr& msg);
+
+/// @brief Converts answer to printable text
+///
+/// @param msg answer to be parsed
+/// @return printable string
+std::string answerToText(const isc::data::ConstElementPtr& msg);
+
+/// @brief Creates a standard command message with no
+/// argument (of the form { "command": "my_command" })
+///
+/// @param command The command string
+/// @return The created message
+isc::data::ConstElementPtr createCommand(const std::string& command);
+
+/// @brief Creates a standard command message with the
+/// given argument (of the form { "command": "my_command", "arguments": arg }
+///
+/// @param command The command string
+/// @param arg The optional argument for the command. This can be of
+/// any Element type. May be NULL.
+/// @return The created message
+isc::data::ConstElementPtr createCommand(const std::string& command,
+ isc::data::ConstElementPtr arg);
+
+/// @brief Creates a standard config/command command message with no
+/// argument and with the given service (of the form
+/// { "command": "my_command", "service": [ service ] })
+///
+/// @param command The command string
+/// @param service The target service. May be empty.
+/// @return The created message
+ isc::data::ConstElementPtr createCommand(const std::string& command,
+ const std::string& service);
+
+/// @brief Creates a standard config/command command message with the
+/// given argument and given service (of the form
+/// { "command": "my_command", "arguments": arg, "service": [ service ] }
+///
+/// @param command The command string
+/// @param arg The optional argument for the command. This can be of
+/// any Element type. May be NULL.
+/// @param service The target service. May be empty.
+/// @return The created message
+isc::data::ConstElementPtr createCommand(const std::string& command,
+ isc::data::ConstElementPtr arg,
+ const std::string& service);
+
+/// @brief Parses the given command into a string containing the actual
+/// command and an ElementPtr containing the optional argument.
+///
+/// @throw CtrlChannelError if this is not a well-formed command
+///
+/// @param arg This value will be set to the ElementPtr pointing to
+/// the argument, or to an empty Map (ElementPtr) if there was none.
+/// @param command The command message containing the command (as made
+/// by createCommand()
+/// @return The command name.
+std::string parseCommand(isc::data::ConstElementPtr& arg,
+ isc::data::ConstElementPtr command);
+
+
+/// @brief Parses the given command into a string containing the command
+/// name and an ElementPtr containing the mandatory argument.
+///
+/// This function expects that command arguments are specified and are
+/// a map.
+///
+/// @throw CtrlChannelError if this is not a well-formed command,
+/// arguments are not specified or are not a map.
+///
+/// @param arg Reference to the data element to which command arguments
+/// will be assigned.
+/// @param command The command message containing the command and
+/// the arguments.
+/// @return Command name.
+std::string parseCommandWithArgs(isc::data::ConstElementPtr& arg,
+ isc::data::ConstElementPtr command);
+
+/// @brief Combines lists of commands carried in two responses.
+///
+/// This method is used to combine list of commands returned by the
+/// two command managers.
+///
+/// If the same command appears in two responses only a single
+/// instance is returned in the combined response.
+///
+/// @param response1 First command response.
+/// @param response2 Second command response.
+///
+/// @return Pointer to the 'list-commands' response holding combined
+/// list of commands.
+isc::data::ConstElementPtr
+combineCommandsLists(const isc::data::ConstElementPtr& response1,
+ const isc::data::ConstElementPtr& response2);
+
+}; // end of namespace isc::config
+}; // end of namespace isc
+
+#endif // COMMAND_INTERPRETER_H