12 #include <boost/foreach.hpp>
21 ClientClassDef::ClientClassDef(
const std::string& name,
24 :
name_(name), match_expr_(match_expr), required_(false),
25 depend_on_known_(false), cfg_option_(cfg_option),
44 depend_on_known_(false), cfg_option_(new
CfgOption()),
47 if (rhs.match_expr_) {
49 *match_expr_ = *(rhs.match_expr_);
52 if (rhs.cfg_option_def_) {
53 rhs.cfg_option_def_->copyTo(*cfg_option_def_);
56 if (rhs.cfg_option_) {
57 rhs.cfg_option_->copyTo(*cfg_option_);
60 required_ = rhs.required_;
61 depend_on_known_ = rhs.depend_on_known_;
62 next_server_ = rhs.next_server_;
64 filename_ = rhs.filename_;
87 match_expr_ = match_expr;
107 required_ = required;
112 return (depend_on_known_);
117 depend_on_known_ = depend_on_known;
122 return (cfg_option_def_);
127 cfg_option_def_ = cfg_option_def;
132 return (cfg_option_);
137 cfg_option_ = cfg_option;
147 return ((name_ == other.name_) &&
148 ((!match_expr_ && !other.match_expr_) ||
149 (match_expr_ && other.match_expr_ &&
150 (*match_expr_ == *(other.match_expr_)))) &&
151 ((!cfg_option_ && !other.cfg_option_) ||
152 (cfg_option_ && other.cfg_option_ &&
153 (*cfg_option_ == *other.cfg_option_))) &&
154 ((!cfg_option_def_ && !other.cfg_option_def_) ||
155 (cfg_option_def_ && other.cfg_option_def_ &&
156 (*cfg_option_def_ == *other.cfg_option_def_))) &&
157 (required_ == other.required_) &&
158 (depend_on_known_ == other.depend_on_known_) &&
159 (next_server_ == other.next_server_) &&
160 (sname_ == other.sname_) &&
161 (filename_ == other.filename_));
171 result->set(
"name", Element::create(name_));
173 if (!test_.empty()) {
174 result->set(
"test", Element::create(test_));
178 result->set(
"only-if-required", Element::create(required_));
181 if (cfg_option_def_ && (family == AF_INET)) {
182 result->set(
"option-def", cfg_option_def_->toElement());
185 result->set(
"option-data", cfg_option_->toElement());
186 if (family != AF_INET) {
191 result->set(
"next-server", Element::create(next_server_.
toText()));
193 result->set(
"server-hostname", Element::create(sname_));
195 result->set(
"boot-file-name", Element::create(filename_));
199 result->set(
"valid-lifetime",
200 Element::create(static_cast<long long>(valid_.
get())));
203 result->set(
"min-valid-lifetime",
204 Element::create(static_cast<long long>(valid_.
getMin())));
208 result->set(
"max-valid-lifetime",
209 Element::create(static_cast<long long>(valid_.
getMax())));
217 os <<
"ClientClassDef:" << x.
getName();
241 const std::string& test,
243 bool depend_on_known,
248 const std::string& sname,
249 const std::string& filename,
252 cclass->setTest(test);
253 cclass->setRequired(required);
254 cclass->setDependOnKnown(depend_on_known);
255 cclass->setCfgOptionDef(cfg_option_def);
256 cclass->setContext(user_context),
257 cclass->setNextServer(next_server);
258 cclass->setSname(sname);
259 cclass->setFilename(filename);
260 cclass->setValid(valid);
268 " - class definition cannot be null");
273 << class_def->getName() <<
" has already been defined");
276 list_->push_back(class_def);
277 (*map_)[class_def->getName()] = class_def;
282 ClientClassDefMap::iterator it = map_->find(name);
283 if (it != map_->end()) {
292 for (ClientClassDefList::iterator this_class = list_->begin();
293 this_class != list_->end(); ++this_class) {
294 if ((*this_class)->getName() == name) {
295 list_->erase(this_class);
309 std::string& dependent_class)
const {
312 for (ClientClassDefList::iterator this_class = list_->begin();
313 this_class != list_->end(); ++this_class) {
315 if ((*this_class)->dependOnClass(name)) {
316 dependent_class = (*this_class)->getName();
320 if ((*this_class)->getName() == name) {
330 if (list_->size() != other.list_->size()) {
334 ClientClassDefList::const_iterator this_class = list_->cbegin();
335 ClientClassDefList::const_iterator other_class = other.list_->cbegin();
336 while (this_class != list_->cend() &&
337 other_class != other.list_->cend()) {
338 if (!*this_class || !*other_class ||
339 **this_class != **other_class) {
354 for (ClientClassDefList::const_iterator this_class = list_->begin();
355 this_class != list_->cend(); ++this_class) {
356 result->add((*this_class)->toElement());
361 std::list<std::string>
367 "ALL",
"KNOWN",
"UNKNOWN",
"BOOTP"
370 std::list<std::string>
372 "VENDOR_CLASS_",
"HA_",
"AFTER_",
"EXTERNAL_"
377 for (std::list<std::string>::const_iterator bn =
builtinNames.cbegin();
379 if (client_class == *bn) {
384 for (std::list<std::string>::const_iterator bt =
builtinPrefixes.cbegin();
386 if (client_class.size() <= bt->size()) {
389 auto mis = std::mismatch(bt->cbegin(), bt->cend(), client_class.cbegin());
390 if (mis.first == bt->cend()) {
400 bool& depend_on_known,
405 if ((client_class ==
"KNOWN") || (client_class ==
"UNKNOWN")) {
406 depend_on_known =
true;
415 if (def->getDependOnKnown()) {
416 depend_on_known =
true;
void setMatchExpr(const ExpressionPtr &match_expr)
Sets the class's match expression.
~ClientClassDictionary()
Destructor.
const ExpressionPtr & getMatchExpr() const
Fetches the class's match expression.
ClientClassDefPtr findClass(const std::string &name) const
Fetches the class definition for a given class name.
void unspecified(bool unspecified)
Modifies the flag that indicates whether the value is specified or unspecified.
boost::shared_ptr< CfgOption > CfgOptionPtr
Non-const pointer.
void setDependOnKnown(bool depend_on_known)
Sets the depend on known flag aka use host flag.
virtual isc::data::ElementPtr toElement() const
Unparse a configuration object.
void setRequired(bool required)
Sets the only if required flag.
static CfgMgr & instance()
returns a single instance of Configuration Manager
std::string getTest() const
Fetches the class's original match expression.
std::unordered_map< std::string, ClientClassDefPtr > ClientClassDefMap
Defines a map of ClientClassDef's, keyed by the class name.
boost::shared_ptr< Element > ElementPtr
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 >())
Adds a new class to the list.
bool equals(const ClientClassDictionary &other) const
Compares two ClientClassDictionary objects for equality.
bool getDependOnKnown() const
Fetches the depend on known flag aka use host flag.
const CfgOptionDefPtr & getCfgOptionDef() const
Fetches the class's option definitions.
boost::shared_ptr< CfgOptionDef > CfgOptionDefPtr
Non-const pointer.
bool equals(const ClientClassDef &other) const
Compares two ClientClassDef objects for equality.
void setTest(const std::string &test)
Sets the class's original match expression.
void contextToElement(data::ElementPtr map) const
Merge unparse a user_context object.
Maintains a list of ClientClassDef's.
bool getRequired() const
Fetches the only if required flag.
ClientClassDictionary()
Constructor.
bool isClientClassDefined(ClientClassDictionaryPtr &class_dictionary, bool &depend_on_known, const ClientClass &client_class)
Check if a client class name is already defined, i.e.
#define isc_throw(type, stream)
A shortcut macro to insert known values into exception arguments.
A generic exception that is thrown if a parameter given to a method is considered invalid in that con...
Represents option data configuration for the DHCP server.
ElementPtr copy(ConstElementPtr from, int level)
Copy the data up to a nesting level.
T getMax() const
Returns a maximum allowed value.
Error that occurs when an attempt is made to add a duplicate class to a class dictionary.
const CfgOptionPtr & getCfgOption() const
Fetches the class's option collection.
boost::shared_ptr< ClientClassDictionary > ClientClassDictionaryPtr
Defines a pointer to a ClientClassDictionary.
Embodies a single client class definition.
uint16_t getFamily() const
Returns address family.
boost::shared_ptr< const Element > ConstElementPtr
bool dependOnClass(const std::string &name, std::string &dependent_class) const
Checks direct dependency.
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::list< std::string > builtinPrefixes
List of built-in client class prefixes i.e.
boost::shared_ptr< ClientClassDef > ClientClassDefPtr
a pointer to an ClientClassDef
std::vector< ClientClassDefPtr > ClientClassDefList
Defines a list of ClientClassDefPtr's, using insert order.
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.
T get(T hint) const
Returns value with a hint.
virtual ~ClientClassDef()
Destructor.
T getMin() const
Returns a minimum allowed value.
boost::shared_ptr< ClientClassDefList > ClientClassDefListPtr
Defines a pointer to a ClientClassDefList.
A wrapper interface for the ASIO library.
void removeClass(const std::string &name)
Removes a given class definition from the dictionary.
std::ostream & operator<<(std::ostream &os, const OpaqueDataTuple &tuple)
Inserts the OpaqueDataTuple as a string into stream.
std::string toText() const
Convert the address to a string.
const ClientClassDefListPtr & getClasses() const
Fetches the dictionary's list of classes.
bool dependOnClass(const std::string &name) const
Checks direct dependency.
virtual isc::data::ElementPtr toElement() const
Unparse a configuration object.
void setName(const std::string &name)
Sets the class's name.
void setCfgOption(const CfgOptionPtr &cfg_option)
Sets the class's option collection.
std::string getName() const
Fetches the class's name.
ClientClassDef(const std::string &name, const ExpressionPtr &match_expr, const CfgOptionPtr &options=CfgOptionPtr())
Constructor.
bool isClientClassBuiltIn(const ClientClass &client_class)
Check if a client class name is builtin.
std::string ClientClass
Defines a single class name.
The IOAddress class represents an IP addresses (version agnostic)
Defines classes for storing client class definitions.
boost::shared_ptr< Expression > ExpressionPtr
void setCfgOptionDef(const CfgOptionDefPtr &cfg_option_def)
Sets the class's option definition collection.