mirror of
https://gitlab.isc.org/isc-projects/kea
synced 2025-08-31 22:15:23 +00:00
[5046] Implement set-config command in kea-dhcp4
Mirror the changes made in kea-dhcp6.
This commit is contained in:
@@ -501,6 +501,47 @@ void setGlobalParameters4() {
|
||||
}
|
||||
}
|
||||
|
||||
/// @brief Initialize the command channel based on the staging configuration
|
||||
///
|
||||
/// Only close the current channel, if the new channel configuration is
|
||||
/// different. This avoids disconnecting a client and hence not sending them
|
||||
/// a command result, unless they specifically alter the channel configuration.
|
||||
/// In that case the user simply has to accept they'll be disconnected.
|
||||
///
|
||||
void configureCommandChannel() {
|
||||
// Get new socket configuration.
|
||||
ConstElementPtr sock_cfg =
|
||||
CfgMgr::instance().getStagingCfg()->getControlSocketInfo();
|
||||
|
||||
// Get current socket configuration.
|
||||
ConstElementPtr current_sock_cfg =
|
||||
CfgMgr::instance().getCurrentCfg()->getControlSocketInfo();
|
||||
|
||||
// Determine if the socket configuration has changed. It has if
|
||||
// both old and new configuration is specified but respective
|
||||
// data elements are't equal.
|
||||
bool sock_changed = (sock_cfg && current_sock_cfg &&
|
||||
!sock_cfg->equals(*current_sock_cfg));
|
||||
|
||||
// If the previous or new socket configuration doesn't exist or
|
||||
// the new configuration differs from the old configuration we
|
||||
// close the exisitng socket and open a new socket as appropriate.
|
||||
// Note that closing an existing socket means the clien will not
|
||||
// receive the configuration result.
|
||||
if (!sock_cfg || !current_sock_cfg || sock_changed) {
|
||||
// Close the existing socket (if any).
|
||||
isc::config::CommandMgr::instance().closeCommandSocket();
|
||||
|
||||
if (sock_cfg) {
|
||||
// This will create a control socket and install the external
|
||||
// socket in IfaceMgr. That socket will be monitored when
|
||||
// Dhcp4Srv::receivePacket() calls IfaceMgr::receive4() and
|
||||
// callback in CommandMgr will be called, if necessary.
|
||||
isc::config::CommandMgr::instance().openCommandSocket(sock_cfg);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
isc::data::ConstElementPtr
|
||||
configureDhcp4Server(Dhcpv4Srv&, isc::data::ConstElementPtr config_set) {
|
||||
if (!config_set) {
|
||||
@@ -632,25 +673,8 @@ configureDhcp4Server(Dhcpv4Srv&, isc::data::ConstElementPtr config_set) {
|
||||
subnet_parser->build(subnet_config->second);
|
||||
}
|
||||
|
||||
// Get command socket configuration from the config file.
|
||||
// This code expects the following structure:
|
||||
// {
|
||||
// "socket-type": "unix",
|
||||
// "socket-name": "/tmp/kea4.sock"
|
||||
// }
|
||||
ConstElementPtr sock_cfg =
|
||||
CfgMgr::instance().getStagingCfg()->getControlSocketInfo();
|
||||
|
||||
// Close existing socket (if any).
|
||||
isc::config::CommandMgr::instance().closeCommandSocket();
|
||||
if (sock_cfg) {
|
||||
// This will create a control socket and will install external socket
|
||||
// in IfaceMgr. That socket will be monitored when Dhcp4Srv::receivePacket()
|
||||
// calls IfaceMgr::receive4() and callback in CommandMgr will be called,
|
||||
// if necessary. If there were previously open command socket, it will
|
||||
// be closed.
|
||||
isc::config::CommandMgr::instance().openCommandSocket(sock_cfg);
|
||||
}
|
||||
// Setup the command channel.
|
||||
configureCommandChannel();
|
||||
|
||||
// the leases database parser is the last to be run.
|
||||
std::map<std::string, ConstElementPtr>::const_iterator leases_config =
|
||||
|
Reference in New Issue
Block a user