Kea 2.0.2
simple_parser4.cc
Go to the documentation of this file.
1// Copyright (C) 2016-2021 Internet Systems Consortium, Inc. ("ISC")
2//
3// This Source Code Form is subject to the terms of the Mozilla Public
4// License, v. 2.0. If a copy of the MPL was not distributed with this
5// file, You can obtain one at http://mozilla.org/MPL/2.0/.
6
7#include <config.h>
8
10#include <cc/data.h>
11#include <boost/foreach.hpp>
12#include <iostream>
13
14using namespace isc::data;
15
16namespace isc {
17namespace dhcp {
32
39 { "valid-lifetime", Element::integer },
40 { "min-valid-lifetime", Element::integer },
41 { "max-valid-lifetime", Element::integer },
42 { "renew-timer", Element::integer },
43 { "rebind-timer", Element::integer },
44 { "decline-probation-period", Element::integer },
45 { "subnet4", Element::list },
46 { "shared-networks", Element::list },
47 { "interfaces-config", Element::map },
48 { "lease-database", Element::map },
49 { "hosts-database", Element::map },
50 { "hosts-databases", Element::list },
51 { "host-reservation-identifiers", Element::list },
52 { "client-classes", Element::list },
53 { "option-def", Element::list },
54 { "option-data", Element::list },
55 { "hooks-libraries", Element::list },
56 { "expired-leases-processing", Element::map },
57 { "dhcp4o6-port", Element::integer },
58 { "control-socket", Element::map },
59 { "dhcp-queue-control", Element::map },
60 { "dhcp-ddns", Element::map },
61 { "echo-client-id", Element::boolean },
62 { "match-client-id", Element::boolean },
63 { "authoritative", Element::boolean },
64 { "next-server", Element::string },
65 { "server-hostname", Element::string },
66 { "boot-file-name", Element::string },
67 { "user-context", Element::map },
68 { "comment", Element::string },
69 { "sanity-checks", Element::map },
70 { "reservations", Element::list },
71 { "config-control", Element::map },
72 { "server-tag", Element::string },
73 { "reservation-mode", Element::string },
74 { "reservations-global", Element::boolean },
75 { "reservations-in-subnet", Element::boolean },
76 { "reservations-out-of-pool", Element::boolean },
77 { "calculate-tee-times", Element::boolean },
78 { "t1-percent", Element::real },
79 { "t2-percent", Element::real },
80 { "loggers", Element::list },
81 { "hostname-char-set", Element::string },
82 { "hostname-char-replacement", Element::string },
83 { "ddns-send-updates", Element::boolean },
84 { "ddns-override-no-update", Element::boolean },
85 { "ddns-override-client-update", Element::boolean },
86 { "ddns-replace-client-name", Element::string },
87 { "ddns-generated-prefix", Element::string },
88 { "ddns-qualifying-suffix", Element::string },
89 { "store-extended-info", Element::boolean },
90 { "statistic-default-sample-count", Element::integer },
91 { "statistic-default-sample-age", Element::integer },
92 { "multi-threading", Element::map },
93 { "cache-threshold", Element::real },
94 { "cache-max-age", Element::integer },
95 { "ip-reservations-unique", Element::boolean },
96 { "ddns-update-on-renew", Element::boolean },
97 { "ddns-use-conflict-resolution", Element::boolean },
98 { "compatibility", Element::map },
99 { "parked-packet-limit", Element::integer },
100};
101
108 { "valid-lifetime", Element::integer, "7200" },
109 { "decline-probation-period", Element::integer, "86400" }, // 24h
110 { "dhcp4o6-port", Element::integer, "0" },
111 { "echo-client-id", Element::boolean, "true" },
112 { "match-client-id", Element::boolean, "true" },
113 { "authoritative", Element::boolean, "false" },
114 { "next-server", Element::string, "0.0.0.0" },
115 { "server-hostname", Element::string, "" },
116 { "boot-file-name", Element::string, "" },
117 { "server-tag", Element::string, "" },
118 { "reservations-global", Element::boolean, "false" },
119 { "reservations-in-subnet", Element::boolean, "true" },
120 { "reservations-out-of-pool", Element::boolean, "false" },
121 { "calculate-tee-times", Element::boolean, "false" },
122 { "t1-percent", Element::real, ".50" },
123 { "t2-percent", Element::real, ".875" },
124 { "ddns-send-updates", Element::boolean, "true" },
125 { "ddns-override-no-update", Element::boolean, "false" },
126 { "ddns-override-client-update", Element::boolean, "false" },
127 { "ddns-replace-client-name", Element::string, "never" },
128 { "ddns-generated-prefix", Element::string, "myhost" },
129 { "ddns-qualifying-suffix", Element::string, "" },
130 { "hostname-char-set", Element::string, "[^A-Za-z0-9.-]" },
131 { "hostname-char-replacement", Element::string, "" },
132 { "store-extended-info", Element::boolean, "false" },
133 { "statistic-default-sample-count", Element::integer, "20" },
134 { "statistic-default-sample-age", Element::integer, "0" },
135 { "ip-reservations-unique", Element::boolean, "true" },
136 { "ddns-update-on-renew", Element::boolean, "false" },
137 { "ddns-use-conflict-resolution", Element::boolean, "true" },
138 { "parked-packet-limit", Element::integer, "256" },
139};
140
147 { "name", Element::string },
148 { "code", Element::integer },
149 { "type", Element::string },
150 { "record-types", Element::string },
151 { "space", Element::string },
152 { "encapsulate", Element::string },
153 { "array", Element::boolean, },
154 { "user-context", Element::map },
155 { "comment", Element::string },
156 { "metadata", Element::map }
157};
158
164 { "record-types", Element::string, ""},
165 { "space", Element::string, "dhcp4"}, // DHCP4_OPTION_SPACE
166 { "array", Element::boolean, "false"},
167 { "encapsulate", Element::string, "" }
168};
169
176 { "name", Element::string },
177 { "data", Element::string },
178 { "code", Element::integer },
179 { "space", Element::string },
180 { "csv-format", Element::boolean },
181 { "always-send", Element::boolean },
182 { "user-context", Element::map },
183 { "comment", Element::string },
184 { "metadata", Element::map }
185};
186
193 { "space", Element::string, "dhcp4"}, // DHCP4_OPTION_SPACE
194 { "csv-format", Element::boolean, "true"},
195 { "always-send", Element::boolean, "false"}
196};
197
204 { "valid-lifetime", Element::integer },
205 { "min-valid-lifetime", Element::integer },
206 { "max-valid-lifetime", Element::integer },
207 { "renew-timer", Element::integer },
208 { "rebind-timer", Element::integer },
209 { "option-data", Element::list },
210 { "pools", Element::list },
211 { "subnet", Element::string },
212 { "interface", Element::string },
213 { "id", Element::integer },
214 { "client-class", Element::string },
215 { "require-client-classes", Element::list },
216 { "reservations", Element::list },
217 { "reservation-mode", Element::string },
218 { "reservations-global", Element::boolean },
219 { "reservations-in-subnet", Element::boolean },
220 { "reservations-out-of-pool", Element::boolean },
221 { "relay", Element::map },
222 { "match-client-id", Element::boolean },
223 { "authoritative", Element::boolean },
224 { "next-server", Element::string },
225 { "server-hostname", Element::string },
226 { "boot-file-name", Element::string },
227 { "4o6-interface", Element::string },
228 { "4o6-interface-id", Element::string },
229 { "4o6-subnet", Element::string },
230 { "user-context", Element::map },
231 { "comment", Element::string },
232 { "calculate-tee-times", Element::boolean },
233 { "t1-percent", Element::real },
234 { "t2-percent", Element::real },
235 { "ddns-send-updates", Element::boolean },
236 { "ddns-override-no-update", Element::boolean },
237 { "ddns-override-client-update", Element::boolean },
238 { "ddns-replace-client-name", Element::string },
239 { "ddns-generated-prefix", Element::string },
240 { "ddns-qualifying-suffix", Element::string },
241 { "hostname-char-set", Element::string },
242 { "hostname-char-replacement", Element::string },
243 { "store-extended-info", Element::boolean },
244 { "metadata", Element::map },
245 { "cache-threshold", Element::real },
246 { "cache-max-age", Element::integer },
247 { "ddns-update-on-renew", Element::boolean },
248 { "ddns-use-conflict-resolution", Element::boolean }
249};
250
259 { "id", Element::integer, "0" }, // 0 means autogenerate
260 { "interface", Element::string, "" },
261 { "client-class", Element::string, "" },
262 { "4o6-interface", Element::string, "" },
263 { "4o6-interface-id", Element::string, "" },
264 { "4o6-subnet", Element::string, "" },
265};
266
274 { "id", Element::integer, "0" }, // 0 means autogenerate
275 { "4o6-interface", Element::string, "" },
276 { "4o6-interface-id", Element::string, "" },
277 { "4o6-subnet", Element::string, "" },
278};
279
290 "rebind-timer",
291 "relay",
292 "renew-timer",
293 "valid-lifetime",
294 "min-valid-lifetime",
295 "max-valid-lifetime",
296 "calculate-tee-times",
297 "t1-percent",
298 "t2-percent",
299 "store-extended-info",
300 "cache-threshold",
301 "cache-max-age"
302};
303
310 { "pool", Element::string },
311 { "option-data", Element::list },
312 { "client-class", Element::string },
313 { "require-client-classes", Element::list },
314 { "user-context", Element::map },
315 { "comment", Element::string },
316 { "metadata", Element::map }
317};
318
325 { "name", Element::string },
326 { "subnet4", Element::list },
327 { "interface", Element::string },
328 { "renew-timer", Element::integer },
329 { "rebind-timer", Element::integer },
330 { "option-data", Element::list },
331 { "match-client-id", Element::boolean },
332 { "authoritative", Element::boolean },
333 { "next-server", Element::string },
334 { "server-hostname", Element::string },
335 { "boot-file-name", Element::string },
336 { "relay", Element::map },
337 { "reservation-mode", Element::string },
338 { "reservations-global", Element::boolean },
339 { "reservations-in-subnet", Element::boolean },
340 { "reservations-out-of-pool", Element::boolean },
341 { "client-class", Element::string },
342 { "require-client-classes", Element::list },
343 { "valid-lifetime", Element::integer },
344 { "min-valid-lifetime", Element::integer },
345 { "max-valid-lifetime", Element::integer },
346 { "user-context", Element::map },
347 { "comment", Element::string },
348 { "calculate-tee-times", Element::boolean },
349 { "t1-percent", Element::real },
350 { "t2-percent", Element::real },
351 { "ddns-send-updates", Element::boolean },
352 { "ddns-override-no-update", Element::boolean },
353 { "ddns-override-client-update", Element::boolean },
354 { "ddns-replace-client-name", Element::string },
355 { "ddns-generated-prefix", Element::string },
356 { "ddns-qualifying-suffix", Element::string },
357 { "hostname-char-set", Element::string },
358 { "hostname-char-replacement", Element::string },
359 { "store-extended-info", Element::boolean },
360 { "metadata", Element::map },
361 { "cache-threshold", Element::real },
362 { "cache-max-age", Element::integer },
363 { "ddns-update-on-renew", Element::boolean },
364 { "ddns-use-conflict-resolution", Element::boolean }
365};
366
369 { "client-class", Element::string, "" },
370 { "interface", Element::string, "" }
371};
372
375 { "re-detect", Element::boolean, "true" }
376};
377
380 { "enable-queue", Element::boolean, "false"},
381 { "queue-type", Element::string, "kea-ring4"},
382 { "capacity", Element::integer, "64"}
383};
384
387 { "enable-multi-threading", Element::boolean, "false" },
388 { "thread-pool-size", Element::integer, "0" },
389 { "packet-queue-size", Element::integer, "64" }
390};
391
394 { "lease-checks", Element::string, "warn" }
395};
396
398
402
404 size_t cnt = 0;
405
406 // Set global defaults first.
407 cnt = setDefaults(global, GLOBAL4_DEFAULTS);
408
409 // Now set option definition defaults for each specified option definition
410 ConstElementPtr option_defs = global->get("option-def");
411 if (option_defs) {
412 BOOST_FOREACH(ElementPtr option_def, option_defs->listValue()) {
413 cnt += SimpleParser::setDefaults(option_def, OPTION4_DEF_DEFAULTS);
414 }
415 }
416
417 // Set the defaults for option data
418 ConstElementPtr options = global->get("option-data");
419 if (options) {
420 cnt += setListDefaults(options, OPTION4_DEFAULTS);
421 }
422
423 // Now set the defaults for defined subnets
424 ConstElementPtr subnets = global->get("subnet4");
425 if (subnets) {
426 cnt += setListDefaults(subnets, SUBNET4_DEFAULTS);
427 }
428
429 // Set the defaults for interfaces config
430 ConstElementPtr ifaces_cfg = global->get("interfaces-config");
431 if (ifaces_cfg) {
432 ElementPtr mutable_cfg = boost::const_pointer_cast<Element>(ifaces_cfg);
433 cnt += setDefaults(mutable_cfg, IFACE4_DEFAULTS);
434 }
435
436 // Set defaults for shared networks
437 ConstElementPtr shared = global->get("shared-networks");
438 if (shared) {
439 BOOST_FOREACH(ElementPtr net, shared->listValue()) {
440
442
443 ConstElementPtr subs = net->get("subnet4");
444 if (subs) {
446 }
447 }
448 }
449
450 // Set the defaults for dhcp-queue-control. If the element isn't
451 // there we'll add it.
452 ConstElementPtr queue_control = global->get("dhcp-queue-control");
453 ElementPtr mutable_cfg;
454 if (queue_control) {
455 mutable_cfg = boost::const_pointer_cast<Element>(queue_control);
456 } else {
457 mutable_cfg = Element::createMap();
458 global->set("dhcp-queue-control", mutable_cfg);
459 }
460
461 cnt += setDefaults(mutable_cfg, DHCP_QUEUE_CONTROL4_DEFAULTS);
462
463 // Set the defaults for multi-threading. If the element isn't there
464 // we'll add it.
465 ConstElementPtr multi_threading = global->get("multi-threading");
466 if (multi_threading) {
467 mutable_cfg = boost::const_pointer_cast<Element>(multi_threading);
468 } else {
469 mutable_cfg = Element::createMap();
470 global->set("multi-threading", mutable_cfg);
471 }
472
473 cnt += setDefaults(mutable_cfg, DHCP_MULTI_THREADING4_DEFAULTS);
474
475 // Set the defaults for sanity-checks. If the element isn't
476 // there we'll add it.
477 ConstElementPtr sanity_checks = global->get("sanity-checks");
478 if (sanity_checks) {
479 mutable_cfg = boost::const_pointer_cast<Element>(sanity_checks);
480 } else {
481 mutable_cfg = Element::createMap();
482 global->set("sanity-checks", mutable_cfg);
483 }
484
485 cnt += setDefaults(mutable_cfg, SANITY_CHECKS4_DEFAULTS);
486
487 return (cnt);
488}
489
491 size_t cnt = 0;
492
493 // Now derive global parameters into subnets.
494 ConstElementPtr subnets = global->get("subnet4");
495 if (subnets) {
496 BOOST_FOREACH(ElementPtr single_subnet, subnets->listValue()) {
497 cnt += SimpleParser::deriveParams(global, single_subnet,
499 }
500 }
501
502 // Deriving parameters for shared networks is a bit more involved.
503 // First, the shared-network level derives from global, and then
504 // subnets within derive from it.
505 ConstElementPtr shared = global->get("shared-networks");
506 if (shared) {
507 BOOST_FOREACH(ElementPtr net, shared->listValue()) {
508 // First try to inherit the parameters from shared network,
509 // if defined there.
510 // Then try to inherit them from global.
511 cnt += SimpleParser::deriveParams(global, net,
513
514 // Now we need to go thrugh all the subnets in this net.
515 subnets = net->get("subnet4");
516 if (subnets) {
517 BOOST_FOREACH(ElementPtr single_subnet, subnets->listValue()) {
518 cnt += SimpleParser::deriveParams(net, single_subnet,
520 }
521 }
522 }
523 }
524
525 return (cnt);
526}
527
528} // namespace dhcp
529} // namespace isc
static size_t setListDefaults(isc::data::ConstElementPtr list, const SimpleDefaults &default_values)
Sets the default values for all entries in a list.
static size_t setDefaults(isc::data::ElementPtr scope, const SimpleDefaults &default_values)
Sets the default values.
static const isc::data::SimpleDefaults DHCP_MULTI_THREADING4_DEFAULTS
This table defines default values for multi-threading in DHCPv4.
static const isc::data::SimpleDefaults SUBNET4_DEFAULTS
This table defines default values for each IPv4 subnet.
static const isc::data::SimpleKeywords SUBNET4_PARAMETERS
This table defines all subnet parameters for DHCPv4.
static const isc::data::SimpleKeywords GLOBAL4_PARAMETERS
This table defines all global parameters in DHCPv4.
static const isc::data::SimpleDefaults GLOBAL4_DEFAULTS
This table defines default global values for DHCPv4.
static const isc::data::ParamsList INHERIT_TO_SUBNET4
List of parameters that can be inherited to subnet4 scope.
static const isc::data::SimpleDefaults IFACE4_DEFAULTS
This table defines default values for interfaces for DHCPv4.
static const isc::data::SimpleKeywords OPTION4_DEF_PARAMETERS
This table defines all option definition parameters.
static const isc::data::SimpleDefaults SHARED_NETWORK4_DEFAULTS
This table defines default values for each IPv4 shared network.
static const isc::data::SimpleKeywords OPTION4_PARAMETERS
This table defines all option parameters.
static const isc::data::SimpleKeywords POOL4_PARAMETERS
This table defines all pool parameters.
static size_t deriveParameters(isc::data::ElementPtr global)
Derives (inherits) all parameters from global to more specific scopes.
static size_t setAllDefaults(isc::data::ElementPtr global)
Sets all defaults for DHCPv4 configuration.
static const isc::data::SimpleDefaults SHARED_SUBNET4_DEFAULTS
This table defines default values for each IPv4 subnet that is part of a shared network.
static const isc::data::SimpleDefaults OPTION4_DEFAULTS
This table defines default values for options in DHCPv4.
static const isc::data::SimpleKeywords SHARED_NETWORK4_PARAMETERS
This table defines all shared network parameters for DHCPv4.
static const isc::data::SimpleDefaults SANITY_CHECKS4_DEFAULTS
This defines default values for sanity checking for DHCPv4.
static const isc::data::SimpleDefaults DHCP_QUEUE_CONTROL4_DEFAULTS
This table defines default values for dhcp-queue-control in DHCPv4.
static const isc::data::SimpleDefaults OPTION4_DEF_DEFAULTS
This table defines default values for option definitions in DHCPv4.
std::vector< std::string > ParamsList
This defines a list of all parameters that are derived (or inherited) between contexts.
boost::shared_ptr< const Element > ConstElementPtr
Definition: data.h:27
std::vector< SimpleDefault > SimpleDefaults
This specifies all default values in a given scope (e.g. a subnet).
boost::shared_ptr< Element > ElementPtr
Definition: data.h:24
std::map< std::string, isc::data::Element::types > SimpleKeywords
This specifies all accepted keywords with their types.
Defines the logger used by the top-level component of kea-lfc.