diff --git a/lib/icinga/checkable.cpp b/lib/icinga/checkable.cpp index f2259d2b8..d34204a5a 100644 --- a/lib/icinga/checkable.cpp +++ b/lib/icinga/checkable.cpp @@ -117,9 +117,9 @@ AcknowledgementType Checkable::GetAcknowledgement(void) return avalue; } -bool Checkable::IsAcknowledged(void) +bool Checkable::IsAcknowledged(void) const { - return GetAcknowledgement() != AcknowledgementNone; + return const_cast(this)->GetAcknowledgement() != AcknowledgementNone; } void Checkable::AcknowledgeProblem(const String& author, const String& comment, AcknowledgementType type, bool notify, double expiry, const MessageOrigin::Ptr& origin) @@ -146,6 +146,12 @@ Endpoint::Ptr Checkable::GetCommandEndpoint(void) const return Endpoint::GetByName(GetCommandEndpointRaw()); } +int Checkable::GetSeverity(void) const +{ + /* overridden in Host/Service class. */ + return 0; +} + void Checkable::NotifyFixedDowntimeStart(const Downtime::Ptr& downtime) { if (!downtime->GetFixed()) diff --git a/lib/icinga/checkable.hpp b/lib/icinga/checkable.hpp index 49319f95d..c24a421af 100644 --- a/lib/icinga/checkable.hpp +++ b/lib/icinga/checkable.hpp @@ -53,6 +53,22 @@ enum CheckableType CheckableService }; +/** + * Severity Flags + * + * @ingroup icinga + */ +enum SeverityFlag +{ + SeverityFlagDowntime = 1, + SeverityFlagAcknowledgement = 2, + SeverityFlagUnhandled = 8, + SeverityFlagPending = 16, + SeverityFlagWarning = 32, + SeverityFlagUnknown = 64, + SeverityFlagCritical = 128, +}; + class CheckCommand; class EventCommand; class Dependency; @@ -85,6 +101,8 @@ public: void AcknowledgeProblem(const String& author, const String& comment, AcknowledgementType type, bool notify = true, double expiry = 0, const MessageOrigin::Ptr& origin = MessageOrigin::Ptr()); void ClearAcknowledgement(const MessageOrigin::Ptr& origin = MessageOrigin::Ptr()); + virtual int GetSeverity(void) const override; + /* Checks */ intrusive_ptr GetCheckCommand(void) const; TimePeriod::Ptr GetCheckPeriod(void) const; @@ -132,7 +150,7 @@ public: void RemoveAllDowntimes(void); void TriggerDowntimes(void); bool IsInDowntime(void) const; - bool IsAcknowledged(void); + bool IsAcknowledged(void) const; std::set GetDowntimes(void) const; void RegisterDowntime(const Downtime::Ptr& downtime); diff --git a/lib/icinga/checkable.ti b/lib/icinga/checkable.ti index a485f81c3..f90a85dbe 100644 --- a/lib/icinga/checkable.ti +++ b/lib/icinga/checkable.ti @@ -128,6 +128,11 @@ abstract class Checkable : CustomVarObject default {{{ return Application::GetStartTime(); }}} }; [state] Timestamp last_state_unreachable; + + [no_storage] int severity { + get; + }; + [state] bool force_next_check; [state] int acknowledgement (AcknowledgementRaw) { default {{{ return AcknowledgementNone; }}} diff --git a/lib/icinga/host.cpp b/lib/icinga/host.cpp index 1f8b0e362..c84eddae2 100644 --- a/lib/icinga/host.cpp +++ b/lib/icinga/host.cpp @@ -181,6 +181,34 @@ HostState Host::GetLastHardState(void) const return CalculateState(GetLastHardStateRaw()); } +/* keep in sync with Service::GetSeverity() */ +int Host::GetSeverity(void) const +{ + int severity = 0; + + ObjectLock olock(this); + ServiceState state = GetStateRaw(); + + /* OK/Warning = Up, Critical/Unknownb = Down */ + if (!HasBeenChecked()) + severity |= SeverityFlagPending; + else if (state == ServiceUnknown) + severity |= SeverityFlagCritical; + else if (state == ServiceCritical) + severity |= SeverityFlagCritical; + + if (IsInDowntime()) + severity |= SeverityFlagDowntime; + else if (IsAcknowledged()) + severity |= SeverityFlagAcknowledgement; + else + severity |= SeverityFlagUnhandled; + + olock.Unlock(); + + return severity; +} + bool Host::IsStateOK(ServiceState state) { return Host::CalculateState(state) == HostUp; diff --git a/lib/icinga/host.hpp b/lib/icinga/host.hpp index eb2e2b735..a2b3acfd3 100644 --- a/lib/icinga/host.hpp +++ b/lib/icinga/host.hpp @@ -54,6 +54,7 @@ public: virtual HostState GetState(void) const override; virtual HostState GetLastState(void) const override; virtual HostState GetLastHardState(void) const override; + virtual int GetSeverity(void) const override; virtual bool IsStateOK(ServiceState state) override; virtual void SaveLastState(ServiceState state, double timestamp) override; diff --git a/lib/icinga/service.cpp b/lib/icinga/service.cpp index 092371355..54fa55eb4 100644 --- a/lib/icinga/service.cpp +++ b/lib/icinga/service.cpp @@ -124,6 +124,36 @@ Host::Ptr Service::GetHost(void) const return m_Host; } +/* keep in sync with Host::GetSeverity() */ +int Service::GetSeverity(void) const +{ + int severity = 0; + + ObjectLock olock(this); + ServiceState state = GetStateRaw(); + + if (!HasBeenChecked()) + severity |= SeverityFlagPending; + else if (state == ServiceWarning) + severity |= SeverityFlagWarning; + else if (state == ServiceUnknown) + severity |= SeverityFlagUnknown; + else if (state == ServiceCritical) + severity |= SeverityFlagCritical; + + /* TODO: Add host reachability and handled */ + if (IsInDowntime()) + severity |= SeverityFlagDowntime; + else if (IsAcknowledged()) + severity |= SeverityFlagAcknowledgement; + else + severity |= SeverityFlagUnhandled; + + olock.Unlock(); + + return severity; +} + bool Service::IsStateOK(ServiceState state) { return state == ServiceOK; diff --git a/lib/icinga/service.hpp b/lib/icinga/service.hpp index d721e4170..8b689cd33 100644 --- a/lib/icinga/service.hpp +++ b/lib/icinga/service.hpp @@ -42,6 +42,7 @@ public: static Service::Ptr GetByNamePair(const String& hostName, const String& serviceName); virtual Host::Ptr GetHost(void) const override; + virtual int GetSeverity(void) const override; virtual bool ResolveMacro(const String& macro, const CheckResult::Ptr& cr, Value *result) const override;