Skip to content

Commit

Permalink
Fix wrong calculation for host compat state UNREACHABLE
Browse files Browse the repository at this point in the history
fixes #10058
  • Loading branch information
Michael Friedrich committed Sep 4, 2015
1 parent 9a2ae6e commit 50cd694
Show file tree
Hide file tree
Showing 9 changed files with 48 additions and 38 deletions.
19 changes: 8 additions & 11 deletions lib/compat/compatlogger.cpp
Expand Up @@ -119,21 +119,18 @@ void CompatLogger::CheckResultHandler(const Checkable::Ptr& checkable, const Che
msgbuf << "SERVICE ALERT: "
<< host->GetName() << ";"
<< service->GetShortName() << ";"
<< Service::StateToString(static_cast<ServiceState>(state_after)) << ";"
<< Service::StateTypeToString(static_cast<StateType>(stateType_after)) << ";"
<< Service::StateToString(service->GetState()) << ";"
<< Service::StateTypeToString(service->GetStateType()) << ";"
<< attempt_after << ";"
<< output << ""
<< "";
} else {
String state = Host::StateToString(Host::CalculateState(static_cast<ServiceState>(state_after)));

if (!reachable_after)
state = "UNREACHABLE";

msgbuf << "HOST ALERT: "
<< host->GetName() << ";"
<< state << ";"
<< Host::StateTypeToString(static_cast<StateType>(stateType_after)) << ";"
<< CompatUtility::GetHostStateString(host) << ";"
<< Host::StateTypeToString(host->GetStateType()) << ";"
<< attempt_after << ";"
<< output << ""
<< "";
Expand Down Expand Up @@ -248,7 +245,7 @@ void CompatLogger::NotificationSentHandler(const Notification::Ptr& notification
if (service)
notification_type_str = Service::StateToString(service->GetState());
else
notification_type_str = host->IsReachable() ? Host::StateToString(host->GetState()) : "UNREACHABLE";
notification_type_str = CompatUtility::GetHostStateString(host);
}

String author_comment = "";
Expand Down Expand Up @@ -280,7 +277,7 @@ void CompatLogger::NotificationSentHandler(const Notification::Ptr& notification
<< user->GetName() << ";"
<< host->GetName() << ";"
<< notification_type_str << " "
<< "(" << (host->IsReachable() ? Host::StateToString(host->GetState()) : "UNREACHABLE") << ");"
<< "(" << CompatUtility::GetHostStateString(host) << ");"
<< command_name << ";"
<< output << ";"
<< author_comment
Expand Down Expand Up @@ -412,7 +409,7 @@ void CompatLogger::EventCommandHandler(const Checkable::Ptr& checkable)
} else {
msgbuf << "HOST EVENT HANDLER: "
<< host->GetName() << ";"
<< (host->IsReachable() ? Host::StateToString(host->GetState()) : "UNREACHABLE") << ";"
<< CompatUtility::GetHostStateString(host) << ";"
<< Host::StateTypeToString(host->GetStateType()) << ";"
<< current_attempt << ";"
<< event_command_name;
Expand Down Expand Up @@ -489,7 +486,7 @@ void CompatLogger::ReopenFile(bool rotate)
std::ostringstream msgbuf;
msgbuf << "CURRENT HOST STATE: "
<< host->GetName() << ";"
<< (host->IsReachable() ? Host::StateToString(host->GetState()) : "UNREACHABLE") << ";"
<< CompatUtility::GetHostStateString(host) << ";"
<< Host::StateTypeToString(host->GetStateType()) << ";"
<< host->GetCheckAttempt() << ";"
<< output << "";
Expand Down
2 changes: 1 addition & 1 deletion lib/compat/statusdatawriter.cpp
Expand Up @@ -356,7 +356,7 @@ void StatusDataWriter::DumpCheckableStatusAttrs(std::ostream& fp, const Checkabl
fp << "\t" << "current_state=" << service->GetState() << "\n"
<< "\t" << "last_hard_state=" << service->GetLastHardState() << "\n";
} else {
fp << "\t" << "current_state=" << (host->IsReachable() ? host->GetState() : 2) << "\n"
fp << "\t" << "current_state=" << CompatUtility::GetHostCurrentState(host) << "\n"
<< "\t" << "last_hard_state=" << host->GetLastHardState() << "\n";
}

Expand Down
13 changes: 4 additions & 9 deletions lib/db_ido/dbevents.cpp
Expand Up @@ -983,8 +983,8 @@ void DbEvents::AddCheckResultLogHistory(const Checkable::Ptr& checkable, const C
msgbuf << "SERVICE ALERT: "
<< host->GetName() << ";"
<< service->GetShortName() << ";"
<< Service::StateToString(static_cast<ServiceState>(state_after)) << ";"
<< Service::StateTypeToString(static_cast<StateType>(stateType_after)) << ";"
<< Service::StateToString(service->GetState()) << ";"
<< Service::StateTypeToString(service->GetStateType()) << ";"
<< attempt_after << ";"
<< output << ""
<< "";
Expand All @@ -1008,15 +1008,10 @@ void DbEvents::AddCheckResultLogHistory(const Checkable::Ptr& checkable, const C
return;
}
} else {
String state = Host::StateToString(Host::CalculateState(static_cast<ServiceState>(state_after)));

if (!reachable_after)
state = "UNREACHABLE";

msgbuf << "HOST ALERT: "
<< host->GetName() << ";"
<< state << ";"
<< Service::StateTypeToString(static_cast<StateType>(stateType_after)) << ";"
<< CompatUtility::GetHostStateString(host) << ";"
<< Host::StateTypeToString(host->GetStateType()) << ";"
<< attempt_after << ";"
<< output << ""
<< "";
Expand Down
2 changes: 1 addition & 1 deletion lib/db_ido/hostdbobject.cpp
Expand Up @@ -122,7 +122,7 @@ Dictionary::Ptr HostDbObject::GetStatusFields(void) const
fields->Set("check_source", cr->GetCheckSource());
}

fields->Set("current_state", host->IsReachable() ? host->GetState() : 2);
fields->Set("current_state", CompatUtility::GetHostCurrentState(host));
fields->Set("has_been_checked", CompatUtility::GetCheckableHasBeenChecked(host));
fields->Set("should_be_scheduled", host->GetEnableActiveChecks());
fields->Set("current_check_attempt", host->GetCheckAttempt());
Expand Down
4 changes: 2 additions & 2 deletions lib/icinga/checkable-dependency.cpp
Expand Up @@ -69,8 +69,8 @@ bool Checkable::IsReachable(DependencyType dt, Dependency::Ptr *failedDependency
return false;
}

BOOST_FOREACH(const Checkable::Ptr& service, GetParents()) {
if (!service->IsReachable(dt, failedDependency, rstack + 1))
BOOST_FOREACH(const Checkable::Ptr& checkable, GetParents()) {
if (!checkable->IsReachable(dt, failedDependency, rstack + 1))
return false;
}

Expand Down
16 changes: 16 additions & 0 deletions lib/icinga/compatutility.cpp
Expand Up @@ -81,6 +81,22 @@ String CompatUtility::GetCommandName(const Command::Ptr command)
}

/* host */
int CompatUtility::GetHostCurrentState(const Host::Ptr& host)
{
if (host->GetState() != HostUp && !host->IsReachable())
return 2; /* hardcoded compat state */

return host->GetState();
}

String CompatUtility::GetHostStateString(const Host::Ptr& host)
{
if (host->GetState() != HostUp && !host->IsReachable())
return "UNREACHABLE"; /* hardcoded compat state */

return Host::StateToString(host->GetState());
}

String CompatUtility::GetHostAlias(const Host::Ptr& host)
{
if (!host->GetDisplayName().IsEmpty())
Expand Down
2 changes: 2 additions & 0 deletions lib/icinga/compatutility.hpp
Expand Up @@ -44,6 +44,8 @@ class I2_ICINGA_API CompatUtility
static String GetCommandName(const Command::Ptr command);

/* host */
static int GetHostCurrentState(const Host::Ptr& host);
static String GetHostStateString(const Host::Ptr& host);
static String GetHostAlias(const Host::Ptr& host);
static int GetHostNotifyOnDown(const Host::Ptr& host);
static int GetHostNotifyOnUnreachable(const Host::Ptr& host);
Expand Down
26 changes: 13 additions & 13 deletions lib/icinga/dependency.cpp
Expand Up @@ -135,47 +135,47 @@ bool Dependency::IsAvailable(DependencyType dt) const
{
Checkable::Ptr parent = GetParent();

Host::Ptr host;
Service::Ptr service;
tie(host, service) = GetHostService(parent);
Host::Ptr parentHost;
Service::Ptr parentService;
tie(parentHost, parentService) = GetHostService(parent);

/* ignore if it's the same checkable object */
if (parent == GetChild()) {
Log(LogNotice, "Dependency")
<< "Dependency '" << GetName() << "' passed: Parent and child " << (service ? "service" : "host") << " are identical.";
<< "Dependency '" << GetName() << "' passed: Parent and child " << (parentService ? "service" : "host") << " are identical.";
return true;
}

/* ignore pending */
if (!parent->GetLastCheckResult()) {
Log(LogNotice, "Dependency")
<< "Dependency '" << GetName() << "' passed: " << (service ? "Service" : "Host") << " '" << parent->GetName() << "' hasn't been checked yet.";
<< "Dependency '" << GetName() << "' passed: Parent " << (parentService ? "service" : "host") << " '" << parent->GetName() << "' hasn't been checked yet.";
return true;
}

if (GetIgnoreSoftStates()) {
/* ignore soft states */
if (parent->GetStateType() == StateTypeSoft) {
Log(LogNotice, "Dependency")
<< "Dependency '" << GetName() << "' passed: " << (service ? "Service" : "Host") << " '" << parent->GetName() << "' is in a soft state.";
<< "Dependency '" << GetName() << "' passed: Parent " << (parentService ? "service" : "host") << " '" << parent->GetName() << "' is in a soft state.";
return true;
}
} else {
Log(LogNotice, "Dependency")
<< "Dependency '" << GetName() << "' failed: " << (service ? "Service" : "Host") << " '" << parent->GetName() << "' is in a soft state.";
<< "Dependency '" << GetName() << "' failed: Parent " << (parentService ? "service" : "host") << " '" << parent->GetName() << "' is in a soft state.";
}

int state;

if (service)
state = ServiceStateToFilter(service->GetState());
if (parentService)
state = ServiceStateToFilter(parentService->GetState());
else
state = HostStateToFilter(host->GetState());
state = HostStateToFilter(parentHost->GetState());

/* check state */
if (state & GetStateFilter()) {
Log(LogNotice, "Dependency")
<< "Dependency '" << GetName() << "' passed: " << (service ? "Service" : "Host") << " '" << parent->GetName() << "' matches state filter.";
<< "Dependency '" << GetName() << "' passed: Parent " << (parentService ? "service" : "host") << " '" << parent->GetName() << "' matches state filter.";
return true;
}

Expand All @@ -199,8 +199,8 @@ bool Dependency::IsAvailable(DependencyType dt) const

Log(LogNotice, "Dependency")
<< "Dependency '" << GetName() << "' failed. Parent "
<< (service ? "service" : "host") << " '" << parent->GetName() << "' is "
<< (service ? Service::StateToString(service->GetState()) : Host::StateToString(host->GetState()));
<< (parentService ? "service" : "host") << " '" << parent->GetName() << "' is "
<< (parentService ? Service::StateToString(parentService->GetState()) : Host::StateToString(parentHost->GetState()));

return false;
}
Expand Down
2 changes: 1 addition & 1 deletion lib/perfdata/gelfwriter.cpp
Expand Up @@ -150,7 +150,7 @@ void GelfWriter::NotificationToUserHandler(const Notification::Ptr& notification
fields->Set("short_message", output);
} else {
fields->Set("_type", "HOST NOTIFICATION");
fields->Set("short_message", "(" + (host->IsReachable() ? Host::StateToString(host->GetState()) : String("UNREACHABLE")) + ")");
fields->Set("short_message", "(" + CompatUtility::GetHostStateString(host) + ")");
}

fields->Set("_state", service ? Service::StateToString(service->GetState()) : Host::StateToString(host->GetState()));
Expand Down

0 comments on commit 50cd694

Please sign in to comment.