2
0
mirror of https://gitlab.isc.org/isc-projects/kea synced 2025-08-30 21:45:37 +00:00

[5332] Revamped lease_cmds hook lib to use hook callouts for command processing

The changes were patterned after what was done in subnets_cmds hook lib.

src/hooks/dhcp/lease_cmds/lease_cmds_callouts.cc
    New file which provides callout functions for each lease command
    as well as load() and unload() (formerly in load_unload.cc)

src/hooks/dhcp/lease_cmds/load_unload.cc
    File deleted

src/hooks/dhcp/lease_cmds/Makefile.am
    Added lease_cmds_callouts.cc
    Removed load_unload.cc

src/hooks/dhcp/lease_cmds/lease_cmds.h
src/hooks/dhcp/lease_cmds/lease_cmds.cc
    LeaseCmdsImpl - removed ctor, dtor, registerCommands, deregisterCommands,
    and changed handlers to non static

    LeaseCmds - added wrapper methods around LeaseCmdImpl handlers
This commit is contained in:
Thomas Markwalder
2017-09-21 16:34:15 -04:00
parent b5ef2a85bc
commit 03636abdf6
6 changed files with 762 additions and 297 deletions

View File

@@ -25,9 +25,9 @@ CLEANFILES = *.gcno *.gcda lease_cmds_messages.h lease_cmds_messages.cc s-messag
noinst_LTLIBRARIES = liblease_cmds.la
liblease_cmds_la_SOURCES = lease_cmds.cc lease_cmds.h
liblease_cmds_la_SOURCES += lease_cmds_callouts.cc
liblease_cmds_la_SOURCES += lease_parser.h lease_parser.cc
liblease_cmds_la_SOURCES += lease_cmds_log.cc lease_cmds_log.h
liblease_cmds_la_SOURCES += load_unload.cc
liblease_cmds_la_SOURCES += version.cc
nodist_liblease_cmds_la_SOURCES = lease_cmds_messages.cc lease_cmds_messages.h

View File

