37#include <boost/algorithm/string.hpp>
38#include <boost/scoped_ptr.hpp>
61const int128_t uint32_min = numeric_limits<uint32_t>::min();
62const int128_t uint32_max = numeric_limits<uint32_t>::max();
107 if (txt ==
"hw-address") {
109 }
else if (txt ==
"duid") {
111 }
else if (txt ==
"client-id") {
115 << txt <<
", the only supported values are: "
116 "hw-address, duid, client-id");
414 const int control_result,
415 const std::string& error_message)
const;
428 short family = AF_INET)
const;
455 if (!user_context || (user_context->getType() !=
Element::map)) {
462 return (
isc->get(
"relay-info"));
512 if (lease->stateRegistered()) {
517 if (force_create && !existing) {
521 "lost race between calls to get and add");
536 << lease->addr_ <<
" either because the lease has been "
537 "deleted or it has changed in the database, in both cases a "
538 "retry might succeed");
549 if (force_create && !existing) {
553 "lost race between calls to get and add");
560 if (existing->stateRegistered() && !lease->stateRegistered()) {
563 }
else if (!existing->stateRegistered() && lease->stateRegistered()) {
565 <<
" can't be registered");
576 if ((!old_extended_info && !extended_info) ||
577 (old_extended_info && extended_info &&
578 (*old_extended_info == *extended_info))) {
588 << lease->addr_ <<
" either because the lease has been "
589 "deleted or it has changed in the database, in both cases a "
590 "retry might succeed");
603 string lease_address =
"unknown";
614 bool force_create =
false;
621 lease_address = lease4->addr_.toText();
629 if (resource_handler.
tryLock4(lease4->addr_)) {
633 "ResourceBusy: IP address:" << lease4->addr_
634 <<
" could not be added.");
643 resp <<
"Lease for address " << lease4->addr_.toText()
644 <<
", subnet-id " << lease4->subnet_id_ <<
" added.";
650 lease_address = lease6->addr_.toText();
658 if (resource_handler.
tryLock(lease6->type_, lease6->addr_)) {
662 "ResourceBusy: IP address:" << lease6->addr_
663 <<
" could not be added.");
673 resp <<
"Lease for address " << lease6->addr_.toText()
674 <<
", subnet-id " << lease6->subnet_id_ <<
" added.";
676 resp <<
"Lease for prefix " << lease6->addr_.toText()
677 <<
"/" <<
static_cast<int>(lease6->prefixlen_)
678 <<
", subnet-id " << lease6->subnet_id_ <<
" added.";
689 }
catch (
const std::exception& ex) {
712 if (params->contains(
"update-ddns")) {
725 if (params->contains(
"type")) {
726 string t = params->get(
"type")->stringValue();
727 if (t ==
"IA_NA" || t ==
"0") {
729 }
else if (t ==
"IA_PD" || t ==
"2") {
731 }
else if (t ==
"V4" || t ==
"3") {
735 <<
", only supported values are: IA_NA, IA_PD and V4");
749 txt <<
"Invalid " << (v6 ?
"IPv6" :
"IPv4")
750 <<
" address specified: " << tmp->stringValue();
758 tmp = params->get(
"subnet-id");
766 if ((tmp128 < uint32_min) || (tmp128 > uint32_max)) {
771 tmp = params->get(
"iaid");
779 tmp128 = tmp->intValue();
780 if ((tmp128 < uint32_min) || (tmp128 > uint32_max)) {
783 x.
iaid =
static_cast<uint32_t
>(tmp128);
794 " and 'identifier-type' is either missing or not a string.");
798 " and 'identifier' is either missing or not a string.");
810 }
catch (
const std::exception& ex) {
817 }
catch (
const std::exception& ex) {
825 }
catch (
const std::exception& ex) {
831 " is not supported.");
861 "requires hwaddr to be specified");
874 "requires duid to be specified");
888 "requires client-id to be specified");
902 }
catch (
const std::exception& ex) {
912 lease_json = lease4->toElement();
914 "IPv4 lease found.", lease_json);
916 }
else if (!v4 && lease6) {
917 lease_json = lease6->toElement();
919 "IPv6 lease found.", lease_json);
949 const std::vector<ElementPtr>& subnet_ids = subnets->listValue();
950 for (
auto const& subnet_id : subnet_ids) {
954 auto subnet_id_ = subnet_id->intValue();
955 if ((subnet_id_ < uint32_min) || (subnet_id_ > uint32_max)) {
963 for (
auto const& lease : leases) {
965 leases_json->add(lease_json);
970 for (
auto const& lease : leases) {
972 leases_json->add(lease_json);
981 for (
auto const& lease : leases) {
983 leases_json->add(lease_json);
987 for (
auto const& lease : leases) {
989 leases_json->add(lease_json);
994 std::ostringstream s;
995 s << leases_json->size()
996 <<
" IPv" << (v4 ?
"4" :
"6")
997 <<
" lease(s) found.";
999 args->set(
"leases", leases_json);
1007 }
catch (
const std::exception& ex) {
1041 boost::scoped_ptr<IOAddress> from_address;
1043 if (from->stringValue() ==
"start") {
1044 from_address.reset(
new IOAddress(v4 ?
"0.0.0.0" :
"::"));
1048 from_address.reset(
new IOAddress(from->stringValue()));
1053 "a valid IPv" << (v4 ?
"4" :
"6") <<
" address");
1058 if (v4 && (!from_address->isV4())) {
1060 <<
" is not an IPv4 address");
1062 }
else if (!v4 && from_address->isV4()) {
1064 <<
" is not an IPv6 address");
1078 auto tmp128 = page_limit->intValue();
1079 if ((tmp128 < uint32_min) || (tmp128 > uint32_max)) {
1088 size_t page_limit_value =
static_cast<size_t>(tmp128);
1099 for (
auto const& lease : leases) {
1101 leases_json->add(lease_json);
1110 for (
auto const& lease : leases) {
1112 leases_json->add(lease_json);
1117 std::ostringstream s;
1118 s << leases_json->size()
1119 <<
" IPv" << (v4 ?
"4" :
"6")
1120 <<
" lease(s) found.";
1124 args->set(
"leases", leases_json);
1125 args->set(
"count",
Element::create(
static_cast<int64_t
>(leases_json->size())));
1135 }
catch (
const std::exception& ex) {
1148 v4 = (
cmd_name_ ==
"lease4-get-by-hw-address");
1166 if (hw_address->stringValue().empty()) {
1173 }
catch (
const std::exception& ex) {
1181 for (
auto const& lease : leases) {
1183 leases_json->add(lease_json);
1188 for (
auto const& lease : leases) {
1190 leases_json->add(lease_json);
1194 std::ostringstream s;
1195 s << leases_json->size()
1196 <<
" IPv" << (v4 ?
"4" :
"6")
1197 <<
" lease(s) found.";
1199 args->set(
"leases", leases_json);
1207 }
catch (
const std::exception& ex) {
1239 }
catch (
const std::exception& ex) {
1246 for (
auto const& lease : leases) {
1248 leases_json->add(lease_json);
1251 std::ostringstream s;
1252 s << leases_json->size() <<
" IPv4 lease(s) found.";
1254 args->set(
"leases", leases_json);
1262 }
catch (
const std::exception& ex) {
1294 }
catch (
const std::exception& ex) {
1301 for (
auto const& lease : leases) {
1303 leases_json->add(lease_json);
1306 std::ostringstream s;
1307 s << leases_json->size() <<
" IPv6 lease(s) found.";
1309 args->set(
"leases", leases_json);
1317 }
catch (
const std::exception& ex) {
1330 v4 = (
cmd_name_ ==
"lease4-get-by-state");
1343 uint32_t state_ = 0;
1346 std::string state_str = state->stringValue();
1347 if (state_str.empty()) {
1349 }
else if ((state_str ==
"default") || (state_str ==
"assigned")) {
1351 }
else if (state_str ==
"declined") {
1353 }
else if (state_str ==
"expired-reclaimed") {
1355 }
else if (state_str ==
"released") {
1357 }
else if (state_str ==
"registered") {
1361 <<
") is not recognized");
1364 state_ = state->intValue();
1375 auto id128 = subnet->intValue();
1376 if ((id128 < uint32_min) || (id128 > uint32_max)) {
1379 subnet_id_ =
static_cast<SubnetID>(id128);
1387 for (
auto const& lease : leases) {
1389 leases_json->add(lease_json);
1395 for (
auto const& lease : leases) {
1397 leases_json->add(lease_json);
1401 std::ostringstream s;
1402 s << leases_json->size()
1403 <<
" IPv" << (v4 ?
"4" :
"6")
1404 <<
" lease(s) found with state ";
1410 if (subnet_id_ != 0) {
1411 s <<
" in subnet " << subnet_id_;
1415 args->set(
"leases", leases_json);
1423 }
catch (
const std::exception& ex) {
1436 v4 = (
cmd_name_ ==
"lease4-get-by-hostname");
1454 std::string hostname_ = hostname->stringValue();
1456 if (hostname_.empty()) {
1459 boost::algorithm::to_lower(hostname_);
1466 for (
auto const& lease : leases) {
1468 leases_json->add(lease_json);
1474 for (
auto const& lease : leases) {
1476 leases_json->add(lease_json);
1480 std::ostringstream s;
1481 s << leases_json->size()
1482 <<
" IPv" << (v4 ?
"4" :
"6")
1483 <<
" lease(s) found.";
1485 args->set(
"leases", leases_json);
1493 }
catch (
const std::exception& ex) {
1521 "requires hwaddr to be specified");
1535 "requires client-id to be specified");
1568 }
catch (
const std::exception& ex) {
1576 .arg(lease4->addr_.toText());
1591 auto deleted_leases =
cmd_args_->get(
"deleted-leases");
1594 if (!deleted_leases && !leases) {
1600 if (deleted_leases && (deleted_leases->getType() !=
Element::list)) {
1612 std::list<std::pair<Parameters, Lease6Ptr> > parsed_deleted_list;
1613 if (deleted_leases) {
1614 auto leases_list = deleted_leases->listValue();
1617 for (
auto const& lease_params : leases_list) {
1622 parsed_deleted_list.push_back(std::make_pair(p, lease));
1628 std::list<Lease6Ptr> parsed_leases_list;
1633 auto leases_list = leases->listValue();
1634 for (
auto const& lease_params : leases_list) {
1642 parsed_leases_list.push_back(lease6);
1647 size_t success_count = 0;
1650 if (!parsed_deleted_list.empty()) {
1653 for (
auto const& lease_params_pair : parsed_deleted_list) {
1658 auto lease = lease_params_pair.second;
1671 if (!failed_deleted_list) {
1682 "lease not found"));
1686 }
catch (
const std::exception& ex) {
1688 if (!failed_deleted_list) {
1701 if (!parsed_leases_list.empty()) {
1705 for (
auto const& lease : parsed_leases_list) {
1708 std::ostringstream text;
1716 if (resource_handler.
tryLock(lease->type_, lease->addr_)) {
1720 "ResourceBusy: IP address:" << lease->addr_
1721 <<
" could not be updated.");
1730 }
catch (
const std::exception& ex) {
1737 if (!failed_leases_list) {
1752 if (failed_deleted_list || failed_leases_list) {
1757 if (failed_deleted_list) {
1758 args->set(
"failed-deleted-leases", failed_deleted_list);
1762 if (failed_leases_list) {
1763 args->set(
"failed-leases", failed_leases_list);
1768 std::ostringstream resp_text;
1769 resp_text <<
"Bulk apply of " << success_count <<
" IPv6 leases completed.";
1776 .arg(success_count);
1778 }
catch (
const std::exception& ex) {
1818 "requires duid to be specified");
1848 }
catch (
const std::exception& ex) {
1857 .arg(lease6->addr_.toText());
1875 bool force_create =
false;
1887 if (resource_handler.
tryLock4(lease4->addr_)) {
1891 "ResourceBusy: IP address:" << lease4->addr_
1892 <<
" could not be updated.");
1903 .arg(lease4->addr_.toText());
1912 }
catch (
const std::exception& ex) {
1937 bool force_create =
false;
1949 if (resource_handler.
tryLock(lease6->type_, lease6->addr_)) {
1953 "ResourceBusy: IP address:" << lease6->addr_
1954 <<
" could not be updated.");
1965 .arg(lease6->addr_.toText());
1974 }
catch (
const std::exception& ex) {
2009 int64_t previous_assigned = 0;
2011 if (assigned_observation) {
2012 previous_assigned = assigned_observation->getInteger().first;
2018 int64_t previous_declined = 0;
2020 if (declined_observation) {
2021 previous_declined = declined_observation->getInteger().first;
2026 static_cast<int64_t
>(0));
2030 static_cast<int64_t
>(0));
2037 "assigned-addresses")));
2044 "declined-addresses")));
2061 for (
auto const& sub : *subs) {
2063 ids <<
" " << sub->getID();
2066 static_cast<int64_t
>(0));
2070 static_cast<int64_t
>(0));
2075 "assigned-addresses")));
2082 "declined-addresses")));
2095 tmp <<
"Deleted " << num <<
" IPv4 lease(s) from subnet(s)" << ids.str();
2099 }
catch (
const std::exception& ex) {
2141 int64_t previous_assigned_na = 0;
2143 if (assigned_na_observation) {
2144 previous_assigned_na = assigned_na_observation->getInteger().first;
2150 int64_t previous_assigned_pd = 0;
2152 if (assigned_pd_observation) {
2153 previous_assigned_pd = assigned_pd_observation->getInteger().first;
2159 int64_t previous_declined = 0;
2161 if (declined_observation) {
2162 previous_declined = declined_observation->getInteger().first;
2167 static_cast<int64_t
>(0));
2171 static_cast<int64_t
>(0));
2175 static_cast<int64_t
>(0));
2179 static_cast<int64_t
>(0));
2193 "declined-addresses")));
2221 for (
auto const& sub : *subs) {
2223 ids <<
" " << sub->getID();
2226 static_cast<int64_t
>(0));
2230 static_cast<int64_t
>(0));
2234 static_cast<int64_t
>(0));
2238 static_cast<int64_t
>(0));
2250 "declined-addresses")));
2274 tmp <<
"Deleted " << num <<
" IPv6 lease(s) from subnet(s)" << ids.str();
2278 }
catch (
const std::exception& ex) {
2303 lease6.reset(
new Lease6());
2304 lease6->addr_ = parameters.
addr;
2313 if (!parameters.
duid) {
2315 "requires duid to be specified");
2335 short family)
const {
2348 }
catch (
const std::exception& ex) {
2350 <<
"' is not a valid IP address.");
2355 << (family == AF_INET6 ?
"IPv6" :
"IPv4")
2356 <<
" address specified: " << param->stringValue());
2364 std::stringstream ss;
2374 ss <<
"DDNS updating is not enabled";
2380 ss <<
"No lease found for: " << addr.
toText();
2382 }
else if (lease->hostname_.empty()) {
2383 ss <<
"Lease for: " << addr.
toText()
2384 <<
", has no hostname, nothing to update";
2386 }
else if (!lease->fqdn_fwd_ && !lease->fqdn_rev_) {
2387 ss <<
"Neither forward nor reverse updates enabled for lease for: "
2394 ss <<
"NCR generated for: " << addr.
toText()
2395 <<
", hostname: " << lease->hostname_;
2401 }
catch (
const std::exception& ex) {
2412 std::stringstream ss;
2422 ss <<
"DDNS updating is not enabled";
2428 ss <<
"No lease found for: " << addr.
toText();
2430 }
else if (lease->hostname_.empty()) {
2431 ss <<
"Lease for: " << addr.
toText()
2432 <<
", has no hostname, nothing to update";
2434 }
else if (!lease->fqdn_fwd_ && !lease->fqdn_rev_) {
2435 ss <<
"Neither forward nor reverse updates enabled for lease for: "
2442 ss <<
"NCR generated for: " << addr.
toText()
2443 <<
", hostname: " << lease->hostname_;
2449 }
catch (
const std::exception& ex) {
2462 const int control_result,
2463 const std::string& error_message)
const {
2476 failed_lease_map->set(
"error-message",
Element::create(error_message));
2478 return (failed_lease_map);
2500 std::string filename;
2506 filename =
file->stringValue();
2507 }
catch (
const std::exception& ex) {
2518 s << (v4 ?
"IPv4" :
"IPv6")
2519 <<
" lease database into '"
2520 << filename <<
"'.";
2533 }
catch (
const std::exception& ex) {
2544 uint32_t offer_lifetime;
2545 callout_handle.
getArgument(
"offer_lifetime", offer_lifetime);
2546 if (!offer_lifetime) {
2557 callout_handle.
getArgument(
"response4", response);
2560 if (!leases || leases->empty() || !((*leases)[0])) {
2566 if (mgr->evaluateVariables(query, response, lease)) {
2571 " the lease with address " << lease->addr_ <<
2572 " either because the lease has been"
2573 " deleted or it has changed in the database");
2574 }
catch (
const std::exception& ex) {
2576 << query->getLabel() <<
", :" << ex.what());
2589 callout_handle.
getArgument(
"response4", response);
2598 if (leases->empty() || !response || (response->getType() !=
DHCPACK)) {
2608 if (mgr->evaluateVariables(query, response, lease)) {
2613 " the lease with address " << lease->addr_ <<
2614 " either because the lease has been"
2615 " deleted or it has changed in the database");
2616 }
catch (
const std::exception& ex) {
2618 << query->getLabel() <<
", :" << ex.what());
2631 callout_handle.
getArgument(
"response6", response);
2639 if (leases->empty() || !response) {
2645 for (
auto lease : *leases) {
2657 if (lease->valid_lft_) {
2659 if (mgr->evaluateVariables(query, response, lease)) {
2666 .arg(lease->addr_.toText())
2667 .arg(query->getLabel());
2668 }
catch (
const std::exception& ex) {
2671 .arg(query->getLabel())
2672 .arg(lease->addr_.toText())
2679 <<
" leases failed to update for "
2680 << query->getLabel());
2686 return (impl_->leaseAddHandler(handle));
2691 return (impl_->lease6BulkApplyHandler(handle));
2696 return (impl_->leaseGetHandler(handle));
2701 return (impl_->leaseGetAllHandler(handle));
2706 return (impl_->leaseGetPageHandler(handle));
2711 return (impl_->leaseGetByHwAddressHandler(handle));
2716 return (impl_->leaseGetByClientIdHandler(handle));
2721 return (impl_->leaseGetByDuidHandler(handle));
2726 return (impl_->leaseGetByStateHandler(handle));
2731 return (impl_->leaseGetByHostnameHandler(handle));
2736 return (impl_->lease4DelHandler(handle));
2741 return (impl_->lease6DelHandler(handle));
2746 return (impl_->lease4UpdateHandler(handle));
2751 return (impl_->lease6UpdateHandler(handle));
2757 return (impl_->lease4WipeHandler(handle));
2763 return (impl_->lease6WipeHandler(handle));
2768 return (impl_->lease4ResendDdnsHandler(handle));
2773 return (impl_->lease6ResendDdnsHandler(handle));
2778 return (impl_->leaseWriteHandler(handle));
2788 impl_->lease4Offer(callout_handle, mgr);
2794 impl_->leases4Committed(callout_handle, mgr);
2800 impl_->leases6Committed(callout_handle, mgr);
static DUID fromText(const std::string &text)
Create DUID from the textual format.
static const DUID & EMPTY()
Defines the constant "empty" DUID.
static ElementPtr create(const Position &pos=ZERO_POSITION())
Create a NullElement.
static ElementPtr createMap(const Position &pos=ZERO_POSITION())
Creates an empty MapElement type ElementPtr.
static ElementPtr createList(const Position &pos=ZERO_POSITION())
Creates an empty ListElement type ElementPtr.
Exception thrown when a command failed due to a conflict.
A generic exception that is thrown if a parameter given to a method is considered invalid in that con...
virtual const char * what() const
Returns a C-style character string of the cause of the exception.
A generic exception that is thrown if an unrecoverable error occurs.
A generic exception that is thrown if a function is called in a prohibited way.
A generic exception that is thrown if a parameter given to a method or function is considered invalid...
A generic exception that is thrown when an unexpected error condition occurs.
The IOAddress class represents an IP addresses (version agnostic).
std::string toText() const
Convert the address to a string.
bool isV6() const
Convenience function to check for an IPv6 address.
bool isV4() const
Convenience function to check for an IPv4 address.
bool isV6Zero() const
Convenience function to check if it is an IPv4 zero address.
short getFamily() const
Returns the address family.
static const IOAddress & IPV6_ZERO_ADDRESS()
Returns an IPv6 zero address.
Base class that command handler implementers may use for common tasks.
std::string cmd_name_
Stores the command name extracted by a call to extractCommand.
void setErrorResponse(hooks::CalloutHandle &handle, const std::string &text, int status=CONTROL_RESULT_ERROR)
Set the callout argument "response" to indicate an error.
data::ConstElementPtr cmd_args_
Stores the command arguments extracted by a call to extractCommand.
void extractCommand(hooks::CalloutHandle &handle)
Extracts the command name and arguments from a Callout handle.
void setSuccessResponse(hooks::CalloutHandle &handle, const std::string &text)
Set the callout argument "response" to indicate success.
void setResponse(hooks::CalloutHandle &handle, data::ConstElementPtr &response)
Set the callout argument "response" to the given response.
uint32_t getUint32(isc::data::ConstElementPtr scope, const std::string &name)
Returns a value converted to uint32_t.
std::string validatePath(const std::string data_path) const
Validates a file path against the supported directory for DHCP data.
static CfgMgr & instance()
returns a single instance of Configuration Manager
SrvConfigPtr getCurrentCfg()
Returns a pointer to the current configuration.
static ClientIdPtr fromText(const std::string &text)
Create client identifier from the textual format.
Holds DUID (DHCPv6 Unique Identifier).
static TrackingLeaseMgr & instance()
Return current lease manager.
virtual Lease6Collection getLeases6(Lease::Type type, const DUID &duid, uint32_t iaid) const =0
Returns existing IPv6 leases for a given DUID+IA combination.
virtual size_t wipeLeases6(const SubnetID &subnet_id)=0
Virtual method which removes specified leases.
static void updateStatsOnAdd(const Lease4Ptr &lease)
Update in-memory stats when adding a v4 lease.
virtual Lease4Collection getLeases4(SubnetID subnet_id) const =0
Returns all IPv4 leases for the particular subnet identifier.
virtual void writeLeases6(const std::string &filename)=0
Write V6 leases to a file.
virtual Lease4Ptr getLease4(const isc::asiolink::IOAddress &addr) const =0
Returns an IPv4 lease for specified IPv4 address.
static void updateStatsOnUpdate(const Lease4Ptr &existing, const Lease4Ptr &lease)
Update in-memory stats when updating a v4 lease.
virtual bool addLease(const Lease4Ptr &lease)=0
Adds an IPv4 lease.
virtual size_t wipeLeases4(const SubnetID &subnet_id)=0
Virtual method which removes specified leases.
virtual void updateLease4(const Lease4Ptr &lease4)=0
Updates IPv4 lease.
virtual void writeLeases4(const std::string &filename)=0
Write V4 leases to a file.
static void updateStatsOnDelete(const Lease4Ptr &lease)
Update in-memory stats when deleting a v4 lease.
virtual Lease6Ptr getLease6(Lease::Type type, const isc::asiolink::IOAddress &addr) const =0
Returns existing IPv6 lease for a given IPv6 address.
virtual void updateLease6(const Lease6Ptr &lease6)=0
Updates IPv6 lease.
Wraps value holding size of the page with leases.
Attempt to update lease that was not there.
Resource race avoidance RAII handler for DHCPv4.
bool tryLock4(const asiolink::IOAddress &addr)
Tries to acquires a resource.
Resource race avoidance RAII handler.
bool tryLock(Lease::Type type, const asiolink::IOAddress &addr)
Tries to acquires a resource.
Per-packet callout handle.
void getArgument(const std::string &name, T &value) const
Get argument.
Parser for Lease4 structure.
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.
Parser for Lease6 structure.
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.
Parameters specified for lease commands.
uint32_t iaid
IAID identifier used for v6 leases.
HWAddrPtr hwaddr
Specifies hardware address (used when query_type is TYPE_HWADDR).
Lease::Type lease_type
Lease type (NA,TA or PD) used for v6 leases.
Type query_type
specifies parameter types
Type
specifies type of query (by IP addr, by hwaddr, by DUID)
@ TYPE_DUID
query by DUID (v6 only)
@ TYPE_CLIENT_ID
query by client identifier (v4 only).
@ TYPE_HWADDR
query by hardware address (v4 only)
@ TYPE_ADDR
query by IP address (either v4 or v6)
isc::dhcp::ClientIdPtr client_id
Specifies identifier value (used when query_type is TYPE_CLIENT_ID).
static Type txtToType(const std::string &txt)
Attempts to covert text to one of specified types.
Parameters()
Default constructor.
bool updateDDNS
Indicates whether or not DNS should be updated.
IOAddress addr
Specifies IPv4/v6 address (used when query_type is TYPE_ADDR).
SubnetID subnet_id
Specifies subnet-id (always used).
isc::dhcp::DuidPtr duid
Specifies identifier value (used when query_type is TYPE_DUID).
Wrapper class around reservation command handlers.
int lease4DelHandler(CalloutHandle &handle)
lease4-del command handler
IOAddress getAddressParam(ConstElementPtr params, const std::string name, short family=AF_INET) const
static void lease4Offer(CalloutHandle &callout_handle, BindingVariableMgrPtr mgr)
lease4_offer hookpoint handler.
ElementPtr createFailedLeaseMap(const Lease::Type &lease_type, const IOAddress &lease_address, const DuidPtr &duid, const int control_result, const std::string &error_message) const
Returns a map holding brief information about a lease which failed to be deleted, updated or added.
int leaseGetByStateHandler(hooks::CalloutHandle &handle)
lease4-get-by-state and lease6-get-by-state commands handler
static bool addOrUpdate6(Lease6Ptr lease, bool force_create)
Add or update lease.
int lease6BulkApplyHandler(CalloutHandle &handle)
lease6-bulk-apply command handler
int leaseGetByDuidHandler(hooks::CalloutHandle &handle)
lease6-get-by-duid command handler
int lease6UpdateHandler(CalloutHandle &handle)
lease6-update handler
int leaseGetPageHandler(hooks::CalloutHandle &handle)
lease4-get-page, lease6-get-page commands handler
Lease6Ptr getIPv6LeaseForDelete(const Parameters ¶meters) const
Convenience function fetching IPv6 address to be used to delete a lease.
int leaseGetByHostnameHandler(hooks::CalloutHandle &handle)
lease4-get-by-hostname and lease6-get-by-hostname commands handler
int lease6DelHandler(CalloutHandle &handle)
lease6-del command handler
int leaseGetByHwAddressHandler(hooks::CalloutHandle &handle)
lease4-get-by-hw-address, lease6-get-by-hw-address command handler
static ConstElementPtr getExtendedInfo6(const Lease6Ptr &lease)
Get DHCPv6 extended info.
int leaseGetHandler(CalloutHandle &handle)
lease4-get, lease6-get command handler
static bool addOrUpdate4(Lease4Ptr lease, bool force_create)
Add or update lease.
static void leases4Committed(CalloutHandle &callout_handle, BindingVariableMgrPtr mgr)
leases4_committed hookpoint handler.
int lease6WipeHandler(CalloutHandle &handle)
lease6-wipe handler
int leaseGetByClientIdHandler(hooks::CalloutHandle &handle)
lease4-get-by-client-id command handler
int lease6ResendDdnsHandler(CalloutHandle &handle)
lease6-resend-ddns handler
int leaseAddHandler(CalloutHandle &handle)
lease4-add, lease6-add command handler
int lease4ResendDdnsHandler(CalloutHandle &handle)
lease4-resend-ddns handler
Parameters getParameters(bool v6, const ConstElementPtr &args)
Extracts parameters required for reservation-get and reservation-del.
static void leases6Committed(CalloutHandle &callout_handle, BindingVariableMgrPtr mgr)
leases6_committed hookpoint handler.
int lease4UpdateHandler(CalloutHandle &handle)
lease4-update handler
int lease4WipeHandler(CalloutHandle &handle)
lease4-wipe handler
int leaseGetAllHandler(CalloutHandle &handle)
lease4-get-all, lease6-get-all commands handler
int leaseWriteHandler(CalloutHandle &handle)
lease4-write handler, lease6-write handler
int lease4ResendDdnsHandler(hooks::CalloutHandle &handle)
lease4-resend-ddns command handler
int leaseGetByStateHandler(hooks::CalloutHandle &handle)
lease4-get-by-state and lease6-get-by-state commands handler
int lease6WipeHandler(hooks::CalloutHandle &handle)
lease6-wipe handler
int leaseGetPageHandler(hooks::CalloutHandle &handle)
lease4-get-page, lease6-get-page commands handler
int lease6DelHandler(hooks::CalloutHandle &handle)
lease6-del command handler
int leaseGetAllHandler(hooks::CalloutHandle &handle)
lease4-get-all, lease6-get-all commands handler
int leaseGetByHostnameHandler(hooks::CalloutHandle &handle)
lease4-get-by-hostname and lease6-get-by-hostname commands handler
void leases4Committed(hooks::CalloutHandle &callout_handle, BindingVariableMgrPtr mgr)
leases4_committed hookpoint handler.
int lease4DelHandler(hooks::CalloutHandle &handle)
lease4-del command handler
int leaseWriteHandler(hooks::CalloutHandle &handle)
lease4-write handler, lease6-write handler
int leaseAddHandler(hooks::CalloutHandle &handle)
lease4-add, lease6-add command handler
int leaseGetByClientIdHandler(hooks::CalloutHandle &handle)
lease4-get-by-client-id command handler
void lease4Offer(hooks::CalloutHandle &callout_handle, BindingVariableMgrPtr mgr)
lease4_offer hookpoint handler.
int lease4UpdateHandler(hooks::CalloutHandle &handle)
lease4-update handler
int leaseGetHandler(hooks::CalloutHandle &handle)
lease4-get, lease6-get command handler
int leaseGetByHwAddressHandler(hooks::CalloutHandle &handle)
lease4-get-by-hw-address, lease6-get-by-hw-address command handler
int lease6UpdateHandler(hooks::CalloutHandle &handle)
lease6-update handler
void leases6Committed(hooks::CalloutHandle &callout_handle, BindingVariableMgrPtr mgr)
leases6_committed hookpoint handler.
int leaseGetByDuidHandler(hooks::CalloutHandle &handle)
lease6-get-by-duid command handler
int lease6BulkApplyHandler(hooks::CalloutHandle &handle)
lease6-bulk-apply command handler
int lease4WipeHandler(hooks::CalloutHandle &handle)
lease4-wipe handler
int lease6ResendDdnsHandler(hooks::CalloutHandle &handle)
lease6-resend-ddns command handler
ObservationPtr getObservation(const std::string &name) const
Returns an observation.
static StatsMgr & instance()
Statistics Manager accessor method.
static std::string generateName(const std::string &context, Type index, const std::string &stat_name)
Generates statistic name in a given context.
RAII class creating a critical section.
static MultiThreadingMgr & instance()
Returns a single instance of Multi Threading Manager.
A generic exception that is thrown if a parameter given violates security check but enforcement is la...
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.
void setValue(const std::string &name, const int64_t value)
Records absolute integer observation.
void addValue(const std::string &name, const int64_t value)
Records incremental integer observation.
const isc::log::MessageID LEASE_CMDS_DEL4
const isc::log::MessageID LEASE_CMDS_WIPE4_FAILED
const isc::log::MessageID LEASE_CMDS_UPDATE6_FAILED
const isc::log::MessageID LEASE_CMDS_UPDATE4_FAILED
const isc::log::MessageID LEASE_CMDS_WIPE6_FAILED
const isc::log::MessageID LEASE_CMDS_UPDATE6_CONFLICT
const isc::log::MessageID LEASE_CMDS_UPDATE4_CONFLICT
const isc::log::MessageID LEASE_CMDS_FATAL_WRITE_LEASES4
const isc::log::MessageID LEASE_CMDS_RESEND_DDNS4_FAILED
const isc::log::MessageID LEASE_CMDS_DEL6
const isc::log::MessageID LEASE_CMDS_ADD4_FAILED
const isc::log::MessageID LEASE_CMDS_LEASES6_COMMITTED_LEASE_ERROR
const isc::log::MessageID LEASE_CMDS_PATH_SECURITY_WARNING
const isc::log::MessageID LEASE_CMDS_ADD6
const isc::log::MessageID LEASE_CMDS_ADD4
const isc::log::MessageID LEASE_CMDS_WIPE6
const isc::log::MessageID LEASE_CMDS_ADD6_CONFLICT
const isc::log::MessageID LEASE_CMDS_BULK_APPLY6_FAILED
const isc::log::MessageID LEASE_CMDS_UPDATE6
const isc::log::MessageID LEASE_CMDS_RESEND_DDNS4
const isc::log::MessageID LEASE_CMDS_GET6_FAILED
const isc::log::MessageID LEASE_CMDS_WIPE4
const isc::log::MessageID LEASE_CMDS_BULK_APPLY6
const isc::log::MessageID LEASE_CMDS_RESEND_DDNS6_FAILED
const isc::log::MessageID LEASE_CMDS_RESEND_DDNS6
const isc::log::MessageID LEASE_CMDS_GET4_FAILED
const isc::log::MessageID LEASE_CMDS_ADD4_CONFLICT
const isc::log::MessageID LEASE_CMDS_LEASES6_COMMITTED_CONFLICT
const isc::log::MessageID LEASE_CMDS_DEL4_FAILED
const isc::log::MessageID LEASE_CMDS_ADD6_FAILED
const isc::log::MessageID LEASE_CMDS_UPDATE4
const isc::log::MessageID LEASE_CMDS_FATAL_WRITE_LEASES6
const isc::log::MessageID LEASE_CMDS_DEL6_FAILED
An abstract API for lease database.
#define LOG_ERROR(LOGGER, MESSAGE)
Macro to conveniently test error output and log it.
#define LOG_INFO(LOGGER, MESSAGE)
Macro to conveniently test info output and log it.
#define LOG_WARN(LOGGER, MESSAGE)
Macro to conveniently test warn output and log it.
#define LOG_FATAL(LOGGER, MESSAGE)
Macro to conveniently test fatal output and log it.
#define LOG_DEBUG(LOGGER, LEVEL, MESSAGE)
Macro to conveniently test debug output and log it.
const int CONTROL_RESULT_EMPTY
Status code indicating that the specified command was completed correctly, but failed to produce any ...
const int CONTROL_RESULT_ERROR
Status code indicating a general failure.
ConstElementPtr createAnswer()
Creates a standard config/command level success answer message (i.e.
const int CONTROL_RESULT_CONFLICT
Status code indicating that the command was unsuccessful due to a conflict between the command argume...
const int CONTROL_RESULT_FATAL_ERROR
Status code indicating that the command was unsuccessful and the configuration could not be reverted ...
const int CONTROL_RESULT_SUCCESS
Status code indicating a successful operation.
boost::shared_ptr< const Element > ConstElementPtr
boost::shared_ptr< Element > ElementPtr
boost::shared_ptr< Lease4Collection > Lease4CollectionPtr
A shared pointer to the collection of IPv4 leases.
boost::shared_ptr< const SrvConfig > ConstSrvConfigPtr
Const pointer to the SrvConfig.
void queueNCR(const NameChangeType &chg_type, const Lease4Ptr &lease)
Creates NameChangeRequest from the DHCPv4 lease and queues it to be sent to D2.
boost::shared_ptr< Pkt4 > Pkt4Ptr
A pointer to Pkt4 object.
boost::shared_ptr< DUID > DuidPtr
boost::shared_ptr< Lease6 > Lease6Ptr
Pointer to a Lease6 structure.
std::vector< Lease6Ptr > Lease6Collection
A collection of IPv6 leases.
boost::multi_index_container< Subnet6Ptr, boost::multi_index::indexed_by< 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< SubnetModificationTimeIndexTag >, boost::multi_index::const_mem_fun< data::BaseStampedElement, boost::posix_time::ptime, &data::BaseStampedElement::getModificationTime > > > > Subnet6Collection
A collection of Subnet6 objects.
boost::shared_ptr< HWAddr > HWAddrPtr
Shared pointer to a hardware address structure.
boost::multi_index_container< Subnet4Ptr, boost::multi_index::indexed_by< 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 > >, boost::multi_index::ordered_non_unique< boost::multi_index::tag< SubnetModificationTimeIndexTag >, boost::multi_index::const_mem_fun< data::BaseStampedElement, boost::posix_time::ptime, &data::BaseStampedElement::getModificationTime > > > > Subnet4Collection
A collection of Subnet4 objects.
uint32_t SubnetID
Defines unique IPv4 or IPv6 subnet identifier.
boost::shared_ptr< ClientId > ClientIdPtr
Shared pointer to a Client ID.
boost::shared_ptr< const CfgSubnets4 > ConstCfgSubnets4Ptr
Const pointer.
boost::shared_ptr< const CfgSubnets6 > ConstCfgSubnets6Ptr
Const pointer.
boost::shared_ptr< Lease6Collection > Lease6CollectionPtr
A shared pointer to the collection of IPv6 leases.
boost::shared_ptr< Pkt6 > Pkt6Ptr
A pointer to Pkt6 packet.
std::vector< Lease4Ptr > Lease4Collection
A collection of IPv4 leases.
boost::shared_ptr< Lease4 > Lease4Ptr
Pointer to a Lease4 structure.
const int LEASE_CMDS_DBG_COMMAND_DATA
Logging level used to log successful commands.
isc::log::Logger lease_cmds_logger("lease-cmds-hooks")
boost::shared_ptr< BindingVariableMgr > BindingVariableMgrPtr
Defines a shared pointer to a BindingVariableMgr.
boost::multiprecision::checked_int128_t int128_t
Defines the logger used by the top-level component of kea-lfc.
Hardware type that represents information from DHCPv4 packet.
static HWAddr fromText(const std::string &text, const uint16_t htype=HTYPE_ETHER)
Creates instance of the hardware address from textual format.
Structure that holds a lease for IPv6 address and/or prefix.
@ ACTION_UPDATE
update extended info tables.
a common structure for IPv4 and IPv6 leases
static constexpr uint32_t STATE_DEFAULT
A lease in the default state.
static constexpr uint32_t STATE_EXPIRED_RECLAIMED
Expired and reclaimed lease.
static constexpr uint32_t STATE_DECLINED
Declined lease.
static constexpr uint32_t STATE_REGISTERED
Registered self-generated lease.
static std::string basicStatesToText(const uint32_t state)
Returns name(s) of the basic lease state(s).
static constexpr uint32_t STATE_RELEASED
Released lease held in the database for lease affinity.
static void syncCurrentExpirationTime(const Lease &from, Lease &to)
Sync lease current expiration time with new value from another lease, so that additional operations c...
Type
Type of lease or pool.
@ TYPE_PD
the lease contains IPv6 prefix (for prefix delegation)
@ TYPE_NA
the lease contains non-temporary IPv6 address
static std::string typeToText(Type type)
returns text representation of a lease type