]> granicus.if.org Git - icinga2/commitdiff
Fix multi line handling for compat check results
authorMarkus Frosch <markus@lazyfrosch.de>
Wed, 27 May 2015 14:05:10 +0000 (16:05 +0200)
committerMichael Friedrich <michael.friedrich@netways.de>
Mon, 15 Jun 2015 15:19:28 +0000 (17:19 +0200)
When a multi line result is submitted via the command pipe, any multi line
output is escaped to a actual string '\n', because any external command only
can be a single line.

Example:
  [1432735140] PROCESS_SERVICE_CHECK_RESULT;host;service;3;Test1\nTest2|test=1

We need to unescape this values, just like we use to escape multi line output
for IDO and status.dat.

fixes #9324

Signed-off-by: Michael Friedrich <michael.friedrich@netways.de>
lib/compat/checkresultreader.cpp
lib/icinga/compatutility.cpp
lib/icinga/compatutility.hpp
lib/icinga/externalcommandprocessor.cpp

index 6433d055a7230970311cd5750e28cc3116e46bfb..1ea5b6f9baec950a293e9b2cfc400262e164a80d 100644 (file)
@@ -17,6 +17,7 @@
  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.             *
  ******************************************************************************/
 
+#include "icinga/compatutility.hpp"
 #include "compat/checkresultreader.hpp"
 #include "compat/checkresultreader.tcpp"
 #include "icinga/service.hpp"
@@ -134,7 +135,8 @@ void CheckResultReader::ProcessCheckResultFile(const String& path) const
        }
 
        CheckResult::Ptr result = new CheckResult();
-       std::pair<String, Value> co = PluginUtility::ParseCheckOutput(attrs["output"]);
+       String output = CompatUtility::UnEscapeString(attrs["output"]);
+       std::pair<String, Value> co = PluginUtility::ParseCheckOutput(output);
        result->SetOutput(co.first);
        result->SetPerformanceData(PluginUtility::SplitPerfdata(co.second));
        result->SetState(PluginUtility::ExitStatusToState(Convert::ToLong(attrs["return_code"])));
index d2cbd863015d2500225313f8a74c96f366c13e3d..b88aafe9b0b58e3131be0b19b692fbe17c313d7a 100644 (file)
@@ -728,6 +728,13 @@ String CompatUtility::EscapeString(const String& str)
        return result;
 }
 
+String CompatUtility::UnEscapeString(const String& str)
+{
+       String result = str;
+       boost::algorithm::replace_all(result, "\\n", "\n");
+       return result;
+}
+
 std::pair<unsigned long, unsigned long> CompatUtility::ConvertTimestamp(double time)
 {
        unsigned long time_sec = static_cast<long>(time);
index edba4b9f94e145ce6bb71185273ff0866fe2c314..5ee326c12b50d2dfed95ee8a70934f6b445d16f5 100644 (file)
@@ -118,6 +118,7 @@ public:
        static int MapExternalCommandType(const String& name);
 
        static String EscapeString(const String& str);
+       static String UnEscapeString(const String& str);
 
 private:
        CompatUtility(void);
index ee6b6799ec5b04471322bd73aadf899ec4850000..5399649693c681ba34b6448e642f31902505b48b 100644 (file)
@@ -354,7 +354,8 @@ void ExternalCommandProcessor::ProcessServiceCheckResult(double time, const std:
 
        int exitStatus = Convert::ToDouble(arguments[2]);
        CheckResult::Ptr result = new CheckResult();
-       std::pair<String, String> co = PluginUtility::ParseCheckOutput(arguments[3]);
+       String output = CompatUtility::UnEscapeString(arguments[3]);
+       std::pair<String, String> co = PluginUtility::ParseCheckOutput(output);
        result->SetOutput(co.first);
        result->SetPerformanceData(PluginUtility::SplitPerfdata(co.second));
        result->SetState(PluginUtility::ExitStatusToState(exitStatus));