summaryrefslogtreecommitdiffstats
path: root/src/lib/dhcpsrv/parsers/sanity_checks_parser.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/dhcpsrv/parsers/sanity_checks_parser.cc')
-rw-r--r--src/lib/dhcpsrv/parsers/sanity_checks_parser.cc80
1 files changed, 80 insertions, 0 deletions
diff --git a/src/lib/dhcpsrv/parsers/sanity_checks_parser.cc b/src/lib/dhcpsrv/parsers/sanity_checks_parser.cc
new file mode 100644
index 0000000..e7c0b20
--- /dev/null
+++ b/src/lib/dhcpsrv/parsers/sanity_checks_parser.cc
@@ -0,0 +1,80 @@
+// Copyright (C) 2018-2022 Internet Systems Consortium, Inc. ("ISC")
+//
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#include <config.h>
+#include <dhcpsrv/parsers/sanity_checks_parser.h>
+#include <dhcpsrv/cfg_consistency.h>
+#include <cc/data.h>
+
+using namespace isc::data;
+
+namespace isc {
+namespace dhcp {
+
+void
+SanityChecksParser::parse(SrvConfig& cfg, const ConstElementPtr& sanity_checks) {
+
+ if (!sanity_checks) {
+ return;
+ }
+ if (sanity_checks->getType() != Element::map) {
+ isc_throw(DhcpConfigError, "sanity-checks is supposed to be a map");
+ }
+
+ // Subnet-id lease checker.
+ ConstElementPtr checks = sanity_checks->get("lease-checks");
+ if (checks) {
+ if (checks->getType() != Element::string) {
+ isc_throw(DhcpConfigError, "lease-checks must be a string");
+ }
+ std::string lc = checks->stringValue();
+ CfgConsistency::LeaseSanity check;
+ if (lc == "none") {
+ check = CfgConsistency::LEASE_CHECK_NONE;
+ } else if (lc == "warn") {
+ check = CfgConsistency::LEASE_CHECK_WARN;
+ } else if (lc == "fix") {
+ check = CfgConsistency::LEASE_CHECK_FIX;
+ } else if (lc == "fix-del") {
+ check = CfgConsistency::LEASE_CHECK_FIX_DEL;
+ } else if (lc == "del") {
+ check = CfgConsistency::LEASE_CHECK_DEL;
+ } else {
+ isc_throw(DhcpConfigError, "Unsupported lease-checks value: " << lc
+ << ", supported values are: none, warn, fix, fix-del, del");
+ }
+ cfg.getConsistency()->setLeaseSanityCheck(check);
+ }
+
+ // Extended info lease checker.
+ checks = sanity_checks->get("extended-info-checks");
+ if (checks) {
+ if (checks->getType() != Element::string) {
+ isc_throw(DhcpConfigError, "extended-info-checks must be a string");
+ }
+ std::string exc = checks->stringValue();
+ CfgConsistency::ExtendedInfoSanity check;
+ if (exc == "none") {
+ check = CfgConsistency::EXTENDED_INFO_CHECK_NONE;
+ } else if (exc == "fix") {
+ check = CfgConsistency::EXTENDED_INFO_CHECK_FIX;
+ } else if (exc == "strict") {
+ check = CfgConsistency::EXTENDED_INFO_CHECK_STRICT;
+ } else if (exc == "pedantic") {
+ check = CfgConsistency::EXTENDED_INFO_CHECK_PEDANTIC;
+ } else {
+ isc_throw(DhcpConfigError,
+ "Unsupported extended-info-checks value: " << exc
+ << ", supported values are: none, fix, strict, pedantic");
+ }
+ cfg.getConsistency()->setExtendedInfoSanityCheck(check);
+ }
+
+ // Additional sanity check fields will come in later here.
+}
+
+}
+}