Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Kea
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Service Desk
Milestones
Merge Requests
0
Merge Requests
0
Operations
Operations
Incidents
Packages & Registries
Packages & Registries
Container Registry
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Adam Osuchowski
Kea
Commits
db9b5842
Commit
db9b5842
authored
Jun 03, 2014
by
Marcin Siodelski
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
[3405] Install signal handlers in DHCPv4 server.
parent
f9e491a5
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
100 additions
and
20 deletions
+100
-20
src/bin/dhcp4/dhcp4_messages.mes
src/bin/dhcp4/dhcp4_messages.mes
+8
-0
src/bin/dhcp4/dhcp4_srv.cc
src/bin/dhcp4/dhcp4_srv.cc
+12
-0
src/bin/dhcp4/kea_controller.cc
src/bin/dhcp4/kea_controller.cc
+80
-20
No files found.
src/bin/dhcp4/dhcp4_messages.mes
View file @
db9b5842
...
...
@@ -97,6 +97,14 @@ This error message is logged when the attempt to compute DHCID for a specified
lease has failed. The lease details and reason for failure is logged in the
message.
% DHCP4_DYNAMIC_RECONFIGURATION initate server reconfiguration using file: %1, after receiving SIGHUP signal
This is the info message logged when the DHCPv4 server starts reconfiguration
as a result of receiving SIGHUP signal.
% DHCP4_DYNAMIC_RECONFIGURATION_FAIL dynamic server reconfiguration failed with file: %1
This is an error message logged when the dynamic reconfiguration of the
DHCP server failed.
% DHCP4_EMPTY_HOSTNAME received empty hostname from the client, skipping processing of this option
This debug message is issued when the server received an empty Hostname option
from a client. Server does not process empty Hostname options and therefore
...
...
src/bin/dhcp4/dhcp4_srv.cc
View file @
db9b5842
...
...
@@ -175,6 +175,18 @@ Dhcpv4Srv::run() {
LOG_ERROR
(
dhcp4_logger
,
DHCP4_PACKET_RECEIVE_FAIL
).
arg
(
e
.
what
());
}
// Handle next signal received by the process. It must be called after
// an attempt to receive a packet to properly handle server shut down.
// The SIGTERM or SIGINT will be received prior to, or during execution
// of select() (select is invoked by recivePacket()). When that happens,
// select will be interrupted. The signal handler will be invoked
// immediately after select(). The handler will set the shutdown flag
// and cause the process to terminate before the next select() function
// is called. If the function was called before receivePacket the
// process could wait up to the duration of timeout of select() to
// terminate.
handleSignal
();
// Timeout may be reached or signal received, which breaks select()
// with no reception ocurred
if
(
!
query
)
{
...
...
src/bin/dhcp4/kea_controller.cc
View file @
db9b5842
...
...
@@ -25,11 +25,18 @@ using namespace isc::asiolink;
using
namespace
isc
::
dhcp
;
using
namespace
std
;
namespace
isc
{
namespace
dhcp
{
void
ControlledDhcpv4Srv
::
init
(
const
std
::
string
&
file_name
)
{
namespace
{
/// @brief Configure DHCPv4 server using the configuration file specified.
///
/// This function is used to both configure the DHCP server on its startup
/// and dynamically reconfigure the server when SIGHUP signal is received.
///
/// It fetches DHCPv6 server's configuration from the 'Dhcp4' section of
/// the JSON configuration file.
///
/// @param file_name Configuration file location.
void
configure
(
const
std
::
string
&
file_name
)
{
// This is a configuration backend implementation that reads the
// configuration from a JSON file.
...
...
@@ -41,8 +48,8 @@ ControlledDhcpv4Srv::init(const std::string& file_name) {
try
{
if
(
file_name
.
empty
())
{
// Basic sanity check: file name must not be empty.
isc_throw
(
BadValue
,
"JSON configuration file not specified. Please
"
"use -c command line option."
);
isc_throw
(
isc
::
BadValue
,
"JSON configuration file not specified.
"
"
Please
use -c command line option."
);
}
// Read contents of the file and parse it as JSON
...
...
@@ -51,8 +58,8 @@ ControlledDhcpv4Srv::init(const std::string& file_name) {
if
(
!
json
)
{
LOG_ERROR
(
dhcp4_logger
,
DHCP4_CONFIG_LOAD_FAIL
)
.
arg
(
"Config file "
+
file_name
+
" missing or empty."
);
isc_throw
(
BadValue
,
"Unable to process JSON configuration file:
"
+
file_name
);
isc_throw
(
isc
::
BadValue
,
"Unable to process JSON configuration
"
" file: "
<<
file_name
);
}
// Get Dhcp4 component from the config
...
...
@@ -60,29 +67,30 @@ ControlledDhcpv4Srv::init(const std::string& file_name) {
if
(
!
dhcp4
)
{
LOG_ERROR
(
dhcp4_logger
,
DHCP4_CONFIG_LOAD_FAIL
)
.
arg
(
"Config file "
+
file_name
+
" does not include 'Dhcp4' entry."
);
isc_throw
(
BadValue
,
"Unable to process JSON configuration file:"
+
file_name
);
.
arg
(
"Config file "
+
file_name
+
" does not include 'Dhcp4'"
" entry."
);
isc_throw
(
isc
::
BadValue
,
"Unable to process JSON configuration"
" file: "
<<
file_name
);
}
// Use parsed JSON structures to configure the server
result
=
processCommand
(
"config-reload"
,
dhcp4
);
result
=
ControlledDhcpv4Srv
::
processCommand
(
"config-reload"
,
dhcp4
);
}
catch
(
const
std
::
exception
&
ex
)
{
LOG_ERROR
(
dhcp4_logger
,
DHCP4_CONFIG_LOAD_FAIL
).
arg
(
ex
.
what
());
isc_throw
(
BadValue
,
"Unable to process JSON configuration file:
"
+
file_name
);
isc_throw
(
isc
::
BadValue
,
"Unable to process JSON configuration file:
"
<<
file_name
);
}
if
(
!
result
)
{
// Undetermined status of the configuration. This should never happen,
// but as the configureDhcp4Server returns a pointer, it is
theoretically
// possible that it will return NULL.
// but as the configureDhcp4Server returns a pointer, it is
//
theoretically
possible that it will return NULL.
LOG_ERROR
(
dhcp4_logger
,
DHCP4_CONFIG_LOAD_FAIL
)
.
arg
(
"Configuration failed: Undefined result of processCommand("
"config-reload, "
+
file_name
+
")"
);
isc_throw
(
BadValue
,
"Configuration failed: Undefined result of "
"processCommand('config-reload', "
+
file_name
+
")"
);
isc_throw
(
isc
::
BadValue
,
"Configuration failed: Undefined result of "
"processCommand('config-reload', "
<<
file_name
<<
")"
);
}
// Now check is the returned result is successful (rcode=0) or not
...
...
@@ -95,12 +103,64 @@ ControlledDhcpv4Srv::init(const std::string& file_name) {
reason
=
string
(
" ("
)
+
comment
->
stringValue
()
+
string
(
")"
);
}
LOG_ERROR
(
dhcp4_logger
,
DHCP4_CONFIG_LOAD_FAIL
).
arg
(
reason
);
isc_throw
(
BadValue
,
"Failed to apply configuration:
"
<<
reason
);
isc_throw
(
isc
::
BadValue
,
"Failed to apply configuration:
"
<<
reason
);
}
}
/// @brief Signals handler for DHCPv4 server.
///
/// This signal handler handles the following signals received by the DHCPv4
/// server process:
/// - SIGHUP - triggers server's dynamic reconfiguration.
/// - SIGTERM - triggers server's shut down.
/// - SIGINT - triggers server's shut down.
///
/// @param signo Signal number received.
void
signalHandler
(
int
signo
)
{
// SIGHUP signals a request to reconfigure the server.
if
(
signo
==
SIGHUP
)
{
// Get configuration file name.
std
::
string
file
=
ControlledDhcpv4Srv
::
getInstance
()
->
getConfigFile
();
try
{
LOG_INFO
(
dhcp4_logger
,
DHCP4_DYNAMIC_RECONFIGURATION
).
arg
(
file
);
configure
(
file
);
}
catch
(
const
std
::
exception
&
ex
)
{
// Log the unsuccessful reconfiguration. The reason for failure
// should be already logged. Don't rethrow an exception so as
// the server keeps working.
LOG_ERROR
(
dhcp4_logger
,
DHCP4_DYNAMIC_RECONFIGURATION_FAIL
)
.
arg
(
file
);
}
}
else
if
((
signo
==
SIGTERM
)
||
(
signo
==
SIGINT
))
{
isc
::
data
::
ElementPtr
params
(
new
isc
::
data
::
MapElement
());
ControlledDhcpv4Srv
::
processCommand
(
"shutdown"
,
params
);
}
}
}
namespace
isc
{
namespace
dhcp
{
void
ControlledDhcpv4Srv
::
init
(
const
std
::
string
&
file_name
)
{
// Call parent class's init to initialize file name.
Daemon
::
init
(
file_name
);
// Configure the server using JSON file.
configure
(
file_name
);
// We don't need to call openActiveSockets() or startD2() as these
// methods are called in processConfig() which is called by
// processCommand("reload-config", ...)
// Set signal handlers. When the SIGHUP is received by the process
// the server reconfiguration will be triggered. When SIGTERM or
// SIGINT will be received, the server will start shutting down.
signal_set_
.
reset
(
new
isc
::
util
::
io
::
SignalSet
(
SIGINT
,
SIGHUP
,
SIGTERM
));
// Set the pointer to the handler function.
signal_handler_
=
signalHandler
;
}
void
ControlledDhcpv4Srv
::
cleanup
()
{
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment