43 string hwaddr_txt =
getString(lease_info,
"hw-address");
50 if (lease_info->contains(
"subnet-id")) {
51 subnet_id =
getUint32(lease_info,
"subnet-id");
55 if (lease_info->contains(
"pool-id")) {
56 pool_id =
getUint32(lease_info,
"pool-id");
63 subnet = cfg->getCfgSubnets4()->getBySubnetId(subnet_id);
66 << subnet_id <<
" currently configured.");
70 if (!subnet->inRange(addr)) {
72 "to subnet " << subnet->toText() <<
", subnet-id=" << subnet_id);
77 subnet = cfg->getCfgSubnets4()->selectSubnet(addr);
80 <<
" subnet for address " << addr);
82 subnet_id = subnet->getID();
87 if (lease_info->contains(
"client-id")) {
88 string txt =
getString(lease_info,
"client-id");
94 uint32_t valid_lft = 0;
95 if (lease_info->contains(
"valid-lft")) {
96 valid_lft =
getUint32(lease_info,
"valid-lft");
98 valid_lft = subnet->getValid();
108 if (lease_info->contains(
"expire")) {
109 int64_t expire_time =
getInteger(lease_info,
"expire");
110 if (expire_time <= 0) {
114 }
else if (expire_time < valid_lft) {
116 " for address " << addr);
118 cltt =
static_cast<time_t
>(expire_time - valid_lft);
123 bool fqdn_fwd =
false;
124 if (lease_info->contains(
"fqdn-fwd")) {
125 fqdn_fwd =
getBoolean(lease_info,
"fqdn-fwd");
127 bool fqdn_rev =
false;
128 if (lease_info->contains(
"fqdn-rev")) {
129 fqdn_rev =
getBoolean(lease_info,
"fqdn-rev");
132 if (lease_info->contains(
"hostname")) {
133 hostname =
getString(lease_info,
"hostname");
135 if (hostname.empty() && (fqdn_fwd || fqdn_rev)) {
137 " fqdn was set to true.");
141 if (lease_info->contains(
"state")) {
142 state =
getUint8(lease_info,
"state");
148 "values are: 0 (default), 1 (declined), 2 (expired-reclaimed)"
149 " and 3 (released)");
156 <<
"' is not a JSON map.");
162 if (ctx && ctx->contains(
"comment")) {
164 <<
"' in user context '" << ctx->str() <<
"'");
168 copied =
copy(ctx, 0);
172 copied->set(
"comment", comment);
179 fqdn_fwd, fqdn_rev, hostname));
182 l->pool_id_ = pool_id;
186 auto check = cfg->getConsistency()->getExtendedInfoSanityCheck();
193 force_create =
false;
194 if (lease_info->contains(
"force-create")) {
195 force_create =
getBoolean(lease_info,
"force-create");
204 bool& force_create) {
216 string duid_txt =
getString(lease_info,
"duid");
221 uint8_t prefix_len = 128;
222 if (lease_info->contains(
"type")) {
223 string txt =
getString(lease_info,
"type");
224 if (txt ==
"IA_NA") {
226 }
else if (txt ==
"IA_TA") {
228 }
else if (txt ==
"IA_PD") {
231 prefix_len =
getUint8(lease_info,
"prefix-len");
234 "supported values are: IA_NA and IA_PD");
241 if (lease_info->contains(
"subnet-id")) {
242 subnet_id =
getUint32(lease_info,
"subnet-id");
245 uint32_t pool_id = 0;
246 if (lease_info->contains(
"pool-id")) {
247 pool_id =
getUint32(lease_info,
"pool-id");
254 subnet = cfg->getCfgSubnets6()->getBySubnetId(subnet_id);
257 << subnet_id <<
" currently configured.");
263 "to subnet " << subnet->toText() <<
", subnet-id=" << subnet_id);
269 " address leases only, not prefix leases.");
272 subnet = cfg->getCfgSubnets6()->selectSubnet(addr);
275 "subnet for address " << addr);
277 subnet_id = subnet->getID();
280 uint32_t iaid =
getUint32(lease_info,
"iaid");
284 if (lease_info->contains(
"hw-address")) {
285 string hwaddr_txt =
getString(lease_info,
"hw-address");
292 uint32_t valid_lft = 0;
293 if (lease_info->contains(
"valid-lft")) {
294 valid_lft =
getUint32(lease_info,
"valid-lft");
296 valid_lft = subnet->getValid();
301 uint32_t pref_lft = 0;
302 if (lease_info->contains(
"preferred-lft")) {
303 pref_lft =
getUint32(lease_info,
"preferred-lft");
305 pref_lft = subnet->getValid();
315 if (lease_info->contains(
"expire")) {
316 int64_t expire_time =
getInteger(lease_info,
"expire");
317 if (expire_time <= 0) {
321 }
else if (expire_time < valid_lft) {
323 " for address " << addr);
326 cltt =
static_cast<time_t
>(expire_time - valid_lft);
331 bool fqdn_fwd =
false;
332 if (lease_info->contains(
"fqdn-fwd")) {
333 fqdn_fwd =
getBoolean(lease_info,
"fqdn-fwd");
335 bool fqdn_rev =
false;
336 if (lease_info->contains(
"fqdn-rev")) {
337 fqdn_rev =
getBoolean(lease_info,
"fqdn-rev");
340 if (lease_info->contains(
"hostname")) {
341 hostname =
getString(lease_info,
"hostname");
343 if (hostname.empty() && (fqdn_fwd || fqdn_rev)) {
345 " fqdn was set to true.");
349 if (lease_info->contains(
"state")) {
350 state =
getUint8(lease_info,
"state");
356 "values are: 0 (default), 1 (declined), 2 (expired-reclaimed)"
357 " and 3 (released)");
362 "Invalid declined state for PD prefix.");
369 <<
"' is not a JSON map.");
375 if (ctx && ctx->contains(
"comment")) {
377 <<
"' in user context '" << ctx->str() <<
"'");
381 copied =
copy(ctx, 0);
385 copied->set(
"comment", comment);
390 if (prefix_len == 0 || prefix_len > 128) {
392 <<
static_cast<unsigned>(prefix_len));
395 if (prefix_len != 128) {
397 if (first_address != addr) {
399 <<
" exceeds prefix/prefix-len pair: " << first_address
400 <<
"/" <<
static_cast<uint32_t
>(prefix_len));
405 Lease6Ptr l(
new Lease6(type, addr, duid_ptr, iaid, pref_lft, valid_lft,
406 subnet_id, fqdn_fwd, fqdn_rev, hostname,
407 hwaddr_ptr, prefix_len));
411 l->pool_id_ = pool_id;
415 auto check = cfg->getConsistency()->getExtendedInfoSanityCheck();
421 force_create =
false;
422 if (lease_info->contains(
"force-create")) {
423 force_create =
getBoolean(lease_info,
"force-create");
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...
A generic exception that is thrown if a function is called in a prohibited way.
The IOAddress class represents an IP addresses (version agnostic)
std::string toText() const
Convert the address to a string.
bool isV4() const
Convenience function to check for an IPv4 address.
static ElementPtr createMap(const Position &pos=ZERO_POSITION())
Creates an empty MapElement type ElementPtr.
uint8_t getUint8(ConstElementPtr scope, const std::string &name)
Get an uint8_t value.
static isc::asiolink::IOAddress getAddress(const ConstElementPtr &scope, const std::string &name)
Returns a IOAddress parameter from a scope.
static std::string getString(isc::data::ConstElementPtr scope, const std::string &name)
Returns a string parameter from a scope.
uint32_t getUint32(isc::data::ConstElementPtr scope, const std::string &name)
Returns a value converted to uint32_t.
static bool getBoolean(isc::data::ConstElementPtr scope, const std::string &name)
Returns a boolean parameter from a scope.
static int64_t getInteger(isc::data::ConstElementPtr scope, const std::string &name)
Returns an integer parameter from a scope.
static ClientIdPtr fromText(const std::string &text)
Create client identifier from the textual format.
Holds DUID (DHCPv6 Unique Identifier)
static DUID fromText(const std::string &text)
Create DUID from the textual format.
static bool upgradeLease6ExtendedInfo(const Lease6Ptr &lease, CfgConsistency::ExtendedInfoSanity check=CfgConsistency::EXTENDED_INFO_CHECK_FIX)
Upgrade a V6 lease user context to the new extended info entry.
static void extractLease4ExtendedInfo(const Lease4Ptr &lease, bool ignore_errors=true)
Extract relay and remote identifiers from the extended info.
static bool upgradeLease4ExtendedInfo(const Lease4Ptr &lease, CfgConsistency::ExtendedInfoSanity check=CfgConsistency::EXTENDED_INFO_CHECK_FIX)
The following queries are used to fulfill Bulk Lease Query queries.
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.
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.
#define isc_throw(type, stream)
A shortcut macro to insert known values into exception arguments.
An abstract API for lease database.
IOAddress firstAddrInPrefix(const IOAddress &prefix, uint8_t len)
This code is based on similar code from the Dibbler project.
ElementPtr copy(ConstElementPtr from, int level)
Copy the data up to a nesting level.
boost::shared_ptr< const Element > ConstElementPtr
boost::shared_ptr< Element > ElementPtr
boost::shared_ptr< const SrvConfig > ConstSrvConfigPtr
Const pointer to the SrvConfig.
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.
boost::shared_ptr< HWAddr > HWAddrPtr
Shared pointer to a hardware address structure.
uint32_t SubnetID
Defines unique IPv4 or IPv6 subnet identifier.
boost::shared_ptr< ClientId > ClientIdPtr
Shared pointer to a Client ID.
boost::shared_ptr< Lease4 > Lease4Ptr
Pointer to a Lease4 structure.
Defines the logger used by the top-level component of kea-lfc.
Hardware type that represents information from DHCPv4 packet.
static HWAddr fromText(const std::string &text, const uint16_t htype=HTYPE_ETHER)
Creates instance of the hardware address from textual format.
Structure that holds a lease for IPv4 address.
Structure that holds a lease for IPv6 address and/or prefix.
static const uint32_t STATE_DECLINED
Declined lease.
static const uint32_t STATE_RELEASED
Released lease held in the database for lease affinity.
Type
Type of lease or pool.
@ TYPE_TA
the lease contains temporary IPv6 address
@ TYPE_PD
the lease contains IPv6 prefix (for prefix delegation)
@ TYPE_NA
the lease contains non-temporary IPv6 address