12#include <boost/foreach.hpp>
25 match_expr_(match_expr), required_(false), depend_on_known_(false),
27 valid_(), preferred_() {
44 match_expr_(
ExpressionPtr()), test_(rhs.test_), required_(rhs.required_),
45 depend_on_known_(rhs.depend_on_known_), cfg_option_(new
CfgOption()),
46 next_server_(rhs.next_server_), sname_(rhs.sname_),
47 filename_(rhs.filename_), valid_(rhs.valid_), preferred_(rhs.preferred_) {
49 if (rhs.match_expr_) {
51 *match_expr_ = *(rhs.match_expr_);
54 if (rhs.cfg_option_def_) {
56 rhs.cfg_option_def_->copyTo(*cfg_option_def_);
59 if (rhs.cfg_option_) {
60 rhs.cfg_option_->copyTo(*cfg_option_);
84 match_expr_ = match_expr;
104 required_ = required;
109 return (depend_on_known_);
114 depend_on_known_ = depend_on_known;
119 return (cfg_option_def_);
124 cfg_option_def_ = cfg_option_def;
129 return (cfg_option_);
134 cfg_option_ = cfg_option;
144 return ((name_ == other.name_) &&
145 ((!match_expr_ && !other.match_expr_) ||
146 (match_expr_ && other.match_expr_ &&
147 (*match_expr_ == *(other.match_expr_)))) &&
148 ((!cfg_option_ && !other.cfg_option_) ||
149 (cfg_option_ && other.cfg_option_ &&
150 (*cfg_option_ == *other.cfg_option_))) &&
151 ((!cfg_option_def_ && !other.cfg_option_def_) ||
152 (cfg_option_def_ && other.cfg_option_def_ &&
153 (*cfg_option_def_ == *other.cfg_option_def_))) &&
154 (required_ == other.required_) &&
155 (depend_on_known_ == other.depend_on_known_) &&
156 (next_server_ == other.next_server_) &&
157 (sname_ == other.sname_) &&
158 (filename_ == other.filename_));
168 result->set(
"name", Element::create(name_));
170 if (!test_.empty()) {
171 result->set(
"test", Element::create(test_));
175 result->set(
"only-if-required", Element::create(required_));
178 if (cfg_option_def_ && (family == AF_INET)) {
179 result->set(
"option-def", cfg_option_def_->toElement());
182 result->set(
"option-data", cfg_option_->toElement());
184 if (family == AF_INET) {
187 result->set(
"next-server", Element::create(next_server_.
toText()));
189 result->set(
"server-hostname", Element::create(sname_));
191 result->set(
"boot-file-name", Element::create(filename_));
195 if (!preferred_.unspecified()) {
196 result->set(
"preferred-lifetime",
197 Element::create(
static_cast<long long>(preferred_.get())));
200 if (preferred_.getMin() < preferred_.get()) {
201 result->set(
"min-preferred-lifetime",
202 Element::create(
static_cast<long long>(preferred_.getMin())));
205 if (preferred_.getMax() > preferred_.get()) {
206 result->set(
"max-preferred-lifetime",
207 Element::create(
static_cast<long long>(preferred_.getMax())));
212 if (!valid_.unspecified()) {
213 result->set(
"valid-lifetime",
214 Element::create(
static_cast<long long>(valid_.get())));
216 if (valid_.getMin() < valid_.get()) {
217 result->set(
"min-valid-lifetime",
218 Element::create(
static_cast<long long>(valid_.getMin())));
221 if (valid_.getMax() > valid_.get()) {
222 result->set(
"max-valid-lifetime",
223 Element::create(
static_cast<long long>(valid_.getMax())));
231 os <<
"ClientClassDef:" << x.
getName();
255 const std::string& test,
257 bool depend_on_known,
262 const std::string& sname,
263 const std::string& filename,
267 cclass->setTest(test);
268 cclass->setRequired(required);
269 cclass->setDependOnKnown(depend_on_known);
270 cclass->setCfgOptionDef(cfg_option_def);
271 cclass->setContext(user_context),
272 cclass->setNextServer(next_server);
273 cclass->setSname(sname);
274 cclass->setFilename(filename);
275 cclass->setValid(valid);
276 cclass->setPreferred(preferred);
284 " - class definition cannot be null");
289 << class_def->getName() <<
" has already been defined");
292 list_->push_back(class_def);
293 (*map_)[class_def->getName()] = class_def;
298 ClientClassDefMap::iterator it = map_->find(name);
299 if (it != map_->end()) {
308 for (ClientClassDefList::iterator this_class = list_->begin();
309 this_class != list_->end(); ++this_class) {
310 if ((*this_class)->getName() == name) {
311 list_->erase(this_class);
324 for (ClientClassDefList::iterator this_class = list_->begin();
325 this_class != list_->end(); ++this_class) {
326 if ((*this_class)->getId() ==
id) {
327 map_->erase((*this_class)->getName());
328 list_->erase(this_class);
341 return (list_->empty());
346 std::string& dependent_class)
const {
349 for (ClientClassDefList::iterator this_class = list_->begin();
350 this_class != list_->end(); ++this_class) {
352 if ((*this_class)->dependOnClass(name)) {
353 dependent_class = (*this_class)->getName();
357 if ((*this_class)->getName() == name) {
367 if (list_->size() != other.list_->size()) {
371 ClientClassDefList::const_iterator this_class = list_->cbegin();
372 ClientClassDefList::const_iterator other_class = other.list_->cbegin();
373 while (this_class != list_->cend() &&
374 other_class != other.list_->cend()) {
375 if (!*this_class || !*other_class ||
376 **this_class != **other_class) {
391 for (ClientClassDefList::const_iterator this_class = list_->begin();
392 this_class != list_->cend(); ++this_class) {
393 result->add((*this_class)->toElement());
403 for (
auto cclass : *(rhs.list_)) {
411std::list<std::string>
417 "ALL",
"KNOWN",
"UNKNOWN",
"BOOTP"
420std::list<std::string>
422 "VENDOR_CLASS_",
"HA_",
"AFTER_",
"EXTERNAL_"
427 for (std::list<std::string>::const_iterator bn =
builtinNames.cbegin();
429 if (client_class == *bn) {
434 for (std::list<std::string>::const_iterator bt =
builtinPrefixes.cbegin();
436 if (client_class.size() <= bt->size()) {
439 auto mis = std::mismatch(bt->cbegin(), bt->cend(), client_class.cbegin());
440 if (mis.first == bt->cend()) {
450 bool& depend_on_known,
455 if ((client_class ==
"KNOWN") || (client_class ==
"UNKNOWN")) {
456 depend_on_known =
true;
465 if (def->getDependOnKnown()) {
466 depend_on_known =
true;
A generic exception that is thrown if a parameter given to a method is considered invalid in that con...
The IOAddress class represents an IP addresses (version agnostic)
std::string toText() const
Convert the address to a string.
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.
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 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 Triplet< uint32_t > &valid=Triplet< uint32_t >(), const Triplet< uint32_t > &preferred=Triplet< uint32_t >())
Adds a new class to the list.
virtual isc::data::ElementPtr toElement() const
Unparse a configuration object.
Error that occurs when an attempt is made to add a duplicate class to a class dictionary.
This template specifies a parameter value.
Defines classes for storing client class definitions.
#define isc_throw(type, stream)
A shortcut macro to insert known values into exception arguments.
A wrapper interface for the ASIO library.
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
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.
boost::shared_ptr< CfgOptionDef > CfgOptionDefPtr
Non-const pointer.
boost::shared_ptr< ClientClassDef > ClientClassDefPtr
a pointer to an ClientClassDef
std::list< std::string > builtinPrefixes
List of built-in client class prefixes i.e.
std::ostream & operator<<(std::ostream &os, const OpaqueDataTuple &tuple)
Inserts the OpaqueDataTuple as a string into stream.
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 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 built-in client class names.
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.