]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
[5682] DHCP4, DHCP6 parsers extended to support sanity-checks
authorTomek Mrugalski <tomasz@isc.org>
Tue, 24 Jul 2018 18:42:04 +0000 (20:42 +0200)
committerTomek Mrugalski <tomasz@isc.org>
Mon, 30 Jul 2018 17:03:18 +0000 (19:03 +0200)
src/bin/dhcp4/dhcp4_lexer.ll
src/bin/dhcp4/dhcp4_parser.yy
src/bin/dhcp4/json_config_parser.cc
src/bin/dhcp4/parser_context.cc
src/bin/dhcp4/parser_context.h
src/bin/dhcp6/dhcp6_lexer.ll
src/bin/dhcp6/dhcp6_parser.yy
src/bin/dhcp6/json_config_parser.cc
src/bin/dhcp6/parser_context.cc
src/bin/dhcp6/parser_context.h

index d4861522f37497c108fcf6a6aace2f61987eb2f4..40d013703b04f83073bccb20c26d85efa2b1e144 100644 (file)
@@ -203,6 +203,24 @@ ControlCharacterFill            [^"\\]|\\{JSONEscapeSequence}
     }
 }
 
+\"sanity-checks\" {
+    switch(driver.ctx_) {
+    case isc::dhcp::Parser4Context::DHCP4:
+        return  isc::dhcp::Dhcp4Parser::make_SANITY_CHECKS(driver.loc_);
+    default:
+        return isc::dhcp::Dhcp4Parser::make_STRING("sanity-checks", driver.loc_);
+    }
+}
+
+\"lease-checks\" {
+    switch(driver.ctx_) {
+    case isc::dhcp::Parser4Context::SANITY_CHECKS:
+        return  isc::dhcp::Dhcp4Parser::make_LEASE_CHECKS(driver.loc_);
+    default:
+        return isc::dhcp::Dhcp4Parser::make_STRING("lease-checks", driver.loc_);
+    }
+}
+
 \"dhcp-socket-type\" {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::INTERFACES_CONFIG:
index d05e4f8bc66e8799a3441783f3b1758ac6647255..f478533c4704d0321f5ff96be02d967ab530a027 100644 (file)
@@ -60,6 +60,9 @@ using namespace std;
   USE_ROUTING "use-routing"
   RE_DETECT "re-detect"
 
+  SANITY_CHECKS "sanity-checks"
+  LEASE_CHECKS "lease-checks"
+
   ECHO_CLIENT_ID "echo-client-id"
   MATCH_CLIENT_ID "match-client-id"
   NEXT_SERVER "next-server"
@@ -449,6 +452,7 @@ global_param: valid_lifetime
             | boot_file_name
             | user_context
             | comment
+            | sanity_checks
             | unknown_map_entry
             ;
 
@@ -568,6 +572,39 @@ lease_database: LEASE_DATABASE {
     ctx.leave();
 };
 
