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);
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)
long Service::GetMaxCheckAttempts(void) const
{
- long value = 1;
+ long value = 3;
GetConfigObject()->GetProperty("max_check_attempts", &value);
return value;
}
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);
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());
}
+
namespace icinga
{
+enum ServiceState
+{
+ StateOK,
+ StateWarning,
+ StateCritical,
+ StateUnreachable,
+ StateUncheckable,
+ StateUnknown
+};
+
+enum ServiceStateType
+{
+ StateTypeHard,
+ StateTypeSoft
+};
+
struct CheckResult;
class I2_ICINGA_API Service : public ConfigObjectAdapter
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);
};