}
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<String> tokens;
boost::algorithm::split(tokens, macro, boost::is_any_of("."));
if (vars && vars->Contains(macro)) {
*result = vars->Get(macro);
+ *user_macro = true;
return true;
}
}
}
if (valid) {
+ if (tokens[0] == "vars")
+ *user_macro = true;
+
*result = ref;
return true;
}
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()) {
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);
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);