+sanity_checks: SANITY_CHECKS {
+    ElementPtr m(new MapElement(ctx.loc2pos(@1)));
+    ctx.stack_.back()->set("sanity-checks", m);
+    ctx.stack_.push_back(m);
+    ctx.enter(ctx.SANITY_CHECKS);
+} COLON LCURLY_BRACKET sanity_checks_params RCURLY_BRACKET {
+    ctx.stack_.pop_back();
+    ctx.leave();
+};
+
+sanity_checks_params: sanity_checks_param
+                    | sanity_checks_params COMMA sanity_checks_param;
+
+sanity_checks_param: lease_checks;
+
+lease_checks: LEASE_CHECKS {
+    ctx.enter(ctx.NO_KEYWORD);
+} COLON STRING {
+
+    if ( (string($4) == "none") ||
+         (string($4) == "warn") ||
+         (string($4) == "fix") ||
+         (string($4) == "fix-del") ||
+         (string($4) == "del")) {
+        ElementPtr user(new StringElement($4, ctx.loc2pos(@4)));
+        ctx.stack_.back()->set("lease-checks", user);
+        ctx.leave();
+    } else {
+        error(@4, "Unsupported 'lease-checks value: " + string($4) +
+              ", supported values are: none, warn, fix, fix-del, del");
+    }
+}
+
 hosts_database: HOSTS_DATABASE {
     ElementPtr i(new MapElement(ctx.loc2pos(@1)));
     ctx.stack_.back()->set("hosts-database", i);
index 646091cd099b805114ce957ba26c5a65ea85d9ed..acdb52d3ca730604d1b73731a7dd467f33147e6d 100644 (file)
@@ -25,6 +25,7 @@
 #include <dhcpsrv/parsers/option_data_parser.h>
 #include <dhcpsrv/parsers/simple_parser4.h>
 #include <dhcpsrv/parsers/shared_networks_list_parser.h>
+#include <dhcpsrv/parsers/sanity_checks_parser.h>
 #include <dhcpsrv/host_data_source_factory.h>
 #include <dhcpsrv/timer_mgr.h>
 #include <hooks/hooks_parser.h>
@@ -388,6 +389,11 @@ configureDhcp4Server(Dhcpv4Srv& server, isc::data::ConstElementPtr config_set,
                 continue;
             }
 
+            if (config_pair.first == "sanity-checks") {
+                SanityChecksParser parser;
+                parser.parse(*srv_cfg, config_pair.second);
+            }
+
             if (config_pair.first == "expired-leases-processing") {
                 ExpirationConfigParser parser;
                 parser.parse(config_pair.second);
index de28969fb6777991ffa190fe78c6bc19d5d75d85..b5770d9a4df11dc978f337db8ca5e92af717d5fa 100644 (file)
@@ -194,6 +194,8 @@ Parser4Context::contextName()
         return ("replace-client-name");
     case SHARED_NETWORK:
         return ("shared-networks");
+    case SANITY_CHECKS:
+        return ("sanity-checks");
     default:
         return ("__unknown__");
     }
index e0beff259aaa7e87845035505973f54a2877c964..00e77cfae8b6ae1f72f0d08868d0e43a9a1e43f3 100644 (file)
@@ -214,6 +214,9 @@ public:
         /// Used while parsing Dhcp4/interfaces structures.
         INTERFACES_CONFIG,
 
+        /// Sanity checks.
+        SANITY_CHECKS,
+
         /// Used while parsing Dhcp4/interfaces/dhcp-socket-type structures.
         DHCP_SOCKET_TYPE,
 
index 362675aab6c307f438f660f9464e0bf73b8380ee..6515dfeaad59fa40bfc6dc95fdae64aa33605c49 100644 (file)
@@ -466,6 +466,24 @@ ControlCharacterFill            [^"\\]|\\{JSONEscapeSequence}
     }
 }
 
+\"sanity-checks\" {
+    switch(driver.ctx_) {
+    case isc::dhcp::Parser6Context::DHCP6:
+        return  isc::dhcp::Dhcp6Parser::make_SANITY_CHECKS(driver.loc_);
+    default:
+        return isc::dhcp::Dhcp6Parser::make_STRING("sanity-checks", driver.loc_);
+    }
+}
+
+\"lease-checks\" {
+    switch(driver.ctx_) {
+    case isc::dhcp::Parser6Context::SANITY_CHECKS:
+        return  isc::dhcp::Dhcp6Parser::make_LEASE_CHECKS(driver.loc_);
+    default:
+        return isc::dhcp::Dhcp6Parser::make_STRING("lease-checks", driver.loc_);
+    }
+}
+
 \"lease-database\" {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::DHCP6:
index 9c8d487be10399065bbf31cdf49198680db6d6e0..6572c1e045a1269a9408097a27484ad09a712c52 100644 (file)
@@ -122,6 +122,9 @@ using namespace std;
   RELAY_SUPPLIED_OPTIONS "relay-supplied-options"
   HOST_RESERVATION_IDENTIFIERS "host-reservation-identifiers"
 
