Kea  1.9.9-git
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 
9 #include <cfgrpt/config_report.h>
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 
17 using namespace isc::config;
18 using namespace isc::process;
19 namespace ph = std::placeholders;
20 
21 namespace isc {
22 namespace d2 {
23 
26 const char* D2Controller::d2_app_name_ = "DhcpDdns";
27 
29 const char* D2Controller::d2_bin_name_ = "kea-dhcp-ddns";
30 
32 D2Controller::instance() {
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 
43 DProcessBase* 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 
49 D2Controller::D2Controller()
50  : DControllerBase(d2_app_name_, d2_bin_name_) {
51 }
52 
53 void
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 
85 void
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 
110 D2Controller::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 
129 std::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
boost::shared_ptr< DControllerBase > DControllerBasePtr
Definition: d_controller.h:78
void registerCommands()
Register commands.
isc::data::ConstElementPtr configTestHandler(const std::string &command, isc::data::ConstElementPtr args)
handler for config-test command
Evaluation context, an interface to the expression evaluation.
virtual ~D2Controller()
Destructor.
isc::data::ConstElementPtr configReloadHandler(const std::string &command, isc::data::ConstElementPtr args)
handler for config-reload command
void deregisterCommands()
Deregister commands.
isc::data::ConstElementPtr shutdownHandler(const std::string &command, isc::data::ConstElementPtr args)
handler for 'shutdown' command
#define isc_throw(type, stream)
A shortcut macro to insert known values into exception arguments.
A generic exception that is thrown if a parameter given to a method is considered invalid in that con...
const char *const config_report[]
Definition: config_report.h:15
DHCP-DDNS Application Process.
Definition: d2_process.h:24
boost::shared_ptr< const Element > ConstElementPtr
Definition: data.h:23
isc::data::ConstElementPtr configWriteHandler(const std::string &command, isc::data::ConstElementPtr args)
handler for config-write command
Defines the logger used by the top-level component of kea-dhcp-ddns.
isc::data::ConstElementPtr configGetHandler(const std::string &command, isc::data::ConstElementPtr args)
handler for config-get command
isc::data::ConstElementPtr configSetHandler(const std::string &command, isc::data::ConstElementPtr args)
handler for config-set command
isc::data::ElementPtr parseFile(const std::string &filename, ParserType parser_type)
Run the parser on the file specified.
Used for parsing content of DhcpDdns.
virtual std::string getVersionAddendum()
Returns version info specific to D2.
Application Process Interface.
Definition: d_process.h:81
isc::data::ConstElementPtr buildReportHandler(const std::string &command, isc::data::ConstElementPtr args)
handler for 'build-report' command
Application Controller.
Definition: d_controller.h:104
const char *const * d2_config_report
isc::data::ConstElementPtr versionGetHandler(const std::string &command, isc::data::ConstElementPtr args)
handler for version-get command
Process Controller for D2 Process This class is the DHCP-DDNS specific derivation of DControllerBase...
Definition: d2_controller.h:29