@@ -35,22 +35,18 @@ namespace lease_cmds {
/// @brief Wrapper class around reservation command handlers.
class LeaseCmdsImpl {
public:
LeaseCmdsImpl();
~LeaseCmdsImpl();
/// @brief Parameters specified for reservation-get and reservation-del
///
/// As both call types (get and delete) need specify which reservation to
/// act on, they have the same set of parameters. In particular, those
/// two call types support the following sets of parameters:
/// - address
/// - subnet-id, identifier-type, identifier-value (v4)
/// - subnet-id, lease-type, iaid, identifier-type, identifier-value (v6)
///
/// This class stores those parameters and is used to pass them around.
class Parameters {
public:
/// @brief Parameters specified for reservation-get and reservation-del
///
/// As both call types (get and delete) need specify which reservation to
/// act on, they have the same set of parameters. In particular, those
/// two call types support the following sets of parameters:
/// - address
/// - subnet-id, identifier-type, identifier-value (v4)
/// - subnet-id, lease-type, iaid, identifier-type, identifier-value (v6)
///
/// This class stores those parameters and is used to pass them around.
class Parameters {
public:
/// @brief specifies type of query (by IP addr, by hwaddr, by DUID)
typedef enum {
@@ -107,44 +103,9 @@ public:
:addr("::"), query_type(TYPE_ADDR), lease_type(Lease::TYPE_NA),
iaid(0) {
}
};
private:
/// @brief Registers commands:
///
/// Registers:
/// - lease4-add
/// - lease6-add
/// - lease4-get
/// - lease6-get
/// - lease4-del
/// - lease6-del
/// - lease4-update
/// - lease6-update
/// - lease4-wipe
/// - lease6-wipe
/// @throw Unexpected if CommandMgr is not available (should not happen)
void registerCommands();
/// @brief Deregisters commands:
///
/// Deregisters:
/// - lease4-add
/// - lease6-add
/// - lease4-get
/// - lease6-get
/// - lease4-del
/// - lease6-del
/// - lease4-update
/// - lease6-update
/// - lease4-wipe
/// - lease6-wipe
///
/// @throw Unexpected if CommandMgr is not available (should not happen)
void deregisterCommands();
};
public:
/// @brief lease4-add, lease6-add command handler
///
/// This command attempts to add a lease.
@@ -192,7 +153,7 @@ private:
/// @param command should be 'lease4-add' or 'lease6-add'
/// @param args must contain host reservation definition.
/// @return result of the operation
static ConstElementPtr
ConstElementPtr
leaseAddHandler(const string& command, ConstElementPtr args);
/// @brief lease4-get, lease6-get command handler
@@ -237,7 +198,7 @@ private:
/// @param command "lease4-get" or "lease6-get"
/// @param args must contain host reservation definition.
/// @return result of the operation (includes lease details, if found)
static ConstElementPtr
ConstElementPtr
leaseGetHandler(const string& command, ConstElementPtr args);
/// @brief lease4-del command handler
@@ -267,7 +228,7 @@ private:
/// @param command should be 'lease4-del' (but it's ignored)
/// @param args must contain host reservation definition.
/// @return result of the operation (host will be included as parameters, if found)
static ConstElementPtr
ConstElementPtr
lease4DelHandler(const string& command, ConstElementPtr args);
/// @brief lease6-del command handler
@@ -300,7 +261,7 @@ private:
/// @param command should be 'lease6-del' (but it's ignored)
/// @param args must contain host reservation definition.
/// @return result of the operation (host will be included as parameters, if found)
static ConstElementPtr
ConstElementPtr
lease6DelHandler(const string& command, ConstElementPtr args);
/// @brief lease4-update handler
@@ -323,7 +284,7 @@ private:
///
/// @param command - should be "lease4-update", but it is ignored
/// @param args arguments that describe the lease being updated.
static ConstElementPtr
ConstElementPtr
lease4UpdateHandler(const string& command, ConstElementPtr args);
/// @brief lease6-update handler
@@ -347,7 +308,7 @@ private:
///
/// @param command - should be "lease6-update" (but it is ignored)
/// @param args arguments that describe the lease being updated.
static ConstElementPtr
ConstElementPtr
lease6UpdateHandler(const string& command, ConstElementPtr args);
/// @brief lease4-wipe handler
@@ -366,7 +327,7 @@ private:
/// }";
/// @param command - should be "lease4-wipe" (but is ignored)
/// @param args arguments that describe the lease being updated.
static ConstElementPtr
ConstElementPtr
lease4WipeHandler(const string& command, ConstElementPtr args);
/// @brief lease6-wipe handler
@@ -385,7 +346,7 @@ private:
/// }";
/// @param command - should be "lease4-wipe" (but is ignored)
/// @param args arguments that describe the lease being updated.
static ConstElementPtr
ConstElementPtr
lease6WipeHandler(const string& command, ConstElementPtr args);
/// @brief Extracts parameters required for reservation-get and reservation-del
@@ -397,64 +358,9 @@ private:
/// @param args arguments passed to command
/// @return parsed parameters
/// @throw BadValue if input arguments don't make sense.
static Parameters getParameters(bool v6, const ConstElementPtr& args);
Parameters getParameters(bool v6, const ConstElementPtr& args);
};
LeaseCmdsImpl::LeaseCmdsImpl() {
registerCommands();
}
LeaseCmdsImpl::~LeaseCmdsImpl() {
deregisterCommands();
}
void LeaseCmdsImpl::registerCommands() {
/// @todo: Use registration mechanism once #5314 is merged.
/// See #5321 discussion.
CommandMgr::instance().registerCommand("lease4-add",
boost::bind(&LeaseCmdsImpl::leaseAddHandler, _1, _2));
CommandMgr::instance().registerCommand("lease6-add",
boost::bind(&LeaseCmdsImpl::leaseAddHandler, _1, _2));
CommandMgr::instance().registerCommand("lease4-get",
boost::bind(&LeaseCmdsImpl::leaseGetHandler, _1, _2));
CommandMgr::instance().registerCommand("lease6-get",
boost::bind(&LeaseCmdsImpl::leaseGetHandler, _1, _2));
CommandMgr::instance().registerCommand("lease4-del",
boost::bind(&LeaseCmdsImpl::lease4DelHandler, _1, _2));
CommandMgr::instance().registerCommand("lease6-del",
boost::bind(&LeaseCmdsImpl::lease6DelHandler, _1, _2));
CommandMgr::instance().registerCommand("lease4-update",
boost::bind(&LeaseCmdsImpl::lease4UpdateHandler, _1, _2));
CommandMgr::instance().registerCommand("lease6-update",
boost::bind(&LeaseCmdsImpl::lease6UpdateHandler, _1, _2));
CommandMgr::instance().registerCommand("lease4-wipe",
boost::bind(&LeaseCmdsImpl::lease4WipeHandler, _1, _2));
CommandMgr::instance().registerCommand("lease6-wipe",
boost::bind(&LeaseCmdsImpl::lease6WipeHandler, _1, _2));
}
void LeaseCmdsImpl::deregisterCommands() {
/// @todo: Use deregistration mechanism once #5321 discussion is done
CommandMgr::instance().deregisterCommand("lease4-add");
CommandMgr::instance().deregisterCommand("lease6-add");
CommandMgr::instance().deregisterCommand("lease4-get");
CommandMgr::instance().deregisterCommand("lease6-get");
CommandMgr::instance().deregisterCommand("lease4-del");
CommandMgr::instance().deregisterCommand("lease6-del");
CommandMgr::instance().deregisterCommand("lease4-update");
CommandMgr::instance().deregisterCommand("lease6-update");
CommandMgr::instance().deregisterCommand("lease4-wipe");
CommandMgr::instance().deregisterCommand("lease6-wipe");
}
ConstElementPtr
LeaseCmdsImpl::leaseAddHandler(const std::string& name,
ConstElementPtr params) {
@@ -883,13 +789,49 @@ LeaseCmdsImpl::lease6WipeHandler(const string& /*cmd*/, ConstElementPtr params)
}
}
ConstElementPtr
LeaseCmds::leaseAddHandler(const string& command, ConstElementPtr args) {
return(impl_->leaseAddHandler(command, args));
}
ConstElementPtr
LeaseCmds::leaseGetHandler(const string& command, ConstElementPtr args) {
return(impl_->leaseGetHandler(command, args));
}
ConstElementPtr
LeaseCmds::lease4DelHandler(const string& command, ConstElementPtr args) {
return(impl_->lease4DelHandler(command, args));
}
ConstElementPtr
LeaseCmds::lease6DelHandler(const string& command, ConstElementPtr args) {
return(impl_->lease6DelHandler(command, args));
}
ConstElementPtr
LeaseCmds::lease4UpdateHandler(const string& command, ConstElementPtr args) {
return(impl_->lease4UpdateHandler(command, args));
}
ConstElementPtr
LeaseCmds::lease6UpdateHandler(const string& command, ConstElementPtr args) {
return(impl_->lease6UpdateHandler(command, args));
}
ConstElementPtr
LeaseCmds::lease4WipeHandler(const string& command, ConstElementPtr args) {
return(impl_->lease4WipeHandler(command, args));
}
ConstElementPtr
LeaseCmds::lease6WipeHandler(const string& command, ConstElementPtr args) {
return(impl_->lease6WipeHandler(command, args));
}
LeaseCmds::LeaseCmds()
:impl_(new LeaseCmdsImpl()) {
}
LeaseCmds::~LeaseCmds() {
impl_.reset();
}
};
};

