From c0d397179244add55d5d73049000788f60954097 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Sat, 15 Sep 2012 19:20:57 +0200 Subject: [PATCH] compatido: fix config dump, add closesink, add host/service cyclic status dumps --- components/compatido/compatidocomponent.cpp | 214 +++++++++++++++++++- components/compatido/compatidocomponent.h | 2 + 2 files changed, 208 insertions(+), 8 deletions(-) diff --git a/components/compatido/compatidocomponent.cpp b/components/compatido/compatidocomponent.cpp index 1ebb43666..899db1ce9 100644 --- a/components/compatido/compatidocomponent.cpp +++ b/components/compatido/compatidocomponent.cpp @@ -69,6 +69,9 @@ void CompatIdoComponent::Start(void) void CompatIdoComponent::Stop(void) { + //FIXME cleanly close ido socket + GoodByeSink(); + CloseSink(); } /* TODO @@ -159,6 +162,32 @@ void CompatIdoComponent::SendHello(String instancename) m_IdoSocket->SendMessage(message.str()); } +/** + * sends goodbye msg to ido + */ +void CompatIdoComponent::GoodByeSink() +{ + time_t now; + time(&now); + + stringstream message; + message << "\n" + << IDO_API_ENDDATADUMP << "\n" + << IDO_API_ENDTIME << ": " << now << "\n" + << IDO_API_GOODBYE + << "\n\n"; + + m_IdoSocket->SendMessage(message.str()); +} + +/** + * closes sink + */ +void CompatIdoComponent::CloseSink() +{ + m_IdoSocket->Close(); +} + /** * sends config dump start signal to ido */ @@ -262,11 +291,17 @@ void CompatIdoComponent::DumpHostObject(const Host::Ptr& host) << IDO_DATA_HAVE3DCOORDS << "=" << 0 << "\n" << IDO_DATA_X3D << "=" << 0.0 << "\n" << IDO_DATA_Y3D << "=" << 0.0 << "\n" - << IDO_DATA_Z3D<< "=" << 0.0 << "\n"; + << IDO_DATA_Z3D<< "=" << 0.0 << "\n" /* FIXME add more related config items * parents, contactgroups, contacts, custom vars * before sending the message */ + << IDO_DATA_PARENTHOST << "=" << "i2_parent" << "\n" + << IDO_DATA_CONTACTGROUP << "=" << "i2_contactgroup" << "\n" + << IDO_DATA_CONTACT << "=" << "i2_contact" << "\n" + << IDO_DATA_CUSTOMVARIABLE << "=" << "i2_customvar" << ":" << 1 << ":" << "i2_custom_var_mod" << "\n" + << IDO_API_ENDDATA << "\n\n"; + m_IdoSocket->SendMessage(message.str()); @@ -278,7 +313,73 @@ void CompatIdoComponent::DumpHostObject(const Host::Ptr& host) void CompatIdoComponent::DumpHostStatus(const Host::Ptr& host) { - //FIXME + int state; + if (!host->IsReachable()) + state = 2; /* unreachable */ + else if (!host->IsUp()) + state = 1; /* down */ + else + state = 0; /* up */ + + struct timeval now; + gettimeofday(&now, NULL); + + stringstream message; + message << "\n" + << IDO_API_HOSTSTATUSDATA << ":" << "\n" + << IDO_DATA_TYPE << "=" << "" << "\n" + << IDO_DATA_FLAGS << "=" << "" << "\n" + << IDO_DATA_ATTRIBUTES << "=" << "" << "\n" + << IDO_DATA_TIMESTAMP << "=" << now.tv_sec << "." << now.tv_usec << "\n" + << IDO_DATA_HOST << "=" << host->GetName() << "\n" + << IDO_DATA_OUTPUT << "=" << "" << "\n" + << IDO_DATA_LONGOUTPUT << "=" << "" << "\n" + << IDO_DATA_PERFDATA << "=" << "" << "\n" + << IDO_DATA_CURRENTSTATE << "=" << "" << "\n" + << IDO_DATA_HASBEENCHECKED << "=" << 1 << "\n" + << IDO_DATA_SHOULDBESCHEDULED << "=" << 1 << "\n" + << IDO_DATA_CURRENTCHECKATTEMPT << "=" << 1 << "\n" + << IDO_DATA_MAXCHECKATTEMPTS << "=" << 1 << "\n" + << IDO_DATA_LASTHOSTCHECK << "=" << Utility::GetTime() << "\n" + << IDO_DATA_NEXTHOSTCHECK << "=" << Utility::GetTime() << "\n" + << IDO_DATA_CHECKTYPE << "=" << "" << "\n" + << IDO_DATA_LASTSTATECHANGE << "=" << "" << "\n" + << IDO_DATA_LASTHARDSTATECHANGE << "=" << "" << "\n" + << IDO_DATA_LASTHARDSTATE << "=" << "" << "\n" + << IDO_DATA_LASTTIMEUP << "=" << "" << "\n" + << IDO_DATA_LASTTIMEDOWN << "=" << "" << "\n" + << IDO_DATA_LASTTIMEUNREACHABLE << "=" << "" << "\n" + << IDO_DATA_STATETYPE << "=" << "" << "\n" + << IDO_DATA_LASTHOSTNOTIFICATION << "=" << "" << "\n" + << IDO_DATA_NEXTHOSTNOTIFICATION << "=" << "" << "\n" + << IDO_DATA_NOMORENOTIFICATIONS << "=" << 0 << "\n" + << IDO_DATA_NOTIFICATIONSENABLED << "=" << 0 << "\n" + << IDO_DATA_PROBLEMHASBEENACKNOWLEDGED << "=" << 0 << "\n" + << IDO_DATA_ACKNOWLEDGEMENTTYPE << "=" << "" << "\n" + << IDO_DATA_CURRENTNOTIFICATIONNUMBER << "=" << 0 << "\n" + << IDO_DATA_PASSIVEHOSTCHECKSENABLED << "=" << 1 << "\n" + << IDO_DATA_EVENTHANDLERENABLED << "=" << "" << "\n" + << IDO_DATA_ACTIVEHOSTCHECKSENABLED << "=" << "" << "\n" + << IDO_DATA_FLAPDETECTIONENABLED << "=" << "" << "\n" + << IDO_DATA_ISFLAPPING << "=" << "" << "\n" + << IDO_DATA_PERCENTSTATECHANGE << "=" << "" << "\n" + << IDO_DATA_LATENCY << "=" << "" << "\n" + << IDO_DATA_EXECUTIONTIME << "=" << "" << "\n" + << IDO_DATA_SCHEDULEDDOWNTIMEDEPTH << "=" << 0 << "\n" + << IDO_DATA_FAILUREPREDICTIONENABLED << "=" << "" << "\n" + << IDO_DATA_PROCESSPERFORMANCEDATA << "=" << 1 << "\n" + << IDO_DATA_OBSESSOVERHOST << "=" << 0 << "\n" + << IDO_DATA_MODIFIEDHOSTATTRIBUTES << "=" << "" << "\n" + << IDO_DATA_EVENTHANDLER << "=" << "" << "\n" + << IDO_DATA_CHECKCOMMAND << "=" << "i2_virtual_check" << "\n" + << IDO_DATA_NORMALCHECKINTERVAL << "=" << "" << "\n" + << IDO_DATA_RETRYCHECKINTERVAL << "=" << "" << "\n" + << IDO_DATA_HOSTCHECKPERIOD << "=" << "" << "\n" + /* FIXME dump all customvars in a loop */ + << IDO_DATA_CUSTOMVARIABLE << "=" << "i2_customvar" << ":" << "1" << ":" << "i2_customvarmod" << "\n" + << IDO_API_ENDDATA << "\n\n"; + + m_IdoSocket->SendMessage(message.str()); } /** @@ -339,11 +440,15 @@ void CompatIdoComponent::DumpServiceObject(const Service::Ptr& service) << IDO_DATA_NOTESURL << "=" << "" << "\n" << IDO_DATA_ACTIONURL << "=" << "" << "\n" << IDO_DATA_ICONIMAGE << "=" << "" << "\n" - << IDO_DATA_ICONIMAGEALT << "=" << "" << "\n"; + << IDO_DATA_ICONIMAGEALT << "=" << "" << "\n" /* FIXME add more related config items * contactgroups, contacts, custom vars - * before sending the message + * before sending the message, in a loop */ + << IDO_DATA_CONTACTGROUP << "=" << "i2_contactgroup" << "\n" + << IDO_DATA_CONTACT << "=" << "i2_contact" << "\n" + << IDO_DATA_CUSTOMVARIABLE << "=" << "i2_customvar" << ":" << 1 << ":" << "i2_custom_var_mod" << "\n" + << IDO_API_ENDDATA << "\n\n"; Logger::Write(LogInformation, "compatido", "Writing compat ido service"); m_IdoSocket->SendMessage(message.str()); @@ -354,8 +459,90 @@ void CompatIdoComponent::DumpServiceObject(const Service::Ptr& service) */ void CompatIdoComponent::DumpServiceStatus(const Service::Ptr& service) { + String output; + String perfdata; + double schedule_start = -1, schedule_end = -1; + double execution_start = -1, execution_end = -1; + + Dictionary::Ptr cr = service->GetLastCheckResult(); + if (cr) { + output = cr->Get("output"); + schedule_start = cr->Get("schedule_start"); + schedule_end = cr->Get("schedule_end"); + execution_start = cr->Get("execution_start"); + execution_end = cr->Get("execution_end"); + perfdata = cr->Get("performance_data_raw"); + } + + double execution_time = (execution_end - execution_start); + double latency = (schedule_end - schedule_start) - execution_time; + + int state = service->GetState(); + + if (state > StateUnknown) + state = StateUnknown; + + struct timeval now; + gettimeofday(&now, NULL); + + stringstream message; + message << "\n" + << IDO_API_SERVICESTATUSDATA << ":" << "\n" + << IDO_DATA_TYPE << "=" << "" << "\n" + << IDO_DATA_FLAGS << "=" << "" << "\n" + << IDO_DATA_ATTRIBUTES << "=" << "" << "\n" + << IDO_DATA_TIMESTAMP << "=" << now.tv_sec << "." << now.tv_usec << "\n" + << IDO_DATA_HOST << "=" << service->GetHost()->GetName() << "\n" + << IDO_DATA_SERVICE << "=" << service->GetAlias() << "\n" + << IDO_DATA_OUTPUT << "=" << output << "\n" + << IDO_DATA_LONGOUTPUT << "=" << "" << "\n" + << IDO_DATA_PERFDATA << "=" << perfdata << "\n" + << IDO_DATA_CURRENTSTATE << "=" << state << "\n" + << IDO_DATA_HASBEENCHECKED << "=" << (service->GetLastCheckResult() ? 1 : 0) << "\n" + << IDO_DATA_SHOULDBESCHEDULED << "=" << "1" << "\n" + << IDO_DATA_CURRENTCHECKATTEMPT << "=" << service->GetCurrentCheckAttempt() << "\n" + << IDO_DATA_MAXCHECKATTEMPTS << "=" << service->GetMaxCheckAttempts() << "\n" + << IDO_DATA_LASTSERVICECHECK << "=" << schedule_end << "\n" + << IDO_DATA_NEXTSERVICECHECK << "=" << service->GetNextCheck() << "\n" + << IDO_DATA_CHECKTYPE << "=" << "" << "\n" + << IDO_DATA_LASTSTATECHANGE << "=" << service->GetLastStateChange() << "\n" + << IDO_DATA_LASTHARDSTATECHANGE << "=" << service->GetLastHardStateChange() << "\n" + << IDO_DATA_LASTHARDSTATE << "=" << "" << "\n" + << IDO_DATA_LASTTIMEOK << "=" << "" << "\n" + << IDO_DATA_LASTTIMEWARNING << "=" << "" << "\n" + << IDO_DATA_LASTTIMEUNKNOWN << "=" << "" << "\n" + << IDO_DATA_LASTTIMECRITICAL << "=" << "" << "\n" + << IDO_DATA_STATETYPE << "=" << service->GetStateType() << "\n" + << IDO_DATA_LASTSERVICENOTIFICATION << "=" << "" << "\n" + << IDO_DATA_NEXTSERVICENOTIFICATION << "=" << "" << "\n" + << IDO_DATA_NOMORENOTIFICATIONS << "=" << 0 << "\n" + << IDO_DATA_NOTIFICATIONSENABLED << "=" << 0 << "\n" + << IDO_DATA_PROBLEMHASBEENACKNOWLEDGED << "=" << 0 << "\n" + << IDO_DATA_ACKNOWLEDGEMENTTYPE << "=" << "" << "\n" + << IDO_DATA_CURRENTNOTIFICATIONNUMBER << "=" << 0 << "\n" + << IDO_DATA_PASSIVESERVICECHECKSENABLED << "=" << "" << "\n" + << IDO_DATA_EVENTHANDLERENABLED << "=" << "" << "\n" + << IDO_DATA_ACTIVESERVICECHECKSENABLED << "=" << "" << "\n" + << IDO_DATA_FLAPDETECTIONENABLED << "=" << "" << "\n" + << IDO_DATA_ISFLAPPING << "=" << "" << "\n" + << IDO_DATA_PERCENTSTATECHANGE << "=" << "" << "\n" + << IDO_DATA_LATENCY << "=" << latency << "\n" + << IDO_DATA_EXECUTIONTIME << "=" << execution_time << "\n" + << IDO_DATA_SCHEDULEDDOWNTIMEDEPTH << "=" << 0 << "\n" + << IDO_DATA_FAILUREPREDICTIONENABLED << "=" << 0 << "\n" + << IDO_DATA_PROCESSPERFORMANCEDATA << "=" << 1 << "\n" + << IDO_DATA_OBSESSOVERSERVICE << "=" << 0 << "\n" + << IDO_DATA_MODIFIEDSERVICEATTRIBUTES << "=" << 0 << "\n" + << IDO_DATA_EVENTHANDLER << "=" << "" << "\n" + << IDO_DATA_CHECKCOMMAND << "=" << "i2_check_service" << "\n" + << IDO_DATA_NORMALCHECKINTERVAL << "=" << service->GetCheckInterval() / 60.0 << "\n" + << IDO_DATA_RETRYCHECKINTERVAL << "=" << service->GetRetryInterval() / 60.0 << "\n" + << IDO_DATA_SERVICECHECKPERIOD << "=" << "" << "\n" + /* FIXME dump customvars in a loop */ + << IDO_DATA_CUSTOMVARIABLE << "=" << "" << ":" << "1" << ":" << "\n" + << IDO_API_ENDDATA << "\n\n"; - //FIXME + m_IdoSocket->SendMessage(message.str()); } /** @@ -492,12 +679,23 @@ void CompatIdoComponent::DumpConfigObjects(void) void CompatIdoComponent::DumpStatusData(void) { Logger::Write(LogInformation, "compatido", "Writing compat ido status information"); +//FIXME update programstatus data more frequently +// + /* hosts */ + DynamicObject::Ptr object; + BOOST_FOREACH(tie(tuples::ignore, object), DynamicObject::GetObjects("Host")) { + const Host::Ptr& host = static_pointer_cast(object); + + DumpHostStatus(host); + } - stringstream message; - /* program status - should probably done more often */ - message << "\n\n"; + /* services */ + BOOST_FOREACH(tie(tuples::ignore, object), DynamicObject::GetObjects("Service")) { + Service::Ptr service = static_pointer_cast(object); + DumpServiceStatus(service); + } } diff --git a/components/compatido/compatidocomponent.h b/components/compatido/compatidocomponent.h index 19727976f..20a8961d4 100644 --- a/components/compatido/compatidocomponent.h +++ b/components/compatido/compatidocomponent.h @@ -40,6 +40,8 @@ private: void OpenSink(String node, String service ); void SendHello(String instancename); + void GoodByeSink(); + void CloseSink(); void StartConfigDump(); void EndConfigDump(); -- 2.40.0