From 0d97d2c0b54f1371b1a2562414469c51f953ffa1 Mon Sep 17 00:00:00 2001 From: Tomek Mrugalski Date: Tue, 6 Dec 2016 20:49:46 +0100 Subject: [PATCH] [5036] readonly support added in hosts-database --- doc/examples/kea6/mysql-reservations.json | 3 ++- src/bin/dhcp6/dhcp6_lexer.ll | 13 +++++++++++-- src/bin/dhcp6/dhcp6_parser.yy | 15 +++++++++++++++ 3 files changed, 28 insertions(+), 3 deletions(-) diff --git a/doc/examples/kea6/mysql-reservations.json b/doc/examples/kea6/mysql-reservations.json index 2574cf9eb..fe9780dac 100644 --- a/doc/examples/kea6/mysql-reservations.json +++ b/doc/examples/kea6/mysql-reservations.json @@ -45,7 +45,8 @@ "name": "kea", "user": "kea", "password": "kea", - "host": "localhost" + "host": "localhost", + "readonly": true }, # Define a subnet with a pool of dynamic addresses and a pool of dynamic diff --git a/src/bin/dhcp6/dhcp6_lexer.ll b/src/bin/dhcp6/dhcp6_lexer.ll index 92864b74b..8c661cfea 100644 --- a/src/bin/dhcp6/dhcp6_lexer.ll +++ b/src/bin/dhcp6/dhcp6_lexer.ll @@ -157,7 +157,7 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence} isc_throw(Dhcp6ParseError, "Directive not closed."); } "?>" BEGIN(INITIAL); - + <*>{blank}+ { // Ok, we found a with space. Let's ignore it and update loc variable. @@ -216,6 +216,15 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence} } } +\"readonly\" { + switch(driver.ctx_) { + case isc::dhcp::Parser6Context::HOSTS_DATABASE: + return isc::dhcp::Dhcp6Parser::make_READONLY(driver.loc_); + default: + return isc::dhcp::Dhcp6Parser::make_STRING("readonly", driver.loc_); + } +} + \"type\" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::LEASE_DATABASE: @@ -961,7 +970,7 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence} // Bad string with a bad escape inside driver.error(driver.loc_, "Bad escape in " + std::string(yytext)); } - + \"{JSONStringCharacter}*\\\" { // Bad string with an open escape at the end driver.error(driver.loc_, "Overflow escape in " + std::string(yytext)); diff --git a/src/bin/dhcp6/dhcp6_parser.yy b/src/bin/dhcp6/dhcp6_parser.yy index 4de439d4d..2a11e8ba0 100644 --- a/src/bin/dhcp6/dhcp6_parser.yy +++ b/src/bin/dhcp6/dhcp6_parser.yy @@ -62,6 +62,7 @@ using namespace std; HOST "host" PERSIST "persist" LFC_INTERVAL "lfc-interval" + READONLY "readonly" PREFERRED_LIFETIME "preferred-lifetime" VALID_LIFETIME "valid-lifetime" @@ -442,6 +443,7 @@ database_map_param: type | name | persist | lfc_interval + | readonly | unknown_map_entry ; @@ -495,6 +497,11 @@ lfc_interval: LFC_INTERVAL COLON INTEGER { ctx.stack_.back()->set("lfc-interval", n); }; +readonly: READONLY COLON BOOLEAN { + ElementPtr n(new BoolElement($3, ctx.loc2pos(@3))); + ctx.stack_.back()->set("readonly", n); +}; + mac_sources: MAC_SOURCES { ElementPtr l(new ListElement(ctx.loc2pos(@1))); ctx.stack_.back()->set("mac-sources", l); @@ -803,6 +810,9 @@ option_def_entry: LCURLY_BRACKET { ctx.stack_.pop_back(); }; +// This defines the top level scope when the parser is told to parse a single +// option definition. It's almost exactly the same as option_def_entry, except +// that it does leave its value on stack. sub_option_def: LCURLY_BRACKET { // Parse the option-def list entry map ElementPtr m(new MapElement(ctx.loc2pos(@1))); @@ -893,6 +903,8 @@ option_data_list_content: %empty | not_empty_option_data_list ; +// This defines the content of option-data list. It can either +// be a single value or multiple entries separated by comma. not_empty_option_data_list: option_data_entry | not_empty_option_data_list COMMA option_data_entry ; @@ -907,6 +919,9 @@ option_data_entry: LCURLY_BRACKET { ctx.stack_.pop_back(); }; +// This defines the top level scope when the parser is told to parse a single +// option data. It's almost exactly the same as option_data_entry, except +// that it does leave its value on stack. sub_option_data: LCURLY_BRACKET { // Parse the option-data list entry map ElementPtr m(new MapElement(ctx.loc2pos(@1))); -- GitLab