33#include <boost/scoped_ptr.hpp>
34#include <boost/algorithm/string.hpp>
92 if (txt ==
"address") {
94 }
else if (txt ==
"hw-address") {
96 }
else if (txt ==
"duid") {
98 }
else if (txt ==
"client-id") {
102 << txt <<
", the only supported values are: "
103 "address, hw-address, duid");
378 const int control_result,
379 const std::string& error_message)
const;
392 short family = AF_INET)
const;
451 if (!lease->stateExpiredReclaimed()) {
452 StatsMgr::instance().addValue(
453 StatsMgr::generateName(
"subnet", lease->subnet_id_,
454 "assigned-addresses"),
456 if (lease->stateDeclined()) {
457 StatsMgr::instance().addValue(
"declined-addresses", int64_t(1));
459 StatsMgr::instance().addValue(
460 StatsMgr::generateName(
"subnet", lease->subnet_id_,
461 "declined-addresses"),
469 if (!lease->stateExpiredReclaimed()) {
470 StatsMgr::instance().addValue(
471 StatsMgr::generateName(
"subnet", lease->subnet_id_,
472 lease->type_ == Lease::TYPE_NA ?
473 "assigned-nas" :
"assigned-pds"),
475 if (lease->stateDeclined()) {
476 StatsMgr::instance().addValue(
"declined-addresses", int64_t(1));
478 StatsMgr::instance().addValue(
479 StatsMgr::generateName(
"subnet", lease->subnet_id_,
480 "declined-addresses"),
489 if (!existing->stateExpiredReclaimed()) {
491 if (existing->subnet_id_ != lease->subnet_id_) {
492 StatsMgr::instance().addValue(
493 StatsMgr::generateName(
"subnet", existing->subnet_id_,
494 "assigned-addresses"),
497 if (existing->stateDeclined()) {
499 StatsMgr::instance().addValue(
"declined-addresses", int64_t(-1));
501 StatsMgr::instance().addValue(
502 StatsMgr::generateName(
"subnet", existing->subnet_id_,
503 "declined-addresses"),
506 if (!lease->stateExpiredReclaimed()) {
508 if (existing->subnet_id_ != lease->subnet_id_) {
509 StatsMgr::instance().addValue(
510 StatsMgr::generateName(
"subnet", lease->subnet_id_,
511 "assigned-addresses"),
514 if (lease->stateDeclined()) {
516 StatsMgr::instance().addValue(
"declined-addresses", int64_t(1));
518 StatsMgr::instance().addValue(
519 StatsMgr::generateName(
"subnet", lease->subnet_id_,
520 "declined-addresses"),
526 if (!lease->stateExpiredReclaimed()) {
528 StatsMgr::instance().addValue(
529 StatsMgr::generateName(
"subnet", lease->subnet_id_,
530 "assigned-addresses"),
532 if (lease->stateDeclined()) {
534 StatsMgr::instance().addValue(
"declined-addresses", int64_t(1));
536 StatsMgr::instance().addValue(
537 StatsMgr::generateName(
"subnet", lease->subnet_id_,
538 "declined-addresses"),
548 if (!existing->stateExpiredReclaimed()) {
550 if (existing->subnet_id_ != lease->subnet_id_) {
551 StatsMgr::instance().addValue(
552 StatsMgr::generateName(
"subnet", existing->subnet_id_,
553 lease->type_ == Lease::TYPE_NA ?
554 "assigned-nas" :
"assigned-pds"),
557 if (existing->stateDeclined()) {
559 StatsMgr::instance().addValue(
"declined-addresses", int64_t(-1));
561 StatsMgr::instance().addValue(
562 StatsMgr::generateName(
"subnet", existing->subnet_id_,
563 "declined-addresses"),
566 if (!lease->stateExpiredReclaimed()) {
568 if (existing->subnet_id_ != lease->subnet_id_) {
569 StatsMgr::instance().addValue(
570 StatsMgr::generateName(
"subnet", lease->subnet_id_,
571 lease->type_ == Lease::TYPE_NA ?
572 "assigned-nas" :
"assigned-pds"),
575 if (lease->stateDeclined()) {
577 StatsMgr::instance().addValue(
"declined-addresses", int64_t(1));
579 StatsMgr::instance().addValue(
580 StatsMgr::generateName(
"subnet", lease->subnet_id_,
581 "declined-addresses"),
587 if (!lease->stateExpiredReclaimed()) {
589 StatsMgr::instance().addValue(
590 StatsMgr::generateName(
"subnet", lease->subnet_id_,
591 lease->type_ == Lease::TYPE_NA ?
592 "assigned-nas" :
"assigned-pds"),
594 if (lease->stateDeclined()) {
596 StatsMgr::instance().addValue(
"declined-addresses", int64_t(1));
598 StatsMgr::instance().addValue(
599 StatsMgr::generateName(
"subnet", lease->subnet_id_,
600 "declined-addresses"),
609 if (!lease->stateExpiredReclaimed()) {
610 StatsMgr::instance().addValue(
611 StatsMgr::generateName(
"subnet", lease->subnet_id_,
612 "assigned-addresses"),
614 if (lease->stateDeclined()) {
615 StatsMgr::instance().addValue(
"declined-addresses", int64_t(-1));
617 StatsMgr::instance().addValue(
618 StatsMgr::generateName(
"subnet", lease->subnet_id_,
619 "declined-addresses"),
627 if (!lease->stateExpiredReclaimed()) {
628 StatsMgr::instance().addValue(
629 StatsMgr::generateName(
"subnet", lease->subnet_id_,
630 lease->type_ == Lease::TYPE_NA ?
631 "assigned-nas" :
"assigned-pds"),
633 if (lease->stateDeclined()) {
634 StatsMgr::instance().addValue(
"declined-addresses", int64_t(-1));
636 StatsMgr::instance().addValue(
637 StatsMgr::generateName(
"subnet", lease->subnet_id_,
638 "declined-addresses"),
646 Lease4Ptr existing = LeaseMgrFactory::instance().getLease4(lease->addr_);
647 if (force_create && !existing) {
649 if (!LeaseMgrFactory::instance().addLease(lease)) {
651 "lost race between calls to get and add");
660 Lease::syncCurrentExpirationTime(*existing, *lease);
663 LeaseMgrFactory::instance().updateLease4(lease);
666 << lease->addr_ <<
" either because the lease has been "
667 "deleted or it has changed in the database, in both cases a "
668 "retry might succeed");
678 LeaseMgrFactory::instance().getLease6(lease->type_, lease->addr_);
679 if (force_create && !existing) {
681 if (!LeaseMgrFactory::instance().addLease(lease)) {
683 "lost race between calls to get and add");
692 Lease::syncCurrentExpirationTime(*existing, *lease);
695 LeaseMgrFactory::instance().updateLease6(lease);
698 << lease->addr_ <<
" either because the lease has been "
699 "deleted or it has changed in the database, in both cases a "
700 "retry might succeed");
712 string txt =
"malformed command";
719 txt =
"(missing parameters)";
731 bool force_create =
false;
737 if (!MultiThreadingMgr::instance().getMode()) {
739 success = LeaseMgrFactory::instance().addLease(lease4);
743 if (resource_handler.
tryLock4(lease4->addr_)) {
744 success = LeaseMgrFactory::instance().addLease(lease4);
747 "ResourceBusy: IP address:" << lease4->addr_
748 <<
" could not be added.");
757 resp <<
"Lease for address " << lease4->addr_.toText()
758 <<
", subnet-id " << lease4->subnet_id_ <<
" added.";
765 if (!MultiThreadingMgr::instance().getMode()) {
767 success = LeaseMgrFactory::instance().addLease(lease6);
771 if (resource_handler.
tryLock(lease6->type_, lease6->addr_)) {
772 success = LeaseMgrFactory::instance().addLease(lease6);
775 "ResourceBusy: IP address:" << lease6->addr_
776 <<
" could not be added.");
785 if (lease6->type_ == Lease::TYPE_NA) {
786 resp <<
"Lease for address " << lease6->addr_.toText()
787 <<
", subnet-id " << lease6->subnet_id_ <<
" added.";
789 resp <<
"Lease for prefix " << lease6->addr_.toText()
790 <<
"/" <<
static_cast<int>(lease6->prefixlen_)
791 <<
", subnet-id " << lease6->subnet_id_ <<
" added.";
796 }
catch (
const std::exception& ex) {
814 if (!params || params->getType() != Element::map) {
818 if (params->contains(
"update-ddns")) {
820 if (tmp->getType() != Element::boolean) {
831 if (params->contains(
"type")) {
832 string t = params->get(
"type")->stringValue();
833 if (t ==
"IA_NA" || t ==
"0") {
835 }
else if (t ==
"IA_TA" || t ==
"1") {
837 }
else if (t ==
"IA_PD" || t ==
"2") {
839 }
else if (t ==
"V4" || t ==
"3") {
843 << t <<
", only supported values are: IA_NA, IA_TA,"
850 if (tmp->getType() != Element::string) {
858 txt <<
"Invalid " << (v6 ?
"IPv6" :
"IPv4")
859 <<
" address specified: " << tmp->stringValue();
867 tmp = params->get(
"subnet-id");
871 if (tmp->getType() != Element::integer) {
876 if (params->contains(
"iaid")) {
877 x.
iaid = params->get(
"iaid")->intValue();
886 if (!type || type->getType() != Element::string) {
888 " and 'identifier-type' is either missing or not a string.");
890 if (!ident || ident->getType() != Element::string) {
892 " and 'identifier' is either missing or not a string.");
901 HWAddr hw = HWAddr::fromText(ident->stringValue());
906 x.
client_id = ClientId::fromText(ident->stringValue());
910 DUID duid = DUID::fromText(ident->stringValue());
921 " is not supported.");
943 lease4 = LeaseMgrFactory::instance().getLease4(p.
addr);
945 lease6 = LeaseMgrFactory::instance().getLease6(p.
lease_type, p.
addr);
953 "requires hwaddr to be specified");
956 lease4 = LeaseMgrFactory::instance().getLease4(*p.
hwaddr, p.
subnet_id);
966 "requires duid to be specified");
969 lease6 = LeaseMgrFactory::instance().getLease6(p.
lease_type, *p.
duid,
980 "requires client-id to be specified");
994 }
catch (
const std::exception& ex) {
1001 lease_json = lease4->toElement();
1003 "IPv4 lease found.", lease_json);
1005 }
else if (!v4 && lease6) {
1006 lease_json = lease6->toElement();
1008 "IPv6 lease found.", lease_json);
1025 ElementPtr leases_json = Element::createList();
1034 if (subnets->getType() != Element::list) {
1038 const std::vector<ElementPtr>& subnet_ids = subnets->listValue();
1039 for (
auto subnet_id = subnet_ids.begin();
1040 subnet_id != subnet_ids.end();
1042 if ((*subnet_id)->getType() != Element::integer) {
1048 LeaseMgrFactory::instance().getLeases4((*subnet_id)->intValue());
1049 for (
auto lease : leases) {
1051 leases_json->add(lease_json);
1055 LeaseMgrFactory::instance().getLeases6((*subnet_id)->intValue());
1056 for (
auto lease : leases) {
1058 leases_json->add(lease_json);
1067 for (
auto lease : leases) {
1069 leases_json->add(lease_json);
1073 for (
auto lease : leases) {
1075 leases_json->add(lease_json);
1080 std::ostringstream s;
1081 s << leases_json->size()
1082 <<
" IPv" << (v4 ?
"4" :
"6")
1083 <<
" lease(s) found.";
1085 args->set(
"leases", leases_json);
1093 }
catch (
const std::exception& ex) {
1123 if (from->getType() != Element::string) {
1127 boost::scoped_ptr<IOAddress> from_address;
1129 if (from->stringValue() ==
"start") {
1130 from_address.reset(
new IOAddress(v4 ?
"0.0.0.0" :
"::"));
1134 from_address.reset(
new IOAddress(from->stringValue()));
1139 "a valid IPv" << (v4 ?
"4" :
"6") <<
" address");
1144 if (v4 && (!from_address->isV4())) {
1146 <<
" is not an IPv4 address");
1148 }
else if (!v4 && from_address->isV4()) {
1150 <<
" is not an IPv6 address");
1160 if (page_limit->getType() != Element::integer) {
1165 size_t page_limit_value =
static_cast<size_t>(page_limit->intValue());
1167 ElementPtr leases_json = Element::createList();
1172 LeaseMgrFactory::instance().getLeases4(*from_address,
1176 for (
auto lease : leases) {
1178 leases_json->add(lease_json);
1184 LeaseMgrFactory::instance().getLeases6(*from_address,
1187 for (
auto lease : leases) {
1189 leases_json->add(lease_json);
1194 std::ostringstream s;
1195 s << leases_json->size()
1196 <<
" IPv" << (v4 ?
"4" :
"6")
1197 <<
" lease(s) found.";
1201 args->set(
"leases", leases_json);
1202 args->set(
"count", Element::create(
static_cast<int64_t
>(leases_json->size())));
1212 }
catch (
const std::exception& ex) {
1237 if (hw_address->getType() != Element::string) {
1241 HWAddr hwaddr = HWAddr::fromText(hw_address->stringValue());
1244 LeaseMgrFactory::instance().getLease4(hwaddr);
1245 ElementPtr leases_json = Element::createList();
1246 for (
auto 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) {
1287 if (client_id->getType() != Element::string) {
1291 ClientIdPtr clientid = ClientId::fromText(client_id->stringValue());
1294 LeaseMgrFactory::instance().getLease4(*clientid);
1295 ElementPtr leases_json = Element::createList();
1296 for (
auto lease : leases) {
1298 leases_json->add(lease_json);
1301 std::ostringstream s;
1302 s << leases_json->size() <<
" IPv4 lease(s) found.";
1304 args->set(
"leases", leases_json);
1312 }
catch (
const std::exception& ex) {
1337 if (duid->getType() != Element::string) {
1341 DUID duid_ = DUID::fromText(duid->stringValue());
1344 LeaseMgrFactory::instance().getLeases6(duid_);
1345 ElementPtr leases_json = Element::createList();
1346 for (
auto lease : leases) {
1348 leases_json->add(lease_json);
1351 std::ostringstream s;
1352 s << leases_json->size() <<
" IPv6 lease(s) found.";
1354 args->set(
"leases", leases_json);
1362 }
catch (
const std::exception& ex) {
1375 v4 = (
cmd_name_ ==
"lease4-get-by-hostname");
1389 if (hostname->getType() != Element::string) {
1393 std::string hostname_ = hostname->stringValue();
1395 if (hostname_.empty()) {
1398 boost::algorithm::to_lower(hostname_);
1400 ElementPtr leases_json = Element::createList();
1403 LeaseMgrFactory::instance().getLeases4(hostname_);
1405 for (
auto lease : leases) {
1407 leases_json->add(lease_json);
1411 LeaseMgrFactory::instance().getLeases6(hostname_);
1413 for (
auto lease : leases) {
1415 leases_json->add(lease_json);
1419 std::ostringstream s;
1420 s << leases_json->size()
1421 <<
" IPv" << (v4 ?
"4" :
"6")
1422 <<
" lease(s) found.";
1424 args->set(
"leases", leases_json);
1432 }
catch (
const std::exception& ex) {
1451 lease4 = LeaseMgrFactory::instance().getLease4(p.
addr);
1461 "requires hwaddr to be specified");
1465 lease4 = LeaseMgrFactory::instance().getLease4(*p.
hwaddr, p.
subnet_id);
1475 "requires client-id to be specified");
1496 if (LeaseMgrFactory::instance().deleteLease(lease4)) {
1508 }
catch (
const std::exception& ex) {
1527 auto deleted_leases =
cmd_args_->get(
"deleted-leases");
1530 if (!deleted_leases && !leases) {
1536 if (deleted_leases && (deleted_leases->getType() != Element::list)) {
1541 if (leases && (leases->getType() != Element::list)) {
1548 std::list<std::pair<Parameters, Lease6Ptr> > parsed_deleted_list;
1549 if (deleted_leases) {
1550 auto leases_list = deleted_leases->listValue();
1553 for (
auto lease_params : leases_list) {
1558 parsed_deleted_list.push_back(std::make_pair(p, lease));
1564 std::list<Lease6Ptr> parsed_leases_list;
1569 auto leases_list = leases->listValue();
1570 for (
auto lease_params : leases_list) {
1577 Lease6Ptr lease6 = parser.
parse(config, lease_params, force_update);
1578 parsed_leases_list.push_back(lease6);
1583 size_t success_count = 0;
1586 if (!parsed_deleted_list.empty()) {
1589 for (
auto lease_params_pair : parsed_deleted_list) {
1594 auto lease = lease_params_pair.second;
1601 if (LeaseMgrFactory::instance().deleteLease(lease)) {
1607 if (!failed_deleted_list) {
1608 failed_deleted_list = Element::createList();
1618 "lease not found"));
1622 }
catch (
const std::exception& ex) {
1624 if (!failed_deleted_list) {
1625 failed_deleted_list = Element::createList();
1637 if (!parsed_leases_list.empty()) {
1641 for (
auto lease : parsed_leases_list) {
1644 if (!MultiThreadingMgr::instance().getMode()) {
1650 if (resource_handler.
tryLock(lease->type_, lease->addr_)) {
1654 "ResourceBusy: IP address:" << lease->addr_
1655 <<
" could not be updated.");
1660 }
catch (
const std::exception& ex) {
1662 if (!failed_leases_list) {
1663 failed_leases_list = Element::createList();
1677 if (failed_deleted_list || failed_leases_list) {
1679 args = Element::createMap();
1682 if (failed_deleted_list) {
1683 args->set(
"failed-deleted-leases", failed_deleted_list);
1687 if (failed_leases_list) {
1688 args->set(
"failed-leases", failed_leases_list);
1693 std::ostringstream resp_text;
1694 resp_text <<
"Bulk apply of " << success_count <<
" IPv6 leases completed.";
1699 }
catch (
const std::exception& ex) {
1712 IOAddress addr(IOAddress::IPV6_ZERO_ADDRESS());
1722 lease6 = LeaseMgrFactory::instance().getLease6(p.
lease_type, p.
addr);
1736 "requires duid to be specified");
1740 lease6 = LeaseMgrFactory::instance().getLease6(p.
lease_type, *p.
duid,
1754 if (LeaseMgrFactory::instance().deleteLease(lease6)) {
1766 }
catch (
const std::exception& ex) {
1788 bool force_create =
false;
1794 if (!MultiThreadingMgr::instance().getMode()) {
1800 if (resource_handler.
tryLock4(lease4->addr_)) {
1804 "ResourceBusy: IP address:" << lease4->addr_
1805 <<
" could not be updated.");
1814 }
catch (
const std::exception& ex) {
1836 bool force_create =
false;
1842 if (!MultiThreadingMgr::instance().getMode()) {
1848 if (resource_handler.
tryLock(lease6->type_, lease6->addr_)) {
1852 "ResourceBusy: IP address:" << lease6->addr_
1853 <<
" could not be updated.");
1862 }
catch (
const std::exception& ex) {
1888 num = LeaseMgrFactory::instance().wipeLeases4(
id);
1891 auto observation = StatsMgr::instance().getObservation(
1892 StatsMgr::generateName(
"subnet",
id,
"declined-addresses"));
1894 int64_t previous_declined = 0;
1897 previous_declined = observation->getInteger().first;
1900 StatsMgr::instance().setValue(
1901 StatsMgr::generateName(
"subnet",
id,
"assigned-addresses"),
1904 StatsMgr::instance().setValue(
1905 StatsMgr::generateName(
"subnet",
id,
"declined-addresses"),
1908 StatsMgr::instance().addValue(
"declined-addresses", -previous_declined);
1916 for (
auto sub : *subs) {
1917 num += LeaseMgrFactory::instance().wipeLeases4(sub->getID());
1918 ids <<
" " << sub->getID();
1919 StatsMgr::instance().setValue(
1920 StatsMgr::generateName(
"subnet", sub->getID(),
"assigned-addresses"),
1923 StatsMgr::instance().setValue(
1924 StatsMgr::generateName(
"subnet", sub->getID(),
"declined-addresses"),
1928 StatsMgr::instance().setValue(
"declined-addresses", int64_t(0));
1932 tmp <<
"Deleted " << num <<
" IPv4 lease(s) from subnet(s)" << ids.str();
1936 }
catch (
const std::exception& ex) {
1968 num = LeaseMgrFactory::instance().wipeLeases6(
id);
1971 auto observation = StatsMgr::instance().getObservation(
1972 StatsMgr::generateName(
"subnet",
id,
"declined-addresses"));
1974 int64_t previous_declined = 0;
1977 previous_declined = observation->getInteger().first;
1980 StatsMgr::instance().setValue(
1981 StatsMgr::generateName(
"subnet",
id,
"assigned-nas" ),
1984 StatsMgr::instance().setValue(
1985 StatsMgr::generateName(
"subnet",
id,
"assigned-pds"),
1988 StatsMgr::instance().setValue(
1989 StatsMgr::generateName(
"subnet",
id,
"declined-addresses"),
1992 StatsMgr::instance().addValue(
"declined-addresses", -previous_declined);
2000 for (
auto sub : *subs) {
2001 num += LeaseMgrFactory::instance().wipeLeases6(sub->getID());
2002 ids <<
" " << sub->getID();
2003 StatsMgr::instance().setValue(
2004 StatsMgr::generateName(
"subnet", sub->getID(),
"assigned-nas" ),
2007 StatsMgr::instance().setValue(
2008 StatsMgr::generateName(
"subnet", sub->getID(),
"assigned-pds"),
2011 StatsMgr::instance().setValue(
2012 StatsMgr::generateName(
"subnet", sub->getID(),
"declined-addresses"),
2016 StatsMgr::instance().setValue(
"declined-addresses", int64_t(0));
2020 tmp <<
"Deleted " << num <<
" IPv6 lease(s) from subnet(s)" << ids.str();
2024 }
catch (
const std::exception& ex) {
2041 lease6 = LeaseMgrFactory::instance().getLease6(parameters.
lease_type,
2044 lease6.reset(
new Lease6());
2045 lease6->addr_ = parameters.
addr;
2054 if (!parameters.
duid) {
2056 "requires duid to be specified");
2060 lease6 = LeaseMgrFactory::instance().getLease6(parameters.
lease_type,
2076 short family)
const {
2082 if (param->getType() != Element::string) {
2089 }
catch (
const std::exception& ex) {
2091 <<
"' is not a valid IP address.");
2096 << (family == AF_INET6 ?
"IPv6" :
"IPv4")
2097 <<
" address specified: " << param->stringValue());
2105 std::stringstream ss;
2114 if (!CfgMgr::instance().getD2ClientMgr().ddnsEnabled()) {
2115 ss <<
"DDNS updating is not enabled";
2118 Lease4Ptr lease = LeaseMgrFactory::instance().getLease4(addr);
2120 ss <<
"No lease found for: " << addr.
toText();
2122 }
else if (lease->hostname_.empty()) {
2123 ss <<
"Lease for: " << addr.
toText()
2124 <<
", has no hostname, nothing to update";
2125 }
else if (!lease->fqdn_fwd_ && !lease->fqdn_rev_) {
2126 ss <<
"Neither forward nor reverse updates enabled for lease for: "
2132 ss <<
"NCR generated for: " << addr.
toText()
2133 <<
", hostname: " << lease->hostname_;
2139 }
catch (
const std::exception& ex) {
2150 std::stringstream ss;
2159 if (!CfgMgr::instance().getD2ClientMgr().ddnsEnabled()) {
2160 ss <<
"DDNS updating is not enabled";
2163 Lease6Ptr lease = LeaseMgrFactory::instance().getLease6(Lease::TYPE_NA, addr);
2165 ss <<
"No lease found for: " << addr.
toText();
2167 }
else if (lease->hostname_.empty()) {
2168 ss <<
"Lease for: " << addr.
toText()
2169 <<
", has no hostname, nothing to update";
2170 }
else if (!lease->fqdn_fwd_ && !lease->fqdn_rev_) {
2171 ss <<
"Neither forward nor reverse updates enabled for lease for: "
2177 ss <<
"NCR generated for: " << addr.
toText()
2178 <<
", hostname: " << lease->hostname_;
2184 }
catch (
const std::exception& ex) {
2197 const int control_result,
2198 const std::string& error_message)
const {
2199 auto failed_lease_map = Element::createMap();
2200 failed_lease_map->set(
"type", Element::create(Lease::typeToText(lease_type)));
2203 failed_lease_map->set(
"ip-address", Element::create(lease_address.
toText()));
2206 failed_lease_map->set(
"duid", Element::create(duid->toText()));
2210 failed_lease_map->set(
"result", Element::create(control_result));
2211 failed_lease_map->set(
"error-message", Element::create(error_message));
2213 return (failed_lease_map);
2218 return (impl_->leaseAddHandler(handle));
2223 return (impl_->lease6BulkApplyHandler(handle));
2228 return (impl_->leaseGetHandler(handle));
2233 return (impl_->leaseGetAllHandler(handle));
2238 return (impl_->leaseGetPageHandler(handle));
2243 return (impl_->leaseGetByHwAddressHandler(handle));
2248 return (impl_->leaseGetByClientIdHandler(handle));
2253 return (impl_->leaseGetByDuidHandler(handle));
2258 return (impl_->leaseGetByHostnameHandler(handle));
2263 return (impl_->lease4DelHandler(handle));
2268 return (impl_->lease6DelHandler(handle));
2273 return (impl_->lease4UpdateHandler(handle));
2278 return (impl_->lease6UpdateHandler(handle));
2284 return (impl_->lease4WipeHandler(handle));
2290 return (impl_->lease6WipeHandler(handle));
2295 return (impl_->lease4ResendDdnsHandler(handle));
2300 return (impl_->lease6ResendDdnsHandler(handle));
A generic exception that is thrown if a parameter given to a method is considered invalid in that con...
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...
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.
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.
Database duplicate entry error.
Holds DUID (DHCPv6 Unique Identifier)
Wraps value holding size of the page with leases.
Attempt to update lease that was not there.
Thrown by lock users when a resource lock cannot be obtained.
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.
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 updateStatsOnUpdate(const Lease4Ptr &existing, const Lease4Ptr &lease)
Update stats when updating lease.
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.
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 command handler
int leaseGetHandler(CalloutHandle &handle)
lease4-get, lease6-get command handler
static bool addOrUpdate4(Lease4Ptr lease, bool force_create)
Add or update lease.
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
static void updateStatsOnAdd(const Lease4Ptr &lease)
Update stats when adding lease.
Parameters getParameters(bool v6, const ConstElementPtr &args)
Extracts parameters required for reservation-get and reservation-del.
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
static void updateStatsOnDelete(const Lease4Ptr &lease)
Update stats when deleting lease.
int lease4ResendDdnsHandler(hooks::CalloutHandle &handle)
lease4-resend-ddns command 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
int lease4DelHandler(hooks::CalloutHandle &handle)
lease4-del command handler
int leaseAddHandler(hooks::CalloutHandle &handle)
lease4-add, lease6-add command handler
int leaseGetByClientIdHandler(hooks::CalloutHandle &handle)
lease4-get-by-client-id command 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 command handler
int lease6UpdateHandler(hooks::CalloutHandle &handle)
lease6-update 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
RAII class creating a critical section.
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.
const isc::log::MessageID LEASE_CMDS_RESEND_DDNS4_FAILED
const isc::log::MessageID LEASE_CMDS_ADD4_FAILED
const isc::log::MessageID LEASE_CMDS_ADD6
const isc::log::MessageID LEASE_CMDS_ADD4
const isc::log::MessageID LEASE_CMDS_RESEND_DDNS4
const isc::log::MessageID LEASE_CMDS_RESEND_DDNS6_FAILED
const isc::log::MessageID LEASE_CMDS_RESEND_DDNS6
const isc::log::MessageID LEASE_CMDS_ADD6_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.
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(const int status_code, const std::string &text, const ConstElementPtr &arg)
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< const SrvConfig > ConstSrvConfigPtr
Const pointer to the SrvConfig.
void queueNCR(const NameChangeType &chg_type, const Lease4Ptr &lease)
Creates name change request from the DHCPv4 lease.
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.
std::vector< Lease4Ptr > Lease4Collection
A collection of IPv4 leases.
boost::shared_ptr< Lease4 > Lease4Ptr
Pointer to a Lease4 structure.
isc::log::Logger lease_cmds_logger("lease-cmds-hooks")
Defines the logger used by the top-level component of kea-lfc.
Hardware type that represents information from DHCPv4 packet.
Structure that holds a lease for IPv6 address and/or prefix.
a common structure for IPv4 and IPv6 leases
Type
Type of lease or pool.