Skip to content

Commit

Permalink
Implement support for functions in set_if
Browse files Browse the repository at this point in the history
refs #7564
  • Loading branch information
gunnarbeutner committed Jan 29, 2015
1 parent ea3c3e0 commit 7b4f1e2
Show file tree
Hide file tree
Showing 4 changed files with 35 additions and 21 deletions.
2 changes: 2 additions & 0 deletions lib/icinga/icinga-type.conf
Expand Up @@ -201,11 +201,13 @@
%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"
}
},
Expand Down
43 changes: 25 additions & 18 deletions lib/icinga/macroprocessor.cpp
Expand Up @@ -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;
Expand Down Expand Up @@ -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,
Expand Down Expand Up @@ -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) {
Expand Down
5 changes: 5 additions & 0 deletions lib/icinga/macroprocessor.hpp
Expand Up @@ -61,6 +61,11 @@ class I2_ICINGA_API MacroProcessor
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);

};

}
Expand Down
6 changes: 3 additions & 3 deletions lib/icinga/pluginutility.cpp
Expand Up @@ -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;
Expand All @@ -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);

Expand Down

0 comments on commit 7b4f1e2

Please sign in to comment.