diff --git a/lib/icinga/macroprocessor.cpp b/lib/icinga/macroprocessor.cpp index 103c4cc18..9218e07cf 100644 --- a/lib/icinga/macroprocessor.cpp +++ b/lib/icinga/macroprocessor.cpp @@ -62,10 +62,12 @@ Value MacroProcessor::ResolveMacros(const Value& str, const ResolverList& resolv } bool MacroProcessor::ResolveMacro(const String& macro, const ResolverList& resolvers, - const CheckResult::Ptr& cr, String *result) + const CheckResult::Ptr& cr, String *result, bool *user_macro) { CONTEXT("Resolving macro '" + macro + "'"); + *user_macro = false; + std::vector tokens; boost::algorithm::split(tokens, macro, boost::is_any_of(".")); @@ -87,6 +89,7 @@ bool MacroProcessor::ResolveMacro(const String& macro, const ResolverList& resol if (vars && vars->Contains(macro)) { *result = vars->Get(macro); + *user_macro = true; return true; } } @@ -132,6 +135,9 @@ bool MacroProcessor::ResolveMacro(const String& macro, const ResolverList& resol } if (valid) { + if (tokens[0] == "vars") + *user_macro = true; + *result = ref; return true; } @@ -161,7 +167,8 @@ String MacroProcessor::InternalResolveMacros(const String& str, const ResolverLi String name = result.SubStr(pos_first + 1, pos_second - pos_first - 1); String resolved_macro; - bool found = ResolveMacro(name, resolvers, cr, &resolved_macro); + bool user_macro; + bool found = ResolveMacro(name, resolvers, cr, &resolved_macro, &user_macro); /* $$ is an escape sequence for $. */ if (name.IsEmpty()) { @@ -172,8 +179,9 @@ String MacroProcessor::InternalResolveMacros(const String& str, const ResolverLi if (!found) Log(LogWarning, "icinga", "Macro '" + name + "' is not defined."); - /* recursively resolve macros in the macro */ - resolved_macro = InternalResolveMacros(resolved_macro, resolvers, cr, EscapeCallback(), recursionLevel + 1); + /* recursively resolve macros in the macro if it was a user macro */ + if (user_macro) + resolved_macro = InternalResolveMacros(resolved_macro, resolvers, cr, EscapeCallback(), recursionLevel + 1); if (escapeFn) resolved_macro = escapeFn(resolved_macro); diff --git a/lib/icinga/macroprocessor.h b/lib/icinga/macroprocessor.h index 61cea23ba..1d9e8d009 100644 --- a/lib/icinga/macroprocessor.h +++ b/lib/icinga/macroprocessor.h @@ -44,12 +44,12 @@ public: static Value ResolveMacros(const Value& str, const ResolverList& resolvers, const CheckResult::Ptr& cr, const EscapeCallback& escapeFn = EscapeCallback()); - static bool ResolveMacro(const String& macro, const ResolverList& resolvers, - const CheckResult::Ptr& cr, String *result); private: MacroProcessor(void); + static bool ResolveMacro(const String& macro, const ResolverList& resolvers, + const CheckResult::Ptr& cr, String *result, bool *user_macro); static String InternalResolveMacros(const String& str, const ResolverList& resolvers, const CheckResult::Ptr& cr, const EscapeCallback& escapeFn, int recursionLevel = 0);