34 #include <boost/scoped_ptr.hpp> 35 #include <boost/algorithm/string.hpp> 50 namespace lease_cmds {
93 if (txt ==
"address") {
94 return (Parameters::TYPE_ADDR);
95 }
else if (txt ==
"hw-address") {
96 return (Parameters::TYPE_HWADDR);
97 }
else if (txt ==
"duid") {
98 return (Parameters::TYPE_DUID);
99 }
else if (txt ==
"client-id") {
100 return (Parameters::TYPE_CLIENT_ID);
103 << txt <<
", the only supported values are: " 104 "address, hw-address, duid");
122 : subnet_id(0), addr(
"::"), query_type(TYPE_ADDR),
123 lease_type(
Lease::TYPE_NA), iaid(0), updateDDNS(false) {
390 const int control_result,
391 const std::string& error_message)
const;
404 short family = AF_INET)
const;
409 static void updateStatsOnAdd(
const Lease4Ptr& lease);
414 static void updateStatsOnAdd(
const Lease6Ptr& lease);
420 static void updateStatsOnUpdate(
const Lease4Ptr& existing,
427 static void updateStatsOnUpdate(
const Lease6Ptr& existing,
433 static void updateStatsOnDelete(
const Lease4Ptr& lease);
438 static void updateStatsOnDelete(
const Lease6Ptr& lease);
448 static bool addOrUpdate4(
Lease4Ptr lease,
bool force_create);
458 static bool addOrUpdate6(
Lease6Ptr lease,
bool force_create);
466 if (!user_context || (user_context->getType() !=
Element::map)) {
473 return (isc->get(
"relay-info"));
478 LeaseCmdsImpl::updateStatsOnAdd(
const Lease4Ptr& lease) {
479 if (!lease->stateExpiredReclaimed()) {
480 StatsMgr::instance().addValue(
481 StatsMgr::generateName(
"subnet", lease->subnet_id_,
482 "assigned-addresses"),
484 if (lease->stateDeclined()) {
485 StatsMgr::instance().addValue(
"declined-addresses", int64_t(1));
487 StatsMgr::instance().addValue(
488 StatsMgr::generateName(
"subnet", lease->subnet_id_,
489 "declined-addresses"),
496 LeaseCmdsImpl::updateStatsOnAdd(
const Lease6Ptr& lease) {
497 if (!lease->stateExpiredReclaimed()) {
498 StatsMgr::instance().addValue(
499 StatsMgr::generateName(
"subnet", lease->subnet_id_,
501 "assigned-nas" :
"assigned-pds"),
503 if (lease->stateDeclined()) {
504 StatsMgr::instance().addValue(
"declined-addresses", int64_t(1));
506 StatsMgr::instance().addValue(
507 StatsMgr::generateName(
"subnet", lease->subnet_id_,
508 "declined-addresses"),
515 LeaseCmdsImpl::updateStatsOnUpdate(
const Lease4Ptr& existing,
517 if (!existing->stateExpiredReclaimed()) {
519 if (existing->subnet_id_ != lease->subnet_id_) {
520 StatsMgr::instance().addValue(
521 StatsMgr::generateName(
"subnet", existing->subnet_id_,
522 "assigned-addresses"),
525 if (existing->stateDeclined()) {
527 StatsMgr::instance().addValue(
"declined-addresses", int64_t(-1));
529 StatsMgr::instance().addValue(
530 StatsMgr::generateName(
"subnet", existing->subnet_id_,
531 "declined-addresses"),
534 if (!lease->stateExpiredReclaimed()) {
536 if (existing->subnet_id_ != lease->subnet_id_) {
537 StatsMgr::instance().addValue(
538 StatsMgr::generateName(
"subnet", lease->subnet_id_,
539 "assigned-addresses"),
542 if (lease->stateDeclined()) {
544 StatsMgr::instance().addValue(
"declined-addresses", int64_t(1));
546 StatsMgr::instance().addValue(
547 StatsMgr::generateName(
"subnet", lease->subnet_id_,
548 "declined-addresses"),
554 if (!lease->stateExpiredReclaimed()) {
556 StatsMgr::instance().addValue(
557 StatsMgr::generateName(
"subnet", lease->subnet_id_,
558 "assigned-addresses"),
560 if (lease->stateDeclined()) {
562 StatsMgr::instance().addValue(
"declined-addresses", int64_t(1));
564 StatsMgr::instance().addValue(
565 StatsMgr::generateName(
"subnet", lease->subnet_id_,
566 "declined-addresses"),
574 LeaseCmdsImpl::updateStatsOnUpdate(
const Lease6Ptr& existing,
576 if (!existing->stateExpiredReclaimed()) {
578 if (existing->subnet_id_ != lease->subnet_id_) {
579 StatsMgr::instance().addValue(
580 StatsMgr::generateName(
"subnet", existing->subnet_id_,
582 "assigned-nas" :
"assigned-pds"),
585 if (existing->stateDeclined()) {
587 StatsMgr::instance().addValue(
"declined-addresses", int64_t(-1));
589 StatsMgr::instance().addValue(
590 StatsMgr::generateName(
"subnet", existing->subnet_id_,
591 "declined-addresses"),
594 if (!lease->stateExpiredReclaimed()) {
596 if (existing->subnet_id_ != lease->subnet_id_) {
597 StatsMgr::instance().addValue(
598 StatsMgr::generateName(
"subnet", lease->subnet_id_,
600 "assigned-nas" :
"assigned-pds"),
603 if (lease->stateDeclined()) {
605 StatsMgr::instance().addValue(
"declined-addresses", int64_t(1));
607 StatsMgr::instance().addValue(
608 StatsMgr::generateName(
"subnet", lease->subnet_id_,
609 "declined-addresses"),
615 if (!lease->stateExpiredReclaimed()) {
617 StatsMgr::instance().addValue(
618 StatsMgr::generateName(
"subnet", lease->subnet_id_,
620 "assigned-nas" :
"assigned-pds"),
622 if (lease->stateDeclined()) {
624 StatsMgr::instance().addValue(
"declined-addresses", int64_t(1));
626 StatsMgr::instance().addValue(
627 StatsMgr::generateName(
"subnet", lease->subnet_id_,
628 "declined-addresses"),
636 LeaseCmdsImpl::updateStatsOnDelete(
const Lease4Ptr& lease) {
637 if (!lease->stateExpiredReclaimed()) {
638 StatsMgr::instance().addValue(
639 StatsMgr::generateName(
"subnet", lease->subnet_id_,
640 "assigned-addresses"),
642 if (lease->stateDeclined()) {
643 StatsMgr::instance().addValue(
"declined-addresses", int64_t(-1));
645 StatsMgr::instance().addValue(
646 StatsMgr::generateName(
"subnet", lease->subnet_id_,
647 "declined-addresses"),
654 LeaseCmdsImpl::updateStatsOnDelete(
const Lease6Ptr& lease) {
655 if (!lease->stateExpiredReclaimed()) {
656 StatsMgr::instance().addValue(
657 StatsMgr::generateName(
"subnet", lease->subnet_id_,
659 "assigned-nas" :
"assigned-pds"),
661 if (lease->stateDeclined()) {
662 StatsMgr::instance().addValue(
"declined-addresses", int64_t(-1));
664 StatsMgr::instance().addValue(
665 StatsMgr::generateName(
"subnet", lease->subnet_id_,
666 "declined-addresses"),
673 LeaseCmdsImpl::addOrUpdate4(
Lease4Ptr lease,
bool force_create) {
675 if (force_create && !existing) {
679 "lost race between calls to get and add");
681 LeaseCmdsImpl::updateStatsOnAdd(lease);
694 << lease->addr_ <<
" either because the lease has been " 695 "deleted or it has changed in the database, in both cases a " 696 "retry might succeed");
699 LeaseCmdsImpl::updateStatsOnUpdate(existing, lease);
704 LeaseCmdsImpl::addOrUpdate6(
Lease6Ptr lease,
bool force_create) {
707 if (force_create && !existing) {
711 "lost race between calls to get and add");
713 LeaseCmdsImpl::updateStatsOnAdd(lease);
725 if ((!old_extended_info && !extended_info) ||
726 (old_extended_info && extended_info &&
727 (*old_extended_info == *extended_info))) {
737 << lease->addr_ <<
" either because the lease has been " 738 "deleted or it has changed in the database, in both cases a " 739 "retry might succeed");
742 LeaseCmdsImpl::updateStatsOnUpdate(existing, lease);
752 string lease_address =
"unknown";
754 extractCommand(handle);
755 v4 = (cmd_name_ ==
"lease4-add");
763 bool force_create =
false;
768 lease4 = parser.
parse(config, cmd_args_, force_create);
770 lease_address = lease4->addr_.toText();
772 if (!MultiThreadingMgr::instance().getMode()) {
778 if (resource_handler.
tryLock4(lease4->addr_)) {
782 "ResourceBusy: IP address:" << lease4->addr_
783 <<
" could not be added.");
791 LeaseCmdsImpl::updateStatsOnAdd(lease4);
792 resp <<
"Lease for address " << lease4->addr_.toText()
793 <<
", subnet-id " << lease4->subnet_id_ <<
" added.";
797 lease6 = parser.
parse(config, cmd_args_, force_create);
799 lease_address = lease6->addr_.toText();
801 if (!MultiThreadingMgr::instance().getMode()) {
807 if (resource_handler.
tryLock(lease6->type_, lease6->addr_)) {
811 "ResourceBusy: IP address:" << lease6->addr_
812 <<
" could not be added.");
820 LeaseCmdsImpl::updateStatsOnAdd(lease6);
822 resp <<
"Lease for address " << lease6->addr_.toText()
823 <<
", subnet-id " << lease6->subnet_id_ <<
" added.";
825 resp <<
"Lease for prefix " << lease6->addr_.toText()
826 <<
"/" <<
static_cast<int>(lease6->prefixlen_)
827 <<
", subnet-id " << lease6->subnet_id_ <<
" added.";
833 .arg(cmd_args_ ? cmd_args_->str() :
"<no args>")
838 }
catch (
const std::exception& ex) {
840 .arg(cmd_args_ ? cmd_args_->str() :
"<no args>")
842 setErrorResponse(handle, ex.what());
849 setSuccessResponse(handle, resp.str());
861 if (params->contains(
"update-ddns")) {
874 if (params->contains(
"type")) {
875 string t = params->get(
"type")->stringValue();
876 if (t ==
"IA_NA" || t ==
"0") {
878 }
else if (t ==
"IA_TA" || t ==
"1") {
880 }
else if (t ==
"IA_PD" || t ==
"2") {
882 }
else if (t ==
"V4" || t ==
"3") {
886 << t <<
", only supported values are: IA_NA, IA_TA," 901 txt <<
"Invalid " << (v6 ?
"IPv6" :
"IPv4")
902 <<
" address specified: " << tmp->stringValue();
910 tmp = params->get(
"subnet-id");
919 if (params->contains(
"iaid")) {
920 x.
iaid = params->get(
"iaid")->intValue();
931 " and 'identifier-type' is either missing or not a string.");
935 " and 'identifier' is either missing or not a string.");
940 x.
query_type = Parameters::txtToType(type->stringValue());
943 case Parameters::TYPE_HWADDR: {
948 case Parameters::TYPE_CLIENT_ID: {
952 case Parameters::TYPE_DUID: {
957 case Parameters::TYPE_ADDR: {
964 " is not supported.");
978 extractCommand(handle);
979 v4 = (cmd_name_ ==
"lease4-get");
980 p = getParameters(!v4, cmd_args_);
982 case Parameters::TYPE_ADDR: {
991 case Parameters::TYPE_HWADDR:
995 "requires hwaddr to be specified");
1004 case Parameters::TYPE_DUID:
1008 "requires duid to be specified");
1018 case Parameters::TYPE_CLIENT_ID:
1022 "requires client-id to be specified");
1036 }
catch (
const std::exception& ex) {
1038 .arg(cmd_args_ ? cmd_args_->str() :
"<no args>")
1040 setErrorResponse(handle, ex.what());
1046 lease_json = lease4->toElement();
1048 "IPv4 lease found.", lease_json);
1049 setResponse(handle, response);
1050 }
else if (!v4 && lease6) {
1051 lease_json = lease6->toElement();
1053 "IPv6 lease found.", lease_json);
1054 setResponse(handle, response);
1067 extractCommand(handle);
1068 v4 = (cmd_name_ ==
"lease4-get-all");
1083 const std::vector<ElementPtr>& subnet_ids = subnets->listValue();
1084 for (
auto subnet_id = subnet_ids.begin();
1085 subnet_id != subnet_ids.end();
1094 for (
auto lease : leases) {
1096 leases_json->add(lease_json);
1101 for (
auto lease : leases) {
1103 leases_json->add(lease_json);
1112 for (
auto lease : leases) {
1114 leases_json->add(lease_json);
1118 for (
auto lease : leases) {
1120 leases_json->add(lease_json);
1125 std::ostringstream s;
1126 s << leases_json->size()
1127 <<
" IPv" << (v4 ?
"4" :
"6")
1128 <<
" lease(s) found.";
1130 args->set(
"leases", leases_json);
1136 setResponse(handle, response);
1138 }
catch (
const std::exception& ex) {
1139 setErrorResponse(handle, ex.what());
1150 extractCommand(handle);
1151 v4 = (cmd_name_ ==
"lease4-get-page");
1172 boost::scoped_ptr<IOAddress> from_address;
1174 if (from->stringValue() ==
"start") {
1175 from_address.reset(
new IOAddress(v4 ?
"0.0.0.0" :
"::"));
1179 from_address.reset(
new IOAddress(from->stringValue()));
1184 "a valid IPv" << (v4 ?
"4" :
"6") <<
" address");
1189 if (v4 && (!from_address->isV4())) {
1191 <<
" is not an IPv4 address");
1193 }
else if (!v4 && from_address->isV4()) {
1195 <<
" is not an IPv6 address");
1210 size_t page_limit_value =
static_cast<size_t>(page_limit->intValue());
1221 for (
auto lease : leases) {
1223 leases_json->add(lease_json);
1232 for (
auto lease : leases) {
1234 leases_json->add(lease_json);
1239 std::ostringstream s;
1240 s << leases_json->size()
1241 <<
" IPv" << (v4 ?
"4" :
"6")
1242 <<
" lease(s) found.";
1246 args->set(
"leases", leases_json);
1247 args->set(
"count",
Element::create(static_cast<int64_t>(leases_json->size())));
1255 setResponse(handle, response);
1257 }
catch (
const std::exception& ex) {
1258 setErrorResponse(handle, ex.what());
1268 extractCommand(handle);
1271 if (!cmd_args_ || (cmd_args_->getType() !=
Element::map)) {
1291 for (
auto lease : leases) {
1293 leases_json->add(lease_json);
1296 std::ostringstream s;
1297 s << leases_json->size() <<
" IPv4 lease(s) found.";
1299 args->set(
"leases", leases_json);
1305 setResponse(handle, response);
1307 }
catch (
const std::exception& ex) {
1308 setErrorResponse(handle, ex.what());
1318 extractCommand(handle);
1321 if (!cmd_args_ || (cmd_args_->getType() !=
Element::map)) {
1341 for (
auto lease : leases) {
1343 leases_json->add(lease_json);
1346 std::ostringstream s;
1347 s << leases_json->size() <<
" IPv4 lease(s) found.";
1349 args->set(
"leases", leases_json);
1355 setResponse(handle, response);
1357 }
catch (
const std::exception& ex) {
1358 setErrorResponse(handle, ex.what());
1368 extractCommand(handle);
1371 if (!cmd_args_ || (cmd_args_->getType() !=
Element::map)) {
1391 for (
auto lease : leases) {
1393 leases_json->add(lease_json);
1396 std::ostringstream s;
1397 s << leases_json->size() <<
" IPv6 lease(s) found.";
1399 args->set(
"leases", leases_json);
1405 setResponse(handle, response);
1407 }
catch (
const std::exception& ex) {
1408 setErrorResponse(handle, ex.what());
1419 extractCommand(handle);
1420 v4 = (cmd_name_ ==
"lease4-get-by-hostname");
1423 if (!cmd_args_ || (cmd_args_->getType() !=
Element::map)) {
1438 std::string hostname_ = hostname->stringValue();
1440 if (hostname_.empty()) {
1443 boost::algorithm::to_lower(hostname_);
1450 for (
auto lease : leases) {
1452 leases_json->add(lease_json);
1458 for (
auto lease : leases) {
1460 leases_json->add(lease_json);
1464 std::ostringstream s;
1465 s << leases_json->size()
1466 <<
" IPv" << (v4 ?
"4" :
"6")
1467 <<
" lease(s) found.";
1469 args->set(
"leases", leases_json);
1475 setResponse(handle, response);
1477 }
catch (
const std::exception& ex) {
1478 setErrorResponse(handle, ex.what());
1490 extractCommand(handle);
1491 p = getParameters(
false, cmd_args_);
1493 case Parameters::TYPE_ADDR: {
1502 case Parameters::TYPE_HWADDR: {
1505 "requires hwaddr to be specified");
1516 case Parameters::TYPE_CLIENT_ID: {
1519 "requires client-id to be specified");
1530 case Parameters::TYPE_DUID: {
1541 setSuccessResponse(handle,
"IPv4 lease deleted.");
1542 LeaseCmdsImpl::updateStatsOnDelete(lease4);
1552 }
catch (
const std::exception& ex) {
1554 .arg(cmd_args_ ? cmd_args_->str() :
"<no args>")
1556 setErrorResponse(handle, ex.what());
1560 .arg(lease4->addr_.toText());
1567 extractCommand(handle);
1570 if (!cmd_args_ || (cmd_args_->getType() !=
Element::map)) {
1575 auto deleted_leases = cmd_args_->get(
"deleted-leases");
1576 auto leases = cmd_args_->get(
"leases");
1578 if (!deleted_leases && !leases) {
1584 if (deleted_leases && (deleted_leases->getType() !=
Element::list)) {
1596 std::list<std::pair<Parameters, Lease6Ptr> > parsed_deleted_list;
1597 if (deleted_leases) {
1598 auto leases_list = deleted_leases->listValue();
1601 for (
auto lease_params : leases_list) {
1604 Parameters p = getParameters(
true, lease_params);
1605 auto lease = getIPv6LeaseForDelete(p);
1606 parsed_deleted_list.push_back(std::make_pair(p, lease));
1612 std::list<Lease6Ptr> parsed_leases_list;
1617 auto leases_list = leases->listValue();
1618 for (
auto lease_params : leases_list) {
1625 Lease6Ptr lease6 = parser.
parse(config, lease_params, force_update);
1626 parsed_leases_list.push_back(lease6);
1631 size_t success_count = 0;
1634 if (!parsed_deleted_list.empty()) {
1637 for (
auto lease_params_pair : parsed_deleted_list) {
1642 auto lease = lease_params_pair.second;
1651 LeaseCmdsImpl::updateStatsOnDelete(lease);
1655 if (!failed_deleted_list) {
1663 failed_deleted_list->add(createFailedLeaseMap(p.
lease_type,
1666 "lease not found"));
1670 }
catch (
const std::exception& ex) {
1672 if (!failed_deleted_list) {
1675 failed_deleted_list->add(createFailedLeaseMap(p.
lease_type,
1685 if (!parsed_leases_list.empty()) {
1689 for (
auto lease : parsed_leases_list) {
1692 std::ostringstream text;
1694 if (!MultiThreadingMgr::instance().getMode()) {
1696 addOrUpdate6(lease,
true);
1700 if (resource_handler.
tryLock(lease->type_, lease->addr_)) {
1701 addOrUpdate6(lease,
true);
1704 "ResourceBusy: IP address:" << lease->addr_
1705 <<
" could not be updated.");
1714 }
catch (
const std::exception& ex) {
1721 if (!failed_leases_list) {
1724 failed_leases_list->add(createFailedLeaseMap(lease->type_,
1736 if (failed_deleted_list || failed_leases_list) {
1741 if (failed_deleted_list) {
1742 args->set(
"failed-deleted-leases", failed_deleted_list);
1746 if (failed_leases_list) {
1747 args->set(
"failed-leases", failed_leases_list);
1752 std::ostringstream resp_text;
1753 resp_text <<
"Bulk apply of " << success_count <<
" IPv6 leases completed.";
1756 setResponse(handle, answer);
1760 .arg(success_count);
1762 }
catch (
const std::exception& ex) {
1765 .arg(cmd_args_ ? cmd_args_->str() :
"<no args>")
1767 setErrorResponse(handle, ex.what());
1780 extractCommand(handle);
1781 p = getParameters(
true, cmd_args_);
1784 case Parameters::TYPE_ADDR: {
1795 case Parameters::TYPE_HWADDR: {
1799 case Parameters::TYPE_DUID: {
1802 "requires duid to be specified");
1821 setSuccessResponse(handle,
"IPv6 lease deleted.");
1822 LeaseCmdsImpl::updateStatsOnDelete(lease6);
1832 }
catch (
const std::exception& ex) {
1834 .arg(cmd_args_ ? cmd_args_->str() :
"<no args>")
1836 setErrorResponse(handle, ex.what());
1841 .arg(lease6->addr_.toText());
1848 extractCommand(handle);
1859 bool force_create =
false;
1863 lease4 = parser.
parse(config, cmd_args_, force_create);
1865 if (!MultiThreadingMgr::instance().getMode()) {
1867 added = addOrUpdate4(lease4, force_create);
1871 if (resource_handler.
tryLock4(lease4->addr_)) {
1872 added = addOrUpdate4(lease4, force_create);
1875 "ResourceBusy: IP address:" << lease4->addr_
1876 <<
" could not be updated.");
1881 setSuccessResponse(handle,
"IPv4 lease added.");
1883 setSuccessResponse(handle,
"IPv4 lease updated.");
1887 .arg(lease4->addr_.toText());
1891 .arg(cmd_args_ ? cmd_args_->str() :
"<no args>")
1896 }
catch (
const std::exception& ex) {
1898 .arg(cmd_args_ ? cmd_args_->str() :
"<no args>")
1900 setErrorResponse(handle, ex.what());
1910 extractCommand(handle);
1921 bool force_create =
false;
1925 lease6 = parser.
parse(config, cmd_args_, force_create);
1927 if (!MultiThreadingMgr::instance().getMode()) {
1929 added = addOrUpdate6(lease6, force_create);
1933 if (resource_handler.
tryLock(lease6->type_, lease6->addr_)) {
1934 added = addOrUpdate6(lease6, force_create);
1937 "ResourceBusy: IP address:" << lease6->addr_
1938 <<
" could not be updated.");
1943 setSuccessResponse(handle,
"IPv6 lease added.");
1945 setSuccessResponse(handle,
"IPv6 lease updated.");
1949 .arg(lease6->addr_.toText());
1953 .arg(cmd_args_ ? cmd_args_->str() :
"<no args>")
1958 }
catch (
const std::exception& ex) {
1960 .arg(cmd_args_ ? cmd_args_->str() :
"<no args>")
1962 setErrorResponse(handle, ex.what());
1972 extractCommand(handle);
1981 if (cmd_args_ && cmd_args_->contains(
"subnet-id")) {
1982 id = parser.
getUint32(cmd_args_,
"subnet-id");
1990 auto observation = StatsMgr::instance().getObservation(
1991 StatsMgr::generateName(
"subnet",
id,
"declined-addresses"));
1993 int64_t previous_declined = 0;
1996 previous_declined = observation->getInteger().first;
1999 StatsMgr::instance().setValue(
2000 StatsMgr::generateName(
"subnet",
id,
"assigned-addresses"),
2003 StatsMgr::instance().setValue(
2004 StatsMgr::generateName(
"subnet",
id,
"declined-addresses"),
2007 StatsMgr::instance().addValue(
"declined-addresses", -previous_declined);
2015 for (
auto sub : *subs) {
2017 ids <<
" " << sub->getID();
2018 StatsMgr::instance().setValue(
2019 StatsMgr::generateName(
"subnet", sub->getID(),
"assigned-addresses"),
2022 StatsMgr::instance().setValue(
2023 StatsMgr::generateName(
"subnet", sub->getID(),
"declined-addresses"),
2027 StatsMgr::instance().setValue(
"declined-addresses", int64_t(0));
2031 tmp <<
"Deleted " << num <<
" IPv4 lease(s) from subnet(s)" << ids.str();
2034 setResponse(handle, response);
2035 }
catch (
const std::exception& ex) {
2037 .arg(cmd_args_ ? cmd_args_->str() :
"<no args>")
2039 setErrorResponse(handle, ex.what());
2044 .arg(cmd_args_ ? cmd_args_->str() :
"<no args>");
2051 extractCommand(handle);
2066 if (cmd_args_ && cmd_args_->contains(
"subnet-id")) {
2067 id = parser.
getUint32(cmd_args_,
"subnet-id");
2075 auto observation = StatsMgr::instance().getObservation(
2076 StatsMgr::generateName(
"subnet",
id,
"declined-addresses"));
2078 int64_t previous_declined = 0;
2081 previous_declined = observation->getInteger().first;
2084 StatsMgr::instance().setValue(
2085 StatsMgr::generateName(
"subnet",
id,
"assigned-nas" ),
2088 StatsMgr::instance().setValue(
2089 StatsMgr::generateName(
"subnet",
id,
"assigned-pds"),
2092 StatsMgr::instance().setValue(
2093 StatsMgr::generateName(
"subnet",
id,
"declined-addresses"),
2096 StatsMgr::instance().addValue(
"declined-addresses", -previous_declined);
2104 for (
auto sub : *subs) {
2106 ids <<
" " << sub->getID();
2107 StatsMgr::instance().setValue(
2108 StatsMgr::generateName(
"subnet", sub->getID(),
"assigned-nas" ),
2111 StatsMgr::instance().setValue(
2112 StatsMgr::generateName(
"subnet", sub->getID(),
"assigned-pds"),
2115 StatsMgr::instance().setValue(
2116 StatsMgr::generateName(
"subnet", sub->getID(),
"declined-addresses"),
2120 StatsMgr::instance().setValue(
"declined-addresses", int64_t(0));
2124 tmp <<
"Deleted " << num <<
" IPv6 lease(s) from subnet(s)" << ids.str();
2127 setResponse(handle, response);
2128 }
catch (
const std::exception& ex) {
2130 .arg(cmd_args_ ? cmd_args_->str() :
"<no args>")
2132 setErrorResponse(handle, ex.what());
2137 .arg(cmd_args_ ? cmd_args_->str() :
"<no args>");
2142 LeaseCmdsImpl::getIPv6LeaseForDelete(
const Parameters& parameters)
const {
2146 case Parameters::TYPE_ADDR: {
2153 lease6.reset(
new Lease6());
2154 lease6->addr_ = parameters.
addr;
2158 case Parameters::TYPE_HWADDR: {
2162 case Parameters::TYPE_DUID: {
2163 if (!parameters.
duid) {
2165 "requires duid to be specified");
2185 short family)
const {
2198 }
catch (
const std::exception& ex) {
2200 <<
"' is not a valid IP address.");
2205 << (family == AF_INET6 ?
"IPv6" :
"IPv4")
2206 <<
" address specified: " << param->stringValue());
2214 std::stringstream ss;
2218 extractCommand(handle);
2221 IOAddress addr = getAddressParam(cmd_args_,
"ip-address", AF_INET);
2224 ss <<
"DDNS updating is not enabled";
2230 ss <<
"No lease found for: " << addr.
toText();
2232 }
else if (lease->hostname_.empty()) {
2233 ss <<
"Lease for: " << addr.
toText()
2234 <<
", has no hostname, nothing to update";
2236 }
else if (!lease->fqdn_fwd_ && !lease->fqdn_rev_) {
2237 ss <<
"Neither forward nor reverse updates enabled for lease for: " 2244 ss <<
"NCR generated for: " << addr.
toText()
2245 <<
", hostname: " << lease->hostname_;
2246 setSuccessResponse(handle, ss.str());
2251 }
catch (
const std::exception& ex) {
2256 setErrorResponse(handle, ss.str(), resp_code);
2262 std::stringstream ss;
2266 extractCommand(handle);
2269 IOAddress addr = getAddressParam(cmd_args_,
"ip-address", AF_INET6);
2272 ss <<
"DDNS updating is not enabled";
2278 ss <<
"No lease found for: " << addr.
toText();
2280 }
else if (lease->hostname_.empty()) {
2281 ss <<
"Lease for: " << addr.
toText()
2282 <<
", has no hostname, nothing to update";
2284 }
else if (!lease->fqdn_fwd_ && !lease->fqdn_rev_) {
2285 ss <<
"Neither forward nor reverse updates enabled for lease for: " 2292 ss <<
"NCR generated for: " << addr.
toText()
2293 <<
", hostname: " << lease->hostname_;
2294 setSuccessResponse(handle, ss.str());
2299 }
catch (
const std::exception& ex) {
2304 setErrorResponse(handle, ss.str(), resp_code);
2312 const int control_result,
2313 const std::string& error_message)
const {
2326 failed_lease_map->set(
"error-message",
Element::create(error_message));
2328 return (failed_lease_map);
2335 extractCommand(handle);
2336 v4 = (cmd_name_ ==
"lease4-write");
2349 string filename = file->stringValue();
2350 if (filename.empty()) {
2360 s << (v4 ?
"IPv4" :
"IPv6")
2361 <<
" lease database into '" 2362 << filename <<
"'.";
2364 setResponse(handle, response);
2365 }
catch (
const std::exception& ex) {
2366 setErrorResponse(handle, ex.what());
2375 return (impl_->leaseAddHandler(handle));
2380 return (impl_->lease6BulkApplyHandler(handle));
2385 return (impl_->leaseGetHandler(handle));
2390 return (impl_->leaseGetAllHandler(handle));
2395 return (impl_->leaseGetPageHandler(handle));
2400 return (impl_->leaseGetByHwAddressHandler(handle));
2405 return (impl_->leaseGetByClientIdHandler(handle));
2410 return (impl_->leaseGetByDuidHandler(handle));
2415 return (impl_->leaseGetByHostnameHandler(handle));
2420 return (impl_->lease4DelHandler(handle));
2425 return (impl_->lease6DelHandler(handle));
2430 return (impl_->lease4UpdateHandler(handle));
2435 return (impl_->lease6UpdateHandler(handle));
2441 return (impl_->lease4WipeHandler(handle));
2447 return (impl_->lease6WipeHandler(handle));
2452 return (impl_->lease4ResendDdnsHandler(handle));
2457 return (impl_->lease6ResendDdnsHandler(handle));
2462 return (impl_->leaseWriteHandler(handle));
2465 LeaseCmds::LeaseCmds()
RAII class creating a critical section.
const int CONTROL_RESULT_CONFLICT
Status code indicating that the command was unsuccessful due to a conflict between the command argume...
#define LOG_WARN(LOGGER, MESSAGE)
Macro to conveniently test warn output and log it.
const isc::log::MessageID LEASE_CMDS_BULK_APPLY6
boost::shared_ptr< DUID > DuidPtr
virtual void updateLease4(const Lease4Ptr &lease4)=0
Updates IPv4 lease.
const isc::log::MessageID LEASE_CMDS_ADD6_FAILED
const isc::log::MessageID LEASE_CMDS_ADD4_FAILED
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)
const isc::log::MessageID LEASE_CMDS_WIPE4_FAILED
#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.
static std::string typeToText(Type type)
returns text representation of a lease type
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.
const isc::log::MessageID LEASE_CMDS_DEL6_FAILED
An abstract API for lease database.
static CfgMgr & instance()
returns a single instance of Configuration Manager
Attempt to update lease that was not there.
const isc::log::MessageID LEASE_CMDS_RESEND_DDNS6_FAILED
std::vector< Lease4Ptr > Lease4Collection
A collection of IPv4 leases.
const isc::log::MessageID LEASE_CMDS_RESEND_DDNS4
const isc::log::MessageID LEASE_CMDS_DEL4
const isc::log::MessageID LEASE_CMDS_UPDATE6_CONFLICT
const isc::log::MessageID LEASE_CMDS_UPDATE6_FAILED
Resource race avoidance RAII handler for DHCPv4.
#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.
const isc::log::MessageID LEASE_CMDS_GET6_FAILED
Type query_type
specifies parameter types
SubnetID subnet_id
Specifies subnet-id (always used)
const isc::log::MessageID LEASE_CMDS_ADD6_CONFLICT
const isc::log::MessageID LEASE_CMDS_BULK_APPLY6_FAILED
const isc::log::MessageID LEASE_CMDS_ADD4
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.
virtual const char * what() const
Returns a C-style character string of the cause of the exception.
boost::shared_ptr< const CfgSubnets4 > ConstCfgSubnets4Ptr
Const pointer.
Holds DUID (DHCPv6 Unique Identifier)
Resource race avoidance RAII handler.
const int CONTROL_RESULT_EMPTY
Status code indicating that the specified command was completed correctly, but failed to produce any ...
Exception thrown when a command failed due to a conflict.
static const IOAddress & IPV6_ZERO_ADDRESS()
Returns an IPv6 zero address.
bool tryLock(Lease::Type type, const asiolink::IOAddress &addr)
Tries to acquires a resource.
#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")
void queueNCR(const NameChangeType &chg_type, const Lease4Ptr &lease)
Creates name change request from the DHCPv4 lease.
boost::shared_ptr< const SrvConfig > ConstSrvConfigPtr
Const pointer to the SrvConfig.
const isc::log::MessageID LEASE_CMDS_UPDATE4
const isc::log::MessageID LEASE_CMDS_RESEND_DDNS4_FAILED
static void syncCurrentExpirationTime(const Lease &from, Lease &to)
Sync lease current expiration time with new value from another lease, so that additional operations c...
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.
const isc::log::MessageID LEASE_CMDS_DEL4_FAILED
boost::shared_ptr< Lease4 > Lease4Ptr
Pointer to a Lease4 structure.
Per-packet callout handle.
Wrapper class around reservation command handlers.
const isc::log::MessageID LEASE_CMDS_UPDATE6
boost::shared_ptr< const CfgSubnets6 > ConstCfgSubnets6Ptr
Const pointer.
bool isV6Zero() const
Convenience function to check if it is an IPv4 zero address.
Parser for Lease6 structure.
const int LEASE_CMDS_DBG_COMMAND_DATA
Logging level used to log successful commands.
boost::shared_ptr< const Element > ConstElementPtr
Structure that holds a lease for IPv6 address and/or prefix.
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.
static ConstElementPtr getExtendedInfo6(const Lease6Ptr &lease)
Get DHCPv6 extended info.
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
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.
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-lfc.
std::string toText() const
Convert the address to a string.
update extended info tables.
const isc::log::MessageID LEASE_CMDS_DEL6
This file contains several functions and constants that are used for handling commands and responses ...
const isc::log::MessageID LEASE_CMDS_GET4_FAILED
static ElementPtr create(const Position &pos=ZERO_POSITION())
bool updateDDNS
Indicates whether or not DNS should be updated.
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.
const isc::log::MessageID LEASE_CMDS_WIPE4
virtual void writeLeases6(const std::string &filename)=0
Write V6 leases to a file.
#define LOG_DEBUG(LOGGER, LEVEL, MESSAGE)
Macro to conveniently test debug output and log it.
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.
const isc::log::MessageID LEASE_CMDS_UPDATE4_FAILED
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.
const isc::log::MessageID LEASE_CMDS_ADD6
virtual bool deleteLease(const Lease4Ptr &lease)=0
Deletes an IPv4 lease.
const isc::log::MessageID LEASE_CMDS_WIPE6
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)
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.
static LeaseMgr & 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.
boost::shared_ptr< Lease6 > Lease6Ptr
Pointer to a Lease6 structure.
const isc::log::MessageID LEASE_CMDS_ADD4_CONFLICT
virtual void writeLeases4(const std::string &filename)=0
Write V4 leases to a file.
const isc::log::MessageID LEASE_CMDS_UPDATE4_CONFLICT
virtual void updateLease6(const Lease6Ptr &lease6)=0
Updates IPv6 lease.
const isc::log::MessageID LEASE_CMDS_WIPE6_FAILED
const isc::log::MessageID LEASE_CMDS_RESEND_DDNS6
uint32_t SubnetID
Defines unique IPv4 or IPv6 subnet identifier.
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.
short getFamily() const
Returns the address family.
bool tryLock4(const asiolink::IOAddress &addr)
Tries to acquires a resource.