View File

@@ -7,6 +7,7 @@
#ifndef LEASE_CMDS_H
#define LEASE_CMDS_H
#include <cc/data.h>
#include <boost/shared_ptr.hpp>
namespace isc {
@@ -15,48 +16,262 @@ namespace lease_cmds {
/// @brief Forward declaration of implementation class.
class LeaseCmdsImpl;
/// @brief A wrapper class that provides convenient initialization to the library.
/// @brief Implements the logic for processing commands pertaining to
/// lease manipulation.
///
/// This is a wrapper class that simply registers extra commands when
/// instantiated and deregisters them when the instance is destroyed.
///
/// For an actual implementation, see @ref LeaseCmdsImpl class in lease_cmds.cc file.
/// This class is used by the callouts implementing command handlers for
/// lease manipulations.
class LeaseCmds {
public:
/// @brief Initializes additional lease commands.
/// @brief Constructor.
///
/// It registers the following commands:
/// - lease4-add
/// - lease6-add
/// - lease4-get
/// - lease6-get
/// - lease4-del
/// - lease6-del
/// - lease4-update
/// - lease6-update
/// - lease4-del-all
/// - lease6-del-all
///
/// @throw Unexpected If any of the above fails.
/// It creates an instance of the @c LeaseCmdsImpl.
LeaseCmds();
/// @brief Destructor
/// @brief lease4-add, lease6-add command handler
///
/// Unregisters commands:
/// - lease4-add
/// - lease6-add
/// - lease4-get
/// - lease6-get
/// - lease4-del
/// - lease6-del
/// - lease4-update
/// - lease6-update
/// - lease4-del-all
/// - lease6-del-all
~LeaseCmds();
private:
/// This command attempts to add a lease.
///
/// An example full command looks as follows. Note that the args
/// parameter is expected to contain the "arguments" portion of it.
/// This function covers both v4 and v6 leases.
///
/// Example command for v4:
/// {
/// "command": "lease4-add",
/// "parameters": {
/// "address": "192.0.2.1",
/// "hwaddr": "00:01:02:03:04:05",
/// "client-id": "this-is-a-client",
/// "valid-lft": 3600,
/// "expire": 12345678,
/// "subnet-id": 1,
/// "fqdn-fwd": true,
/// "fqdn-rev": true,
/// "hostname": "myhost.example.org",
/// "state": 0
/// }
/// }
/// Example command for v6:
/// {
/// "command": "lease6-add",
/// "arguments": {
/// "subnet-id": 66,
/// "ip-address": "2001:db8:abcd::",
/// "type": "IA_PD",
/// "prefix-len": 48,
/// "duid": "01:02:03:04:05:06:07:08",
/// "iaid": 1234,
/// "preferred-lft": 500,
/// "valid-lft": 1000,
/// "expire": 12345678,
/// "fqdn-fwd": true,
/// "fqdn-rev": true,
/// "hostname": "urania.example.org""
/// }
/// }
///
/// @param command should be 'lease4-add' or 'lease6-add'
/// @param args must contain host reservation definition.
/// @return result of the operation
data::ConstElementPtr
leaseAddHandler(const std::string& command, data::ConstElementPtr args);
/// @brief lease4-get, lease6-get command handler
///
/// This command attempts to retrieve a lease that match selected criteria.
/// The following types of parameters are supported:
/// - (subnet-id, address) for both v4 and v6
/// - (subnet-id, identifier-type, identifier) for v4
/// - (subnet-id, type, iana, identifier-type, identifier) for v6
///
/// Example command for query by (subnet-id, address):
/// {
/// "command": "lease4-get",
/// "arguments": {
/// "subnet-id": 1,
/// "ip-address": "192.0.2.202"
/// }
/// }
///
/// Example command for query by (subnet-id, identifier-type, identifier)
/// {
/// "command": "lease4-get",
/// "arguments": {
/// "subnet-id": 1,
/// "identifier-type": "hw-address",
/// "identifier": "00:01:02:03:04:05"
/// }
/// }
///
/// Example command for query by (subnet-id, type, iana, identifier-type,
/// identifier):
/// {
/// "command": "lease6-get",
/// "arguments": {
/// "subnet-id": 66,
/// "iaid": 42,
/// "type": "IA_NA",
/// "identifier-type": "duid",
/// "identifier": "77:77:77:77:77:77:77:77"
/// }
/// }
/// @param command "lease4-get" or "lease6-get"
/// @param args must contain host reservation definition.
/// @return result of the operation (includes lease details, if found)
data::ConstElementPtr
leaseGetHandler(const std::string& command, data::ConstElementPtr args);
/// @brief lease4-del command handler
///
/// This command attempts to delete an IPv4 lease that match selected
/// criteria. Two types of parameters are supported: (subnet-id, address) or
/// (subnet-id, identifier-type, identifier).
///
/// Example command for deletion by (subnet-id, address):
/// {
/// "command": "lease4-del",
/// "arguments": {
/// "subnet-id": 1,
/// "ip-address": "192.0.2.202"
/// }
/// }
///
/// Example command for deletion by (subnet-id, identifier-type, identifier)
/// {
/// "command": "lease4-del",
/// "arguments": {
/// "subnet-id": 1,
/// "identifier-type": "hw-address",
/// "identifier": "00:01:02:03:04:05"
/// }
/// }";
/// @param command should be 'lease4-del' (but it's ignored)
/// @param args must contain host reservation definition.
/// @return result of the operation (host will be included as parameters, if found)
data::ConstElementPtr
lease4DelHandler(const std::string& command, data::ConstElementPtr args);
/// @brief lease6-del command handler
///
/// This command attempts to delete a lease that match selected criteria.
/// Two types of parameters are supported: (subnet-id, address) or
/// (subnet-id, type, iaid, identifier-type, identifier).
///
/// Example command for deletion by (subnet-id, address):
/// {
/// "command": "lease6-del",
/// "arguments": {
/// "subnet-id": 1,
/// "ip-address": "192.0.2.202"
/// }
/// }
///
/// Example command for deletion by (subnet-id, type, iaid, identifier-type,
/// identifier):
/// {
/// "command": "lease6-del",
/// "arguments": {
/// "subnet-id": 1,
/// "type": "IA_NA",
/// "iaid": 123456,
/// "identifier-type": "hw-address",
/// "identifier": "00:01:02:03:04:05"
/// }
/// }";
/// @param command should be 'lease6-del' (but it's ignored)
/// @param args must contain host reservation definition.
/// @return result of the operation (host will be included as parameters, if found)
data::ConstElementPtr
lease6DelHandler(const std::string& command, data::ConstElementPtr args);
/// @brief lease4-update handler
///
/// This command attempts to update existing IPv4 lease. The parameters
/// specified will replace existing lease. The only condition is that
/// the IP address must not change. If you want to change the IP address,
/// please use lease4-del and lease4-add instead.
///
/// Example command:
/// {
/// "command": "lease4-update",
/// "arguments": {
/// "subnet-id": 44,
/// "ip-address": "192.0.2.1",
/// "hw-address": "1a:1b:1c:1d:1e:1f",
/// "hostname": "newhostname.example.org"
/// }
/// };
///
/// @param command - should be "lease4-update", but it is ignored
/// @param args arguments that describe the lease being updated.
data::ConstElementPtr
lease4UpdateHandler(const std::string& command, data::ConstElementPtr args);
/// @brief lease6-update handler
///
/// This command attempts to update existing IPv6 lease. The parameters
/// specified will replace existing lease. The only condition is that
/// the IP address must not change. If you want to change the IP address,
/// please use lease6-del and lease6-add instead.
///
/// Example command:
/// {
/// "command": "lease6-update",
/// "arguments": {
/// "subnet-id": 66,
/// "ip-address": "2001:db8::1",
/// "iaid": 7654321,
/// "duid": "88:88:88:88:88:88:88:88",
/// "hostname": "newhostname.example.org"
/// }
/// }";
///
/// @param command - should be "lease6-update" (but it is ignored)
/// @param args arguments that describe the lease being updated.
data::ConstElementPtr
lease6UpdateHandler(const std::string& command, data::ConstElementPtr args);
/// @brief lease4-wipe handler
///
/// This commands attempts to remove all IPv4 leases from a specific
/// subnet. Currently the leases are removed from the database,
/// without any processing (like calling hooks or doing DDNS
/// cleanups).
///
/// Example command:
/// {\n"
/// "command": "lease4-wipe",\n"
/// "arguments": {"
/// "subnet-id": 44
/// }\n"
/// }";
/// @param command - should be "lease4-wipe" (but is ignored)
/// @param args arguments that describe the lease being updated.
data::ConstElementPtr
lease4WipeHandler(const std::string& command, data::ConstElementPtr args);
/// @brief lease6-wipe handler
///
/// This commands attempts to remove all IPv4 leases from a specific
/// subnet. Currently the leases are removed from the database,
/// without any processing (like calling hooks or doing DDNS
/// cleanups).
///
/// Example command:
/// {\n"
/// "command": "lease4-wipe",\n"
/// "arguments": {"
/// "subnet-id": 44
/// }\n"
/// }";
/// @param command - should be "lease4-wipe" (but is ignored)
/// @param args arguments that describe the lease being updated.
data::ConstElementPtr
lease6WipeHandler(const std::string& command, data::ConstElementPtr args);
private:
/// Pointer to the actual implementation
boost::shared_ptr<LeaseCmdsImpl> impl_;
};

View File

@@ -0,0 +1,331 @@
// Copyright (C) 2017 Internet Systems Consortium, Inc. ("ISC")
//
// This Source Code Form is subject to the terms of the End User License
// Agreement. See COPYING file in the premium/ directory.
// Functions accessed by the hooks framework use C linkage to avoid the name
// mangling that accompanies use of the C++ compiler as well as to avoid
// issues related to namespaces.
#include <lease_cmds.h>
#include <lease_cmds_log.h>
#include <cc/command_interpreter.h>
#include <hooks/hooks.h>
using namespace isc::config;
using namespace isc::data;
using namespace isc::hooks;
using namespace isc::lease_cmds;
extern "C" {
/// @brief This is a command callout for 'lease4-add' command.
///
/// @param handle Callout handle used to retrieve a command and
/// provide a response.
/// @return 0 if this callout has been invoked successfully,
/// 1 otherwise.
int lease4_add(CalloutHandle& handle) {
ConstElementPtr response;
try {
ConstElementPtr command;
handle.getArgument("command", command);
ConstElementPtr args;
std::string cmd_name = parseCommand(args, command);
LeaseCmds lease_cmds;
response = lease_cmds.leaseAddHandler(cmd_name, args);
} catch (const std::exception& ex) {
response = createAnswer(CONTROL_RESULT_ERROR, ex.what());
LOG_ERROR(lease_cmds_logger, LEASE_CMDS_ADD4_MALFORMED)
.arg(ex.what());
}
handle.setArgument("response", response);
return (0);
}
/// @brief This is a command callout for 'lease6-add' command.
///
/// @param handle Callout handle used to retrieve a command and
/// provide a response.
/// @return 0 if this callout has been invoked successfully,
/// 1 otherwise.
int lease6_add(CalloutHandle& handle) {
ConstElementPtr response;
try {
ConstElementPtr command;
handle.getArgument("command", command);
ConstElementPtr args;
std::string cmd_name = parseCommand(args, command);
LeaseCmds lease_cmds;
response = lease_cmds.leaseAddHandler(cmd_name, args);
} catch (const std::exception& ex) {
response = createAnswer(CONTROL_RESULT_ERROR, ex.what());
LOG_ERROR(lease_cmds_logger, LEASE_CMDS_ADD6_MALFORMED)
.arg(ex.what());
}
handle.setArgument("response", response);
return (0);
}
/// @brief This is a command callout for 'lease4-get' command.
///
/// @param handle Callout handle used to retrieve a command and
/// provide a response.
/// @return 0 if this callout has been invoked successfully,
/// 1 otherwise.
int lease4_get(CalloutHandle& handle) {
ConstElementPtr response;
try {
ConstElementPtr command;
handle.getArgument("command", command);
ConstElementPtr args;
std::string cmd_name = parseCommand(args, command);
LeaseCmds lease_cmds;
response = lease_cmds.leaseGetHandler(cmd_name, args);
} catch (const std::exception& ex) {
response = createAnswer(CONTROL_RESULT_ERROR, ex.what());
LOG_ERROR(lease_cmds_logger, LEASE_CMDS_GET4_MALFORMED)
.arg(ex.what());
}
handle.setArgument("response", response);
return (0);
}
/// @brief This is a command callout for 'lease6-get' command.
///
/// @param handle Callout handle used to retrieve a command and
/// provide a response.
/// @return 0 if this callout has been invoked successfully,
/// 1 otherwise.
int lease6_get(CalloutHandle& handle) {
ConstElementPtr response;
try {
ConstElementPtr command;
handle.getArgument("command", command);
ConstElementPtr args;
std::string cmd_name = parseCommand(args, command);
LeaseCmds lease_cmds;
response = lease_cmds.leaseGetHandler(cmd_name, args);
} catch (const std::exception& ex) {
response = createAnswer(CONTROL_RESULT_ERROR, ex.what());
LOG_ERROR(lease_cmds_logger, LEASE_CMDS_GET6_MALFORMED)
.arg(ex.what());
}
handle.setArgument("response", response);
return (0);
}
/// @brief This is a command callout for 'lease4-update' command.
///
/// @param handle Callout handle used to retrieve a command and
/// provide a response.
/// @return 0 if this callout has been invoked successfully,
/// 1 otherwise.
int lease4_update(CalloutHandle& handle) {
ConstElementPtr response;
try {
ConstElementPtr command;
handle.getArgument("command", command);
ConstElementPtr args;
std::string cmd_name = parseCommand(args, command);
LeaseCmds lease_cmds;
response = lease_cmds.lease4UpdateHandler(cmd_name, args);
} catch (const std::exception& ex) {
response = createAnswer(CONTROL_RESULT_ERROR, ex.what());
LOG_ERROR(lease_cmds_logger, LEASE_CMDS_UPDATE4_MALFORMED)
.arg(ex.what());
}
handle.setArgument("response", response);
return (0);
}
/// @brief This is a command callout for 'lease6-update' command.
///
/// @param handle Callout handle used to retrieve a command and
/// provide a response.
/// @return 0 if this callout has been invoked successfully,
/// 1 otherwise.
int lease6_update(CalloutHandle& handle) {
ConstElementPtr response;
try {
ConstElementPtr command;
handle.getArgument("command", command);
ConstElementPtr args;
std::string cmd_name = parseCommand(args, command);
LeaseCmds lease_cmds;
response = lease_cmds.lease6UpdateHandler(cmd_name, args);
} catch (const std::exception& ex) {
response = createAnswer(CONTROL_RESULT_ERROR, ex.what());
LOG_ERROR(lease_cmds_logger, LEASE_CMDS_UPDATE6_MALFORMED)
.arg(ex.what());
}
handle.setArgument("response", response);
return (0);
}
/// @brief This is a command callout for 'lease4-del' command.
///
/// @param handle Callout handle used to retrieve a command and
/// provide a response.
/// @return 0 if this callout has been invoked successfully,
/// 1 otherwise.
int lease4_del(CalloutHandle& handle) {
ConstElementPtr response;
try {
ConstElementPtr command;
handle.getArgument("command", command);
ConstElementPtr args;
std::string cmd_name = parseCommand(args, command);
LeaseCmds lease_cmds;
response = lease_cmds.lease4DelHandler(cmd_name, args);
} catch (const std::exception& ex) {
response = createAnswer(CONTROL_RESULT_ERROR, ex.what());
LOG_ERROR(lease_cmds_logger, LEASE_CMDS_DEL4_MALFORMED)
.arg(ex.what());
}
handle.setArgument("response", response);
return (0);
}
/// @brief This is a command callout for 'lease6-del' command.
///
/// @param handle Callout handle used to retrieve a command and
/// provide a response.
/// @return 0 if this callout has been invoked successfully,
/// 1 otherwise.
int lease6_del(CalloutHandle& handle) {
ConstElementPtr response;
try {
ConstElementPtr command;
handle.getArgument("command", command);
ConstElementPtr args;
std::string cmd_name = parseCommand(args, command);
LeaseCmds lease_cmds;
response = lease_cmds.lease6DelHandler(cmd_name, args);
} catch (const std::exception& ex) {
response = createAnswer(CONTROL_RESULT_ERROR, ex.what());
LOG_ERROR(lease_cmds_logger, LEASE_CMDS_DEL6_MALFORMED)
.arg(ex.what());
}
handle.setArgument("response", response);
return (0);
}
/// @brief This is a command callout for 'lease4-wipe' command.
///
/// @param handle Callout handle used to retrieve a command and
/// provide a response.
/// @return 0 if this callout has been invoked successfully,
/// 1 otherwise.
int lease4_wipe(CalloutHandle& handle) {
ConstElementPtr response;
try {
ConstElementPtr command;
handle.getArgument("command", command);
ConstElementPtr args;
std::string cmd_name = parseCommand(args, command);
LeaseCmds lease_cmds;
response = lease_cmds.lease4WipeHandler(cmd_name, args);
} catch (const std::exception& ex) {
response = createAnswer(CONTROL_RESULT_ERROR, ex.what());
LOG_ERROR(lease_cmds_logger, LEASE_CMDS_WIPE4_MALFORMED)
.arg(ex.what());
}
handle.setArgument("response", response);
return (0);
}
/// @brief This is a command callout for 'lease6-wipe' command.
///
/// @param handle Callout handle used to retrieve a command and
/// provide a response.
/// @return 0 if this callout has been invoked successfully,
/// 1 otherwise.
int lease6_wipe(CalloutHandle& handle) {
ConstElementPtr response;
try {
ConstElementPtr command;
handle.getArgument("command", command);
ConstElementPtr args;
std::string cmd_name = parseCommand(args, command);
LeaseCmds lease_cmds;
response = lease_cmds.lease6WipeHandler(cmd_name, args);
} catch (const std::exception& ex) {
response = createAnswer(CONTROL_RESULT_ERROR, ex.what());
LOG_ERROR(lease_cmds_logger, LEASE_CMDS_WIPE6_MALFORMED)
.arg(ex.what());
}
handle.setArgument("response", response);
return (0);
}
/// @brief This function is called when the library is loaded.
///
/// @param handle library handle
/// @return 0 when initialization is successful, 1 otherwise
int load(LibraryHandle& handle) {
handle.registerCommandCallout("lease4-add", lease4_add);
handle.registerCommandCallout("lease6-add", lease6_add);
handle.registerCommandCallout("lease4-get", lease4_get);
handle.registerCommandCallout("lease6-get", lease6_get);
handle.registerCommandCallout("lease4-del", lease4_del);
handle.registerCommandCallout("lease6-del", lease6_del);
handle.registerCommandCallout("lease4-update", lease4_update);
handle.registerCommandCallout("lease6-update", lease6_update);
handle.registerCommandCallout("lease4-wipe", lease4_wipe);
handle.registerCommandCallout("lease6-wipe", lease6_wipe);
LOG_INFO(lease_cmds_logger, LEASE_CMDS_INIT_OK);
return (0);
}
/// @brief This function is called when the library is unloaded.
///
/// @return 0 if deregistration was successful, 1 otherwise
int unload() {
LOG_INFO(lease_cmds_logger, LEASE_CMDS_DEINIT_OK);
return (0);
}
} // end extern "C"

View File

@@ -1,13 +1,28 @@
# Copyright (C) 2017 Internet Systems Consortium, Inc. ("ISC")
% LEASE_CMDS_INIT_FAILED loading Lease Commands hooks library failed: %1
This error message indicates an error during loading the Lease Commands
hooks library. The details of the error are provided as argument of
the log message.
% LEASE_CMDS_ADD4 lease4-add command successful (parameters: %1)
The lease4-add command has been successful. Parameters of the host
added are logged.
% LEASE_CMDS_INIT_OK loading Lease Commands hooks library successful
This info message indicates that the Lease Commands hooks library has been
loaded successfully. Enjoy!
% LEASE_CMDS_ADD4_FAILED lease4-add command failed (parameters: %1, reason: %2)
The lease4-add command has failed. Both the reason as well as the
parameters passed are logged.
% LEASE_CMDS_ADD4_MALFORMED lease4-add is malformed, reason: %1
The JSON text received by the lease4-add handler was not a properly formed
control channel command.
% LEASE_CMDS_ADD6 lease6-add command successful (parameters: %1)
The lease6-add command has been successful. Parameters of the host
added are logged.
% LEASE_CMDS_ADD6_FAILED Lease6-add command failed (parameters: %1, reason: %2)
The lease6-add command has failed. Both the reason as well as the
parameters passed are logged.
% LEASE_CMDS_ADD6_MALFORMED lease6-add is malformed, reason: %1
The JSON text received by the lease6-add handler was not a properly formed
control channel command.
% LEASE_CMDS_DEINIT_FAILED unloading Lease Commands hooks library failed: %1
This error message indicates an error during unloading the Lease Commands
@@ -18,34 +33,59 @@ the log message.
This info message indicates that the Lease Commands hooks library has been
removed successfully.
% LEASE_CMDS_ADD4_FAILED lease4-add command failed (parameters: %1, reason: %2)
The lease4-add command has failed. Both the reason as well as the
parameters passed are logged.
% LEASE_CMDS_ADD6_FAILED Lease6-add command failed (parameters: %1, reason: %2)
The lease6-add command has failed. Both the reason as well as the
parameters passed are logged.
% LEASE_CMDS_ADD4 lease4-add command successful (parameters: %1)
The lease4-add command has been successful. Parameters of the host
added are logged.
% LEASE_CMDS_ADD6 lease6-add command successful (parameters: %1)
The lease6-add command has been successful. Parameters of the host
added are logged.
% LEASE_CMDS_DEL4 lease4-del command successful (parameters: %1)
The attempt to delete an IPv4 lease (lease4-del command) has been successful.
Parameters of the host removed are logged.
% LEASE_CMDS_DEL4_FAILED lease4-del command failed (parameters: %1, reason: %2)
The attempt to delete an IPv4 lease (lease4-del command) has failed. Both the
reason as well as the parameters passed are logged.
% LEASE_CMDS_DEL6_FAILED lease6-del command failed (parameters: %1, reason: %2)
The attempt to delete an IPv6 lease (lease4-del command) has failed. Both the
reason as well as the parameters passed are logged.
% LEASE_CMDS_DEL4 lease4-del command successful (parameters: %1)
The attempt to delete an IPv4 lease (lease4-del command) has been successful.
Parameters of the host removed are logged.
% LEASE_CMDS_DEL4_MALFORMED lease4-del is malformed, reason: %1
The JSON text received by the lease4-del handler was not a properly formed
control channel command.
% LEASE_CMDS_DEL6 lease4-del command successful (parameters: %1)
The attempt to delete an IPv4 lease (lease4-del command) has been successful.
Parameters of the host removed are logged.
% LEASE_CMDS_DEL6_FAILED lease6-del command failed (parameters: %1, reason: %2)
The attempt to delete an IPv6 lease (lease4-del command) has failed. Both the
reason as well as the parameters passed are logged.
% LEASE_CMDS_DEL6_MALFORMED lease6-del is malformed, reason: %1
The JSON text received by the lease6-del handler was not a properly formed
control channel command.
% LEASE_CMDS_GET4_MALFORMED lease4-get is malformed, reason: %1
The JSON text received by the lease4-get handler was not a properly formed
control channel command.
% LEASE_CMDS_GET6_MALFORMED lease6-get is malformed, reason: %1
The JSON text received by the lease6-get handler was not a properly formed
control channel command.
% LEASE_CMDS_INIT_FAILED loading Lease Commands hooks library failed: %1
This error message indicates an error during loading the Lease Commands
hooks library. The details of the error are provided as argument of
the log message.
% LEASE_CMDS_INIT_OK loading Lease Commands hooks library successful
This info message indicates that the Lease Commands hooks library has been
loaded successfully. Enjoy!
% LEASE_CMDS_UPDATE4_MALFORMED lease4-update is malformed, reason: %1
The JSON text received by the lease4-update handler was not a properly formed
control channel command.
% LEASE_CMDS_UPDATE6_MALFORMED lease6-update is malformed, reason: %1
The JSON text received by the lease6-update handler was not a properly formed
control channel command.
% LEASE_CMDS_WIPE4_MALFORMED lease4-wipe is malformed, reason: %1
The JSON text received by the lease4-wipe handler was not a properly formed
control channel command.
% LEASE_CMDS_WIPE6_MALFORMED lease6-wipe is malformed, reason: %1
The JSON text received by the lease6-wipe handler was not a properly formed
control channel command.

View File

@@ -1,63 +0,0 @@
// Copyright (C) 2017 Internet Systems Consortium, Inc. ("ISC")
//
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
/// @file load_unload.cc Defines the load and unload hooks library functions.
#include <config.h>
#include <lease_cmds.h>
#include <lease_cmds_log.h>
#include <string>
#include <hooks/hooks.h>
#include <exceptions/exceptions.h>
using namespace isc::hooks;
using namespace isc::lease_cmds;
boost::shared_ptr<LeaseCmds> instance;
extern "C" {
/// @brief This function is called when the library is loaded.
///
/// This function creates LeaseCmds object that registers
/// additional commands.
///
/// @param handle library handle (ignored)
/// @return 0 when initialization is successful, 1 otherwise
int load(LibraryHandle& /*handle*/) {
try {
instance.reset(new LeaseCmds());
} catch (const isc::Unexpected& ex) {
LOG_ERROR(lease_cmds_logger, LEASE_CMDS_INIT_FAILED)
.arg(ex.what());
return (1);
}
LOG_INFO(lease_cmds_logger, LEASE_CMDS_INIT_OK);
return (0);
}
/// @brief This function is called when the library is unloaded.
///
/// This function creates LeaseCmds object that deregisters
/// additional commands.
///
/// @return 0 if deregistration was successful, 1 otherwise
int unload() {
try {
instance.reset();
} catch (const isc::Unexpected& ex) {
LOG_ERROR(lease_cmds_logger, LEASE_CMDS_DEINIT_FAILED)
.arg(ex.what());
return (1);
}
LOG_INFO(lease_cmds_logger, LEASE_CMDS_DEINIT_OK);
return (0);
}
}