mirror of https://github.com/Icinga/icinga2.git
parent
0d18b96c39
commit
24852e05c7
|
@ -1256,23 +1256,3 @@ String Utility::UnescapeString(const String& s)
|
||||||
|
|
||||||
return result.str();
|
return result.str();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Utility::ValidateMacroString(const String& macro)
|
|
||||||
{
|
|
||||||
if (macro.IsEmpty())
|
|
||||||
return true;
|
|
||||||
|
|
||||||
size_t pos_first, pos_second, offset;
|
|
||||||
offset = 0;
|
|
||||||
|
|
||||||
while((pos_first = macro.FindFirstOf("$", offset)) != String::NPos) {
|
|
||||||
pos_second = macro.FindFirstOf("$", pos_first + 1);
|
|
||||||
|
|
||||||
if (pos_second == String::NPos)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
offset = pos_second + 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
|
@ -118,8 +118,6 @@ public:
|
||||||
static String EscapeString(const String& s, const String& chars);
|
static String EscapeString(const String& s, const String& chars);
|
||||||
static String UnescapeString(const String& s);
|
static String UnescapeString(const String& s);
|
||||||
|
|
||||||
static bool ValidateMacroString(const String& macro);
|
|
||||||
|
|
||||||
static void SetThreadName(const String& name, bool os = true);
|
static void SetThreadName(const String& name, bool os = true);
|
||||||
static String GetThreadName(void);
|
static String GetThreadName(void);
|
||||||
|
|
||||||
|
|
|
@ -18,6 +18,7 @@
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
|
|
||||||
#include "icinga/command.hpp"
|
#include "icinga/command.hpp"
|
||||||
|
#include "icinga/macroprocessor.hpp"
|
||||||
#include "base/function.hpp"
|
#include "base/function.hpp"
|
||||||
#include "base/exception.hpp"
|
#include "base/exception.hpp"
|
||||||
#include "base/objectlock.hpp"
|
#include "base/objectlock.hpp"
|
||||||
|
@ -81,7 +82,7 @@ void Command::ValidateArguments(const String& location, const Command::Ptr& obje
|
||||||
|
|
||||||
String argstr = argval;
|
String argstr = argval;
|
||||||
|
|
||||||
if (!Utility::ValidateMacroString(argstr)) {
|
if(!MacroProcessor::ValidateMacroString(argstr)) {
|
||||||
BOOST_THROW_EXCEPTION(ScriptError("Validation failed for " +
|
BOOST_THROW_EXCEPTION(ScriptError("Validation failed for " +
|
||||||
location + ": Closing $ not found in macro format string '" + argstr + "'.", object->GetDebugInfo()));
|
location + ": Closing $ not found in macro format string '" + argstr + "'.", object->GetDebugInfo()));
|
||||||
}
|
}
|
||||||
|
@ -102,7 +103,7 @@ void Command::ValidateEnvironmentVariables(const String& location, const Command
|
||||||
if (!envval.IsString() || envval.IsEmpty())
|
if (!envval.IsString() || envval.IsEmpty())
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (!Utility::ValidateMacroString(envval)) {
|
if(!MacroProcessor::ValidateMacroString(envval)) {
|
||||||
BOOST_THROW_EXCEPTION(ScriptError("Validation failed for " +
|
BOOST_THROW_EXCEPTION(ScriptError("Validation failed for " +
|
||||||
location + ": Closing $ not found in macro format string '" + envval + "'.", object->GetDebugInfo()));
|
location + ": Closing $ not found in macro format string '" + envval + "'.", object->GetDebugInfo()));
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,6 +18,7 @@
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
|
|
||||||
#include "icinga/customvarobject.hpp"
|
#include "icinga/customvarobject.hpp"
|
||||||
|
#include "icinga/macroprocessor.hpp"
|
||||||
#include "base/logger.hpp"
|
#include "base/logger.hpp"
|
||||||
#include "base/function.hpp"
|
#include "base/function.hpp"
|
||||||
#include "base/exception.hpp"
|
#include "base/exception.hpp"
|
||||||
|
@ -88,7 +89,7 @@ void CustomVarObject::ValidateCustomAttributes(const String& location, const Cus
|
||||||
if (kv_var.second.IsEmpty())
|
if (kv_var.second.IsEmpty())
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (!Utility::ValidateMacroString(kv_var.second)) {
|
if (!MacroProcessor::ValidateMacroString(kv_var.second)) {
|
||||||
BOOST_THROW_EXCEPTION(ScriptError("Validation failed for " +
|
BOOST_THROW_EXCEPTION(ScriptError("Validation failed for " +
|
||||||
location + ": Closing $ not found in macro format string '" + kv_var.second + "'.", object->GetDebugInfo()));
|
location + ": Closing $ not found in macro format string '" + kv_var.second + "'.", object->GetDebugInfo()));
|
||||||
}
|
}
|
||||||
|
@ -102,7 +103,7 @@ void CustomVarObject::ValidateCustomAttributes(const String& location, const Cus
|
||||||
if (arrval.IsEmpty())
|
if (arrval.IsEmpty())
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (!Utility::ValidateMacroString(arrval)) {
|
if (!MacroProcessor::ValidateMacroString(arrval)) {
|
||||||
BOOST_THROW_EXCEPTION(ScriptError("Validation failed for " +
|
BOOST_THROW_EXCEPTION(ScriptError("Validation failed for " +
|
||||||
location + ": Closing $ not found in macro format string '" + arrval + "'.", object->GetDebugInfo()));
|
location + ": Closing $ not found in macro format string '" + arrval + "'.", object->GetDebugInfo()));
|
||||||
}
|
}
|
||||||
|
@ -113,7 +114,7 @@ void CustomVarObject::ValidateCustomAttributes(const String& location, const Cus
|
||||||
|
|
||||||
String varstr = varval;
|
String varstr = varval;
|
||||||
|
|
||||||
if (!Utility::ValidateMacroString(varstr)) {
|
if (!MacroProcessor::ValidateMacroString(varstr)) {
|
||||||
BOOST_THROW_EXCEPTION(ScriptError("Validation failed for " +
|
BOOST_THROW_EXCEPTION(ScriptError("Validation failed for " +
|
||||||
location + ": Closing $ not found in macro format string '" + varstr + "'.", object->GetDebugInfo()));
|
location + ": Closing $ not found in macro format string '" + varstr + "'.", object->GetDebugInfo()));
|
||||||
}
|
}
|
||||||
|
|
|
@ -302,3 +302,24 @@ Value MacroProcessor::InternalResolveMacros(const String& str, const ResolverLis
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool MacroProcessor::ValidateMacroString(const String& macro)
|
||||||
|
{
|
||||||
|
if (macro.IsEmpty())
|
||||||
|
return true;
|
||||||
|
|
||||||
|
size_t pos_first, pos_second, offset;
|
||||||
|
offset = 0;
|
||||||
|
|
||||||
|
while((pos_first = macro.FindFirstOf("$", offset)) != String::NPos) {
|
||||||
|
pos_second = macro.FindFirstOf("$", pos_first + 1);
|
||||||
|
|
||||||
|
if (pos_second == String::NPos)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
offset = pos_second + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
|
@ -47,6 +47,8 @@ public:
|
||||||
const Dictionary::Ptr& resolvedMacros = Dictionary::Ptr(),
|
const Dictionary::Ptr& resolvedMacros = Dictionary::Ptr(),
|
||||||
bool useResolvedMacros = false);
|
bool useResolvedMacros = false);
|
||||||
|
|
||||||
|
static bool ValidateMacroString(const String& macro);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
MacroProcessor(void);
|
MacroProcessor(void);
|
||||||
|
|
||||||
|
|
|
@ -234,12 +234,12 @@ Value GraphiteWriter::EscapeMacroMetric(const Value& value)
|
||||||
|
|
||||||
void GraphiteWriter::ValidateNameTemplates(const String& location, const GraphiteWriter::Ptr& object)
|
void GraphiteWriter::ValidateNameTemplates(const String& location, const GraphiteWriter::Ptr& object)
|
||||||
{
|
{
|
||||||
if (!Utility::ValidateMacroString(object->GetHostNameTemplate())) {
|
if (!MacroProcessor::ValidateMacroString(object->GetHostNameTemplate())) {
|
||||||
BOOST_THROW_EXCEPTION(ScriptError("Validation failed for " +
|
BOOST_THROW_EXCEPTION(ScriptError("Validation failed for " +
|
||||||
location + ": Closing $ not found in macro format string '" + object->GetHostNameTemplate() + "'.", object->GetDebugInfo()));
|
location + ": Closing $ not found in macro format string '" + object->GetHostNameTemplate() + "'.", object->GetDebugInfo()));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!Utility::ValidateMacroString(object->GetServiceNameTemplate())) {
|
if (!MacroProcessor::ValidateMacroString(object->GetServiceNameTemplate())) {
|
||||||
BOOST_THROW_EXCEPTION(ScriptError("Validation failed for " +
|
BOOST_THROW_EXCEPTION(ScriptError("Validation failed for " +
|
||||||
location + ": Closing $ not found in macro format string '" + object->GetServiceNameTemplate() + "'.", object->GetDebugInfo()));
|
location + ": Closing $ not found in macro format string '" + object->GetServiceNameTemplate() + "'.", object->GetDebugInfo()));
|
||||||
}
|
}
|
||||||
|
|
|
@ -142,12 +142,12 @@ void PerfdataWriter::RotationTimerHandler(void)
|
||||||
|
|
||||||
void PerfdataWriter::ValidateFormatTemplates(const String& location, const PerfdataWriter::Ptr& object)
|
void PerfdataWriter::ValidateFormatTemplates(const String& location, const PerfdataWriter::Ptr& object)
|
||||||
{
|
{
|
||||||
if (!Utility::ValidateMacroString(object->GetHostFormatTemplate())) {
|
if (!MacroProcessor::ValidateMacroString(object->GetHostFormatTemplate())) {
|
||||||
BOOST_THROW_EXCEPTION(ScriptError("Validation failed for " +
|
BOOST_THROW_EXCEPTION(ScriptError("Validation failed for " +
|
||||||
location + ": Closing $ not found in macro format string '" + object->GetHostFormatTemplate() + "'.", object->GetDebugInfo()));
|
location + ": Closing $ not found in macro format string '" + object->GetHostFormatTemplate() + "'.", object->GetDebugInfo()));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!Utility::ValidateMacroString(object->GetServiceFormatTemplate())) {
|
if (!MacroProcessor::ValidateMacroString(object->GetServiceFormatTemplate())) {
|
||||||
BOOST_THROW_EXCEPTION(ScriptError("Validation failed for " +
|
BOOST_THROW_EXCEPTION(ScriptError("Validation failed for " +
|
||||||
location + ": Closing $ not found in macro format string '" + object->GetHostFormatTemplate() + "'.", object->GetDebugInfo()));
|
location + ": Closing $ not found in macro format string '" + object->GetHostFormatTemplate() + "'.", object->GetDebugInfo()));
|
||||||
}
|
}
|
||||||
|
|
|
@ -52,15 +52,15 @@ BOOST_AUTO_TEST_CASE(simple)
|
||||||
BOOST_CHECK(result->GetLength() == 2);
|
BOOST_CHECK(result->GetLength() == 2);
|
||||||
|
|
||||||
/* verify the config validator macro checks */
|
/* verify the config validator macro checks */
|
||||||
BOOST_CHECK(Utility::ValidateMacroString("$host.address") == false);
|
BOOST_CHECK(MacroProcessor::ValidateMacroString("$host.address") == false);
|
||||||
BOOST_CHECK(Utility::ValidateMacroString("host.vars.test$") == false);
|
BOOST_CHECK(MacroProcessor::ValidateMacroString("host.vars.test$") == false);
|
||||||
|
|
||||||
BOOST_CHECK(Utility::ValidateMacroString("host.vars.test$") == false);
|
BOOST_CHECK(MacroProcessor::ValidateMacroString("host.vars.test$") == false);
|
||||||
BOOST_CHECK(Utility::ValidateMacroString("$template::test$abc$") == false);
|
BOOST_CHECK(MacroProcessor::ValidateMacroString("$template::test$abc$") == false);
|
||||||
|
|
||||||
BOOST_CHECK(Utility::ValidateMacroString("$$test $host.vars.test$") == true);
|
BOOST_CHECK(MacroProcessor::ValidateMacroString("$$test $host.vars.test$") == true);
|
||||||
|
|
||||||
BOOST_CHECK(Utility::ValidateMacroString("test $host.vars.test$") == true);
|
BOOST_CHECK(MacroProcessor::ValidateMacroString("test $host.vars.test$") == true);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue