Kea 1.9.11
d2_controller.cc
Go to the documentation of this file.
1// Copyright (C) 2013-2020 Internet Systems Consortium, Inc. ("ISC")
2//
3// This Source Code Form is subject to the terms of the Mozilla Public
4// License, v. 2.0. If a copy of the MPL was not distributed with this
5// file, You can obtain one at http://mozilla.org/MPL/2.0/.
6
7#include <config.h>
8
10#include <config/command_mgr.h>
11#include <d2/d2_controller.h>
12#include <d2/d2_process.h>
13#include <d2/parser_context.h>
14
15#include <stdlib.h>
16
17using namespace isc::config;
18using namespace isc::process;
19namespace ph = std::placeholders;
20
21namespace isc {
22namespace d2 {
23
26const char* D2Controller::d2_app_name_ = "DhcpDdns";
27
29const char* D2Controller::d2_bin_name_ = "kea-dhcp-ddns";
30
33 // If the instance hasn't been created yet, create it. Note this method
34 // must use the base class singleton instance methods.
35 if (!getController()) {
36 DControllerBasePtr controller_ptr(new D2Controller());
37 setController(controller_ptr);
38 }
39
40 return (getController());
41}
42
43DProcessBase* D2Controller::createProcess() {
44 // Instantiate and return an instance of the D2 application process. Note
45 // that the process is passed the controller's io_service.
46 return (new D2Process(getAppName().c_str(), getIOService()));
47}
48
49D2Controller::D2Controller()
50 : DControllerBase(d2_app_name_, d2_bin_name_) {
51}
52
53void
55 // These are the commands always supported by the D2 server.
56 // Please keep the list in alphabetic order.
57 CommandMgr::instance().registerCommand(BUILD_REPORT_COMMAND,
58 std::bind(&D2Controller::buildReportHandler, this, ph::_1, ph::_2));
59
60 CommandMgr::instance().registerCommand(CONFIG_GET_COMMAND,
61 std::bind(&D2Controller::configGetHandler, this, ph::_1, ph::_2));
62
63 CommandMgr::instance().registerCommand(CONFIG_RELOAD_COMMAND,
64 std::bind(&D2Controller::configReloadHandler, this, ph::_1, ph::_2));
65
66 CommandMgr::instance().registerCommand(CONFIG_SET_COMMAND,
67 std::bind(&D2Controller::configSetHandler, this, ph::_1, ph::_2));
68
69 CommandMgr::instance().registerCommand(CONFIG_TEST_COMMAND,
70 std::bind(&D2Controller::configTestHandler, this, ph::_1, ph::_2));
71
72 CommandMgr::instance().registerCommand(CONFIG_WRITE_COMMAND,
73 std::bind(&D2Controller::configWriteHandler, this, ph::_1, ph::_2));
74
75 CommandMgr::instance().registerCommand(SHUT_DOWN_COMMAND,
76 std::bind(&D2Controller::shutdownHandler, this, ph::_1, ph::_2));
77
78 CommandMgr::instance().registerCommand(STATUS_GET_COMMAND,
79 std::bind(&DControllerBase::statusGetHandler, this, ph::_1, ph::_2));
80
81 CommandMgr::instance().registerCommand(VERSION_GET_COMMAND,
82 std::bind(&D2Controller::versionGetHandler, this, ph::_1, ph::_2));
83}
84
85void
87 try {
88 // Close the command socket (if it exists).
89 CommandMgr::instance().closeCommandSocket();
90
91 // Deregister any registered commands (please keep in alphabetic order)
92 CommandMgr::instance().deregisterCommand(BUILD_REPORT_COMMAND);
93 CommandMgr::instance().deregisterCommand(CONFIG_GET_COMMAND);
94 CommandMgr::instance().deregisterCommand(CONFIG_RELOAD_COMMAND);
95 CommandMgr::instance().deregisterCommand(CONFIG_SET_COMMAND);
96 CommandMgr::instance().deregisterCommand(CONFIG_TEST_COMMAND);
97 CommandMgr::instance().deregisterCommand(CONFIG_WRITE_COMMAND);
98 CommandMgr::instance().deregisterCommand(SHUT_DOWN_COMMAND);
99 CommandMgr::instance().deregisterCommand(STATUS_GET_COMMAND);
100 CommandMgr::instance().deregisterCommand(VERSION_GET_COMMAND);
101
102 } catch (...) {
103 // What to do? Simply ignore...
104 }
105}
106
107
108
110D2Controller::parseFile(const std::string& file_name) {
112
113 // Read contents of the file and parse it as JSON
114 D2ParserContext parser;
115 elements = parser.parseFile(file_name, D2ParserContext::PARSER_DHCPDDNS);
116 if (!elements) {
117 isc_throw(isc::BadValue, "no configuration found in file");
118 }
119
120 return (elements);
121}
122
124}
125
126// Refer to config_report so it will be embedded in the binary.
128
129std::string
131 std::stringstream stream;
132 // Currently the only dependency D2 adds to base is cryptolink
133 stream << isc::cryptolink::CryptoLink::getVersion() << std::endl;
134 return (stream.str());
135
136}
137
138}; // end namespace isc::d2
139}; // end namespace isc
A generic exception that is thrown if a parameter given to a method is considered invalid in that con...
Process Controller for D2 Process This class is the DHCP-DDNS specific derivation of DControllerBase.
Definition: d2_controller.h:29
static process::DControllerBasePtr & instance()
Static singleton instance method.
static const char * d2_app_name_
Defines the application name, this is passed into base class and appears in log statements.
Definition: d2_controller.h:43
static const char * d2_bin_name_
Defines the executable name.
Definition: d2_controller.h:47
virtual std::string getVersionAddendum()
Returns version info specific to D2.
void registerCommands()
Register commands.
void deregisterCommands()
Deregister commands.
virtual ~D2Controller()
Destructor.
Evaluation context, an interface to the expression evaluation.
@ PARSER_DHCPDDNS
Used for parsing content of DhcpDdns.
isc::data::ElementPtr parseFile(const std::string &filename, ParserType parser_type)
Run the parser on the file specified.
DHCP-DDNS Application Process.
Definition: d2_process.h:24
Application Controller.
Definition: d_controller.h:104
isc::data::ConstElementPtr configReloadHandler(const std::string &command, isc::data::ConstElementPtr args)
handler for config-reload command
isc::data::ConstElementPtr buildReportHandler(const std::string &command, isc::data::ConstElementPtr args)
handler for 'build-report' command
asiolink::IOServicePtr & getIOService()
Getter for fetching the controller's IOService.
Definition: d_controller.h:458
static DControllerBasePtr & getController()
Static getter which returns the singleton instance.
Definition: d_controller.h:466
isc::data::ConstElementPtr configWriteHandler(const std::string &command, isc::data::ConstElementPtr args)
handler for config-write command
static void setController(const DControllerBasePtr &controller)
Static setter which sets the singleton instance.
Definition: d_controller.cc:42
isc::data::ConstElementPtr versionGetHandler(const std::string &command, isc::data::ConstElementPtr args)
handler for version-get command
isc::data::ConstElementPtr configSetHandler(const std::string &command, isc::data::ConstElementPtr args)
handler for config-set command
isc::data::ConstElementPtr configGetHandler(const std::string &command, isc::data::ConstElementPtr args)
handler for config-get command
isc::data::ConstElementPtr configTestHandler(const std::string &command, isc::data::ConstElementPtr args)
handler for config-test command
std::string getAppName() const
Fetches the name of the application under control.
Definition: d_controller.h:222
isc::data::ConstElementPtr shutdownHandler(const std::string &command, isc::data::ConstElementPtr args)
handler for 'shutdown' command
Application Process Interface.
Definition: d_process.h:81
#define isc_throw(type, stream)
A shortcut macro to insert known values into exception arguments.
const char *const * d2_config_report
boost::shared_ptr< const Element > ConstElementPtr
Definition: data.h:27
const char *const config_report[]
Definition: config_report.h:15
boost::shared_ptr< DControllerBase > DControllerBasePtr
Definition: d_controller.h:78
Defines the logger used by the top-level component of kea-lfc.