]> granicus.if.org Git - icinga2/commitdiff
Only resolve user macros (vars.*) recursively.
authorGunnar Beutner <gunnar@beutner.name>
Thu, 10 Apr 2014 06:46:36 +0000 (08:46 +0200)
committerGunnar Beutner <gunnar@beutner.name>
Thu, 10 Apr 2014 06:46:36 +0000 (08:46 +0200)
Fixes #5983

lib/icinga/macroprocessor.cpp
lib/icinga/macroprocessor.h

index 103c4cc18b97710611904070c9ff90c3ce72dfcb..9218e07cf4664a6ff2ff248a7b6146ce96bad28b 100644 (file)
@@ -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<String> 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);
index 61cea23bafde024049825402da48a275331fad3d..1d9e8d009be45922b640064f1a9b1f6b563ece98 100644 (file)
@@ -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);