2
0
mirror of https://gitlab.isc.org/isc-projects/kea synced 2025-09-01 22:45:18 +00:00

[#3082] addressed review comments

This commit is contained in:
Razvan Becheriu
2025-01-22 12:04:46 +02:00
parent a7e71c4809
commit 0943f5075a
11 changed files with 63 additions and 20 deletions

View File

@@ -7818,6 +7818,8 @@ operating system, i.e. the size of the ``sun_path`` field in the
different operating systems, between 91 and 107 characters. Typical different operating systems, between 91 and 107 characters. Typical
values are 107 on Linux and 103 on FreeBSD. values are 107 on Linux and 103 on FreeBSD.
Kea supports only one ``unix`` control socket in the "control-sockets" list.
Communication over the control channel is conducted using JSON Communication over the control channel is conducted using JSON
structures. See the structures. See the
`Control Channel section in the Kea Developer's Guide `Control Channel section in the Kea Developer's Guide
@@ -7914,6 +7916,9 @@ password, these values can be read from files. The syntax is extended by:
- The ``user-file`` client parameter, which, with the ``directory`` parameter, - The ``user-file`` client parameter, which, with the ``directory`` parameter,
specifies the path of a file where the user ID can be read. specifies the path of a file where the user ID can be read.
Since Kea-2.7.6 Kea supports multiple HTTP/HTTPS connections.
Both IPv4 and IPv6 addresses can be used.
When files are used, they are read when the configuration is loaded, When files are used, they are read when the configuration is loaded,
to detect configuration errors as soon as possible. to detect configuration errors as soon as possible.
@@ -7944,6 +7949,11 @@ to detect configuration errors as soon as possible.
"password": "1234" "password": "1234"
} ] } ]
} }
},
{
"socket-type": "http",
"socket-address": "2010:30:40::50",
"socket-port": 8004
} }
], ],

View File

@@ -7618,6 +7618,8 @@ operating system, i.e. the size of the ``sun_path`` field in the
different operating systems, between 91 and 107 characters. Typical different operating systems, between 91 and 107 characters. Typical
values are 107 on Linux and 103 on FreeBSD. values are 107 on Linux and 103 on FreeBSD.
Kea supports only one ``unix`` control socket in the "control-sockets" list.
Communication over the control channel is conducted using JSON Communication over the control channel is conducted using JSON
structures. See the structures. See the
`Control Channel section in the Kea Developer's Guide `Control Channel section in the Kea Developer's Guide
@@ -7714,6 +7716,9 @@ password, these values can be read from files. The syntax is extended by:
- The ``user-file`` client parameter, which, with the ``directory`` parameter, - The ``user-file`` client parameter, which, with the ``directory`` parameter,
specifies the path of a file where the user ID can be read. specifies the path of a file where the user ID can be read.
Since Kea-2.7.6 Kea supports multiple HTTP/HTTPS connections.
Both IPv4 and IPv6 addresses can be used.
When files are used, they are read when the configuration is loaded, When files are used, they are read when the configuration is loaded,
to detect configuration errors as soon as possible. to detect configuration errors as soon as possible.
@@ -7744,6 +7749,11 @@ to detect configuration errors as soon as possible.
"password": "1234" "password": "1234"
} ] } ]
} }
},
{
"socket-type": "http",
"socket-address": "10.20.30.40",
"socket-port": 8005
} }
], ],

View File

