From 671eb0110feb9d1ab054df26acaccb315944839e Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Wed, 6 Feb 2013 13:10:14 +0100 Subject: [PATCH] Write a validator for method names Fixes #3637 --- itl/types.conf | 2 ++ lib/config/configtype.cpp | 24 ++++++++++++++++++++++++ lib/config/configtype.h | 3 +++ 3 files changed, 29 insertions(+) diff --git a/itl/types.conf b/itl/types.conf index e83a925aa..e5b1bba15 100644 --- a/itl/types.conf +++ b/itl/types.conf @@ -31,6 +31,8 @@ type DynamicObject { %attribute string "__type", %attribute dictionary "methods" { + %validator "native::ValidateMethods", + %attribute string "*", }, diff --git a/lib/config/configtype.cpp b/lib/config/configtype.cpp index 52e57d6a6..55c4087a2 100644 --- a/lib/config/configtype.cpp +++ b/lib/config/configtype.cpp @@ -21,6 +21,8 @@ using namespace icinga; +REGISTER_SCRIPTFUNCTION("native::ValidateMethods", &ConfigType::ValidateMethods); + ConfigType::ConfigType(const String& name, const DebugInfo& debuginfo) : m_Name(name), m_RuleList(boost::make_shared()), m_DebugInfo(debuginfo) { } @@ -166,3 +168,25 @@ void ConfigType::ValidateDictionary(const Dictionary::Ptr& dictionary, } } +void ConfigType::ValidateMethods(const ScriptTask::Ptr& task, + const vector& arguments) +{ + if (arguments.size() < 1) + BOOST_THROW_EXCEPTION(invalid_argument("Missing argument: Location must be specified.")); + + if (arguments.size() < 2) + BOOST_THROW_EXCEPTION(invalid_argument("Missing argument: Attribute dictionary must be specified.")); + + String location = arguments[0]; + Dictionary::Ptr attrs = arguments[1]; + + String key; + BOOST_FOREACH(tie(key, tuples::ignore), attrs) { + if (!ScriptFunction::GetByName(key)) { + ConfigCompilerContext::GetContext()->AddError(false, "Validation failed for " + + location + ": Method '" + key + "' not found."); + } + } + + task->FinishResult(Empty); +} diff --git a/lib/config/configtype.h b/lib/config/configtype.h index 4251a5f3d..b72aeaaa9 100644 --- a/lib/config/configtype.h +++ b/lib/config/configtype.h @@ -46,6 +46,9 @@ public: void ValidateItem(const ConfigItem::Ptr& object) const; + static void ValidateMethods(const ScriptTask::Ptr& task, + const vector& arguments); + private: String m_Name; /**< The type name. */ String m_Parent; /**< The parent type. */