Kea 1.5.0
unix_control_socket.cc
Go to the documentation of this file.
1// Copyright (C) 2018 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
9
10#include <config.h>
11
14#include <asiolink/io_service.h>
16#include <cc/json_feed.h>
18#include <config/timeouts.h>
19
20using namespace std;
21using namespace isc::asiolink;
22using namespace isc::config;
23using namespace isc::data;
24
25namespace isc {
26namespace netconf {
27
30 return (UnixControlSocketPtr(new UnixControlSocket(ctrl_sock)));
31}
32
34 : ControlSocketBase(ctrl_sock) {
35}
36
38}
39
41UnixControlSocket::configGet(const string& /*service*/) {
42 return (sendCommand(createCommand("config-get")));
43}
44
47 const string& /*service*/) {
48 return (sendCommand(createCommand("config-test", config)));
49}
50
53 const string& /*service*/) {
54 return (sendCommand(createCommand("config-set", config)));
55}
56
58UnixControlSocket::sendCommand(ConstElementPtr command) {
59 // We are using our own IO service because this method is synchronous.
60 IOServicePtr io_service(new IOService());
61 ClientConnection conn(*io_service);
62 boost::system::error_code received_ec;
63 ConstJSONFeedPtr received_feed;
64
66 ClientConnection::ControlCommand(command->toWire()),
67 [&io_service, &received_ec, &received_feed]
68 (const boost::system::error_code& ec, ConstJSONFeedPtr feed) {
69 // Capture error code and parsed data.
70 received_ec = ec;
71 received_feed = feed;
72 // Got the IO service so stop IO service. This causes to
73 // stop IO service when all handlers have been invoked.
74 io_service->stopWork();
75 },
77
78 // Perform this synchronously.
79 io_service->run();
80
81 if (received_ec) {
82 // Got an error.
83 isc_throw(ControlSocketError, "communication error: "
84 << received_ec.message());
85 }
86
87 if (!received_feed) {
88 // Failed to get the answer.
89 isc_throw(ControlSocketError, "empty response");
90 }
91
92 try {
93 return (received_feed->toElement());
94 } catch (const std::exception& ex) {
95 isc_throw(ControlSocketError, "unparsable response: " << ex.what());
96 }
97}
98
99} // namespace netconf
100} // namespace isc
Represents client side connection over the unix domain socket.
Base class for control socket communication.
const std::string getName() const
Returns the Unix socket name.
Exception thrown when the error during communication.
Class for control socket communication over UNIX socket.
virtual data::ConstElementPtr configSet(data::ConstElementPtr config, const std::string &service)
Set configuration.
UnixControlSocket(CfgControlSocketPtr ctrl_sock)
Constructor.
virtual data::ConstElementPtr configTest(data::ConstElementPtr config, const std::string &service)
Test configuration.
virtual data::ConstElementPtr configGet(const std::string &service)
Get configuration.
virtual ~UnixControlSocket()
Destructor (does nothing).
This file contains several functions and constants that are used for handling commands and responses ...
#define isc_throw(type, stream)
A shortcut macro to insert known values into exception arguments.
boost::shared_ptr< const JSONFeed > ConstJSONFeedPtr
Pointer to the const JSONFeed.
Definition: json_feed.h:27
ConstElementPtr createCommand(const std::string &command)
Creates a standard command message with no argument (of the form { "command": "my_command" })
constexpr long TIMEOUT_AGENT_FORWARD_COMMAND
Timeout for the Control Agent to forward command to a Kea server, e.g.
Definition: timeouts.h:31
boost::shared_ptr< const Element > ConstElementPtr
Definition: data.h:23
boost::shared_ptr< ControlSocketBase > ControlSocketBasePtr
Type definition for the pointer to the ControlSocketBase.
boost::shared_ptr< UnixControlSocket > UnixControlSocketPtr
Type definition for the pointer to the UnixControlSocket.
boost::shared_ptr< CfgControlSocket > CfgControlSocketPtr
Defines a pointer for CfgControlSocket instances.
ControlSocketBasePtr createControlSocket< CfgControlSocket::Type::UNIX >(CfgControlSocketPtr ctrl_sock)
Factory template specialization for unix control sockets.
Defines the logger used by the top-level component of kea-dhcp-ddns.
Contains declarations for UNIX control socket communication.