return m_ExportMacros;
}
+Array::Ptr Command::GetEscapeMacros(void) const
+{
+ return m_EscapeMacros;
+}
+
bool Command::ResolveMacro(const String& macro, const Dictionary::Ptr&, String *result) const
{
Dictionary::Ptr macros = GetMacros();
bag->Set("timeout", m_Timeout);
bag->Set("macros", m_Macros);
bag->Set("export_macros", m_ExportMacros);
+ bag->Set("escape_macros", m_EscapeMacros);
}
}
m_Macros = bag->Get("macros");
m_Macros = bag->Get("macros");
m_ExportMacros = bag->Get("export_macros");
+ m_EscapeMacros = bag->Get("escape_macros");
}
}
Dictionary::Ptr GetMacros(void) const;
Array::Ptr GetExportMacros(void) const;
+ Array::Ptr GetEscapeMacros(void) const;
virtual bool ResolveMacro(const String& macro, const Dictionary::Ptr& cr, String *result) const;
protected:
Value m_Timeout;
Dictionary::Ptr m_Macros;
Array::Ptr m_ExportMacros;
+ Array::Ptr m_EscapeMacros;
};
}
%attribute array "export_macros" {
%attribute string "*"
},
+ %attribute array "escape_macros" {
+ %attribute string "*"
+ },
%attribute dictionary "macros" {
%attribute string "*"
},
using namespace icinga;
Value MacroProcessor::ResolveMacros(const Value& str, const std::vector<MacroResolver::Ptr>& resolvers,
- const Dictionary::Ptr& cr, const MacroProcessor::EscapeCallback& escapeFn)
+ const Dictionary::Ptr& cr, const MacroProcessor::EscapeCallback& escapeFn, const Array::Ptr& escapeMacros)
{
Value result;
if (str.IsScalar()) {
- result = InternalResolveMacros(str, resolvers, cr, escapeFn);
+ result = InternalResolveMacros(str, resolvers, cr, escapeFn, escapeMacros);
} else if (str.IsObjectType<Array>()) {
Array::Ptr resultArr = boost::make_shared<Array>();
Array::Ptr arr = str;
BOOST_FOREACH(const Value& arg, arr) {
/* Note: don't escape macros here. */
- resultArr->Add(InternalResolveMacros(arg, resolvers, cr, EscapeCallback()));
+ resultArr->Add(InternalResolveMacros(arg, resolvers, cr, EscapeCallback(), Array::Ptr()));
}
result = resultArr;
String MacroProcessor::InternalResolveMacros(const String& str, const std::vector<MacroResolver::Ptr>& resolvers,
- const Dictionary::Ptr& cr, const MacroProcessor::EscapeCallback& escapeFn)
+ const Dictionary::Ptr& cr, const MacroProcessor::EscapeCallback& escapeFn, const Array::Ptr& escapeMacros)
{
size_t offset, pos_first, pos_second;
offset = 0;
if (!found)
Log(LogWarning, "icinga", "Macro '" + name + "' is not defined.");
- if (escapeFn)
- resolved_macro = escapeFn(resolved_macro);
+ if (escapeFn && escapeMacros) {
+ bool escape = false;
+
+ ObjectLock olock(escapeMacros);
+ BOOST_FOREACH(const String& escapeMacro, escapeMacros) {
+ if (escapeMacro == name) {
+ escape = true;
+ break;
+ }
+ }
+
+ if (escape)
+ resolved_macro = escapeFn(resolved_macro);
+ }
result.Replace(pos_first, pos_second - pos_first + 1, resolved_macro);
offset = pos_first + resolved_macro.GetLength();
#include "icinga/i2-icinga.h"
#include "icinga/macroresolver.h"
#include "base/dictionary.h"
+#include "base/array.h"
#include <boost/function.hpp>
#include <vector>
typedef boost::function<String (const String&)> EscapeCallback;
static Value ResolveMacros(const Value& str, const std::vector<MacroResolver::Ptr>& resolvers,
- const Dictionary::Ptr& cr, const EscapeCallback& escapeFn = EscapeCallback());
+ const Dictionary::Ptr& cr, const EscapeCallback& escapeFn = EscapeCallback(), const Array::Ptr& escapeMacros = Array::Ptr());
static bool ResolveMacro(const String& macro, const std::vector<MacroResolver::Ptr>& resolvers,
const Dictionary::Ptr& cr, String *result);
static String InternalResolveMacros(const String& str,
const std::vector<MacroResolver::Ptr>& resolvers, const Dictionary::Ptr& cr,
- const EscapeCallback& escapeFn);
+ const EscapeCallback& escapeFn, const Array::Ptr& escapeMacros);
};
}
resolvers.push_back(service->GetHost());
resolvers.push_back(IcingaApplication::GetInstance());
- Value command = MacroProcessor::ResolveMacros(raw_command, resolvers, Dictionary::Ptr(), Utility::EscapeShellCmd);
+ Value command = MacroProcessor::ResolveMacros(raw_command, resolvers, Dictionary::Ptr(), Utility::EscapeShellCmd, commandObj->GetEscapeMacros());
Dictionary::Ptr envMacros = boost::make_shared<Dictionary>();
resolvers.push_back(service->GetHost());
resolvers.push_back(IcingaApplication::GetInstance());
- Value command = MacroProcessor::ResolveMacros(raw_command, resolvers, Dictionary::Ptr(), Utility::EscapeShellCmd);
+ Value command = MacroProcessor::ResolveMacros(raw_command, resolvers, Dictionary::Ptr(), Utility::EscapeShellCmd, commandObj->GetEscapeMacros());
Dictionary::Ptr envMacros = boost::make_shared<Dictionary>();
resolvers.push_back(service->GetHost());
resolvers.push_back(IcingaApplication::GetInstance());
- Value command = MacroProcessor::ResolveMacros(raw_command, resolvers, cr, Utility::EscapeShellCmd);
+ Value command = MacroProcessor::ResolveMacros(raw_command, resolvers, cr, Utility::EscapeShellCmd, commandObj->GetEscapeMacros());
Dictionary::Ptr envMacros = boost::make_shared<Dictionary>();