#include "icinga/perfdatavalue.hpp"
#include "base/convert.hpp"
#include "base/exception.hpp"
+#include "base/logger.hpp"
#include <boost/algorithm/string/case_conv.hpp>
#include <boost/algorithm/string/split.hpp>
#include <boost/algorithm/string/classification.hpp>
BOOST_THROW_EXCEPTION(std::invalid_argument("Invalid performance data unit: " + unit));
}
- if (tokens.size() > 1 && tokens[1] != "U" && tokens[1] != "")
- warn = Convert::ToDouble(tokens[1]);
-
- if (tokens.size() > 2 && tokens[2] != "U" && tokens[2] != "")
- crit = Convert::ToDouble(tokens[2]);
-
- if (tokens.size() > 3 && tokens[3] != "U" && tokens[3] != "")
- min = Convert::ToDouble(tokens[3]);
-
- if (tokens.size() > 4 && tokens[4] != "U" && tokens[4] != "")
- max = Convert::ToDouble(tokens[4]);
+ warn = ParseWarnCritMinMaxToken(tokens, 1, "warning");
+ crit = ParseWarnCritMinMaxToken(tokens, 2, "critical");
+ min = ParseWarnCritMinMaxToken(tokens, 3, "minimum");
+ max = ParseWarnCritMinMaxToken(tokens, 4, "maximum");
value = value * base;
return result.str();
}
+
+Value PerfdataValue::ParseWarnCritMinMaxToken(const std::vector<String>& tokens, std::vector<String>::size_type index, const String& description)
+{
+ if (tokens.size() > index && tokens[index] != "U" && tokens[index] != "" && tokens[index].FindFirstNotOf("+-0123456789.e") == String::NPos)
+ return Convert::ToDouble(tokens[index]);
+ else {
+ if (tokens.size() > index && tokens[index] != "")
+ Log(LogDebug, "PerfdataValue")
+ << "Ignoring unsupported perfdata " << description << " range, value: '" << tokens[index] << "'.";
+ return Empty;
+ }
+}
BOOST_CHECK(pv->Format() == "test=123456B;1000;2000;3000;4000");
}
+BOOST_AUTO_TEST_CASE(ignore_invalid_warn_crit_min_max)
+{
+ PerfdataValue::Ptr pv = PerfdataValue::Parse("test=123456;1000:2000;0:3000;3000;4000");
+ BOOST_CHECK(pv);
+ BOOST_CHECK(pv->GetValue() == 123456);
+ BOOST_CHECK(pv->GetWarn() == Empty);
+ BOOST_CHECK(pv->GetCrit() == Empty);
+ BOOST_CHECK(pv->GetMin() == 3000);
+ BOOST_CHECK(pv->GetMax() == 4000);
+
+ BOOST_CHECK(pv->Format() == "test=123456");
+}
+
BOOST_AUTO_TEST_CASE(invalid)
{
+ BOOST_CHECK_THROW(PerfdataValue::Parse("123456"), boost::exception);
BOOST_CHECK_THROW(PerfdataValue::Parse("test=1,23456"), boost::exception);
- BOOST_CHECK_THROW(PerfdataValue::Parse("test=123456;10%;20%"), boost::exception);
}
BOOST_AUTO_TEST_CASE(multi)