@@ -136,6 +136,7 @@ CtrlAgentProcess::configure(isc::data::ConstElementPtr config_set,
uint16_t server_port = ctx->getHttpPort(); uint16_t server_port = ctx->getHttpPort();
// Search for the specific connection and reuse the existing one if found.
auto it = sockets_.find(std::make_pair(server_address, server_port)); auto it = sockets_.find(std::make_pair(server_address, server_port));
if (it != sockets_.end()) { if (it != sockets_.end()) {
auto listener = getHttpListener(); auto listener = getHttpListener();
@@ -155,6 +156,8 @@ CtrlAgentProcess::configure(isc::data::ConstElementPtr config_set,
return; return;
} }
// Connection not found so it needs to be created.
// When TLS is enabled configure it.
bool use_https = false; bool use_https = false;
TlsContextPtr tls_context; TlsContextPtr tls_context;
if (!ctx->getCertFile().empty()) { if (!ctx->getCertFile().empty()) {

View File

@@ -15,6 +15,8 @@
namespace isc { namespace isc {
namespace agent { namespace agent {
/// @brief Structure used to store HTTP/HTTPS connection data.
/// (configuration, listener, etc.)
struct HttpSocketInfo { struct HttpSocketInfo {
/// @brief Flag which indicates if socket can be reused. /// @brief Flag which indicates if socket can be reused.
bool usable_; bool usable_;
@@ -143,7 +145,7 @@ public:
/// @return true if the process is listening. /// @return true if the process is listening.
bool isListening() const; bool isListening() const;
/// @brief Close http control socket. /// @brief Close http control sockets.
void closeCommandSockets(); void closeCommandSockets();
private: private:
@@ -154,7 +156,7 @@ private:
/// @return Number of executed handlers. /// @return Number of executed handlers.
size_t runIO(); size_t runIO();
/// @brief The HTTP/HTTPS socket configurations. /// @brief The HTTP/HTTPS socket data (configuration, listener, etc.).
std::map<std::pair<isc::asiolink::IOAddress, uint16_t>, HttpSocketInfoPtr> sockets_; std::map<std::pair<isc::asiolink::IOAddress, uint16_t>, HttpSocketInfoPtr> sockets_;
}; };

View File

@@ -164,13 +164,14 @@ This informational message indicates that the server has started
HTTP/HTTPS service on the specified address and port for receiving HTTP/HTTPS service on the specified address and port for receiving
control commands. control commands.
% HTTP_COMMAND_MGR_SERVICE_STOPPING stopping %1 service %2 % HTTP_COMMAND_MGR_SERVICE_STOPPING Server is stopping %1 service %2
This informational message indicates that the server has stopped This informational message indicates that the server has stopped
HTTP/HTTPS service. When known the address and port are displayed. HTTP/HTTPS service. When known the address and port are displayed.
% HTTP_COMMAND_MGR_SERVICE_STOPPING_NO_DATA stopping %1 service %2 % HTTP_COMMAND_MGR_SERVICE_STOPPING_NO_DATA Server is stopping all services including %1 service %2
This informational message indicates that the server has stopped This informational message indicates that the server is stopping all
HTTP/HTTPS service. When known the address and port are displayed. HTTP/HTTPS services. When known the address and port are displayed for
each service.
% HTTP_COMMAND_MGR_SERVICE_STOPPING_ALL stopping %1 service %2 % HTTP_COMMAND_MGR_SERVICE_STOPPING_ALL stopping %1 service %2
This informational message indicates that the server has stopped This informational message indicates that the server has stopped

View File

@@ -232,6 +232,8 @@ private:
/// @brief Pointer to a HttpCommandConfig object. /// @brief Pointer to a HttpCommandConfig object.
typedef boost::shared_ptr<HttpCommandConfig> HttpCommandConfigPtr; typedef boost::shared_ptr<HttpCommandConfig> HttpCommandConfigPtr;
/// @brief Structure used to store HTTP/HTTPS connection data.
/// (configuration, listener, etc.)
struct HttpSocketInfo { struct HttpSocketInfo {
/// @brief Flag which indicates if socket can be reused. /// @brief Flag which indicates if socket can be reused.
bool usable_; bool usable_;

View File

@@ -38,16 +38,19 @@ public:
use_external_(true) { use_external_(true) {
} }
/// @brief Configure control socket from configuration. /// @brief Open http control sockets using configuration.
/// ///
/// @param config Configuration of the control socket. /// @param config Configuration information for the http control sockets.
void openCommandSocket(const isc::data::ConstElementPtr config);
/// @brief Configure control socket from configuration.
///
/// @param config Configuration of the control socket.
void openCommandSockets(const isc::data::ConstElementPtr config); void openCommandSockets(const isc::data::ConstElementPtr config);
/// @brief Open http control socket using configuration.
///
/// Creates http/https listener, or reuses the existing one reapplying
/// changes.
///
/// @param config Configuration information for the http control socket.
void openCommandSocket(const isc::data::ConstElementPtr config);
/// @brief Close control socket. /// @brief Close control socket.
/// ///
/// @param info Configuration information for the http control socket. /// @param info Configuration information for the http control socket.
@@ -74,7 +77,7 @@ public:
/// @brief Idle connection timeout. /// @brief Idle connection timeout.
long idle_timeout_; long idle_timeout_;
/// @brief The HTTP/HTTPS socket configurations. /// @brief The HTTP/HTTPS socket data (configuration, listener, etc.).
std::map<std::pair<IOAddress, uint16_t>, HttpSocketInfoPtr> sockets_; std::map<std::pair<IOAddress, uint16_t>, HttpSocketInfoPtr> sockets_;
/// @brief Use external sockets flag. /// @brief Use external sockets flag.
@@ -117,6 +120,7 @@ HttpCommandMgrImpl::openCommandSocket(const isc::data::ConstElementPtr config) {
IOAddress server_address = cmd_config->getSocketAddress(); IOAddress server_address = cmd_config->getSocketAddress();
uint16_t server_port = cmd_config->getSocketPort(); uint16_t server_port = cmd_config->getSocketPort();
// Search for the specific connection and reuse the existing one if found.
auto it = sockets_.find(std::make_pair(server_address, server_port)); auto it = sockets_.find(std::make_pair(server_address, server_port));
if (it != sockets_.end()) { if (it != sockets_.end()) {
if ((cmd_config->getTrustAnchor() != it->second->config_->getTrustAnchor()) || if ((cmd_config->getTrustAnchor() != it->second->config_->getTrustAnchor()) ||
@@ -133,6 +137,8 @@ HttpCommandMgrImpl::openCommandSocket(const isc::data::ConstElementPtr config) {
return; return;
} }
// Connection not found so it needs to be created.
// When TLS is enabled configure it.
bool use_https = false; bool use_https = false;
TlsContextPtr tls_context; TlsContextPtr tls_context;
if (!cmd_config->getCertFile().empty()) { if (!cmd_config->getCertFile().empty()) {

View File

@@ -54,12 +54,15 @@ public:
/// @param use_external True (default) add external sockets. /// @param use_external True (default) add external sockets.
void addExternalSockets(bool use_external = true); void addExternalSockets(bool use_external = true);
/// @brief Configure http control socket from configuration. /// @brief Open http control sockets using configuration.
/// ///
/// @param config Configuration information for the http control socket. /// @param config Configuration information for the http control sockets.
void openCommandSockets(const isc::data::ConstElementPtr config); void openCommandSockets(const isc::data::ConstElementPtr config);
/// @brief Configure http control socket from configuration. /// @brief Open http control socket using configuration.
///
/// Creates http/https listener, or reuses the existing one reapplying
/// changes.
/// ///
/// @param config Configuration information for the http control socket. /// @param config Configuration information for the http control socket.
void openCommandSocket(const isc::data::ConstElementPtr config); void openCommandSocket(const isc::data::ConstElementPtr config);
@@ -70,7 +73,7 @@ public:
/// @param remove When true remove the listeners immediately. /// @param remove When true remove the listeners immediately.
void closeCommandSocket(HttpSocketInfoPtr info = HttpSocketInfoPtr(), bool remove = true); void closeCommandSocket(HttpSocketInfoPtr info = HttpSocketInfoPtr(), bool remove = true);
/// @brief Close http control socket. /// @brief Close http control sockets.
void closeCommandSockets(); void closeCommandSockets();
/// @brief Returns a const pointer to the HTTP listener. /// @brief Returns a const pointer to the HTTP listener.

View File

@@ -1,4 +1,4 @@
// Copyright (C) 2021-2024 Internet Systems Consortium, Inc. ("ISC") // Copyright (C) 2024-2025 Internet Systems Consortium, Inc. ("ISC")
// //
// This Source Code Form is subject to the terms of the Mozilla Public // 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 // License, v. 2.0. If a copy of the MPL was not distributed with this

View File

@@ -510,6 +510,8 @@ public:
/// @brief Opens acceptor service allowing the control clients to connect. /// @brief Opens acceptor service allowing the control clients to connect.
/// ///
/// Creates acceptor, or reuses the existing one.
///
/// @param config Configuration information for the control socket. /// @param config Configuration information for the control socket.
/// @throw BadSocketInfo When socket configuration is invalid. /// @throw BadSocketInfo When socket configuration is invalid.
/// @throw SocketError When socket operation fails. /// @throw SocketError When socket operation fails.
@@ -544,7 +546,7 @@ public:
/// @brief Pool of connections. /// @brief Pool of connections.
ConnectionPool connection_pool_; ConnectionPool connection_pool_;
/// @brief The UNIX sockets. /// @brief The UNIX socket data (configuration, acceptor, etc.).
std::map<std::string, UnixSocketInfoPtr> sockets_; std::map<std::string, UnixSocketInfoPtr> sockets_;
/// @brief Connection timeout. /// @brief Connection timeout.
@@ -587,12 +589,14 @@ UnixCommandMgrImpl::openCommandSocket(const isc::data::ConstElementPtr config) {
UnixCommandConfigPtr cmd_config(new UnixCommandConfig(config)); UnixCommandConfigPtr cmd_config(new UnixCommandConfig(config));
// Search for the specific connection and reuse the existing one if found.
auto it = sockets_.find(cmd_config->getSocketName()); auto it = sockets_.find(cmd_config->getSocketName());
if (it != sockets_.end()) { if (it != sockets_.end()) {
it->second->usable_ = true; it->second->usable_ = true;
return; return;
} }
// Connection not found so it needs to be created.
// First let's open lock file. // First let's open lock file.
std::string lock_name = cmd_config->getLockName(); std::string lock_name = cmd_config->getLockName();
int lock_fd = open(lock_name.c_str(), O_RDONLY | O_CREAT, 0600); int lock_fd = open(lock_name.c_str(), O_RDONLY | O_CREAT, 0600);

View File

@@ -71,6 +71,8 @@ public:
/// @brief Opens unix control socket with parameters specified in socket_info /// @brief Opens unix control socket with parameters specified in socket_info
/// (required parameters: socket-type: unix, socket-name:/unix/path). /// (required parameters: socket-type: unix, socket-name:/unix/path).
/// ///
/// Creates acceptor, or reuses the existing one.
///
/// @throw BadSocketInfo When socket configuration is invalid. /// @throw BadSocketInfo When socket configuration is invalid.
/// @throw SocketError When socket operation fails. /// @throw SocketError When socket operation fails.
/// ///