+  SANITY_CHECKS "sanity-checks"
+  LEASE_CHECKS "lease-checks"
+
   CLIENT_CLASSES "client-classes"
   REQUIRE_CLIENT_CLASSES "require-client-classes"
   TEST "test"
@@ -450,6 +453,7 @@ global_param: preferred_lifetime
             | dhcp_ddns
             | user_context
             | comment
+            | sanity_checks
             | unknown_map_entry
             ;
 
@@ -712,6 +716,38 @@ keyspace: KEYSPACE {
     ctx.leave();
 };
 
+sanity_checks: SANITY_CHECKS {
+    ElementPtr m(new MapElement(ctx.loc2pos(@1)));
+    ctx.stack_.back()->set("sanity-checks", m);
+    ctx.stack_.push_back(m);
+    ctx.enter(ctx.SANITY_CHECKS);
+} COLON LCURLY_BRACKET sanity_checks_params RCURLY_BRACKET {
+    ctx.stack_.pop_back();
+    ctx.leave();
+};
+
+sanity_checks_params: sanity_checks_param
+                    | sanity_checks_params COMMA sanity_checks_param;
+
+sanity_checks_param: lease_checks;
+
+lease_checks: LEASE_CHECKS {
+    ctx.enter(ctx.NO_KEYWORD);
+} COLON STRING {
+
+    if ( (string($4) == "none") ||
+         (string($4) == "warn") ||
+         (string($4) == "fix") ||
+         (string($4) == "fix-del") ||
+         (string($4) == "del")) {
+        ElementPtr user(new StringElement($4, ctx.loc2pos(@4)));
+        ctx.stack_.back()->set("lease-checks", user);
+        ctx.leave();
+    } else {
+        error(@4, "Unsupported 'lease-checks value: " + string($4) +
+              ", supported values are: none, warn, fix, fix-del, del");
+    }
+}
 
 mac_sources: MAC_SOURCES {
     ElementPtr l(new ListElement(ctx.loc2pos(@1)));
index 70ce51c59aa3fb4a1132a7a4e5b812b21970967f..2de5e36898e34f00b1d6fbc563e8610d2ffd9498 100644 (file)
@@ -33,6 +33,7 @@
 #include <dhcpsrv/parsers/option_data_parser.h>
 #include <dhcpsrv/parsers/simple_parser6.h>
 #include <dhcpsrv/parsers/shared_networks_list_parser.h>
+#include <dhcpsrv/parsers/sanity_checks_parser.h>
 #include <dhcpsrv/host_data_source_factory.h>
 #include <hooks/hooks_parser.h>
 #include <log/logger_support.h>
@@ -502,6 +503,11 @@ configureDhcp6Server(Dhcpv6Srv& server, isc::data::ConstElementPtr config_set,
                 continue;
             }
 
+            if (config_pair.first == "sanity-checks") {
+                SanityChecksParser parser;
+                parser.parse(*srv_config, config_pair.second);
+            }
+
             if (config_pair.first == "expired-leases-processing") {
                 ExpirationConfigParser parser;
                 parser.parse(config_pair.second);
index f76df94ed397677feca4d8d971752b57553ab002..acb8c8de19964483a1f5803d7233e4752744e890 100644 (file)
@@ -196,7 +196,9 @@ Parser6Context::contextName()
         return ("replace-client-name");
     case SHARED_NETWORK:
         return ("shared-networks");
-     default:
+    case SANITY_CHECKS:
+        return ("sanity-checks");
+    default:
         return ("__unknown__");
     }
 }
index a3f7cc7101ab810cba25ababc25e00eb9fcc6091..9e41c9b042f7fea19f1fadbb95bd4a7fbed8f749 100644 (file)
@@ -218,6 +218,9 @@ public:
         /// Used while parsing Dhcp6/interfaces structures.
         INTERFACES_CONFIG,
 
+        /// Sanity checks.
+        SANITY_CHECKS,
+
         /// Used while parsing Dhcp6/lease-database structures.
         LEASE_DATABASE,