20 #include <boost/foreach.hpp>
44 << expression_cfg->str() <<
"] must be a string, at ("
45 << expression_cfg->getPosition() <<
")");
51 expression_cfg->getValue(value);
53 EvalContext eval_ctx(family == AF_INET ? Option::V4 : Option::V6,
58 }
catch (
const std::exception& ex) {
61 "expression: [" << value
62 <<
"] error: " << ex.
what() <<
" at ("
63 << expression_cfg->getPosition() <<
")");
73 bool append_error_position) {
75 std::string name = getString(class_def_cfg,
"name");
78 "not empty parameter 'name' is required "
79 << getPosition(
"name", class_def_cfg) <<
")");
86 bool depend_on_known =
false;
90 [&class_dictionary, &depend_on_known]
96 parser.
parse(match_expr, test_cfg, family, check_defined);
97 test = test_cfg->stringValue();
107 SimpleParser4::OPTION4_DEF_DEFAULTS :
108 SimpleParser6::OPTION6_DEF_DEFAULTS);
116 if (!LibDHCP::shouldDeferOptionUnpack(def->getOptionSpaceName(),
119 "Not allowed option definition for code '"
120 << def->getCode() <<
"' in space '"
121 << def->getOptionSpaceName() <<
"' at ("
122 << option_def->getPosition() <<
")");
126 }
catch (
const std::exception& ex) {
129 << option_def->getPosition() <<
")");
139 opts_parser.
parse(options, option_data);
146 bool required =
false;
147 if (class_def_cfg->contains(
"only-if-required")) {
148 required = getBoolean(class_def_cfg,
"only-if-required");
153 if (class_def_cfg->contains(
"next-server")) {
154 std::string next_server_txt = getString(class_def_cfg,
"next-server");
156 next_server =
IOAddress(next_server_txt);
159 "Invalid next-server value specified: '"
160 << next_server_txt <<
"' ("
161 << getPosition(
"next-server", class_def_cfg) <<
")");
164 if (next_server.
getFamily() != AF_INET) {
166 << next_server_txt <<
"', must be IPv4 address ("
167 << getPosition(
"next-server", class_def_cfg) <<
")");
172 << next_server_txt <<
"', must not be a broadcast ("
173 << getPosition(
"next-server", class_def_cfg) <<
")");
179 if (class_def_cfg->contains(
"server-hostname")) {
180 sname = getString(class_def_cfg,
"server-hostname");
182 if (sname.length() >= Pkt4::MAX_SNAME_LEN) {
184 << Pkt4::MAX_SNAME_LEN - 1 <<
" bytes long, it is "
185 << sname.length() <<
" ("
186 << getPosition(
"server-hostname", class_def_cfg) <<
")");
191 std::string filename;
192 if (class_def_cfg->contains(
"boot-file-name")) {
193 filename = getString(class_def_cfg,
"boot-file-name");
195 if (filename.length() > Pkt4::MAX_FILE_LEN) {
197 << Pkt4::MAX_FILE_LEN - 1 <<
" bytes long, it is "
198 << filename.length() <<
" ("
199 << getPosition(
"boot-file-name", class_def_cfg) <<
")");
212 <<
"' only-if-required flag must be false");
216 <<
"' test expression must be empty");
222 if (name ==
"DROP") {
225 <<
"' only-if-required flag must be false");
232 class_dictionary->addClass(name, match_expr, test, required,
233 depend_on_known, options, defs,
234 user_context, next_server, sname, filename, valid_lft);
235 }
catch (
const std::exception& ex) {
236 std::ostringstream s;
237 s <<
"Can't add class: " << ex.what();
239 if (append_error_position) {
240 s <<
" (" << class_def_cfg->getPosition() <<
")";
248 const uint16_t family) {
250 if (!class_def_cfg || (class_def_cfg->getType() !=
Element::map)) {
255 static std::set<std::string> supported_params = {
"name",
259 "only-if-required" };
262 static std::set<std::string> supported_params_v4 = {
"option-def",
268 for (
auto name_value_pair : class_def_cfg->mapValue()) {
269 if ((supported_params.count(name_value_pair.first) > 0) ||
270 ((family == AF_INET) && (supported_params_v4.count(name_value_pair.first) > 0))) {
275 << name_value_pair.first <<
"'");
288 client_class_def_list->listValue()) {
290 parser.
parse(dictionary, client_class_def, family);
Parser for a single client class definition.
bool isV4Bcast() const
Convenience function to check if it is an IPv4 broadcast address.
void parse(const CfgOptionPtr &cfg, isc::data::ConstElementPtr option_data_list)
Parses a list of options, instantiates them and stores in cfg.
boost::shared_ptr< CfgOption > CfgOptionPtr
Non-const pointer.
void parse(ClientClassDictionaryPtr &class_dictionary, isc::data::ConstElementPtr client_class_def, uint16_t family, bool append_error_position=true)
Parses an entry that describes single client class definition.
isc::dhcp::Expression expression
Parsed expression (output tokens are stored here)
boost::shared_ptr< CfgOptionDef > CfgOptionDefPtr
Non-const pointer.
OptionDefinitionPtr parse(isc::data::ConstElementPtr option_def)
Parses an entry that describes single option definition.
void parse(ExpressionPtr &expression, isc::data::ConstElementPtr expression_cfg, uint16_t family, isc::eval::EvalContext::CheckDefined check_defined=isc::eval::EvalContext::acceptAll)
Parses an expression configuration element into an Expression.
Maintains a list of ClientClassDef's.
bool isClientClassDefined(ClientClassDictionaryPtr &class_dictionary, bool &depend_on_known, const ClientClass &client_class)
Check if a client class name is already defined, i.e.
Parser for a logical expression.
#define isc_throw(type, stream)
A shortcut macro to insert known values into exception arguments.
Represents option data configuration for the DHCP server.
Parsers for client class definitions.
To be removed. Please use ConfigError instead.
Parser for a single option definition.
boost::shared_ptr< ClientClassDictionary > ClientClassDictionaryPtr
Defines a pointer to a ClientClassDictionary.
Evaluation context, an interface to the expression evaluation.
boost::shared_ptr< const Element > ConstElementPtr
Represents option definitions used by the DHCP server.
Parser for option data values within a subnet.
std::list< std::string > builtinNames
List of built-in client class names.
static size_t setListDefaults(isc::data::ConstElementPtr list, const SimpleDefaults &default_values)
Sets the default values for all entries in a list.
virtual const char * what() const
Returns a C-style character string of the cause of the exception.
Defines the logger used by the top-level component of kea-dhcp-ddns.
std::vector< TokenPtr > Expression
This is a structure that holds an expression converted to RPN.
An exception that is thrown if an error occurs within the IO module.
boost::shared_ptr< OptionDefinition > OptionDefinitionPtr
Pointer to option definition object.
std::string ClientClass
Defines a single class name.
The IOAddress class represents an IP addresses (version agnostic)
std::function< bool(const ClientClass &)> CheckDefined
Type of the check defined function.
Defines classes for storing client class definitions.
short getFamily() const
Returns the address family.
boost::shared_ptr< Expression > ExpressionPtr
bool parseString(const std::string &str, ParserType type=PARSER_BOOL)
Run the parser on the string specified.