Fix incorrect formatting for some macro values

fixes #11483
This commit is contained in:
Gunnar Beutner 2016-06-16 15:14:35 +02:00
parent d415ff7373
commit bc6f7d7a21
7 changed files with 48 additions and 40 deletions

View File

@ -33,6 +33,13 @@ String Convert::ToString(const Value& val)
return val; return val;
} }
String Convert::ToString(double val)
{
std::ostringstream msgbuf;
msgbuf << std::fixed << val;
return msgbuf.str();
}
double Convert::ToDateTimeValue(double val) double Convert::ToDateTimeValue(double val)
{ {
return val; return val;

View File

@ -82,6 +82,7 @@ public:
static String ToString(const String& val); static String ToString(const String& val);
static String ToString(const Value& val); static String ToString(const Value& val);
static String ToString(double val);
static double ToDateTimeValue(double val); static double ToDateTimeValue(double val);
static double ToDateTimeValue(const Value& val); static double ToDateTimeValue(const Value& val);

View File

@ -28,8 +28,7 @@ using namespace icinga;
static String NumberToString(void) static String NumberToString(void)
{ {
ScriptFrame *vframe = ScriptFrame::GetCurrentFrame(); ScriptFrame *vframe = ScriptFrame::GetCurrentFrame();
double self = vframe->Self; return vframe->Self;
return Convert::ToString(self);
} }
Object::Ptr Number::GetPrototype(void) Object::Ptr Number::GetPrototype(void)

View File

@ -56,18 +56,19 @@ Value::operator double(void) const
Value::operator String(void) const Value::operator String(void) const
{ {
Object *object; Object *object;
double integral, fractional; double dvalue, integral, fractional;
switch (GetType()) { switch (GetType()) {
case ValueEmpty: case ValueEmpty:
return String(); return String();
case ValueNumber: case ValueNumber:
fractional = std::modf(boost::get<double>(m_Value), &integral); dvalue = boost::get<double>(m_Value);
fractional = std::modf(dvalue, &integral);
if (fractional != 0) if (fractional != 0)
return boost::lexical_cast<std::string>(m_Value); return Convert::ToString(dvalue);
else else
return boost::lexical_cast<std::string>((long)integral); return Convert::ToString(static_cast<long>(dvalue));
case ValueBoolean: case ValueBoolean:
if (boost::get<bool>(m_Value)) if (boost::get<bool>(m_Value))
return "true"; return "true";

View File

@ -237,7 +237,7 @@ bool Host::ResolveMacro(const String& macro, const CheckResult::Ptr&, Value *res
*result = StateToString(GetState()); *result = StateToString(GetState());
return true; return true;
} else if (macro == "state_id") { } else if (macro == "state_id") {
*result = Convert::ToString(GetState()); *result = GetState();
return true; return true;
} else if (macro == "state_type") { } else if (macro == "state_type") {
*result = StateTypeToString(GetStateType()); *result = StateTypeToString(GetStateType());
@ -246,19 +246,19 @@ bool Host::ResolveMacro(const String& macro, const CheckResult::Ptr&, Value *res
*result = StateToString(GetLastState()); *result = StateToString(GetLastState());
return true; return true;
} else if (macro == "last_state_id") { } else if (macro == "last_state_id") {
*result = Convert::ToString(GetLastState()); *result = GetLastState();
return true; return true;
} else if (macro == "last_state_type") { } else if (macro == "last_state_type") {
*result = StateTypeToString(GetLastStateType()); *result = StateTypeToString(GetLastStateType());
return true; return true;
} else if (macro == "last_state_change") { } else if (macro == "last_state_change") {
*result = Convert::ToString((long)GetLastStateChange()); *result = GetLastStateChange();
return true; return true;
} else if (macro == "downtime_depth") { } else if (macro == "downtime_depth") {
*result = Convert::ToString((long)GetDowntimeDepth()); *result = GetDowntimeDepth();
return true; return true;
} else if (macro == "duration_sec") { } else if (macro == "duration_sec") {
*result = Convert::ToString((long)(Utility::GetTime() - GetLastStateChange())); *result = Utility::GetTime() - GetLastStateChange();
return true; return true;
} else if (macro == "num_services" || macro == "num_services_ok" || macro == "num_services_warning" } else if (macro == "num_services" || macro == "num_services_ok" || macro == "num_services_warning"
|| macro == "num_services_unknown" || macro == "num_services_critical") { || macro == "num_services_unknown" || macro == "num_services_critical") {
@ -281,7 +281,7 @@ bool Host::ResolveMacro(const String& macro, const CheckResult::Ptr&, Value *res
count++; count++;
} }
*result = Convert::ToString(count); *result = count;
return true; return true;
} }
@ -289,10 +289,10 @@ bool Host::ResolveMacro(const String& macro, const CheckResult::Ptr&, Value *res
if (cr) { if (cr) {
if (macro == "latency") { if (macro == "latency") {
*result = Convert::ToString(cr->CalculateLatency()); *result = cr->CalculateLatency();
return true; return true;
} else if (macro == "execution_time") { } else if (macro == "execution_time") {
*result = Convert::ToString(cr->CalculateExecutionTime()); *result = cr->CalculateExecutionTime();
return true; return true;
} else if (macro == "output") { } else if (macro == "output") {
*result = cr->GetOutput(); *result = cr->GetOutput();
@ -301,7 +301,7 @@ bool Host::ResolveMacro(const String& macro, const CheckResult::Ptr&, Value *res
*result = PluginUtility::FormatPerfdata(cr->GetPerformanceData()); *result = PluginUtility::FormatPerfdata(cr->GetPerformanceData());
return true; return true;
} else if (macro == "last_check") { } else if (macro == "last_check") {
*result = Convert::ToString((long)cr->GetScheduleStart()); *result = cr->GetScheduleStart();
return true; return true;
} else if (macro == "check_source") { } else if (macro == "check_source") {
*result = cr->GetCheckSource(); *result = cr->GetCheckSource();

View File

@ -210,7 +210,7 @@ bool IcingaApplication::ResolveMacro(const String& macro, const CheckResult::Ptr
double now = Utility::GetTime(); double now = Utility::GetTime();
if (macro == "timet") { if (macro == "timet") {
*result = Convert::ToString((long)now); *result = now;
return true; return true;
} else if (macro == "long_date_time") { } else if (macro == "long_date_time") {
*result = Utility::FormatDateTime("%Y-%m-%d %H:%M:%S %z", now); *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(); ServiceStatistics ss = CIB::CalculateServiceStats();
if (macro == "num_services_ok") { if (macro == "num_services_ok") {
*result = Convert::ToString(ss.services_ok); *result = ss.services_ok;
return true; return true;
} else if (macro == "num_services_warning") { } else if (macro == "num_services_warning") {
*result = Convert::ToString(ss.services_warning); *result = ss.services_warning;
return true; return true;
} else if (macro == "num_services_critical") { } else if (macro == "num_services_critical") {
*result = Convert::ToString(ss.services_critical); *result = ss.services_critical;
return true; return true;
} else if (macro == "num_services_unknown") { } else if (macro == "num_services_unknown") {
*result = Convert::ToString(ss.services_unknown); *result = ss.services_unknown;
return true; return true;
} else if (macro == "num_services_pending") { } else if (macro == "num_services_pending") {
*result = Convert::ToString(ss.services_pending); *result = ss.services_pending;
return true; return true;
} else if (macro == "num_services_unreachable") { } else if (macro == "num_services_unreachable") {
*result = Convert::ToString(ss.services_unreachable); *result = ss.services_unreachable;
return true; return true;
} else if (macro == "num_services_flapping") { } else if (macro == "num_services_flapping") {
*result = Convert::ToString(ss.services_flapping); *result = ss.services_flapping;
return true; return true;
} else if (macro == "num_services_in_downtime") { } else if (macro == "num_services_in_downtime") {
*result = Convert::ToString(ss.services_in_downtime); *result = ss.services_in_downtime;
return true; return true;
} else if (macro == "num_services_acknowledged") { } else if (macro == "num_services_acknowledged") {
*result = Convert::ToString(ss.services_acknowledged); *result = ss.services_acknowledged;
return true; return true;
} }
} }
@ -272,25 +272,25 @@ bool IcingaApplication::ResolveMacro(const String& macro, const CheckResult::Ptr
HostStatistics hs = CIB::CalculateHostStats(); HostStatistics hs = CIB::CalculateHostStats();
if (macro == "num_hosts_up") { if (macro == "num_hosts_up") {
*result = Convert::ToString(hs.hosts_up); *result = hs.hosts_up;
return true; return true;
} else if (macro == "num_hosts_down") { } else if (macro == "num_hosts_down") {
*result = Convert::ToString(hs.hosts_down); *result = hs.hosts_down;
return true; return true;
} else if (macro == "num_hosts_pending") { } else if (macro == "num_hosts_pending") {
*result = Convert::ToString(hs.hosts_pending); *result = hs.hosts_pending;
return true; return true;
} else if (macro == "num_hosts_unreachable") { } else if (macro == "num_hosts_unreachable") {
*result = Convert::ToString(hs.hosts_unreachable); *result = hs.hosts_unreachable;
return true; return true;
} else if (macro == "num_hosts_flapping") { } else if (macro == "num_hosts_flapping") {
*result = Convert::ToString(hs.hosts_flapping); *result = hs.hosts_flapping;
return true; return true;
} else if (macro == "num_hosts_in_downtime") { } else if (macro == "num_hosts_in_downtime") {
*result = Convert::ToString(hs.hosts_in_downtime); *result = hs.hosts_in_downtime;
return true; return true;
} else if (macro == "num_hosts_acknowledged") { } else if (macro == "num_hosts_acknowledged") {
*result = Convert::ToString(hs.hosts_acknowledged); *result = hs.hosts_acknowledged;
return true; return true;
} }
} }

View File

@ -192,7 +192,7 @@ bool Service::ResolveMacro(const String& macro, const CheckResult::Ptr& cr, Valu
*result = StateToString(GetState()); *result = StateToString(GetState());
return true; return true;
} else if (macro == "state_id") { } else if (macro == "state_id") {
*result = Convert::ToString(GetState()); *result = GetState();
return true; return true;
} else if (macro == "state_type") { } else if (macro == "state_type") {
*result = StateTypeToString(GetStateType()); *result = StateTypeToString(GetStateType());
@ -201,28 +201,28 @@ bool Service::ResolveMacro(const String& macro, const CheckResult::Ptr& cr, Valu
*result = StateToString(GetLastState()); *result = StateToString(GetLastState());
return true; return true;
} else if (macro == "last_state_id") { } else if (macro == "last_state_id") {
*result = Convert::ToString(GetLastState()); *result = GetLastState();
return true; return true;
} else if (macro == "last_state_type") { } else if (macro == "last_state_type") {
*result = StateTypeToString(GetLastStateType()); *result = StateTypeToString(GetLastStateType());
return true; return true;
} else if (macro == "last_state_change") { } else if (macro == "last_state_change") {
*result = Convert::ToString((long)GetLastStateChange()); *result = GetLastStateChange();
return true; return true;
} else if (macro == "downtime_depth") { } else if (macro == "downtime_depth") {
*result = Convert::ToString((long)GetDowntimeDepth()); *result = GetDowntimeDepth();
return true; return true;
} else if (macro == "duration_sec") { } else if (macro == "duration_sec") {
*result = Convert::ToString((long)(Utility::GetTime() - GetLastStateChange())); *result = Utility::GetTime() - GetLastStateChange();
return true; return true;
} }
if (cr) { if (cr) {
if (macro == "latency") { if (macro == "latency") {
*result = Convert::ToString(cr->CalculateLatency()); *result = cr->CalculateLatency();
return true; return true;
} else if (macro == "execution_time") { } else if (macro == "execution_time") {
*result = Convert::ToString(cr->CalculateExecutionTime()); *result = cr->CalculateExecutionTime();
return true; return true;
} else if (macro == "output") { } else if (macro == "output") {
*result = cr->GetOutput(); *result = cr->GetOutput();
@ -231,7 +231,7 @@ bool Service::ResolveMacro(const String& macro, const CheckResult::Ptr& cr, Valu
*result = PluginUtility::FormatPerfdata(cr->GetPerformanceData()); *result = PluginUtility::FormatPerfdata(cr->GetPerformanceData());
return true; return true;
} else if (macro == "last_check") { } else if (macro == "last_check") {
*result = Convert::ToString((long)cr->GetExecutionEnd()); *result = cr->GetExecutionEnd();
return true; return true;
} else if (macro == "check_source") { } else if (macro == "check_source") {
*result = cr->GetCheckSource(); *result = cr->GetCheckSource();