27 #include <boost/bind.hpp>
28 #include <boost/scoped_ptr.hpp>
40 namespace lease_cmds {
81 if (txt ==
"address") {
82 return (Parameters::TYPE_ADDR);
83 }
else if (txt ==
"hw-address") {
84 return (Parameters::TYPE_HWADDR);
85 }
else if (txt ==
"duid") {
86 return (Parameters::TYPE_DUID);
87 }
else if (txt ==
"client-id") {
88 return (Parameters::TYPE_CLIENT_ID);
91 << txt <<
", the only supported values are: "
92 "address, hw-address, duid");
108 :addr(
"::"), query_type(TYPE_ADDR), lease_type(
Lease::TYPE_NA),
242 string txt =
"malformed command";
246 extractCommand(handle);
247 v4 = (cmd_name_ ==
"lease4-add");
249 txt =
"(missing parameters)";
254 txt = cmd_args_->str();
261 bool force_create =
false;
264 lease4 = parser.
parse(config, cmd_args_, force_create);
268 resp <<
"Lease for address " << lease4->addr_.toText()
269 <<
", subnet-id " << lease4->subnet_id_ <<
" added.";
274 lease6 = parser.
parse(config, cmd_args_, force_create);
279 resp <<
"Lease for address " << lease6->addr_.toText()
280 <<
", subnet-id " << lease6->subnet_id_ <<
" added.";
282 resp <<
"Lease for prefix " << lease6->addr_.toText()
283 <<
"/" <<
static_cast<int>(lease6->prefixlen_)
284 <<
", subnet-id " << lease6->subnet_id_ <<
" added.";
289 }
catch (
const std::exception& ex) {
293 setErrorResponse(handle, ex.what());
298 v4 ? LEASE_CMDS_ADD4 : LEASE_CMDS_ADD6).arg(txt);
299 setSuccessResponse(handle, resp.str());
307 if (!params || params->getType() != Element::map) {
315 if (params->contains(
"type")) {
316 string t = params->get(
"type")->stringValue();
317 if (t ==
"IA_NA" || t ==
"0") {
319 }
else if (t ==
"IA_TA" || t ==
"1") {
321 }
else if (t ==
"IA_PD" || t ==
"2") {
323 }
else if (t ==
"V4" || t ==
"3") {
327 << t <<
", only supported values are: IA_NA, IA_TA,"
334 if (tmp->getType() != Element::string) {
342 txt <<
"Invalid " << (v6 ?
"IPv6" :
"IPv4")
343 <<
" address specified: " << tmp->stringValue();
351 tmp = params->get(
"subnet-id");
355 if (tmp->getType() != Element::integer) {
360 if (params->contains(
"iaid")) {
361 x.
iaid = params->get(
"iaid")->intValue();
370 if (!type || type->getType() != Element::string) {
372 " and 'identifier-type' is either missing or not a string.");
374 if (!ident || ident->getType() != Element::string) {
376 " and 'identifier' is either missing or not a string.");
381 x.
query_type = Parameters::txtToType(type->stringValue());
384 case Parameters::TYPE_HWADDR: {
389 case Parameters::TYPE_CLIENT_ID: {
393 case Parameters::TYPE_DUID: {
398 case Parameters::TYPE_ADDR: {
405 " is not supported.");
418 extractCommand(handle);
419 v4 = (cmd_name_ ==
"lease4-get");
421 p = getParameters(!v4, cmd_args_);
423 case Parameters::TYPE_ADDR: {
432 case Parameters::TYPE_HWADDR:
436 "requires hwaddr to be specified");
445 case Parameters::TYPE_DUID:
449 "requires duid to be specified");
459 case Parameters::TYPE_CLIENT_ID:
463 "requires client-id to be specified");
477 }
catch (
const std::exception& ex) {
478 setErrorResponse(handle, ex.what());
484 lease_json = lease4->toElement();
486 "IPv4 lease found.", lease_json);
487 setResponse(handle, response);
488 }
else if (!v4 && lease6) {
489 lease_json = lease6->toElement();
491 "IPv6 lease found.", lease_json);
492 setResponse(handle, response);
505 extractCommand(handle);
506 v4 = (cmd_name_ ==
"lease4-get-all");
508 ElementPtr leases_json = Element::createList();
517 if (subnets->getType() != Element::list) {
521 const std::vector<ElementPtr>& subnet_ids = subnets->listValue();
522 for (
auto subnet_id = subnet_ids.begin();
523 subnet_id != subnet_ids.end();
525 if ((*subnet_id)->getType() != Element::integer) {
532 for (
auto lease : leases) {
534 leases_json->add(lease_json);
539 for (
auto lease : leases) {
541 leases_json->add(lease_json);
550 for (
auto lease : leases) {
552 leases_json->add(lease_json);
556 for (
auto lease : leases) {
558 leases_json->add(lease_json);
563 std::ostringstream s;
564 s << leases_json->size()
565 <<
" IPv" << (v4 ?
"4" :
"6")
566 <<
" lease(s) found.";
568 args->set(
"leases", leases_json);
574 setResponse(handle, response);
576 }
catch (
const std::exception& ex) {
577 setErrorResponse(handle, ex.what());
588 extractCommand(handle);
589 v4 = (cmd_name_ ==
"lease4-get-page");
606 if (from->getType() != Element::string) {
610 boost::scoped_ptr<IOAddress> from_address;
612 if (from->stringValue() ==
"start") {
613 from_address.reset(
new IOAddress(v4 ?
"0.0.0.0" :
"::"));
617 from_address.reset(
new IOAddress(from->stringValue()));
622 "a valid IPv" << (v4 ?
"4" :
"6") <<
" address");
627 if (v4 && (!from_address->isV4())) {
629 <<
" is not an IPv4 address");
631 }
else if (!v4 && from_address->isV4()) {
633 <<
" is not an IPv6 address");
643 if (page_limit->getType() != Element::integer) {
648 size_t page_limit_value =
static_cast<size_t>(page_limit->intValue());
650 ElementPtr leases_json = Element::createList();
659 for (
auto lease : leases) {
661 leases_json->add(lease_json);
670 for (
auto lease : leases) {
672 leases_json->add(lease_json);
677 std::ostringstream s;
678 s << leases_json->size()
679 <<
" IPv" << (v4 ?
"4" :
"6")
680 <<
" lease(s) found.";
684 args->set(
"leases", leases_json);
685 args->set(
"count", Element::create(
static_cast<int64_t
>(leases_json->size())));
693 setResponse(handle, response);
695 }
catch (std::exception& ex) {
696 setErrorResponse(handle, ex.what());
709 extractCommand(handle);
710 p = getParameters(
false, cmd_args_);
713 case Parameters::TYPE_ADDR: {
719 case Parameters::TYPE_HWADDR:
722 "requires hwaddr to be specified");
733 addr = lease4->addr_;
736 case Parameters::TYPE_CLIENT_ID:
739 "requires client-id to be specified");
750 addr = lease4->addr_;
753 case Parameters::TYPE_DUID:
764 setSuccessResponse(handle,
"IPv4 lease deleted.");
768 }
catch (
const std::exception& ex) {
769 setErrorResponse(handle, ex.what());
782 extractCommand(handle);
783 p = getParameters(
true, cmd_args_);
786 case Parameters::TYPE_ADDR: {
792 case Parameters::TYPE_HWADDR:
796 case Parameters::TYPE_DUID:
799 "requires duid to be specified");
811 addr = lease6->addr_;
821 setSuccessResponse(handle,
"IPv6 lease deleted.");
825 }
catch (
const std::exception& ex) {
826 setErrorResponse(handle, ex.what());
836 extractCommand(handle);
847 bool force_create =
false;
851 lease4 = parser.
parse(config, cmd_args_, force_create);
854 setSuccessResponse(handle,
"IPv4 lease added.");
858 setSuccessResponse(handle,
"IPv4 lease updated.");
860 }
catch (
const std::exception& ex) {
861 setErrorResponse(handle, ex.what());
871 extractCommand(handle);
882 bool force_create =
false;
886 lease6 = parser.
parse(config, cmd_args_, force_create);
890 setSuccessResponse(handle,
"IPv6 lease added.");
893 setSuccessResponse(handle,
"IPv6 lease updated.");
895 }
catch (
const std::exception& ex) {
896 setErrorResponse(handle, ex.what());
906 extractCommand(handle);
915 if (cmd_args_ && cmd_args_->contains(
"subnet-id")) {
916 id = parser.
getUint32(cmd_args_,
"subnet-id");
930 for (
auto sub : *subs) {
932 ids <<
" " << sub->getID();
937 tmp <<
"Deleted " << num <<
" IPv4 lease(s) from subnet(s)" << ids.str();
940 setResponse(handle, response);
941 }
catch (
const std::exception& ex) {
942 setErrorResponse(handle, ex.what());
952 extractCommand(handle);
967 if (cmd_args_ && cmd_args_->contains(
"subnet-id")) {
968 id = parser.
getUint32(cmd_args_,
"subnet-id");
982 for (
auto sub : *subs) {
984 ids <<
" " << sub->getID();
989 tmp <<
"Deleted " << num <<
" IPv6 lease(s) from subnet(s)" << ids.str();
992 setResponse(handle, response);
993 }
catch (
const std::exception& ex) {
994 setErrorResponse(handle, ex.what());
1003 return(impl_->leaseAddHandler(handle));
1008 return(impl_->leaseGetHandler(handle));
1013 return (impl_->leaseGetAllHandler(handle));
1018 return (impl_->leaseGetPageHandler(handle));
1023 return(impl_->lease4DelHandler(handle));
1028 return(impl_->lease6DelHandler(handle));
1033 return(impl_->lease4UpdateHandler(handle));
1038 return(impl_->lease6UpdateHandler(handle));
1043 return(impl_->lease4WipeHandler(handle));
1048 return(impl_->lease6WipeHandler(handle));
1051 LeaseCmds::LeaseCmds()