From: Tomek Mrugalski Date: Tue, 24 Jul 2018 18:42:04 +0000 (+0200) Subject: [5682] DHCP4, DHCP6 parsers extended to support sanity-checks X-Git-Tag: ha_phase2~24 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=4cb3ae1902f433136ef5a6077a7b8c3cf996b5e5;p=thirdparty%2Fkea.git [5682] DHCP4, DHCP6 parsers extended to support sanity-checks --- diff --git a/src/bin/dhcp4/dhcp4_lexer.ll b/src/bin/dhcp4/dhcp4_lexer.ll index d4861522f3..40d013703b 100644 --- a/src/bin/dhcp4/dhcp4_lexer.ll +++ b/src/bin/dhcp4/dhcp4_lexer.ll @@ -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: diff --git a/src/bin/dhcp4/dhcp4_parser.yy b/src/bin/dhcp4/dhcp4_parser.yy index d05e4f8bc6..f478533c47 100644 --- a/src/bin/dhcp4/dhcp4_parser.yy +++ b/src/bin/dhcp4/dhcp4_parser.yy @@ -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); diff --git a/src/bin/dhcp4/json_config_parser.cc b/src/bin/dhcp4/json_config_parser.cc index 646091cd09..acdb52d3ca 100644 --- a/src/bin/dhcp4/json_config_parser.cc +++ b/src/bin/dhcp4/json_config_parser.cc @@ -25,6 +25,7 @@ #include #include #include +#include #include #include #include @@ -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); diff --git a/src/bin/dhcp4/parser_context.cc b/src/bin/dhcp4/parser_context.cc index de28969fb6..b5770d9a4d 100644 --- a/src/bin/dhcp4/parser_context.cc +++ b/src/bin/dhcp4/parser_context.cc @@ -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__"); } diff --git a/src/bin/dhcp4/parser_context.h b/src/bin/dhcp4/parser_context.h index e0beff259a..00e77cfae8 100644 --- a/src/bin/dhcp4/parser_context.h +++ b/src/bin/dhcp4/parser_context.h @@ -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, diff --git a/src/bin/dhcp6/dhcp6_lexer.ll b/src/bin/dhcp6/dhcp6_lexer.ll index 362675aab6..6515dfeaad 100644 --- a/src/bin/dhcp6/dhcp6_lexer.ll +++ b/src/bin/dhcp6/dhcp6_lexer.ll @@ -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: diff --git a/src/bin/dhcp6/dhcp6_parser.yy b/src/bin/dhcp6/dhcp6_parser.yy index 9c8d487be1..6572c1e045 100644 --- a/src/bin/dhcp6/dhcp6_parser.yy +++ b/src/bin/dhcp6/dhcp6_parser.yy @@ -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))); diff --git a/src/bin/dhcp6/json_config_parser.cc b/src/bin/dhcp6/json_config_parser.cc index 70ce51c59a..2de5e36898 100644 --- a/src/bin/dhcp6/json_config_parser.cc +++ b/src/bin/dhcp6/json_config_parser.cc @@ -33,6 +33,7 @@ #include #include #include +#include #include #include #include @@ -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); diff --git a/src/bin/dhcp6/parser_context.cc b/src/bin/dhcp6/parser_context.cc index f76df94ed3..acb8c8de19 100644 --- a/src/bin/dhcp6/parser_context.cc +++ b/src/bin/dhcp6/parser_context.cc @@ -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__"); } } diff --git a/src/bin/dhcp6/parser_context.h b/src/bin/dhcp6/parser_context.h index a3f7cc7101..9e41c9b042 100644 --- a/src/bin/dhcp6/parser_context.h +++ b/src/bin/dhcp6/parser_context.h @@ -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,