]> granicus.if.org Git - icinga2/commitdiff
Implement support for functions in set_if
authorGunnar Beutner <gunnar@beutner.name>
Thu, 29 Jan 2015 09:09:53 +0000 (10:09 +0100)
committerGunnar Beutner <gunnar@beutner.name>
Thu, 29 Jan 2015 09:09:53 +0000 (10:09 +0100)
refs #7564

lib/icinga/icinga-type.conf
lib/icinga/macroprocessor.cpp
lib/icinga/macroprocessor.hpp
lib/icinga/pluginutility.cpp

index 5c2401c09cabb6b97f0dc50e723f4be0d8254897..60470246fc4c0263eb6faeec9f0a2f27c3f030e1 100644 (file)
                %attribute %dictionary "*" {
                        %attribute %string "key"
                        %attribute %string "value"
+                       %attribute %function "value"
                        %attribute %string "description"
                        %attribute %number "required"
                        %attribute %number "skip_key"
                        %attribute %number "repeat_key"
                        %attribute %string "set_if"
+                       %attribute %function "set_if"
                        %attribute %number "order"
                }
        },
index 2d7d39362fa6acea04f161e2d0e87dfecda547a3..4fc2434c44a9e0baf3780f3aaf431f9760981bce 100644 (file)
@@ -59,8 +59,10 @@ Value MacroProcessor::ResolveMacros(const Value& str, const ResolverList& resolv
                }
 
                result = resultArr;
+       } else if (str.IsObjectType<Function>()) {
+               result = EvaluateFunction(str, resolvers, cr, missingMacro, escapeFn, resolvedMacros, useResolvedMacros, 0);
        } else {
-               BOOST_THROW_EXCEPTION(std::invalid_argument("Command is not a string or array."));
+               BOOST_THROW_EXCEPTION(std::invalid_argument("Macro is not a string or array."));
        }
 
        return result;
@@ -166,6 +168,26 @@ Value MacroProcessor::InternalResolveMacrosShim(const std::vector<Value>& args,
            resolvedMacros, useResolvedMacros, recursionLevel);
 }
 
+Value MacroProcessor::EvaluateFunction(const Function::Ptr& func, const ResolverList& resolvers,
+    const CheckResult::Ptr& cr, String *missingMacro,
+    const MacroProcessor::EscapeCallback& escapeFn, const Dictionary::Ptr& resolvedMacros,
+    bool useResolvedMacros, int recursionLevel)
+{
+       Dictionary::Ptr resolvers_this = new Dictionary();
+
+       BOOST_FOREACH(const ResolverSpec& resolver, resolvers) {
+               resolvers_this->Set(resolver.first, resolver.second);
+       }
+
+       resolvers_this->Set("macro", new Function(boost::bind(&MacroProcessor::InternalResolveMacrosShim,
+           _1, boost::cref(resolvers), cr, missingMacro, boost::cref(escapeFn), resolvedMacros, useResolvedMacros,
+           recursionLevel)));
+
+       ScriptFrame frame(resolvers_this);
+       std::vector<Value> args;
+       return func->Invoke(args);
+}
+
 Value MacroProcessor::InternalResolveMacros(const String& str, const ResolverList& resolvers,
     const CheckResult::Ptr& cr, String *missingMacro,
     const MacroProcessor::EscapeCallback& escapeFn, const Dictionary::Ptr& resolvedMacros,
@@ -210,23 +232,8 @@ Value MacroProcessor::InternalResolveMacros(const String& str, const ResolverLis
                }
 
                if (resolved_macro.IsObjectType<Function>()) {
-                       Function::Ptr func = resolved_macro;
-
-                       if (!resolvers_this) {
-                               resolvers_this = new Dictionary();
-
-                               BOOST_FOREACH(const ResolverSpec& resolver, resolvers) {
-                                       resolvers_this->Set(resolver.first, resolver.second);
-                               }
-
-                               resolvers_this->Set("macro", new Function(boost::bind(&MacroProcessor::InternalResolveMacrosShim,
-                                   _1, boost::cref(resolvers), cr, missingMacro, boost::cref(escapeFn), resolvedMacros, useResolvedMacros,
-                                   recursionLevel)));
-                       }
-
-                       ScriptFrame frame(resolvers_this);
-                       std::vector<Value> args;
-                       resolved_macro = func->Invoke(args);
+                       resolved_macro = EvaluateFunction(resolved_macro, resolvers, cr, missingMacro, escapeFn,
+                           resolvedMacros, useResolvedMacros, recursionLevel);
                }
 
                if (!found) {
index 78846aae7674d1152483abb22a322b13113b018d..ab667627018149c9d26ea239579036bdb0d77f4b 100644 (file)
@@ -61,6 +61,11 @@ private:
            const CheckResult::Ptr& cr, String *missingMacro,
            const MacroProcessor::EscapeCallback& escapeFn, const Dictionary::Ptr& resolvedMacros,
            bool useResolvedMacros, int recursionLevel);
+       static Value EvaluateFunction(const Function::Ptr& func, const ResolverList& resolvers,
+           const CheckResult::Ptr& cr, String *missingMacro,
+           const MacroProcessor::EscapeCallback& escapeFn, const Dictionary::Ptr& resolvedMacros,
+           bool useResolvedMacros, int recursionLevel);
+
 };
 
 }
index eeb892f402be0535de40b68d1f818bb97df9e196..c01688b09da89d6d4508a258bd97252281709fa9 100644 (file)
@@ -109,7 +109,7 @@ void PluginUtility::ExecuteCommand(const Command::Ptr& commandObj, const Checkab
                        arg.Key = kv.first;
 
                        bool required = false;
-                       String argval;
+                       Value argval;
 
                        if (arginfo.IsObjectType<Dictionary>()) {
                                Dictionary::Ptr argdict = arginfo;
@@ -123,11 +123,11 @@ void PluginUtility::ExecuteCommand(const Command::Ptr& commandObj, const Checkab
                                        arg.RepeatKey = argdict->Get("repeat_key");
                                arg.Order = argdict->Get("order");
 
-                               String set_if = argdict->Get("set_if");
+                               Value set_if = argdict->Get("set_if");
 
                                if (!set_if.IsEmpty()) {
                                        String missingMacro;
-                                       String set_if_resolved = MacroProcessor::ResolveMacros(set_if, macroResolvers,
+                                       Value set_if_resolved = MacroProcessor::ResolveMacros(set_if, macroResolvers,
                                            cr, &missingMacro, MacroProcessor::EscapeCallback(), resolvedMacros,
                                            useResolvedMacros);