30 match_expr_(match_expr), required_(false), depend_on_known_(false),
32 valid_(), preferred_() {
49 match_expr_(
ExpressionPtr()), test_(rhs.test_), required_(rhs.required_),
50 depend_on_known_(rhs.depend_on_known_), cfg_option_(new
CfgOption()),
51 next_server_(rhs.next_server_), sname_(rhs.sname_),
52 filename_(rhs.filename_), valid_(rhs.valid_), preferred_(rhs.preferred_),
53 offer_lft_(rhs.offer_lft_) {
55 if (rhs.match_expr_) {
57 *match_expr_ = *rhs.match_expr_;
60 if (rhs.cfg_option_def_) {
62 rhs.cfg_option_def_->copyTo(*cfg_option_def_);
65 if (rhs.cfg_option_) {
66 rhs.cfg_option_->copyTo(*cfg_option_);
90 match_expr_ = match_expr;
110 required_ = required;
115 return (depend_on_known_);
120 depend_on_known_ = depend_on_known;
125 return (cfg_option_def_);
130 cfg_option_def_ = cfg_option_def;
135 return (cfg_option_);
140 cfg_option_ = cfg_option;
151 .arg(pkt->getLabel())
158 .arg(pkt->getLabel())
164 .arg(pkt->getLabel())
169 .arg(pkt->getLabel())
171 .arg(
"get exception?");
189 if (!subclass.empty()) {
191 .arg(pkt->getLabel())
199 pkt->addSubClass(
getName(), value);
203 .arg(pkt->getLabel())
208 .arg(pkt->getLabel())
210 .arg(
"get exception?");
221 return ((name_ == other.name_) &&
222 ((!match_expr_ && !other.match_expr_) ||
223 (match_expr_ && other.match_expr_ &&
224 (*match_expr_ == *other.match_expr_))) &&
225 ((!cfg_option_ && !other.cfg_option_) ||
226 (cfg_option_ && other.cfg_option_ &&
227 (*cfg_option_ == *other.cfg_option_))) &&
228 ((!cfg_option_def_ && !other.cfg_option_def_) ||
229 (cfg_option_def_ && other.cfg_option_def_ &&
230 (*cfg_option_def_ == *other.cfg_option_def_))) &&
231 (required_ == other.required_) &&
232 (depend_on_known_ == other.depend_on_known_) &&
233 (next_server_ == other.next_server_) &&
234 (sname_ == other.sname_) &&
235 (filename_ == other.filename_));
247 if (!test_.empty()) {
255 if (cfg_option_def_ && (family == AF_INET)) {
256 result->set(
"option-def", cfg_option_def_->toElement());
259 result->set(
"option-data", cfg_option_->toElement());
261 if (family == AF_INET) {
272 result->set(
"offer-lifetime",
279 result->set(
"preferred-lifetime",
283 if (preferred_.
getMin() < preferred_.
get()) {
284 result->set(
"min-preferred-lifetime",
288 if (preferred_.
getMax() > preferred_.
get()) {
289 result->set(
"max-preferred-lifetime",
296 result->set(
"valid-lifetime",
300 result->set(
"min-valid-lifetime",
305 result->set(
"max-valid-lifetime",
316 auto const&
test = result->get(
"test");
318 result->set(
"template-test",
test);
319 result->remove(
"test");
327 os <<
"ClientClassDef:" << x.
getName();
339 for (
auto const& cclass : *rhs.list_) {
351 const std::string& test,
353 bool depend_on_known,
358 const std::string& sname,
359 const std::string& filename,
370 cclass->setTest(test);
371 cclass->setRequired(required);
372 cclass->setDependOnKnown(depend_on_known);
373 cclass->setCfgOptionDef(cfg_option_def);
374 cclass->setContext(user_context),
375 cclass->setNextServer(next_server);
376 cclass->setSname(sname);
377 cclass->setFilename(filename);
378 cclass->setValid(valid);
379 cclass->setPreferred(preferred);
380 cclass->setOfferLft(offer_lft);
388 " - class definition cannot be null");
393 << class_def->getName() <<
" has already been defined");
396 list_->push_back(class_def);
397 (*map_)[class_def->getName()] = class_def;
402 ClientClassDefMap::iterator it = map_->find(name);
403 if (it != map_->end()) {
412 for (ClientClassDefList::iterator this_class = list_->begin();
413 this_class != list_->end(); ++this_class) {
414 if ((*this_class)->getName() == name) {
415 list_->erase(this_class);
428 for (ClientClassDefList::iterator this_class = list_->begin();
429 this_class != list_->end(); ++this_class) {
430 if ((*this_class)->getId() ==
id) {
431 map_->erase((*this_class)->getName());
432 list_->erase(this_class);
445 return (list_->empty());
450 std::string& dependent_class)
const {
453 for (
auto const& this_class : *list_) {
455 if (this_class->dependOnClass(name)) {
456 dependent_class = this_class->getName();
460 if (this_class->getName() == name) {
470 if (list_->size() != other.list_->size()) {
474 ClientClassDefList::const_iterator this_class = list_->cbegin();
475 ClientClassDefList::const_iterator other_class = other.list_->cbegin();
476 while (this_class != list_->cend() &&
477 other_class != other.list_->cend()) {
478 if (!*this_class || !*other_class ||
479 **this_class != **other_class) {
492 std::queue<ExpressionPtr> expressions;
493 for (
auto const& c : *list_) {
494 if (!c->getTest().empty()) {
503 expressions.push(match_expr);
508 for (
auto const& c : *list_) {
509 if (!c->getTest().empty()) {
510 c->setMatchExpr(expressions.front());
518 for (
auto const& c : *list_) {
521 if (!class_options || class_options->empty()) {
528 if (!c->getCfgOptionDef()) {
529 class_options->createOptions(external_defs);
539 c->getCfgOptionDef()->copyTo(*composite_defs);
546 external_defs->copyTo(*external_defs_copy);
547 composite_defs->merge(*external_defs_copy);
551 class_options->createOptions(composite_defs);
560 for (
auto const& this_class : *list_) {
561 result->add(this_class->toElement());
571 for (
auto const& cclass : *rhs.list_) {
580std::list<std::string>
588 "ALL",
"KNOWN",
"UNKNOWN",
"BOOTP"
597std::list<std::string>
599 "VENDOR_CLASS_",
"HA_",
"AFTER_",
"EXTERNAL_"
605 if (client_class == bn) {
611 if (client_class.size() <= bt.size()) {
614 auto mis = std::mismatch(bt.cbegin(), bt.cend(), client_class.cbegin());
615 if (mis.first == bt.cend()) {
625 bool& depend_on_known,
630 if ((client_class ==
"KNOWN") || (client_class ==
"UNKNOWN")) {
631 depend_on_known =
true;
640 if (def->getDependOnKnown()) {
641 depend_on_known =
true;
A generic exception that is thrown if a parameter given to a method is considered invalid in that con...
This is a base class for exceptions thrown from the DNS library module.
virtual const char * what() const
Returns a C-style character string of the cause of the exception.
The IOAddress class represents an IP addresses (version agnostic)
std::string toText() const
Convert the address to a string.
static ElementPtr create(const Position &pos=ZERO_POSITION())
static ElementPtr createMap(const Position &pos=ZERO_POSITION())
Creates an empty MapElement type ElementPtr.
static ElementPtr createList(const Position &pos=ZERO_POSITION())
Creates an empty ListElement type ElementPtr.
This class represents configuration element which is associated with database identifier,...
uint16_t getFamily() const
Returns address family.
static CfgMgr & instance()
returns a single instance of Configuration Manager
Represents option definitions used by the DHCP server.
Represents option data configuration for the DHCP server.
Embodies a single client class definition.
bool equals(const ClientClassDef &other) const
Compares two ClientClassDef objects for equality.
bool getRequired() const
Fetches the only if required flag.
void setCfgOption(const CfgOptionPtr &cfg_option)
Sets the class's option collection.
void setName(const std::string &name)
Sets the class's name.
bool dependOnClass(const std::string &name) const
Checks direct dependency.
bool getDependOnKnown() const
Fetches the depend on known flag aka use host flag.
void setRequired(bool required)
Sets the only if required flag.
virtual void test(PktPtr pkt, const ExpressionPtr &expr_ptr)
Test method which checks if the packet belongs to the class.
const CfgOptionDefPtr & getCfgOptionDef() const
Fetches the class's option definitions.
ClientClassDef(const std::string &name, const ExpressionPtr &match_expr, const CfgOptionPtr &options=CfgOptionPtr())
Constructor.
const ExpressionPtr & getMatchExpr() const
Fetches the class's match expression.
void setCfgOptionDef(const CfgOptionDefPtr &cfg_option_def)
Sets the class's option definition collection.
virtual ~ClientClassDef()
Destructor.
std::string getName() const
Fetches the class's name.
const CfgOptionPtr & getCfgOption() const
Fetches the class's option collection.
void setMatchExpr(const ExpressionPtr &match_expr)
Sets the class's match expression.
void setTest(const std::string &test)
Sets the class's original match expression.
virtual isc::data::ElementPtr toElement() const
Unparse a configuration object.
std::string getTest() const
Fetches the class's original match expression.
void setDependOnKnown(bool depend_on_known)
Sets the depend on known flag aka use host flag.
Maintains a list of ClientClassDef's.
ClientClassDefPtr findClass(const std::string &name) const
Fetches the class definition for a given class name.
bool equals(const ClientClassDictionary &other) const
Compares two ClientClassDictionary objects for equality.
void removeClass(const std::string &name)
Removes a given class definition from the dictionary.
bool empty() const
Checks if the class dictionary is empty.
bool dependOnClass(const std::string &name, std::string &dependent_class) const
Checks direct dependency.
ClientClassDictionary()
Constructor.
const ClientClassDefListPtr & getClasses() const
Fetches the dictionary's list of classes.
ClientClassDictionary & operator=(const ClientClassDictionary &rhs)
Copy assignment operator.
~ClientClassDictionary()
Destructor.
void createOptions(const CfgOptionDefPtr &cfg_option_def)
Iterates over the classes in the dictionary and recreates the options.
void addClass(const std::string &name, const ExpressionPtr &match_expr, const std::string &test, bool required, bool depend_on_known, const CfgOptionPtr &options, CfgOptionDefPtr defs=CfgOptionDefPtr(), isc::data::ConstElementPtr user_context=isc::data::ConstElementPtr(), asiolink::IOAddress next_server=asiolink::IOAddress("0.0.0.0"), const std::string &sname=std::string(), const std::string &filename=std::string(), const util::Triplet< uint32_t > &valid=util::Triplet< uint32_t >(), const util::Triplet< uint32_t > &preferred=util::Triplet< uint32_t >(), bool is_template=false, const util::Optional< uint32_t > &offer_lft=util::Optional< uint32_t >())
Adds a new class to the list.
virtual isc::data::ElementPtr toElement() const
Unparse a configuration object.
void initMatchExpr(uint16_t family)
Iterates over the classes in the dictionary and ensures that that match expressions are initialized.
Error that occurs when an attempt is made to add a duplicate class to a class dictionary.
Parser for a logical expression.
void parse(ExpressionPtr &expression, isc::data::ConstElementPtr expression_cfg, uint16_t family, isc::eval::EvalContext::CheckDefined check_defined=isc::eval::EvalContext::acceptAll, isc::eval::EvalContext::ParserType parser_type=isc::eval::EvalContext::PARSER_BOOL)
Parses an expression configuration element into an Expression.
static const std::string SPAWN_CLASS_PREFIX
This is a prefix added to the spawned class name.
TemplateClientClassDef(const std::string &name, const ExpressionPtr &match_expr, const CfgOptionPtr &options=CfgOptionPtr())
Constructor.
virtual void test(PktPtr pkt, const ExpressionPtr &expr_ptr) override
Test method which checks if the packet belongs to the class.
virtual isc::data::ElementPtr toElement() const override
Unparse a configuration object.
ParserType
Specifies what type of expression the parser is expected to see.
@ PARSER_BOOL
expression is expected to evaluate to bool
@ PARSER_STRING
expression is expected to evaluate to string
static bool acceptAll(const ClientClass &client_class)
Accept all client class names.
A template representing an optional value.
T get() const
Retrieves the encapsulated value.
void unspecified(bool unspecified)
Modifies the flag that indicates whether the value is specified or unspecified.
This template specifies a parameter value.
T get(T hint) const
Returns value with a hint.
T getMax() const
Returns a maximum allowed value.
T getMin() const
Returns a minimum allowed value.
Defines classes for storing client class definitions.
Parsers for client class definitions.
#define isc_throw(type, stream)
A shortcut macro to insert known values into exception arguments.
#define LOG_ERROR(LOGGER, MESSAGE)
Macro to conveniently test error output and log it.
#define LOG_INFO(LOGGER, MESSAGE)
Macro to conveniently test info output and log it.
#define LOG_DEBUG(LOGGER, LEVEL, MESSAGE)
Macro to conveniently test debug output and log it.
A wrapper interface for the ASIO library.
std::ostream & operator<<(std::ostream &os, const IOAddress &address)
Insert the IOAddress as a string into stream.
ElementPtr copy(ConstElementPtr from, int level)
Copy the data up to a nesting level.
boost::shared_ptr< const Element > ConstElementPtr
boost::shared_ptr< Element > ElementPtr
isc::log::Logger dhcpsrv_logger("dhcpsrv")
DHCP server library Logger.
boost::shared_ptr< isc::dhcp::Pkt > PktPtr
A pointer to either Pkt4 or Pkt6 packet.
std::string ClientClass
Defines a single class name.
std::vector< ClientClassDefPtr > ClientClassDefList
Defines a list of ClientClassDefPtr's, using insert order.
boost::shared_ptr< CfgOption > CfgOptionPtr
Non-const pointer.
const isc::log::MessageID EVAL_RESULT
boost::shared_ptr< CfgOptionDef > CfgOptionDefPtr
Non-const pointer.
boost::shared_ptr< ClientClassDef > ClientClassDefPtr
a pointer to an ClientClassDef
std::string evaluateString(const Expression &expr, Pkt &pkt)
std::list< std::string > builtinPrefixes
The prefixes used to check if a class is BuiltIn class.
const int DHCPSRV_DBG_TRACE_DETAIL
Additional information.
boost::shared_ptr< Expression > ExpressionPtr
boost::shared_ptr< ClientClassDictionary > ClientClassDictionaryPtr
Defines a pointer to a ClientClassDictionary.
boost::shared_ptr< ClientClassDefList > ClientClassDefListPtr
Defines a pointer to a ClientClassDefList.
bool evaluateBool(const Expression &expr, Pkt &pkt)
Evaluate a RPN expression for a v4 or v6 packet and return a true or false decision.
bool isClientClassDefined(ClientClassDictionaryPtr &class_dictionary, bool &depend_on_known, const ClientClass &client_class)
Check if a client class name is already defined, i.e.
std::vector< TokenPtr > Expression
This is a structure that holds an expression converted to RPN.
bool isClientClassBuiltIn(const ClientClass &client_class)
Check if a client class name is builtin.
bool dependOnClass(const TokenPtr &token, const std::string &name)
Checks dependency on a token.
std::list< std::string > builtinNames
List of classes for which test expressions cannot be defined.
std::unordered_map< std::string, ClientClassDefPtr > ClientClassDefMap
Defines a map of ClientClassDef's, keyed by the class name.
Defines the logger used by the top-level component of kea-lfc.
Abstract class for configuration Cfg_* classes.
Base class for user context.
void contextToElement(data::ElementPtr map) const
Merge unparse a user_context object.