From 13917e07b0cdfc9a1e436f05aaa910ab6d78e540 Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Tue, 27 Jan 2015 10:55:14 +0100 Subject: [PATCH] Implement validator support for function objects fixes #8291 --- lib/config/config_lexer.ll | 1 + lib/config/config_parser.yy | 2 + lib/config/typerule.cpp | 3 + lib/config/typerule.hpp | 169 ++++++++++++++++++------------------ lib/icinga/icinga-type.conf | 4 +- 5 files changed, 93 insertions(+), 86 deletions(-) diff --git a/lib/config/config_lexer.ll b/lib/config/config_lexer.ll index bfa7a9851..169fd7dba 100644 --- a/lib/config/config_lexer.ll +++ b/lib/config/config_lexer.ll @@ -174,6 +174,7 @@ do { \ %string { yylval->type = TypeString; return T_TYPE_STRING; } %scalar { yylval->type = TypeScalar; return T_TYPE_SCALAR; } %any { yylval->type = TypeAny; return T_TYPE_ANY; } +%function { yylval->type = TypeFunction; return T_TYPE_FUNCTION; } %name { yylval->type = TypeName; return T_TYPE_NAME; } %validator { return T_VALIDATOR; } %require { return T_REQUIRE; } diff --git a/lib/config/config_parser.yy b/lib/config/config_parser.yy index 6c3b683a3..2c1b27b80 100644 --- a/lib/config/config_parser.yy +++ b/lib/config/config_parser.yy @@ -152,6 +152,7 @@ static void MakeRBinaryOp(Expression** result, Expression *left, Expression *rig %token T_TYPE_STRING "string (T_TYPE_STRING)" %token T_TYPE_SCALAR "scalar (T_TYPE_SCALAR)" %token T_TYPE_ANY "any (T_TYPE_ANY)" +%token T_TYPE_FUNCTION "function (T_TYPE_FUNCTION)" %token T_TYPE_NAME "name (T_TYPE_NAME)" %token T_VALIDATOR "%validator (T_VALIDATOR)" %token T_REQUIRE "%require (T_REQUIRE)" @@ -435,6 +436,7 @@ type: T_TYPE_DICTIONARY | T_TYPE_STRING | T_TYPE_SCALAR | T_TYPE_ANY + | T_TYPE_FUNCTION | T_TYPE_NAME ; diff --git a/lib/config/typerule.cpp b/lib/config/typerule.cpp index aeff328ee..513d666ac 100644 --- a/lib/config/typerule.cpp +++ b/lib/config/typerule.cpp @@ -73,6 +73,9 @@ bool TypeRule::MatchValue(const Value& value, String *hint, const TypeRuleUtilit case TypeArray: return value.IsObjectType(); + case TypeFunction: + return value.IsObjectType(); + case TypeName: if (!value.IsScalar()) return false; diff --git a/lib/config/typerule.hpp b/lib/config/typerule.hpp index 43a309c39..a4fe8faa2 100644 --- a/lib/config/typerule.hpp +++ b/lib/config/typerule.hpp @@ -1,84 +1,85 @@ -/****************************************************************************** - * 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 TYPERULE_H -#define TYPERULE_H - -#include "config/i2-config.hpp" -#include "config/typerulelist.hpp" -#include "base/debuginfo.hpp" - -namespace icinga -{ - -/** - * Utilities for type rules. - * - * @ingroup config - */ -class I2_CONFIG_API TypeRuleUtilities -{ -public: - virtual bool ValidateName(const String& type, const String& name, String *hint) const; -}; - -/** - * The allowed type for a type rule. - * - * @ingroup config - */ -enum TypeSpecifier -{ - TypeAny, - TypeScalar, - TypeNumber, - TypeString, - TypeDictionary, - TypeArray, - TypeName -}; - -/** - * A configuration type rule. - * - * @ingroup config - */ -struct I2_CONFIG_API TypeRule -{ -public: - TypeRule(TypeSpecifier type, const String& nameType, - const String& namePattern, const TypeRuleList::Ptr& subRules, - const DebugInfo& debuginfo); - - TypeRuleList::Ptr GetSubRules(void) const; - - bool MatchName(const String& name) const; - bool MatchValue(const Value& value, String *hint, const TypeRuleUtilities *utils) const; - -private: - TypeSpecifier m_Type; - String m_NameType; - String m_NamePattern; - TypeRuleList::Ptr m_SubRules; - DebugInfo m_DebugInfo; -}; - -} - -#endif /* TYPERULE_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 TYPERULE_H +#define TYPERULE_H + +#include "config/i2-config.hpp" +#include "config/typerulelist.hpp" +#include "base/debuginfo.hpp" + +namespace icinga +{ + +/** + * Utilities for type rules. + * + * @ingroup config + */ +class I2_CONFIG_API TypeRuleUtilities +{ +public: + virtual bool ValidateName(const String& type, const String& name, String *hint) const; +}; + +/** + * The allowed type for a type rule. + * + * @ingroup config + */ +enum TypeSpecifier +{ + TypeAny, + TypeScalar, + TypeNumber, + TypeString, + TypeDictionary, + TypeArray, + TypeFunction, + TypeName +}; + +/** + * A configuration type rule. + * + * @ingroup config + */ +struct I2_CONFIG_API TypeRule +{ +public: + TypeRule(TypeSpecifier type, const String& nameType, + const String& namePattern, const TypeRuleList::Ptr& subRules, + const DebugInfo& debuginfo); + + TypeRuleList::Ptr GetSubRules(void) const; + + bool MatchName(const String& name) const; + bool MatchValue(const Value& value, String *hint, const TypeRuleUtilities *utils) const; + +private: + TypeSpecifier m_Type; + String m_NameType; + String m_NamePattern; + TypeRuleList::Ptr m_SubRules; + DebugInfo m_DebugInfo; +}; + +} + +#endif /* TYPERULE_H */ diff --git a/lib/icinga/icinga-type.conf b/lib/icinga/icinga-type.conf index 2e0970fae..5c2401c09 100644 --- a/lib/icinga/icinga-type.conf +++ b/lib/icinga/icinga-type.conf @@ -174,7 +174,7 @@ %attribute %string "display_name", %require "update", - %attribute %any "update", + %attribute %function "update", /* %if (methods.update == "LegacyTimePeriod") { */ // %require "ranges", @@ -188,7 +188,7 @@ %validator "ValidateCommandAttributes", %require "execute", - %attribute %any "execute", + %attribute %function "execute", /* %if (methods.execute == "PluginNotification" || methods.execute == "PluginCheck" || methods.execute == "PluginEvent") { */ // %require "command",