]> granicus.if.org Git - icinga2/commitdiff
Implemented soft/hard states.
authorGunnar Beutner <gunnar.beutner@netways.de>
Mon, 25 Jun 2012 13:42:46 +0000 (15:42 +0200)
committerGunnar Beutner <gunnar.beutner@netways.de>
Mon, 25 Jun 2012 13:42:46 +0000 (15:42 +0200)
components/checker/checkercomponent.cpp
icinga/checkresult.cpp
icinga/checkresult.h
icinga/nagioschecktask.cpp
icinga/service.cpp
icinga/service.h
jsonrpc/jsonrpcclient.cpp

index c7205d6a8d811d616962758a15a55c7b2293eb9f..862b7e992baeaf76e82502e351b2c3446810e576 100644 (file)
@@ -131,19 +131,23 @@ void CheckerComponent::ResultTimerHandler(void)
                if (result.GetState() != StateOK)
                        failed++;
 
+               /* update service state */
+               service.ApplyCheckResult(result);
+
                RequestMessage rm;
                rm.SetMethod("checker::CheckResult");
 
                MessagePart params;
                params.SetProperty("service", service.GetName());
+               params.SetProperty("state", static_cast<long>(service.GetState()));
+               params.SetProperty("state_type", static_cast<long>(service.GetStateType()));
+               params.SetProperty("current_attempt", static_cast<long>(service.GetCurrentCheckAttempt()));
                params.SetProperty("result", result.GetDictionary());
 
                rm.SetParams(params);
 
                GetEndpointManager()->SendMulticastMessage(m_CheckerEndpoint, rm);
 
-               service.ApplyCheckResult(result);
-
                service.SetNextCheck(now + service.GetCheckInterval());
                m_PendingServices.erase(service.GetConfigObject());
                m_Services.push(service);
index caeaa9e6712b9187235accbe761f06d97276f0de..4cef02fa97948d82734b6e42ef2f958cea31e53b 100644 (file)
@@ -39,16 +39,16 @@ time_t CheckResult::GetEndTime(void) const
        return static_cast<time_t>(value);
 }
 
-void CheckResult::SetState(CheckState state)
+void CheckResult::SetState(ServiceState state)
 {
        m_Data->SetProperty("state", static_cast<long>(state));
 }
 
-CheckState CheckResult::GetState(void) const
+ServiceState CheckResult::GetState(void) const
 {
        long value = StateUnknown;
        m_Data->GetProperty("state", &value);
-       return static_cast<CheckState>(value);
+       return static_cast<ServiceState>(value);
 }
 
 void CheckResult::SetOutput(string output)
