From: Gunnar Beutner Date: Thu, 16 Jun 2016 13:14:35 +0000 (+0200) Subject: Fix incorrect formatting for some macro values X-Git-Tag: v2.5.0~255 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=bc6f7d7a217164ac28a07b679b6beb0d2fbddff5;p=icinga2 Fix incorrect formatting for some macro values fixes #11483 --- diff --git a/lib/base/convert.cpp b/lib/base/convert.cpp index 3495fdd05..45f6a965b 100644 --- a/lib/base/convert.cpp +++ b/lib/base/convert.cpp @@ -33,6 +33,13 @@ String Convert::ToString(const Value& val) return val; } +String Convert::ToString(double val) +{ + std::ostringstream msgbuf; + msgbuf << std::fixed << val; + return msgbuf.str(); +} + double Convert::ToDateTimeValue(double val) { return val; diff --git a/lib/base/convert.hpp b/lib/base/convert.hpp index fd2daa3a6..103909f39 100644 --- a/lib/base/convert.hpp +++ b/lib/base/convert.hpp @@ -82,6 +82,7 @@ public: static String ToString(const String& val); static String ToString(const Value& val); + static String ToString(double val); static double ToDateTimeValue(double val); static double ToDateTimeValue(const Value& val); diff --git a/lib/base/number-script.cpp b/lib/base/number-script.cpp index 9765a368e..30d2e43b7 100644 --- a/lib/base/number-script.cpp +++ b/lib/base/number-script.cpp @@ -28,8 +28,7 @@ using namespace icinga; static String NumberToString(void) { ScriptFrame *vframe = ScriptFrame::GetCurrentFrame(); - double self = vframe->Self; - return Convert::ToString(self); + return vframe->Self; } Object::Ptr Number::GetPrototype(void) diff --git a/lib/base/value-operators.cpp b/lib/base/value-operators.cpp index ad2691a59..a658180a6 100644 --- a/lib/base/value-operators.cpp +++ b/lib/base/value-operators.cpp @@ -56,18 +56,19 @@ Value::operator double(void) const Value::operator String(void) const { Object *object; - double integral, fractional; + double dvalue, integral, fractional; switch (GetType()) { case ValueEmpty: return String(); case ValueNumber: - fractional = std::modf(boost::get(m_Value), &integral); + dvalue = boost::get(m_Value); + fractional = std::modf(dvalue, &integral); if (fractional != 0) - return boost::lexical_cast(m_Value); + return Convert::ToString(dvalue); else - return boost::lexical_cast((long)integral); + return Convert::ToString(static_cast(dvalue)); case ValueBoolean: if (boost::get(m_Value)) return "true"; diff --git a/lib/icinga/host.cpp b/lib/icinga/host.cpp index af33d528b..dd166aa3b 100644 --- a/lib/icinga/host.cpp +++ b/lib/icinga/host.cpp @@ -237,7 +237,7 @@ bool Host::ResolveMacro(const String& macro, const CheckResult::Ptr&, Value *res *result = StateToString(GetState()); return true; } else if (macro == "state_id") { - *result = Convert::ToString(GetState()); + *result = GetState(); return true; } else if (macro == "state_type") { *result = StateTypeToString(GetStateType()); @@ -246,19 +246,19 @@ bool Host::ResolveMacro(const String& macro, const CheckResult::Ptr&, Value *res *result = StateToString(GetLastState()); return true; } else if (macro == "last_state_id") { - *result = Convert::ToString(GetLastState()); + *result = GetLastState(); return true; } else if (macro == "last_state_type") { *result = StateTypeToString(GetLastStateType()); return true; } else if (macro == "last_state_change") { - *result = Convert::ToString((long)GetLastStateChange()); + *result = GetLastStateChange(); return true; } else if (macro == "downtime_depth") { - *result = Convert::ToString((long)GetDowntimeDepth()); + *result = GetDowntimeDepth(); return true; } else if (macro == "duration_sec") { - *result = Convert::ToString((long)(Utility::GetTime() - GetLastStateChange())); + *result = Utility::GetTime() - GetLastStateChange(); return true; } else if (macro == "num_services" || macro == "num_services_ok" || macro == "num_services_warning" || macro == "num_services_unknown" || macro == "num_services_critical") { @@ -281,7 +281,7 @@ bool Host::ResolveMacro(const String& macro, const CheckResult::Ptr&, Value *res count++; } - *result = Convert::ToString(count); + *result = count; return true; } @@ -289,10 +289,10 @@ bool Host::ResolveMacro(const String& macro, const CheckResult::Ptr&, Value *res if (cr) { if (macro == "latency") { - *result = Convert::ToString(cr->CalculateLatency()); + *result = cr->CalculateLatency(); return true; } else if (macro == "execution_time") { - *result = Convert::ToString(cr->CalculateExecutionTime()); + *result = cr->CalculateExecutionTime(); return true; } else if (macro == "output") { *result = cr->GetOutput(); @@ -301,7 +301,7 @@ bool Host::ResolveMacro(const String& macro, const CheckResult::Ptr&, Value *res *result = PluginUtility::FormatPerfdata(cr->GetPerformanceData()); return true; } else if (macro == "last_check") { - *result = Convert::ToString((long)cr->GetScheduleStart()); + *result = cr->GetScheduleStart(); return true; } else if (macro == "check_source") { *result = cr->GetCheckSource(); diff --git a/lib/icinga/icingaapplication.cpp b/lib/icinga/icingaapplication.cpp index 26f41d0b2..5d7afa21c 100644 --- a/lib/icinga/icingaapplication.cpp +++ b/lib/icinga/icingaapplication.cpp @@ -210,7 +210,7 @@ bool IcingaApplication::ResolveMacro(const String& macro, const CheckResult::Ptr double now = Utility::GetTime(); if (macro == "timet") { - *result = Convert::ToString((long)now); + *result = now; return true; } else if (macro == "long_date_time") { *result = Utility::FormatDateTime("%Y-%m-%d %H:%M:%S %z", now); @@ -240,31 +240,31 @@ bool IcingaApplication::ResolveMacro(const String& macro, const CheckResult::Ptr ServiceStatistics ss = CIB::CalculateServiceStats(); if (macro == "num_services_ok") { - *result = Convert::ToString(ss.services_ok); + *result = ss.services_ok; return true; } else if (macro == "num_services_warning") { - *result = Convert::ToString(ss.services_warning); + *result = ss.services_warning; return true; } else if (macro == "num_services_critical") { - *result = Convert::ToString(ss.services_critical); + *result = ss.services_critical; return true; } else if (macro == "num_services_unknown") { - *result = Convert::ToString(ss.services_unknown); + *result = ss.services_unknown; return true; } else if (macro == "num_services_pending") { - *result = Convert::ToString(ss.services_pending); + *result = ss.services_pending; return true; } else if (macro == "num_services_unreachable") { - *result = Convert::ToString(ss.services_unreachable); + *result = ss.services_unreachable; return true; } else if (macro == "num_services_flapping") { - *result = Convert::ToString(ss.services_flapping); + *result = ss.services_flapping; return true; } else if (macro == "num_services_in_downtime") { - *result = Convert::ToString(ss.services_in_downtime); + *result = ss.services_in_downtime; return true; } else if (macro == "num_services_acknowledged") { - *result = Convert::ToString(ss.services_acknowledged); + *result = ss.services_acknowledged; return true; } } @@ -272,25 +272,25 @@ bool IcingaApplication::ResolveMacro(const String& macro, const CheckResult::Ptr HostStatistics hs = CIB::CalculateHostStats(); if (macro == "num_hosts_up") { - *result = Convert::ToString(hs.hosts_up); + *result = hs.hosts_up; return true; } else if (macro == "num_hosts_down") { - *result = Convert::ToString(hs.hosts_down); + *result = hs.hosts_down; return true; } else if (macro == "num_hosts_pending") { - *result = Convert::ToString(hs.hosts_pending); + *result = hs.hosts_pending; return true; } else if (macro == "num_hosts_unreachable") { - *result = Convert::ToString(hs.hosts_unreachable); + *result = hs.hosts_unreachable; return true; } else if (macro == "num_hosts_flapping") { - *result = Convert::ToString(hs.hosts_flapping); + *result = hs.hosts_flapping; return true; } else if (macro == "num_hosts_in_downtime") { - *result = Convert::ToString(hs.hosts_in_downtime); + *result = hs.hosts_in_downtime; return true; } else if (macro == "num_hosts_acknowledged") { - *result = Convert::ToString(hs.hosts_acknowledged); + *result = hs.hosts_acknowledged; return true; } } diff --git a/lib/icinga/service.cpp b/lib/icinga/service.cpp index 78b389ce2..fd233f0b2 100644 --- a/lib/icinga/service.cpp +++ b/lib/icinga/service.cpp @@ -192,7 +192,7 @@ bool Service::ResolveMacro(const String& macro, const CheckResult::Ptr& cr, Valu *result = StateToString(GetState()); return true; } else if (macro == "state_id") { - *result = Convert::ToString(GetState()); + *result = GetState(); return true; } else if (macro == "state_type") { *result = StateTypeToString(GetStateType()); @@ -201,28 +201,28 @@ bool Service::ResolveMacro(const String& macro, const CheckResult::Ptr& cr, Valu *result = StateToString(GetLastState()); return true; } else if (macro == "last_state_id") { - *result = Convert::ToString(GetLastState()); + *result = GetLastState(); return true; } else if (macro == "last_state_type") { *result = StateTypeToString(GetLastStateType()); return true; } else if (macro == "last_state_change") { - *result = Convert::ToString((long)GetLastStateChange()); + *result = GetLastStateChange(); return true; } else if (macro == "downtime_depth") { - *result = Convert::ToString((long)GetDowntimeDepth()); + *result = GetDowntimeDepth(); return true; } else if (macro == "duration_sec") { - *result = Convert::ToString((long)(Utility::GetTime() - GetLastStateChange())); + *result = Utility::GetTime() - GetLastStateChange(); return true; } if (cr) { if (macro == "latency") { - *result = Convert::ToString(cr->CalculateLatency()); + *result = cr->CalculateLatency(); return true; } else if (macro == "execution_time") { - *result = Convert::ToString(cr->CalculateExecutionTime()); + *result = cr->CalculateExecutionTime(); return true; } else if (macro == "output") { *result = cr->GetOutput(); @@ -231,7 +231,7 @@ bool Service::ResolveMacro(const String& macro, const CheckResult::Ptr& cr, Valu *result = PluginUtility::FormatPerfdata(cr->GetPerformanceData()); return true; } else if (macro == "last_check") { - *result = Convert::ToString((long)cr->GetExecutionEnd()); + *result = cr->GetExecutionEnd(); return true; } else if (macro == "check_source") { *result = cr->GetCheckSource();