34#include <boost/scoped_ptr.hpp>
35#include <boost/algorithm/string.hpp>
93 if (txt ==
"address") {
95 }
else if (txt ==
"hw-address") {
97 }
else if (txt ==
"duid") {
99 }
else if (txt ==
"client-id") {
103 << txt <<
", the only supported values are: "
104 "address, hw-address, duid");
390 const int control_result,
391 const std::string& error_message)
const;
404 short family = AF_INET)
const;
466 if (!user_context || (user_context->getType() != Element::map)) {
470 if (!
isc || (
isc->getType() != Element::map)) {
473 return (
isc->get(
"relay-info"));
479 if (!lease->stateExpiredReclaimed()) {
480 StatsMgr::instance().addValue(
481 StatsMgr::generateName(
"subnet", lease->subnet_id_,
482 "assigned-addresses"),
483 static_cast<int64_t
>(1));
486 const auto& subnet = CfgMgr::instance().getCurrentCfg()->getCfgSubnets4()->getBySubnetId(lease->subnet_id_);
488 pool = subnet->getPool(Lease::TYPE_V4, lease->addr_,
false);
490 StatsMgr::instance().addValue(
491 StatsMgr::generateName(
"subnet", subnet->getID(),
492 StatsMgr::generateName(
"pool", pool->getID(),
493 "assigned-addresses")),
494 static_cast<int64_t
>(1));
498 if (lease->stateDeclined()) {
499 StatsMgr::instance().addValue(
"declined-addresses",
static_cast<int64_t
>(1));
501 StatsMgr::instance().addValue(
502 StatsMgr::generateName(
"subnet", lease->subnet_id_,
503 "declined-addresses"),
504 static_cast<int64_t
>(1));
507 StatsMgr::instance().addValue(
508 StatsMgr::generateName(
"subnet", subnet->getID(),
509 StatsMgr::generateName(
"pool", pool->getID(),
510 "declined-addresses")),
511 static_cast<int64_t
>(1));
519 if (!lease->stateExpiredReclaimed()) {
520 StatsMgr::instance().addValue(
521 StatsMgr::generateName(
"subnet", lease->subnet_id_,
522 lease->type_ == Lease::TYPE_NA ?
523 "assigned-nas" :
"assigned-pds"),
524 static_cast<int64_t
>(1));
527 const auto& subnet = CfgMgr::instance().getCurrentCfg()->getCfgSubnets6()->getBySubnetId(lease->subnet_id_);
529 pool = subnet->getPool(lease->type_, lease->addr_,
false);
531 StatsMgr::instance().addValue(
532 StatsMgr::generateName(
"subnet", subnet->getID(),
533 StatsMgr::generateName(lease->type_ == Lease::TYPE_NA ?
534 "pool" :
"pd-pool", pool->getID(),
535 lease->type_ == Lease::TYPE_NA ?
536 "assigned-nas" :
"assigned-pds")),
537 static_cast<int64_t
>(1));
541 if (lease->stateDeclined()) {
542 StatsMgr::instance().addValue(
"declined-addresses",
static_cast<int64_t
>(1));
544 StatsMgr::instance().addValue(
545 StatsMgr::generateName(
"subnet", lease->subnet_id_,
546 "declined-addresses"),
547 static_cast<int64_t
>(1));
550 StatsMgr::instance().addValue(
551 StatsMgr::generateName(
"subnet", subnet->getID(),
552 StatsMgr::generateName(
"pool", pool->getID(),
553 "declined-addresses")),
554 static_cast<int64_t
>(1));
563 if (!existing->stateExpiredReclaimed()) {
568 if (existing->subnet_id_ != lease->subnet_id_) {
569 StatsMgr::instance().addValue(
570 StatsMgr::generateName(
"subnet", existing->subnet_id_,
571 "assigned-addresses"),
572 static_cast<int64_t
>(-1));
574 subnet = CfgMgr::instance().getCurrentCfg()->getCfgSubnets4()->getBySubnetId(existing->subnet_id_);
576 pool = subnet->getPool(Lease::TYPE_V4, existing->addr_,
false);
578 StatsMgr::instance().addValue(
579 StatsMgr::generateName(
"subnet", subnet->getID(),
580 StatsMgr::generateName(
"pool", pool->getID(),
581 "assigned-addresses")),
582 static_cast<int64_t
>(-1));
587 if (existing->stateDeclined()) {
589 StatsMgr::instance().addValue(
"declined-addresses",
static_cast<int64_t
>(-1));
591 StatsMgr::instance().addValue(
592 StatsMgr::generateName(
"subnet", existing->subnet_id_,
593 "declined-addresses"),
594 static_cast<int64_t
>(-1));
597 StatsMgr::instance().addValue(
598 StatsMgr::generateName(
"subnet", subnet->getID(),
599 StatsMgr::generateName(
"pool", pool->getID(),
600 "declined-addresses")),
601 static_cast<int64_t
>(-1));
607 if (!lease->stateExpiredReclaimed()) {
609 if (existing->subnet_id_ != lease->subnet_id_) {
610 StatsMgr::instance().addValue(
611 StatsMgr::generateName(
"subnet", lease->subnet_id_,
612 "assigned-addresses"),
613 static_cast<int64_t
>(1));
615 subnet = CfgMgr::instance().getCurrentCfg()->getCfgSubnets4()->getBySubnetId(lease->subnet_id_);
617 pool = subnet->getPool(Lease::TYPE_V4, lease->addr_,
false);
619 StatsMgr::instance().addValue(
620 StatsMgr::generateName(
"subnet", subnet->getID(),
621 StatsMgr::generateName(
"pool", pool->getID(),
622 "assigned-addresses")),
623 static_cast<int64_t
>(1));
628 if (lease->stateDeclined()) {
630 StatsMgr::instance().addValue(
"declined-addresses",
static_cast<int64_t
>(1));
632 StatsMgr::instance().addValue(
633 StatsMgr::generateName(
"subnet", lease->subnet_id_,
634 "declined-addresses"),
635 static_cast<int64_t
>(1));
638 StatsMgr::instance().addValue(
639 StatsMgr::generateName(
"subnet", subnet->getID(),
640 StatsMgr::generateName(
"pool", pool->getID(),
641 "declined-addresses")),
642 static_cast<int64_t
>(1));
648 if (!lease->stateExpiredReclaimed()) {
650 StatsMgr::instance().addValue(
651 StatsMgr::generateName(
"subnet", lease->subnet_id_,
652 "assigned-addresses"),
653 static_cast<int64_t
>(1));
656 const auto& subnet = CfgMgr::instance().getCurrentCfg()->getCfgSubnets4()->getBySubnetId(lease->subnet_id_);
658 pool = subnet->getPool(Lease::TYPE_V4, lease->addr_,
false);
660 StatsMgr::instance().addValue(
661 StatsMgr::generateName(
"subnet", subnet->getID(),
662 StatsMgr::generateName(
"pool", pool->getID(),
663 "assigned-addresses")),
664 static_cast<int64_t
>(1));
668 if (lease->stateDeclined()) {
670 StatsMgr::instance().addValue(
"declined-addresses",
static_cast<int64_t
>(1));
672 StatsMgr::instance().addValue(
673 StatsMgr::generateName(
"subnet", lease->subnet_id_,
674 "declined-addresses"),
675 static_cast<int64_t
>(1));
678 StatsMgr::instance().addValue(
679 StatsMgr::generateName(
"subnet", subnet->getID(),
680 StatsMgr::generateName(
"pool", pool->getID(),
681 "declined-addresses")),
682 static_cast<int64_t
>(1));
692 if (!existing->stateExpiredReclaimed()) {
697 if (existing->subnet_id_ != lease->subnet_id_) {
698 StatsMgr::instance().addValue(
699 StatsMgr::generateName(
"subnet", existing->subnet_id_,
700 lease->type_ == Lease::TYPE_NA ?
701 "assigned-nas" :
"assigned-pds"),
702 static_cast<int64_t
>(-1));
704 subnet = CfgMgr::instance().getCurrentCfg()->getCfgSubnets6()->getBySubnetId(existing->subnet_id_);
706 pool = subnet->getPool(existing->type_, existing->addr_,
false);
708 StatsMgr::instance().addValue(
709 StatsMgr::generateName(
"subnet", subnet->getID(),
710 StatsMgr::generateName(existing->type_ == Lease::TYPE_NA ?
711 "pool" :
"pd-pool", pool->getID(),
712 existing->type_ == Lease::TYPE_NA ?
713 "assigned-nas" :
"assigned-pds")),
714 static_cast<int64_t
>(-1));
719 if (existing->stateDeclined()) {
721 StatsMgr::instance().addValue(
"declined-addresses",
static_cast<int64_t
>(-1));
723 StatsMgr::instance().addValue(
724 StatsMgr::generateName(
"subnet", existing->subnet_id_,
725 "declined-addresses"),
726 static_cast<int64_t
>(-1));
729 StatsMgr::instance().addValue(
730 StatsMgr::generateName(
"subnet", subnet->getID(),
731 StatsMgr::generateName(
"pool", pool->getID(),
732 "declined-addresses")),
733 static_cast<int64_t
>(-1));
739 if (!lease->stateExpiredReclaimed()) {
741 if (existing->subnet_id_ != lease->subnet_id_) {
742 StatsMgr::instance().addValue(
743 StatsMgr::generateName(
"subnet", lease->subnet_id_,
744 lease->type_ == Lease::TYPE_NA ?
745 "assigned-nas" :
"assigned-pds"),
746 static_cast<int64_t
>(1));
748 subnet = CfgMgr::instance().getCurrentCfg()->getCfgSubnets6()->getBySubnetId(lease->subnet_id_);
750 pool = subnet->getPool(lease->type_, lease->addr_,
false);
752 StatsMgr::instance().addValue(
753 StatsMgr::generateName(
"subnet", subnet->getID(),
754 StatsMgr::generateName(lease->type_ == Lease::TYPE_NA ?
755 "pool" :
"pd-pool", pool->getID(),
756 lease->type_ == Lease::TYPE_NA ?
757 "assigned-nas" :
"assigned-pds")),
758 static_cast<int64_t
>(1));
763 if (lease->stateDeclined()) {
765 StatsMgr::instance().addValue(
"declined-addresses",
static_cast<int64_t
>(1));
767 StatsMgr::instance().addValue(
768 StatsMgr::generateName(
"subnet", lease->subnet_id_,
769 "declined-addresses"),
770 static_cast<int64_t
>(1));
773 StatsMgr::instance().addValue(
774 StatsMgr::generateName(
"subnet", subnet->getID(),
775 StatsMgr::generateName(
"pool", pool->getID(),
776 "declined-addresses")),
777 static_cast<int64_t
>(1));
783 if (!lease->stateExpiredReclaimed()) {
785 StatsMgr::instance().addValue(
786 StatsMgr::generateName(
"subnet", lease->subnet_id_,
787 lease->type_ == Lease::TYPE_NA ?
788 "assigned-nas" :
"assigned-pds"),
789 static_cast<int64_t
>(1));
792 const auto& subnet = CfgMgr::instance().getCurrentCfg()->getCfgSubnets6()->getBySubnetId(lease->subnet_id_);
794 pool = subnet->getPool(lease->type_, lease->addr_,
false);
796 StatsMgr::instance().addValue(
797 StatsMgr::generateName(
"subnet", subnet->getID(),
798 StatsMgr::generateName(lease->type_ == Lease::TYPE_NA ?
799 "pool" :
"pd-pool", pool->getID(),
800 lease->type_ == Lease::TYPE_NA ?
801 "assigned-nas" :
"assigned-pds")),
802 static_cast<int64_t
>(1));
806 if (lease->stateDeclined()) {
808 StatsMgr::instance().addValue(
"declined-addresses",
static_cast<int64_t
>(1));
810 StatsMgr::instance().addValue(
811 StatsMgr::generateName(
"subnet", lease->subnet_id_,
812 "declined-addresses"),
813 static_cast<int64_t
>(1));
816 StatsMgr::instance().addValue(
817 StatsMgr::generateName(
"subnet", subnet->getID(),
818 StatsMgr::generateName(
"pool", pool->getID(),
819 "declined-addresses")),
820 static_cast<int64_t
>(1));
829 if (!lease->stateExpiredReclaimed()) {
830 StatsMgr::instance().addValue(
831 StatsMgr::generateName(
"subnet", lease->subnet_id_,
832 "assigned-addresses"),
833 static_cast<int64_t
>(-1));
836 const auto& subnet = CfgMgr::instance().getCurrentCfg()->getCfgSubnets4()->getBySubnetId(lease->subnet_id_);
838 pool = subnet->getPool(Lease::TYPE_V4, lease->addr_,
false);
840 StatsMgr::instance().addValue(
841 StatsMgr::generateName(
"subnet", subnet->getID(),
842 StatsMgr::generateName(
"pool", pool->getID(),
843 "assigned-addresses")),
844 static_cast<int64_t
>(-1));
848 if (lease->stateDeclined()) {
849 StatsMgr::instance().addValue(
"declined-addresses",
static_cast<int64_t
>(-1));
851 StatsMgr::instance().addValue(
852 StatsMgr::generateName(
"subnet", lease->subnet_id_,
853 "declined-addresses"),
854 static_cast<int64_t
>(-1));
857 StatsMgr::instance().addValue(
858 StatsMgr::generateName(
"subnet", subnet->getID(),
859 StatsMgr::generateName(
"pool", pool->getID(),
860 "declined-addresses")),
861 static_cast<int64_t
>(-1));
869 if (!lease->stateExpiredReclaimed()) {
870 StatsMgr::instance().addValue(
871 StatsMgr::generateName(
"subnet", lease->subnet_id_,
872 lease->type_ == Lease::TYPE_NA ?
873 "assigned-nas" :
"assigned-pds"),
874 static_cast<int64_t
>(-1));
877 const auto& subnet = CfgMgr::instance().getCurrentCfg()->getCfgSubnets6()->getBySubnetId(lease->subnet_id_);
879 pool = subnet->getPool(lease->type_, lease->addr_,
false);
881 StatsMgr::instance().addValue(
882 StatsMgr::generateName(
"subnet", subnet->getID(),
883 StatsMgr::generateName(lease->type_ == Lease::TYPE_NA ?
884 "pool" :
"pd-pool", pool->getID(),
885 lease->type_ == Lease::TYPE_NA ?
886 "assigned-nas" :
"assigned-pds")),
887 static_cast<int64_t
>(-1));
891 if (lease->stateDeclined()) {
892 StatsMgr::instance().addValue(
"declined-addresses",
static_cast<int64_t
>(-1));
894 StatsMgr::instance().addValue(
895 StatsMgr::generateName(
"subnet", lease->subnet_id_,
896 "declined-addresses"),
897 static_cast<int64_t
>(-1));
900 StatsMgr::instance().addValue(
901 StatsMgr::generateName(
"subnet", subnet->getID(),
902 StatsMgr::generateName(
"pool", pool->getID(),
903 "declined-addresses")),
904 static_cast<int64_t
>(-1));
912 Lease4Ptr existing = LeaseMgrFactory::instance().getLease4(lease->addr_);
913 if (force_create && !existing) {
915 if (!LeaseMgrFactory::instance().addLease(lease)) {
917 "lost race between calls to get and add");
926 Lease::syncCurrentExpirationTime(*existing, *lease);
929 LeaseMgrFactory::instance().updateLease4(lease);
932 << lease->addr_ <<
" either because the lease has been "
933 "deleted or it has changed in the database, in both cases a "
934 "retry might succeed");
944 LeaseMgrFactory::instance().getLease6(lease->type_, lease->addr_);
945 if (force_create && !existing) {
947 if (!LeaseMgrFactory::instance().addLease(lease)) {
949 "lost race between calls to get and add");
958 Lease::syncCurrentExpirationTime(*existing, *lease);
963 if ((!old_extended_info && !extended_info) ||
964 (old_extended_info && extended_info &&
965 (*old_extended_info == *extended_info))) {
968 lease->extended_info_action_ = Lease6::ACTION_UPDATE;
972 LeaseMgrFactory::instance().updateLease6(lease);
975 << lease->addr_ <<
" either because the lease has been "
976 "deleted or it has changed in the database, in both cases a "
977 "retry might succeed");
990 string lease_address =
"unknown";
1001 bool force_create =
false;
1008 lease_address = lease4->addr_.toText();
1010 if (!MultiThreadingMgr::instance().getMode()) {
1012 success = LeaseMgrFactory::instance().addLease(lease4);
1016 if (resource_handler.
tryLock4(lease4->addr_)) {
1017 success = LeaseMgrFactory::instance().addLease(lease4);
1020 "ResourceBusy: IP address:" << lease4->addr_
1021 <<
" could not be added.");
1030 resp <<
"Lease for address " << lease4->addr_.toText()
1031 <<
", subnet-id " << lease4->subnet_id_ <<
" added.";
1037 lease_address = lease6->addr_.toText();
1039 if (!MultiThreadingMgr::instance().getMode()) {
1041 success = LeaseMgrFactory::instance().addLease(lease6);
1045 if (resource_handler.
tryLock(lease6->type_, lease6->addr_)) {
1046 success = LeaseMgrFactory::instance().addLease(lease6);
1049 "ResourceBusy: IP address:" << lease6->addr_
1050 <<
" could not be added.");
1059 if (lease6->type_ == Lease::TYPE_NA) {
1060 resp <<
"Lease for address " << lease6->addr_.toText()
1061 <<
", subnet-id " << lease6->subnet_id_ <<
" added.";
1063 resp <<
"Lease for prefix " << lease6->addr_.toText()
1064 <<
"/" <<
static_cast<int>(lease6->prefixlen_)
1065 <<
", subnet-id " << lease6->subnet_id_ <<
" added.";
1076 }
catch (
const std::exception& ex) {
1086 .arg(lease_address);
1095 if (!params || params->getType() != Element::map) {
1099 if (params->contains(
"update-ddns")) {
1101 if (tmp->getType() != Element::boolean) {
1112 if (params->contains(
"type")) {
1113 string t = params->get(
"type")->stringValue();
1114 if (t ==
"IA_NA" || t ==
"0") {
1116 }
else if (t ==
"IA_TA" || t ==
"1") {
1118 }
else if (t ==
"IA_PD" || t ==
"2") {
1120 }
else if (t ==
"V4" || t ==
"3") {
1124 << t <<
", only supported values are: IA_NA, IA_TA,"
1125 <<
" IA_PD and V4");
1131 if (tmp->getType() != Element::string) {
1139 txt <<
"Invalid " << (v6 ?
"IPv6" :
"IPv4")
1140 <<
" address specified: " << tmp->stringValue();
1148 tmp = params->get(
"subnet-id");
1152 if (tmp->getType() != Element::integer) {
1157 if (params->contains(
"iaid")) {
1158 x.
iaid = params->get(
"iaid")->intValue();
1167 if (!type || type->getType() != Element::string) {
1169 " and 'identifier-type' is either missing or not a string.");
1171 if (!ident || ident->getType() != Element::string) {
1173 " and 'identifier' is either missing or not a string.");
1182 HWAddr hw = HWAddr::fromText(ident->stringValue());
1187 x.
client_id = ClientId::fromText(ident->stringValue());
1191 DUID duid = DUID::fromText(ident->stringValue());
1202 " is not supported.");
1223 lease4 = LeaseMgrFactory::instance().getLease4(p.
addr);
1225 lease6 = LeaseMgrFactory::instance().getLease6(p.
lease_type, p.
addr);
1233 "requires hwaddr to be specified");
1236 lease4 = LeaseMgrFactory::instance().getLease4(*p.
hwaddr, p.
subnet_id);
1246 "requires duid to be specified");
1249 lease6 = LeaseMgrFactory::instance().getLease6(p.
lease_type, *p.
duid,
1260 "requires client-id to be specified");
1274 }
catch (
const std::exception& ex) {
1284 lease_json = lease4->toElement();
1286 "IPv4 lease found.", lease_json);
1288 }
else if (!v4 && lease6) {
1289 lease_json = lease6->toElement();
1291 "IPv6 lease found.", lease_json);
1308 ElementPtr leases_json = Element::createList();
1317 if (subnets->getType() != Element::list) {
1321 const std::vector<ElementPtr>& subnet_ids = subnets->listValue();
1322 for (
auto subnet_id = subnet_ids.begin();
1323 subnet_id != subnet_ids.end();
1325 if ((*subnet_id)->getType() != Element::integer) {
1331 LeaseMgrFactory::instance().getLeases4((*subnet_id)->intValue());
1332 for (
auto lease : leases) {
1334 leases_json->add(lease_json);
1338 LeaseMgrFactory::instance().getLeases6((*subnet_id)->intValue());
1339 for (
auto lease : leases) {
1341 leases_json->add(lease_json);
1350 for (
auto lease : leases) {
1352 leases_json->add(lease_json);
1356 for (
auto lease : leases) {
1358 leases_json->add(lease_json);
1363 std::ostringstream s;
1364 s << leases_json->size()
1365 <<
" IPv" << (v4 ?
"4" :
"6")
1366 <<
" lease(s) found.";
1368 args->set(
"leases", leases_json);
1376 }
catch (
const std::exception& ex) {
1406 if (from->getType() != Element::string) {
1410 boost::scoped_ptr<IOAddress> from_address;
1412 if (from->stringValue() ==
"start") {
1413 from_address.reset(
new IOAddress(v4 ?
"0.0.0.0" :
"::"));
1417 from_address.reset(
new IOAddress(from->stringValue()));
1422 "a valid IPv" << (v4 ?
"4" :
"6") <<
" address");
1427 if (v4 && (!from_address->isV4())) {
1429 <<
" is not an IPv4 address");
1431 }
else if (!v4 && from_address->isV4()) {
1433 <<
" is not an IPv6 address");
1443 if (page_limit->getType() != Element::integer) {
1448 size_t page_limit_value =
static_cast<size_t>(page_limit->intValue());
1450 ElementPtr leases_json = Element::createList();
1455 LeaseMgrFactory::instance().getLeases4(*from_address,
1459 for (
auto lease : leases) {
1461 leases_json->add(lease_json);
1467 LeaseMgrFactory::instance().getLeases6(*from_address,
1470 for (
auto lease : leases) {
1472 leases_json->add(lease_json);
1477 std::ostringstream s;
1478 s << leases_json->size()
1479 <<
" IPv" << (v4 ?
"4" :
"6")
1480 <<
" lease(s) found.";
1484 args->set(
"leases", leases_json);
1485 args->set(
"count", Element::create(
static_cast<int64_t
>(leases_json->size())));
1495 }
catch (
const std::exception& ex) {
1520 if (hw_address->getType() != Element::string) {
1524 HWAddr hwaddr = HWAddr::fromText(hw_address->stringValue());
1527 LeaseMgrFactory::instance().getLease4(hwaddr);
1528 ElementPtr leases_json = Element::createList();
1529 for (
auto lease : leases) {
1531 leases_json->add(lease_json);
1534 std::ostringstream s;
1535 s << leases_json->size() <<
" IPv4 lease(s) found.";
1537 args->set(
"leases", leases_json);
1545 }
catch (
const std::exception& ex) {
1570 if (client_id->getType() != Element::string) {
1574 ClientIdPtr clientid = ClientId::fromText(client_id->stringValue());
1577 LeaseMgrFactory::instance().getLease4(*clientid);
1578 ElementPtr leases_json = Element::createList();
1579 for (
auto lease : leases) {
1581 leases_json->add(lease_json);
1584 std::ostringstream s;
1585 s << leases_json->size() <<
" IPv4 lease(s) found.";
1587 args->set(
"leases", leases_json);
1595 }
catch (
const std::exception& ex) {
1620 if (duid->getType() != Element::string) {
1624 DUID duid_ = DUID::fromText(duid->stringValue());
1627 LeaseMgrFactory::instance().getLeases6(duid_);
1628 ElementPtr leases_json = Element::createList();
1629 for (
auto lease : leases) {
1631 leases_json->add(lease_json);
1634 std::ostringstream s;
1635 s << leases_json->size() <<
" IPv6 lease(s) found.";
1637 args->set(
"leases", leases_json);
1645 }
catch (
const std::exception& ex) {
1658 v4 = (
cmd_name_ ==
"lease4-get-by-hostname");
1672 if (hostname->getType() != Element::string) {
1676 std::string hostname_ = hostname->stringValue();
1678 if (hostname_.empty()) {
1681 boost::algorithm::to_lower(hostname_);
1683 ElementPtr leases_json = Element::createList();
1686 LeaseMgrFactory::instance().getLeases4(hostname_);
1688 for (
auto lease : leases) {
1690 leases_json->add(lease_json);
1694 LeaseMgrFactory::instance().getLeases6(hostname_);
1696 for (
auto lease : leases) {
1698 leases_json->add(lease_json);
1702 std::ostringstream s;
1703 s << leases_json->size()
1704 <<
" IPv" << (v4 ?
"4" :
"6")
1705 <<
" lease(s) found.";
1707 args->set(
"leases", leases_json);
1715 }
catch (
const std::exception& ex) {
1733 lease4 = LeaseMgrFactory::instance().getLease4(p.
addr);
1743 "requires hwaddr to be specified");
1747 lease4 = LeaseMgrFactory::instance().getLease4(*p.
hwaddr, p.
subnet_id);
1757 "requires client-id to be specified");
1778 if (LeaseMgrFactory::instance().deleteLease(lease4)) {
1790 }
catch (
const std::exception& ex) {
1798 .arg(lease4->addr_.toText());
1813 auto deleted_leases =
cmd_args_->get(
"deleted-leases");
1816 if (!deleted_leases && !leases) {
1822 if (deleted_leases && (deleted_leases->getType() != Element::list)) {
1827 if (leases && (leases->getType() != Element::list)) {
1834 std::list<std::pair<Parameters, Lease6Ptr> > parsed_deleted_list;
1835 if (deleted_leases) {
1836 auto leases_list = deleted_leases->listValue();
1839 for (
auto lease_params : leases_list) {
1844 parsed_deleted_list.push_back(std::make_pair(p, lease));
1850 std::list<Lease6Ptr> parsed_leases_list;
1855 auto leases_list = leases->listValue();
1856 for (
auto lease_params : leases_list) {
1863 Lease6Ptr lease6 = parser.
parse(config, lease_params, force_update);
1864 parsed_leases_list.push_back(lease6);
1869 size_t success_count = 0;
1872 if (!parsed_deleted_list.empty()) {
1875 for (
auto lease_params_pair : parsed_deleted_list) {
1880 auto lease = lease_params_pair.second;
1887 if (LeaseMgrFactory::instance().deleteLease(lease)) {
1893 if (!failed_deleted_list) {
1894 failed_deleted_list = Element::createList();
1904 "lease not found"));
1908 }
catch (
const std::exception& ex) {
1910 if (!failed_deleted_list) {
1911 failed_deleted_list = Element::createList();
1923 if (!parsed_leases_list.empty()) {
1927 for (
auto lease : parsed_leases_list) {
1930 std::ostringstream text;
1932 if (!MultiThreadingMgr::instance().getMode()) {
1938 if (resource_handler.
tryLock(lease->type_, lease->addr_)) {
1942 "ResourceBusy: IP address:" << lease->addr_
1943 <<
" could not be updated.");
1952 }
catch (
const std::exception& ex) {
1959 if (!failed_leases_list) {
1960 failed_leases_list = Element::createList();
1974 if (failed_deleted_list || failed_leases_list) {
1976 args = Element::createMap();
1979 if (failed_deleted_list) {
1980 args->set(
"failed-deleted-leases", failed_deleted_list);
1984 if (failed_leases_list) {
1985 args->set(
"failed-leases", failed_leases_list);
1990 std::ostringstream resp_text;
1991 resp_text <<
"Bulk apply of " << success_count <<
" IPv6 leases completed.";
1998 .arg(success_count);
2000 }
catch (
const std::exception& ex) {
2016 IOAddress addr(IOAddress::IPV6_ZERO_ADDRESS());
2026 lease6 = LeaseMgrFactory::instance().getLease6(p.
lease_type, p.
addr);
2040 "requires duid to be specified");
2044 lease6 = LeaseMgrFactory::instance().getLease6(p.
lease_type, *p.
duid,
2058 if (LeaseMgrFactory::instance().deleteLease(lease6)) {
2070 }
catch (
const std::exception& ex) {
2079 .arg(lease6->addr_.toText());
2097 bool force_create =
false;
2103 if (!MultiThreadingMgr::instance().getMode()) {
2109 if (resource_handler.
tryLock4(lease4->addr_)) {
2113 "ResourceBusy: IP address:" << lease4->addr_
2114 <<
" could not be updated.");
2125 .arg(lease4->addr_.toText());
2134 }
catch (
const std::exception& ex) {
2159 bool force_create =
false;
2165 if (!MultiThreadingMgr::instance().getMode()) {
2171 if (resource_handler.
tryLock(lease6->type_, lease6->addr_)) {
2175 "ResourceBusy: IP address:" << lease6->addr_
2176 <<
" could not be updated.");
2187 .arg(lease6->addr_.toText());
2196 }
catch (
const std::exception& ex) {
2225 num = LeaseMgrFactory::instance().wipeLeases4(
id);
2228 auto observation = StatsMgr::instance().getObservation(
2229 StatsMgr::generateName(
"subnet",
id,
"declined-addresses"));
2231 int64_t previous_declined = 0;
2234 previous_declined = observation->getInteger().first;
2237 StatsMgr::instance().setValue(
2238 StatsMgr::generateName(
"subnet",
id,
"assigned-addresses"),
2239 static_cast<int64_t
>(0));
2241 StatsMgr::instance().setValue(
2242 StatsMgr::generateName(
"subnet",
id,
"declined-addresses"),
2243 static_cast<int64_t
>(0));
2245 auto const& sub = CfgMgr::instance().getCurrentCfg()->getCfgSubnets4()->getBySubnetId(
id);
2247 for (
const auto& pool : sub->getPools(Lease::TYPE_V4)) {
2248 const std::string& name_aa(StatsMgr::generateName(
"subnet", sub->getID(),
2249 StatsMgr::generateName(
"pool", pool->getID(),
2250 "assigned-addresses")));
2251 if (!StatsMgr::instance().getObservation(name_aa)) {
2252 StatsMgr::instance().setValue(name_aa,
static_cast<int64_t
>(0));
2255 const std::string& name_da(StatsMgr::generateName(
"subnet", sub->getID(),
2256 StatsMgr::generateName(
"pool", pool->getID(),
2257 "declined-addresses")));
2258 if (!StatsMgr::instance().getObservation(name_da)) {
2259 StatsMgr::instance().setValue(name_da,
static_cast<int64_t
>(0));
2264 StatsMgr::instance().addValue(
"declined-addresses", -previous_declined);
2272 for (
auto sub : *subs) {
2273 num += LeaseMgrFactory::instance().wipeLeases4(sub->getID());
2274 ids <<
" " << sub->getID();
2275 StatsMgr::instance().setValue(
2276 StatsMgr::generateName(
"subnet", sub->getID(),
"assigned-addresses"),
2277 static_cast<int64_t
>(0));
2279 StatsMgr::instance().setValue(
2280 StatsMgr::generateName(
"subnet", sub->getID(),
"declined-addresses"),
2281 static_cast<int64_t
>(0));
2283 for (
const auto& pool : sub->getPools(Lease::TYPE_V4)) {
2284 const std::string& name_aa(StatsMgr::generateName(
"subnet", sub->getID(),
2285 StatsMgr::generateName(
"pool", pool->getID(),
2286 "assigned-addresses")));
2287 if (!StatsMgr::instance().getObservation(name_aa)) {
2288 StatsMgr::instance().setValue(name_aa,
static_cast<int64_t
>(0));
2291 const std::string& name_da(StatsMgr::generateName(
"subnet", sub->getID(),
2292 StatsMgr::generateName(
"pool", pool->getID(),
2293 "declined-addresses")));
2294 if (!StatsMgr::instance().getObservation(name_da)) {
2295 StatsMgr::instance().setValue(name_da,
static_cast<int64_t
>(0));
2300 StatsMgr::instance().setValue(
"declined-addresses",
static_cast<int64_t
>(0));
2304 tmp <<
"Deleted " << num <<
" IPv4 lease(s) from subnet(s)" << ids.str();
2308 }
catch (
const std::exception& ex) {
2344 num = LeaseMgrFactory::instance().wipeLeases6(
id);
2347 auto observation = StatsMgr::instance().getObservation(
2348 StatsMgr::generateName(
"subnet",
id,
"declined-addresses"));
2350 int64_t previous_declined = 0;
2353 previous_declined = observation->getInteger().first;
2356 StatsMgr::instance().setValue(
2357 StatsMgr::generateName(
"subnet",
id,
"assigned-nas" ),
2358 static_cast<int64_t
>(0));
2360 StatsMgr::instance().setValue(
2361 StatsMgr::generateName(
"subnet",
id,
"assigned-pds"),
2362 static_cast<int64_t
>(0));
2364 StatsMgr::instance().setValue(
2365 StatsMgr::generateName(
"subnet",
id,
"declined-addresses"),
2366 static_cast<int64_t
>(0));
2368 auto const& sub = CfgMgr::instance().getCurrentCfg()->getCfgSubnets6()->getBySubnetId(
id);
2370 for (
const auto& pool : sub->getPools(Lease::TYPE_NA)) {
2371 const std::string& name_anas(StatsMgr::generateName(
"subnet", sub->getID(),
2372 StatsMgr::generateName(
"pool", pool->getID(),
2374 if (!StatsMgr::instance().getObservation(name_anas)) {
2375 StatsMgr::instance().setValue(name_anas,
static_cast<int64_t
>(0));
2378 const std::string& name_da(StatsMgr::generateName(
"subnet", sub->getID(),
2379 StatsMgr::generateName(
"pool", pool->getID(),
2380 "declined-addresses")));
2381 if (!StatsMgr::instance().getObservation(name_da)) {
2382 StatsMgr::instance().setValue(name_da,
static_cast<int64_t
>(0));
2386 for (
const auto& pool : sub->getPools(Lease::TYPE_PD)) {
2387 const std::string& name_apds(StatsMgr::generateName(
"subnet", sub->getID(),
2388 StatsMgr::generateName(
"pd-pool", pool->getID(),
2390 if (!StatsMgr::instance().getObservation(name_apds)) {
2391 StatsMgr::instance().setValue(name_apds,
static_cast<int64_t
>(0));
2396 StatsMgr::instance().addValue(
"declined-addresses", -previous_declined);
2404 for (
auto sub : *subs) {
2405 num += LeaseMgrFactory::instance().wipeLeases6(sub->getID());
2406 ids <<
" " << sub->getID();
2407 StatsMgr::instance().setValue(
2408 StatsMgr::generateName(
"subnet", sub->getID(),
"assigned-nas" ),
2409 static_cast<int64_t
>(0));
2411 StatsMgr::instance().setValue(
2412 StatsMgr::generateName(
"subnet", sub->getID(),
"assigned-pds"),
2413 static_cast<int64_t
>(0));
2415 StatsMgr::instance().setValue(
2416 StatsMgr::generateName(
"subnet", sub->getID(),
"declined-addresses"),
2417 static_cast<int64_t
>(0));
2419 for (
const auto& pool : sub->getPools(Lease::TYPE_NA)) {
2420 const std::string& name_anas(StatsMgr::generateName(
"subnet", sub->getID(),
2421 StatsMgr::generateName(
"pool", pool->getID(),
2423 if (!StatsMgr::instance().getObservation(name_anas)) {
2424 StatsMgr::instance().setValue(name_anas,
static_cast<int64_t
>(0));
2427 const std::string& name_da(StatsMgr::generateName(
"subnet", sub->getID(),
2428 StatsMgr::generateName(
"pool", pool->getID(),
2429 "declined-addresses")));
2430 if (!StatsMgr::instance().getObservation(name_da)) {
2431 StatsMgr::instance().setValue(name_da,
static_cast<int64_t
>(0));
2435 for (
const auto& pool : sub->getPools(Lease::TYPE_PD)) {
2436 const std::string& name_apds(StatsMgr::generateName(
"subnet", sub->getID(),
2437 StatsMgr::generateName(
"pd-pool", pool->getID(),
2439 if (!StatsMgr::instance().getObservation(name_apds)) {
2440 StatsMgr::instance().setValue(name_apds,
static_cast<int64_t
>(0));
2445 StatsMgr::instance().setValue(
"declined-addresses",
static_cast<int64_t
>(0));
2449 tmp <<
"Deleted " << num <<
" IPv6 lease(s) from subnet(s)" << ids.str();
2453 }
catch (
const std::exception& ex) {
2475 lease6 = LeaseMgrFactory::instance().getLease6(parameters.
lease_type,
2478 lease6.reset(
new Lease6());
2479 lease6->addr_ = parameters.
addr;
2488 if (!parameters.
duid) {
2490 "requires duid to be specified");
2494 lease6 = LeaseMgrFactory::instance().getLease6(parameters.
lease_type,
2510 short family)
const {
2516 if (param->getType() != Element::string) {
2523 }
catch (
const std::exception& ex) {
2525 <<
"' is not a valid IP address.");
2530 << (family == AF_INET6 ?
"IPv6" :
"IPv4")
2531 <<
" address specified: " << param->stringValue());
2539 std::stringstream ss;
2548 if (!CfgMgr::instance().getD2ClientMgr().ddnsEnabled()) {
2549 ss <<
"DDNS updating is not enabled";
2553 Lease4Ptr lease = LeaseMgrFactory::instance().getLease4(addr);
2555 ss <<
"No lease found for: " << addr.
toText();
2557 }
else if (lease->hostname_.empty()) {
2558 ss <<
"Lease for: " << addr.
toText()
2559 <<
", has no hostname, nothing to update";
2561 }
else if (!lease->fqdn_fwd_ && !lease->fqdn_rev_) {
2562 ss <<
"Neither forward nor reverse updates enabled for lease for: "
2569 ss <<
"NCR generated for: " << addr.
toText()
2570 <<
", hostname: " << lease->hostname_;
2576 }
catch (
const std::exception& ex) {
2587 std::stringstream ss;
2596 if (!CfgMgr::instance().getD2ClientMgr().ddnsEnabled()) {
2597 ss <<
"DDNS updating is not enabled";
2601 Lease6Ptr lease = LeaseMgrFactory::instance().getLease6(Lease::TYPE_NA, addr);
2603 ss <<
"No lease found for: " << addr.
toText();
2605 }
else if (lease->hostname_.empty()) {
2606 ss <<
"Lease for: " << addr.
toText()
2607 <<
", has no hostname, nothing to update";
2609 }
else if (!lease->fqdn_fwd_ && !lease->fqdn_rev_) {
2610 ss <<
"Neither forward nor reverse updates enabled for lease for: "
2617 ss <<
"NCR generated for: " << addr.
toText()
2618 <<
", hostname: " << lease->hostname_;
2624 }
catch (
const std::exception& ex) {
2637 const int control_result,
2638 const std::string& error_message)
const {
2639 auto failed_lease_map = Element::createMap();
2640 failed_lease_map->set(
"type", Element::create(Lease::typeToText(lease_type)));
2643 failed_lease_map->set(
"ip-address", Element::create(lease_address.
toText()));
2646 failed_lease_map->set(
"duid", Element::create(duid->toText()));
2650 failed_lease_map->set(
"result", Element::create(control_result));
2651 failed_lease_map->set(
"error-message", Element::create(error_message));
2653 return (failed_lease_map);
2671 if (file->getType() != Element::string) {
2674 string filename = file->stringValue();
2675 if (filename.empty()) {
2680 LeaseMgrFactory::instance().writeLeases4(filename);
2682 LeaseMgrFactory::instance().writeLeases6(filename);
2685 s << (v4 ?
"IPv4" :
"IPv6")
2686 <<
" lease database into '"
2687 << filename <<
"'.";
2690 }
catch (
const std::exception& ex) {
2700 return (impl_->leaseAddHandler(handle));
2705 return (impl_->lease6BulkApplyHandler(handle));
2710 return (impl_->leaseGetHandler(handle));
2715 return (impl_->leaseGetAllHandler(handle));
2720 return (impl_->leaseGetPageHandler(handle));
2725 return (impl_->leaseGetByHwAddressHandler(handle));
2730 return (impl_->leaseGetByClientIdHandler(handle));
2735 return (impl_->leaseGetByDuidHandler(handle));
2740 return (impl_->leaseGetByHostnameHandler(handle));
2745 return (impl_->lease4DelHandler(handle));
2750 return (impl_->lease6DelHandler(handle));
2755 return (impl_->lease4UpdateHandler(handle));
2760 return (impl_->lease6UpdateHandler(handle));
2766 return (impl_->lease4WipeHandler(handle));
2772 return (impl_->lease6WipeHandler(handle));
2777 return (impl_->lease4ResendDdnsHandler(handle));
2782 return (impl_->lease6ResendDdnsHandler(handle));
2787 return (impl_->leaseWriteHandler(handle));
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 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.
Holds DUID (DHCPv6 Unique Identifier)
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.
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
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.
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
int leaseWriteHandler(CalloutHandle &handle)
lease4-write handler, lease6-write 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 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
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_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_RESEND_DDNS4_FAILED
const isc::log::MessageID LEASE_CMDS_DEL6
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_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_DEL4_FAILED
const isc::log::MessageID LEASE_CMDS_ADD6_FAILED
const isc::log::MessageID LEASE_CMDS_UPDATE4
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_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.
const int CONTROL_RESULT_CONFLICT
Status code indicating that the command was unsuccessful due to a conflict between the command argume...
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< const Subnet6 > ConstSubnet6Ptr
A const pointer to a Subnet6 object.
boost::shared_ptr< const Subnet4 > ConstSubnet4Ptr
A const pointer to a Subnet4 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::shared_ptr< Pool > PoolPtr
a pointer to either IPv4 or IPv6 Pool
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.
const int LEASE_CMDS_DBG_COMMAND_DATA
Logging level used to log successful commands.
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.