index a1a6a2bd0fbdd40be7b5bf20b11fa6da3a129754..fbd4ebf3d3d52a7cf45e8cf0aae6fdd51ef61c21 100644 (file)
@@ -4,16 +4,6 @@
 namespace icinga
 {
 
-enum CheckState
-{
-       StateOK,
-       StateWarning,
-       StateCritical,
-       StateUnreachable,
-       StateUncheckable,
-       StateUnknown
-};
-
 struct CheckResult
 {
 public:
@@ -28,8 +18,8 @@ public:
        void SetEndTime(time_t ts);
        time_t GetEndTime(void) const;
 
-       void SetState(CheckState state);
-       CheckState GetState(void) const;
+       void SetState(ServiceState state);
+       ServiceState GetState(void) const;
 
        void SetOutput(string output);
        string GetOutput(void) const;
index b33813b3e83a51fd7a8fe33d6b5be906410087d2..ec39c6af22288358906d7e051aa9159199c243f4 100644 (file)
@@ -165,7 +165,7 @@ bool NagiosCheckTask::RunTask(void)
                exitcode = status;
 #endif /* _MSC_VER */
 
-               CheckState state;
+               ServiceState state;
 
                switch (exitcode) {
                        case 0:
index 068af4749f98538d3a4de5881ada1c45379ab800..cf9fc5d06e90a7a92f3540eb0e04686b038383ff 100644 (file)
@@ -44,7 +44,7 @@ string Service::GetCheckCommand(void) const
 
 long Service::GetMaxCheckAttempts(void) const
 {
-       long value = 1;
+       long value = 3;
        GetConfigObject()->GetProperty("max_check_attempts", &value);
        return value;
 }
@@ -62,20 +62,20 @@ long Service::GetCheckInterval(void) const
 
 long Service::GetRetryInterval(void) const
 {
-       long value = 15;
+       long value = 60;
        GetConfigObject()->GetProperty("retry_interval", &value);
        return value;
 }
 
 void Service::SetNextCheck(time_t nextCheck)
 {
-       GetConfigObject()->SetProperty("next_check", (long)nextCheck);
+       GetConfigObject()->SetTag("next_check", (long)nextCheck);
 }
 
 time_t Service::GetNextCheck(void)
 {
        long value = -1;
-       GetConfigObject()->GetProperty("next_check", &value);
+       GetConfigObject()->GetTag("next_check", &value);
        if (value == -1) {
                value = time(NULL) + rand() % GetCheckInterval();
                SetNextCheck(value);
@@ -85,17 +85,74 @@ time_t Service::GetNextCheck(void)
 
 void Service::SetChecker(string checker)
 {
-       GetConfigObject()->SetProperty("checker", checker);
+       GetConfigObject()->SetTag("checker", checker);
 }
 
 string Service::GetChecker(void) const
 {
        string value;
-       GetConfigObject()->GetProperty("checker", &value);
+       GetConfigObject()->GetTag("checker", &value);
        return value;
 }
 
+void Service::SetCurrentCheckAttempt(long attempt)
+{
+       GetConfigObject()->SetTag("check_attempt", attempt);
+}
+
+long Service::GetCurrentCheckAttempt(void) const
+{
+       long value = 0;
+       GetConfigObject()->GetTag("check_attempt", &value);
+       return value;
+}
+
+void Service::SetState(ServiceState state)
+{
+       GetConfigObject()->SetTag("state", static_cast<long>(state));
+}
+
+ServiceState Service::GetState(void) const
+{
+       long value = StateUnknown;
+       GetConfigObject()->GetTag("state", &value);
+       return static_cast<ServiceState>(value);
+}
+
+void Service::SetStateType(ServiceStateType type)
+{
+       GetConfigObject()->SetTag("state_type", static_cast<long>(type));
+}
+
+ServiceStateType Service::GetStateType(void) const
+{
+       long value = StateTypeHard;
+       GetConfigObject()->GetTag("state_type", &value);
+       return static_cast<ServiceStateType>(value);
+}
+
 void Service::ApplyCheckResult(const CheckResult& cr)
 {
+       long attempt = GetCurrentCheckAttempt();
+
+       if (GetState() == StateOK && cr.GetState() == StateOK) {
+               SetStateType(StateTypeHard);
+               SetCurrentCheckAttempt(0);
+       } else if (GetState() == StateOK && cr.GetState() != StateOK) {
+               attempt++;
+
+               if (attempt >= GetMaxCheckAttempts()) {
+                       SetStateType(StateTypeHard);
+                       attempt = 0;
+               } else {
+                       SetStateType(StateTypeSoft);
+               }
+
+               SetCurrentCheckAttempt(attempt);
+       } else if (GetState() != StateOK && cr.GetState() == StateOK) {
+               SetState(StateOK);
+       }
 
+       SetState(cr.GetState());
 }
+
index e8ac647a792142648cbc24e0b63fafc08a0c7a5b..5cf13e8624e4bec764c2ed37cc494805cc94c230 100644 (file)
@@ -4,6 +4,22 @@
 namespace icinga
 {
 
+enum ServiceState
+{
+       StateOK,
+       StateWarning,
+       StateCritical,
+       StateUnreachable,
+       StateUncheckable,
+       StateUnknown
+};
+
+enum ServiceStateType
+{
+       StateTypeHard,
+       StateTypeSoft
+};
+
 struct CheckResult;
 
 class I2_ICINGA_API Service : public ConfigObjectAdapter
@@ -24,9 +40,19 @@ public:
 
        void SetNextCheck(time_t nextCheck);
        time_t GetNextCheck(void);
+
        void SetChecker(string checker);
        string GetChecker(void) const;
 
+       void SetCurrentCheckAttempt(long attempt);
+       long GetCurrentCheckAttempt(void) const;
+
+       void SetState(ServiceState state);
+       ServiceState GetState(void) const;
+
+       void SetStateType(ServiceStateType type);
+       ServiceStateType GetStateType(void) const;
+
        void ApplyCheckResult(const CheckResult& cr);
 };
 
index e457b9617d63e769cd6d9d271400e61c3a624c2e..6f6ab2d3bdde65014045578f07aab4103732e5d9 100644 (file)
@@ -62,6 +62,8 @@ void JsonRpcClient::DataAvailableHandler(void)
                                        return;
                        }
 
+                       std::cerr << jsonString << std::endl;
+
                        message = MessagePart(jsonString);
                        OnNewMessage(GetSelf(), message);
                } catch (const std::exception& ex) {