mirror of https://github.com/Icinga/icinga2.git
Allow using more than one %validator rule for the same type
fixes #8829
This commit is contained in:
parent
ae204092cc
commit
e8cee8d5e2
|
@ -372,9 +372,9 @@ type: T_TYPE identifier
|
|||
context->m_Type->GetRuleList()->AddRules(ruleList);
|
||||
context->m_Type->GetRuleList()->AddRequires(ruleList);
|
||||
|
||||
String validator = ruleList->GetValidator();
|
||||
if (!validator.IsEmpty())
|
||||
context->m_Type->GetRuleList()->SetValidator(validator);
|
||||
BOOST_FOREACH(const String& validator, ruleList->GetValidators()) {
|
||||
context->m_Type->GetRuleList()->AddValidator(validator);
|
||||
}
|
||||
}
|
||||
;
|
||||
|
||||
|
@ -407,7 +407,7 @@ typerule: T_REQUIRE T_STRING
|
|||
}
|
||||
| T_VALIDATOR T_STRING
|
||||
{
|
||||
context->m_RuleLists.top()->SetValidator($2);
|
||||
context->m_RuleLists.top()->AddValidator($2);
|
||||
free($2);
|
||||
}
|
||||
| T_ATTRIBUTE type T_STRING
|
||||
|
|
|
@ -169,9 +169,7 @@ void ConfigType::ValidateObject(const Object::Ptr& object,
|
|||
locations.pop_back();
|
||||
}
|
||||
|
||||
String validator = ruleList->GetValidator();
|
||||
|
||||
if (!validator.IsEmpty()) {
|
||||
BOOST_FOREACH(const String& validator, ruleList->GetValidators()) {
|
||||
Function::Ptr func = ScriptGlobal::Get(validator, &Empty);
|
||||
|
||||
if (!func)
|
||||
|
@ -226,9 +224,7 @@ void ConfigType::ValidateArray(const Array::Ptr& array,
|
|||
locations.pop_back();
|
||||
}
|
||||
|
||||
String validator = ruleList->GetValidator();
|
||||
|
||||
if (!validator.IsEmpty()) {
|
||||
BOOST_FOREACH(const String& validator, ruleList->GetValidators()) {
|
||||
Function::Ptr func = ScriptGlobal::Get(validator, &Empty);
|
||||
|
||||
if (!func)
|
||||
|
|
|
@ -1,140 +1,140 @@
|
|||
/******************************************************************************
|
||||
* Icinga 2 *
|
||||
* Copyright (C) 2012-2015 Icinga Development Team (http://www.icinga.org) *
|
||||
* *
|
||||
* This program is free software; you can redistribute it and/or *
|
||||
* modify it under the terms of the GNU General Public License *
|
||||
* as published by the Free Software Foundation; either version 2 *
|
||||
* of the License, or (at your option) any later version. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, *
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
||||
* GNU General Public License for more details. *
|
||||
* *
|
||||
* You should have received a copy of the GNU General Public License *
|
||||
* along with this program; if not, write to the Free Software Foundation *
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. *
|
||||
******************************************************************************/
|
||||
|
||||
#include "config/typerulelist.hpp"
|
||||
#include "config/typerule.hpp"
|
||||
#include <boost/foreach.hpp>
|
||||
|
||||
using namespace icinga;
|
||||
|
||||
/**
|
||||
* Sets the validator method for a rule list.
|
||||
*
|
||||
* @param validator The validator.
|
||||
*/
|
||||
void TypeRuleList::SetValidator(const String& validator)
|
||||
{
|
||||
m_Validator = validator;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves the validator method.
|
||||
*
|
||||
* @returns The validator method.
|
||||
*/
|
||||
String TypeRuleList::GetValidator(void) const
|
||||
{
|
||||
return m_Validator;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds an attribute to the list of required attributes.
|
||||
*
|
||||
* @param attr The new required attribute.
|
||||
*/
|
||||
void TypeRuleList::AddRequire(const String& attr)
|
||||
{
|
||||
m_Requires.push_back(attr);
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves the list of required attributes.
|
||||
*
|
||||
* @returns The list of required attributes.
|
||||
*/
|
||||
std::vector<String> TypeRuleList::GetRequires(void) const
|
||||
{
|
||||
return m_Requires;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds all requires from the specified rule list.
|
||||
*
|
||||
* @param ruleList The rule list to copy requires from.
|
||||
*/
|
||||
void TypeRuleList::AddRequires(const TypeRuleList::Ptr& ruleList)
|
||||
{
|
||||
BOOST_FOREACH(const String& require, ruleList->m_Requires) {
|
||||
AddRequire(require);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds a rule to a rule list.
|
||||
*
|
||||
* @param rule The rule that should be added.
|
||||
*/
|
||||
void TypeRuleList::AddRule(const TypeRule& rule)
|
||||
{
|
||||
m_Rules.push_back(rule);
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds all rules from the specified rule list.
|
||||
*
|
||||
* @param ruleList The rule list to copy rules from.
|
||||
*/
|
||||
void TypeRuleList::AddRules(const TypeRuleList::Ptr& ruleList)
|
||||
{
|
||||
BOOST_FOREACH(const TypeRule& rule, ruleList->m_Rules) {
|
||||
AddRule(rule);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the number of rules currently contained in the list.
|
||||
*
|
||||
* @returns The length of the list.
|
||||
*/
|
||||
size_t TypeRuleList::GetLength(void) const
|
||||
{
|
||||
return m_Rules.size();
|
||||
}
|
||||
|
||||
/**
|
||||
* Validates a field.
|
||||
*
|
||||
* @param name The name of the attribute.
|
||||
* @param value The value of the attribute.
|
||||
* @param[out] subRules The list of sub-rules for the matching rule.
|
||||
* @param[out] hint A hint describing the validation failure.
|
||||
* @returns The validation result.
|
||||
*/
|
||||
TypeValidationResult TypeRuleList::ValidateAttribute(const String& name,
|
||||
const Value& value, TypeRuleList::Ptr *subRules, String *hint,
|
||||
const TypeRuleUtilities *utils) const
|
||||
{
|
||||
bool foundField = false;
|
||||
BOOST_FOREACH(const TypeRule& rule, m_Rules) {
|
||||
if (!rule.MatchName(name))
|
||||
continue;
|
||||
|
||||
foundField = true;
|
||||
|
||||
if (rule.MatchValue(value, hint, utils)) {
|
||||
*subRules = rule.GetSubRules();
|
||||
return ValidationOK;
|
||||
}
|
||||
}
|
||||
|
||||
if (foundField)
|
||||
return ValidationInvalidType;
|
||||
else
|
||||
return ValidationUnknownField;
|
||||
}
|
||||
/******************************************************************************
|
||||
* Icinga 2 *
|
||||
* Copyright (C) 2012-2015 Icinga Development Team (http://www.icinga.org) *
|
||||
* *
|
||||
* This program is free software; you can redistribute it and/or *
|
||||
* modify it under the terms of the GNU General Public License *
|
||||
* as published by the Free Software Foundation; either version 2 *
|
||||
* of the License, or (at your option) any later version. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, *
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
||||
* GNU General Public License for more details. *
|
||||
* *
|
||||
* You should have received a copy of the GNU General Public License *
|
||||
* along with this program; if not, write to the Free Software Foundation *
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. *
|
||||
******************************************************************************/
|
||||
|
||||
#include "config/typerulelist.hpp"
|
||||
#include "config/typerule.hpp"
|
||||
#include <boost/foreach.hpp>
|
||||
|
||||
using namespace icinga;
|
||||
|
||||
/**
|
||||
* Adds a validator method for a rule list.
|
||||
*
|
||||
* @param validator The validator.
|
||||
*/
|
||||
void TypeRuleList::AddValidator(const String& validator)
|
||||
{
|
||||
m_Validators.push_back(validator);
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves the validator methods.
|
||||
*
|
||||
* @returns The validator methods.
|
||||
*/
|
||||
std::vector<String> TypeRuleList::GetValidators(void) const
|
||||
{
|
||||
return m_Validators;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds an attribute to the list of required attributes.
|
||||
*
|
||||
* @param attr The new required attribute.
|
||||
*/
|
||||
void TypeRuleList::AddRequire(const String& attr)
|
||||
{
|
||||
m_Requires.push_back(attr);
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves the list of required attributes.
|
||||
*
|
||||
* @returns The list of required attributes.
|
||||
*/
|
||||
std::vector<String> TypeRuleList::GetRequires(void) const
|
||||
{
|
||||
return m_Requires;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds all requires from the specified rule list.
|
||||
*
|
||||
* @param ruleList The rule list to copy requires from.
|
||||
*/
|
||||
void TypeRuleList::AddRequires(const TypeRuleList::Ptr& ruleList)
|
||||
{
|
||||
BOOST_FOREACH(const String& require, ruleList->m_Requires) {
|
||||
AddRequire(require);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds a rule to a rule list.
|
||||
*
|
||||
* @param rule The rule that should be added.
|
||||
*/
|
||||
void TypeRuleList::AddRule(const TypeRule& rule)
|
||||
{
|
||||
m_Rules.push_back(rule);
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds all rules from the specified rule list.
|
||||
*
|
||||
* @param ruleList The rule list to copy rules from.
|
||||
*/
|
||||
void TypeRuleList::AddRules(const TypeRuleList::Ptr& ruleList)
|
||||
{
|
||||
BOOST_FOREACH(const TypeRule& rule, ruleList->m_Rules) {
|
||||
AddRule(rule);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the number of rules currently contained in the list.
|
||||
*
|
||||
* @returns The length of the list.
|
||||
*/
|
||||
size_t TypeRuleList::GetLength(void) const
|
||||
{
|
||||
return m_Rules.size();
|
||||
}
|
||||
|
||||
/**
|
||||
* Validates a field.
|
||||
*
|
||||
* @param name The name of the attribute.
|
||||
* @param value The value of the attribute.
|
||||
* @param[out] subRules The list of sub-rules for the matching rule.
|
||||
* @param[out] hint A hint describing the validation failure.
|
||||
* @returns The validation result.
|
||||
*/
|
||||
TypeValidationResult TypeRuleList::ValidateAttribute(const String& name,
|
||||
const Value& value, TypeRuleList::Ptr *subRules, String *hint,
|
||||
const TypeRuleUtilities *utils) const
|
||||
{
|
||||
bool foundField = false;
|
||||
BOOST_FOREACH(const TypeRule& rule, m_Rules) {
|
||||
if (!rule.MatchName(name))
|
||||
continue;
|
||||
|
||||
foundField = true;
|
||||
|
||||
if (rule.MatchValue(value, hint, utils)) {
|
||||
*subRules = rule.GetSubRules();
|
||||
return ValidationOK;
|
||||
}
|
||||
}
|
||||
|
||||
if (foundField)
|
||||
return ValidationInvalidType;
|
||||
else
|
||||
return ValidationUnknownField;
|
||||
}
|
||||
|
|
|
@ -1,76 +1,76 @@
|
|||
/******************************************************************************
|
||||
* Icinga 2 *
|
||||
* Copyright (C) 2012-2015 Icinga Development Team (http://www.icinga.org) *
|
||||
* *
|
||||
* This program is free software; you can redistribute it and/or *
|
||||
* modify it under the terms of the GNU General Public License *
|
||||
* as published by the Free Software Foundation; either version 2 *
|
||||
* of the License, or (at your option) any later version. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, *
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
||||
* GNU General Public License for more details. *
|
||||
* *
|
||||
* You should have received a copy of the GNU General Public License *
|
||||
* along with this program; if not, write to the Free Software Foundation *
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. *
|
||||
******************************************************************************/
|
||||
|
||||
#ifndef TYPERULELIST_H
|
||||
#define TYPERULELIST_H
|
||||
|
||||
#include "config/i2-config.hpp"
|
||||
#include "base/value.hpp"
|
||||
#include <vector>
|
||||
|
||||
namespace icinga
|
||||
{
|
||||
|
||||
struct TypeRule;
|
||||
class TypeRuleUtilities;
|
||||
|
||||
/**
|
||||
* @ingroup config
|
||||
*/
|
||||
enum TypeValidationResult
|
||||
{
|
||||
ValidationOK,
|
||||
ValidationInvalidType,
|
||||
ValidationUnknownField
|
||||
};
|
||||
|
||||
/**
|
||||
* A list of configuration type rules.
|
||||
*
|
||||
* @ingroup config
|
||||
*/
|
||||
class I2_CONFIG_API TypeRuleList : public Object
|
||||
{
|
||||
public:
|
||||
DECLARE_PTR_TYPEDEFS(TypeRuleList);
|
||||
|
||||
void SetValidator(const String& validator);
|
||||
String GetValidator(void) const;
|
||||
|
||||
void AddRequire(const String& attr);
|
||||
void AddRequires(const TypeRuleList::Ptr& ruleList);
|
||||
std::vector<String> GetRequires(void) const;
|
||||
|
||||
void AddRule(const TypeRule& rule);
|
||||
void AddRules(const TypeRuleList::Ptr& ruleList);
|
||||
|
||||
TypeValidationResult ValidateAttribute(const String& name, const Value& value,
|
||||
TypeRuleList::Ptr *subRules, String *hint, const TypeRuleUtilities *utils) const;
|
||||
|
||||
size_t GetLength(void) const;
|
||||
|
||||
private:
|
||||
String m_Validator;
|
||||
std::vector<String> m_Requires;
|
||||
std::vector<TypeRule> m_Rules;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif /* TYPERULELIST_H */
|
||||
/******************************************************************************
|
||||
* Icinga 2 *
|
||||
* Copyright (C) 2012-2015 Icinga Development Team (http://www.icinga.org) *
|
||||
* *
|
||||
* This program is free software; you can redistribute it and/or *
|
||||
* modify it under the terms of the GNU General Public License *
|
||||
* as published by the Free Software Foundation; either version 2 *
|
||||
* of the License, or (at your option) any later version. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, *
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
||||
* GNU General Public License for more details. *
|
||||
* *
|
||||
* You should have received a copy of the GNU General Public License *
|
||||
* along with this program; if not, write to the Free Software Foundation *
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. *
|
||||
******************************************************************************/
|
||||
|
||||
#ifndef TYPERULELIST_H
|
||||
#define TYPERULELIST_H
|
||||
|
||||
#include "config/i2-config.hpp"
|
||||
#include "base/value.hpp"
|
||||
#include <vector>
|
||||
|
||||
namespace icinga
|
||||
{
|
||||
|
||||
struct TypeRule;
|
||||
class TypeRuleUtilities;
|
||||
|
||||
/**
|
||||
* @ingroup config
|
||||
*/
|
||||
enum TypeValidationResult
|
||||
{
|
||||
ValidationOK,
|
||||
ValidationInvalidType,
|
||||
ValidationUnknownField
|
||||
};
|
||||
|
||||
/**
|
||||
* A list of configuration type rules.
|
||||
*
|
||||
* @ingroup config
|
||||
*/
|
||||
class I2_CONFIG_API TypeRuleList : public Object
|
||||
{
|
||||
public:
|
||||
DECLARE_PTR_TYPEDEFS(TypeRuleList);
|
||||
|
||||
void AddValidator(const String& validator);
|
||||
std::vector<String> GetValidators(void) const;
|
||||
|
||||
void AddRequire(const String& attr);
|
||||
void AddRequires(const TypeRuleList::Ptr& ruleList);
|
||||
std::vector<String> GetRequires(void) const;
|
||||
|
||||
void AddRule(const TypeRule& rule);
|
||||
void AddRules(const TypeRuleList::Ptr& ruleList);
|
||||
|
||||
TypeValidationResult ValidateAttribute(const String& name, const Value& value,
|
||||
TypeRuleList::Ptr *subRules, String *hint, const TypeRuleUtilities *utils) const;
|
||||
|
||||
size_t GetLength(void) const;
|
||||
|
||||
private:
|
||||
std::vector<String> m_Validators;
|
||||
std::vector<String> m_Requires;
|
||||
std::vector<TypeRule> m_Rules;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif /* TYPERULELIST_H */
|
||||
|
|
|
@ -82,7 +82,7 @@ void Command::ValidateArguments(const String& location, const Command::Ptr& obje
|
|||
|
||||
String argstr = argval;
|
||||
|
||||
if(!MacroProcessor::ValidateMacroString(argstr)) {
|
||||
if (!MacroProcessor::ValidateMacroString(argstr)) {
|
||||
BOOST_THROW_EXCEPTION(ScriptError("Validation failed for " +
|
||||
location + ": Closing $ not found in macro format string '" + argstr + "'.", object->GetDebugInfo()));
|
||||
}
|
||||
|
@ -103,7 +103,7 @@ void Command::ValidateEnvironmentVariables(const String& location, const Command
|
|||
if (!envval.IsString() || envval.IsEmpty())
|
||||
continue;
|
||||
|
||||
if(!MacroProcessor::ValidateMacroString(envval)) {
|
||||
if (!MacroProcessor::ValidateMacroString(envval)) {
|
||||
BOOST_THROW_EXCEPTION(ScriptError("Validation failed for " +
|
||||
location + ": Closing $ not found in macro format string '" + envval + "'.", object->GetDebugInfo()));
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue