27 #include <boost/bind.hpp> 28 #include <boost/scoped_ptr.hpp> 40 namespace lease_cmds {
81 if (txt ==
"address") {
82 return (Parameters::TYPE_ADDR);
83 }
else if (txt ==
"hw-address") {
84 return (Parameters::TYPE_HWADDR);
85 }
else if (txt ==
"duid") {
86 return (Parameters::TYPE_DUID);
87 }
else if (txt ==
"client-id") {
88 return (Parameters::TYPE_CLIENT_ID);
91 << txt <<
", the only supported values are: " 92 "address, hw-address, duid");
108 :addr(
"::"), query_type(TYPE_ADDR), lease_type(
Lease::TYPE_NA),
242 string txt =
"malformed command";
246 extractCommand(handle);
247 v4 = (cmd_name_ ==
"lease4-add");
249 txt =
"(missing parameters)";
254 txt = cmd_args_->str();
261 bool force_create =
false;
264 lease4 = parser.
parse(config, cmd_args_, force_create);
268 resp <<
"Lease for address " << lease4->addr_.toText()
269 <<
", subnet-id " << lease4->subnet_id_ <<
" added.";
274 lease6 = parser.
parse(config, cmd_args_, force_create);
279 resp <<
"Lease for address " << lease6->addr_.toText()
280 <<
", subnet-id " << lease6->subnet_id_ <<
" added.";
282 resp <<
"Lease for prefix " << lease6->addr_.toText()
283 <<
"/" << static_cast<int>(lease6->prefixlen_)
284 <<
", subnet-id " << lease6->subnet_id_ <<
" added.";
289 }
catch (
const std::exception& ex) {
293 setErrorResponse(handle, ex.what());
298 v4 ? LEASE_CMDS_ADD4 : LEASE_CMDS_ADD6).arg(txt);
299 setSuccessResponse(handle, resp.str());
307 if (!params || params->getType() != Element::map) {
315 if (params->contains(
"type")) {
316 string t = params->get(
"type")->stringValue();
317 if (t ==
"IA_NA" || t ==
"0") {
319 }
else if (t ==
"IA_TA" || t ==
"1") {
321 }
else if (t ==
"IA_PD" || t ==
"2") {
323 }
else if (t ==
"V4" || t ==
"3") {
327 << t <<
", only supported values are: IA_NA, IA_TA," 334 if (tmp->getType() != Element::string) {
342 txt <<
"Invalid " << (v6 ?
"IPv6" :
"IPv4")
343 <<
" address specified: " << tmp->stringValue();
351 tmp = params->get(
"subnet-id");
355 if (tmp->getType() != Element::integer) {
360 if (params->contains(
"iaid")) {
361 x.
iaid = params->get(
"iaid")->intValue();
370 if (!type || type->getType() != Element::string) {
372 " and 'identifier-type' is either missing or not a string.");
374 if (!ident || ident->getType() != Element::string) {
376 " and 'identifier' is either missing or not a string.");
381 x.
query_type = Parameters::txtToType(type->stringValue());
384 case Parameters::TYPE_HWADDR: {
389 case Parameters::TYPE_CLIENT_ID: {
393 case Parameters::TYPE_DUID: {
398 case Parameters::TYPE_ADDR: {
405 " is not supported.");
418 extractCommand(handle);
419 v4 = (cmd_name_ ==
"lease4-get");
421 p = getParameters(!v4, cmd_args_);
423 case Parameters::TYPE_ADDR: {
432 case Parameters::TYPE_HWADDR:
436 "requires hwaddr to be specified");
445 case Parameters::TYPE_DUID:
449 "requires duid to be specified");
459 case Parameters::TYPE_CLIENT_ID:
463 "requires client-id to be specified");
477 }
catch (
const std::exception& ex) {
478 setErrorResponse(handle, ex.what());
484 lease_json = lease4->toElement();
486 "IPv4 lease found.", lease_json);
487 setResponse(handle, response);
488 }
else if (!v4 && lease6) {
489 lease_json = lease6->toElement();
491 "IPv6 lease found.", lease_json);
492 setResponse(handle, response);
505 extractCommand(handle);
506 v4 = (cmd_name_ ==
"lease4-get-all");
508 ElementPtr leases_json = Element::createList();
517 if (subnets->getType() != Element::list) {
521 const std::vector<ElementPtr>& subnet_ids = subnets->listValue();
522 for (
auto subnet_id = subnet_ids.begin();
523 subnet_id != subnet_ids.end();
525 if ((*subnet_id)->getType() != Element::integer) {
532 for (
auto lease : leases) {
534 leases_json->add(lease_json);
539 for (
auto lease : leases) {
541 leases_json->add(lease_json);
550 for (
auto lease : leases) {
552 leases_json->add(lease_json);
556 for (
auto lease : leases) {
558 leases_json->add(lease_json);
563 std::ostringstream s;
564 s << leases_json->size()
565 <<
" IPv" << (v4 ?
"4" :
"6")
566 <<
" lease(s) found.";
568 args->set(
"leases", leases_json);
574 setResponse(handle, response);
576 }
catch (
const std::exception& ex) {
577 setErrorResponse(handle, ex.what());
588 extractCommand(handle);
589 v4 = (cmd_name_ ==
"lease4-get-page");
606 if (from->getType() != Element::string) {
610 boost::scoped_ptr<IOAddress> from_address;
612 if (from->stringValue() ==
"start") {
613 from_address.reset(
new IOAddress(v4 ?
"0.0.0.0" :
"::"));
617 from_address.reset(
new IOAddress(from->stringValue()));
622 "a valid IPv" << (v4 ?
"4" :
"6") <<
" address");
627 if (v4 && (!from_address->isV4())) {
629 <<
" is not an IPv4 address");
631 }
else if (!v4 && from_address->isV4()) {
633 <<
" is not an IPv6 address");
643 if (page_limit->getType() != Element::integer) {
648 size_t page_limit_value = static_cast<size_t>(page_limit->intValue());
650 ElementPtr leases_json = Element::createList();
659 for (
auto lease : leases) {
661 leases_json->add(lease_json);
670 for (
auto lease : leases) {
672 leases_json->add(lease_json);
677 std::ostringstream s;
678 s << leases_json->size()
679 <<
" IPv" << (v4 ?
"4" :
"6")
680 <<
" lease(s) found.";
684 args->set(
"leases", leases_json);
685 args->set(
"count", Element::create(static_cast<int64_t>(leases_json->size())));
693 setResponse(handle, response);
695 }
catch (std::exception& ex) {
696 setErrorResponse(handle, ex.what());
709 extractCommand(handle);
710 p = getParameters(
false, cmd_args_);
713 case Parameters::TYPE_ADDR: {
719 case Parameters::TYPE_HWADDR:
722 "requires hwaddr to be specified");
733 addr = lease4->addr_;
736 case Parameters::TYPE_CLIENT_ID:
739 "requires client-id to be specified");
750 addr = lease4->addr_;
753 case Parameters::TYPE_DUID:
764 setSuccessResponse(handle,
"IPv4 lease deleted.");
768 }
catch (
const std::exception& ex) {
769 setErrorResponse(handle, ex.what());
782 extractCommand(handle);
783 p = getParameters(
true, cmd_args_);
786 case Parameters::TYPE_ADDR: {
792 case Parameters::TYPE_HWADDR:
796 case Parameters::TYPE_DUID:
799 "requires duid to be specified");
811 addr = lease6->addr_;
821 setSuccessResponse(handle,
"IPv6 lease deleted.");
825 }
catch (
const std::exception& ex) {
826 setErrorResponse(handle, ex.what());
836 extractCommand(handle);
847 bool force_create =
false;
851 lease4 = parser.
parse(config, cmd_args_, force_create);
854 setSuccessResponse(handle,
"IPv4 lease added.");
858 setSuccessResponse(handle,
"IPv4 lease updated.");
860 }
catch (
const std::exception& ex) {
861 setErrorResponse(handle, ex.what());
871 extractCommand(handle);
882 bool force_create =
false;
886 lease6 = parser.
parse(config, cmd_args_, force_create);
890 setSuccessResponse(handle,
"IPv6 lease added.");
893 setSuccessResponse(handle,
"IPv6 lease updated.");
895 }
catch (
const std::exception& ex) {
896 setErrorResponse(handle, ex.what());
906 extractCommand(handle);
915 if (cmd_args_ && cmd_args_->contains(
"subnet-id")) {
916 id = parser.
getUint32(cmd_args_,
"subnet-id");
930 for (
auto sub : *subs) {
932 ids <<
" " << sub->getID();
937 tmp <<
"Deleted " << num <<
" IPv4 lease(s) from subnet(s)" << ids.str();
940 setResponse(handle, response);
941 }
catch (
const std::exception& ex) {
942 setErrorResponse(handle, ex.what());
952 extractCommand(handle);
967 if (cmd_args_ && cmd_args_->contains(
"subnet-id")) {
968 id = parser.
getUint32(cmd_args_,
"subnet-id");
982 for (
auto sub : *subs) {
984 ids <<
" " << sub->getID();
989 tmp <<
"Deleted " << num <<
" IPv6 lease(s) from subnet(s)" << ids.str();
992 setResponse(handle, response);
993 }
catch (
const std::exception& ex) {
994 setErrorResponse(handle, ex.what());
1003 return(impl_->leaseAddHandler(handle));
1008 return(impl_->leaseGetHandler(handle));
1013 return (impl_->leaseGetAllHandler(handle));
1018 return (impl_->leaseGetPageHandler(handle));
1023 return(impl_->lease4DelHandler(handle));
1028 return(impl_->lease6DelHandler(handle));
1033 return(impl_->lease4UpdateHandler(handle));
1038 return(impl_->lease6UpdateHandler(handle));
1043 return(impl_->lease4WipeHandler(handle));
1048 return(impl_->lease6WipeHandler(handle));
1051 LeaseCmds::LeaseCmds()
boost::shared_ptr< DUID > DuidPtr
virtual void updateLease4(const Lease4Ptr &lease4)=0
Updates IPv4 lease.
Parameters()
Default constructor.
static ClientIdPtr fromText(const std::string &text)
Create client identifier from the textual format.
Parser for Lease4 structure.
HWAddrPtr hwaddr
Specifies hardware address (used when query_type is TYPE_HWADDR)
#define LOG_INFO(LOGGER, MESSAGE)
Macro to conveniently test info output and log it.
ConstElementPtr createAnswer(const int status_code, const std::string &text, const ConstElementPtr &arg)
const int CONTROL_RESULT_SUCCESS
Status code indicating a successful operation.
virtual size_t wipeLeases4(const SubnetID &subnet_id)=0
Virtual method which removes specified leases.
A generic exception that is thrown if a parameter given to a method or function is considered invalid...
boost::shared_ptr< HWAddr > HWAddrPtr
Shared pointer to a hardware address structure.
boost::multi_index_container< Subnet6Ptr, boost::multi_index::indexed_by< boost::multi_index::random_access< boost::multi_index::tag< SubnetRandomAccessIndexTag > >, boost::multi_index::ordered_unique< boost::multi_index::tag< SubnetSubnetIdIndexTag >, boost::multi_index::const_mem_fun< Subnet, SubnetID, &Subnet::getID > >, boost::multi_index::ordered_unique< boost::multi_index::tag< SubnetPrefixIndexTag >, boost::multi_index::const_mem_fun< Subnet, std::string, &Subnet::toText > > >> Subnet6Collection
A collection of Subnet6 objects.
virtual isc::dhcp::Lease6Ptr parse(isc::dhcp::ConstSrvConfigPtr &cfg, const isc::data::ConstElementPtr &lease_info, bool &force_create)
Parses Element tree and tries to convert to Lease4.
An abstract API for lease database.
static CfgMgr & instance()
returns a single instance of Configuration Manager
std::vector< Lease4Ptr > Lease4Collection
A collection of IPv4 leases.
#define LOG_ERROR(LOGGER, MESSAGE)
Macro to conveniently test error output and log it.
the lease contains IPv6 prefix (for prefix delegation)
const int CONTROL_RESULT_ERROR
Status code indicating a general failure.
boost::shared_ptr< Element > ElementPtr
SrvConfigPtr getCurrentCfg()
Returns a pointer to the current configuration.
static DUID fromText(const std::string &text)
Create DUID from the textual format.
Type query_type
specifies parameter types (true = query by address, false = query by identifier-type,...
SubnetID subnet_id
Specifies subnet-id (always used)
boost::shared_ptr< const CfgSubnets4 > ConstCfgSubnets4Ptr
Const pointer.
Holds DUID (DHCPv6 Unique Identifier)
const int CONTROL_RESULT_EMPTY
Status code indicating that the specified command was completed correctly, but failed to produce any ...
static const IOAddress & IPV6_ZERO_ADDRESS()
Returns an IPv6 zero address.
#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...
isc::log::Logger lease_cmds_logger("lease-cmds-hooks")
boost::shared_ptr< const SrvConfig > ConstSrvConfigPtr
Const pointer to the SrvConfig.
boost::shared_ptr< Lease4 > Lease4Ptr
Pointer to a Lease4 structure.
Per-packet callout handle.
Wrapper class around reservation command handlers.
boost::shared_ptr< const CfgSubnets6 > ConstCfgSubnets6Ptr
Const pointer.
Parser for Lease6 structure.
static const IOAddress & IPV4_ZERO_ADDRESS()
Returns an address set to all zeros.
boost::shared_ptr< const Element > ConstElementPtr
std::vector< Lease6Ptr > Lease6Collection
A collection of IPv6 leases.
virtual Lease6Ptr getLease6(Lease::Type type, const isc::asiolink::IOAddress &addr) const =0
Returns existing IPv6 lease for a given IPv6 address.
virtual Lease4Collection getLeases4(SubnetID subnet_id) const =0
Returns all IPv4 leases for the particular subnet identifier.
IOAddress addr
Specifies IPv4/v6 address (used when query_type is TYPE_ADDR)
boost::shared_ptr< ClientId > ClientIdPtr
Shared pointer to a Client ID.
bool isV6() const
Convenience function to check for an IPv6 address.
the lease contains temporary IPv6 address
Type
specifies type of query (by IP addr, by hwaddr, by DUID)
bool isV4() const
Convenience function to check for an IPv4 address.
uint32_t getUint32(isc::data::ConstElementPtr scope, const std::string &name)
Returns a value converted to uint32_t.
the lease contains non-temporary IPv6 address
Lease::Type lease_type
Lease type (NA,TA or PD) used for v6 leases.
query by IP address (either v4 or v6)
Defines the logger used by the top-level component of kea-dhcp-ddns.
boost::multi_index_container< Subnet4Ptr, boost::multi_index::indexed_by< boost::multi_index::random_access< boost::multi_index::tag< SubnetRandomAccessIndexTag > >, boost::multi_index::ordered_unique< boost::multi_index::tag< SubnetSubnetIdIndexTag >, boost::multi_index::const_mem_fun< Subnet, SubnetID, &Subnet::getID > >, boost::multi_index::ordered_unique< boost::multi_index::tag< SubnetPrefixIndexTag >, boost::multi_index::const_mem_fun< Subnet, std::string, &Subnet::toText > >, boost::multi_index::ordered_non_unique< boost::multi_index::tag< SubnetServerIdIndexTag >, boost::multi_index::const_mem_fun< Network4, asiolink::IOAddress, &Network4::getServerId > > >> Subnet4Collection
A collection of Subnet4 objects.
This file contains several functions and constants that are used for handling commands and responses ...
Base class that command handler implementers may use for common tasks.
a common structure for IPv4 and IPv6 leases
static HWAddr fromText(const std::string &text, const uint16_t htype=HTYPE_ETHER)
Creates instance of the hardware address from textual format.
Type
Type of lease or pool.
A generic exception that is thrown if a function is called in a prohibited way.
Parameters specified for lease commands.
Hardware type that represents information from DHCPv4 packet.
static Type txtToType(const std::string &txt)
Attempts to covert text to one of specified types.
virtual bool addLease(const Lease4Ptr &lease)=0
Adds an IPv4 lease.
query by hardware address (v4 only)
virtual size_t wipeLeases6(const SubnetID &subnet_id)=0
Virtual method which removes specified leases.
virtual Lease4Ptr getLease4(const isc::asiolink::IOAddress &addr) const =0
Returns an IPv4 lease for specified IPv4 address.
isc::dhcp::DuidPtr duid
Specifies identifier value (used when query_type is TYPE_DUID)
Wraps value holding size of the page with leases.
The IOAddress class represents an IP addresses (version agnostic)
static LeaseMgr & instance()
Return current lease manager.
virtual isc::dhcp::Lease4Ptr parse(isc::dhcp::ConstSrvConfigPtr &cfg, const isc::data::ConstElementPtr &lease_info, bool &force_create)
Parses Element tree and tries to convert to Lease4.
virtual Lease6Collection getLeases6(Lease::Type type, const DUID &duid, uint32_t iaid) const =0
Returns existing IPv6 leases for a given DUID+IA combination.
boost::shared_ptr< Lease6 > Lease6Ptr
Pointer to a Lease6 structure.
virtual void updateLease6(const Lease6Ptr &lease6)=0
Updates IPv6 lease.
uint32_t SubnetID
Unique identifier for a subnet (both v4 and v6)
isc::dhcp::ClientIdPtr client_id
Specifies identifier value (used when query_type is TYPE_CLIENT_ID)
uint32_t iaid
IAID identifier used for v6 leases.