From 745e86de9782b5bc29c8b57ca051e16e26e5707e Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Sun, 3 Feb 2013 16:32:31 +0100 Subject: [PATCH] Service::CheckCompletedHandler: Convert exceptions to fake check results. --- lib/icinga/service.cpp | 51 +++++++++++++++++++++++++----------------- 1 file changed, 30 insertions(+), 21 deletions(-) diff --git a/lib/icinga/service.cpp b/lib/icinga/service.cpp index b1aab631f..1f4c3278d 100644 --- a/lib/icinga/service.cpp +++ b/lib/icinga/service.cpp @@ -697,34 +697,43 @@ void Service::CheckCompletedHandler(const Dictionary::Ptr& scheduleInfo, scheduleInfo->Set("execution_end", Utility::GetTime()); scheduleInfo->Set("schedule_end", Utility::GetTime()); + Dictionary::Ptr result; + try { Value vresult = task->GetResult(); - if (vresult.IsObjectType()) { - Dictionary::Ptr result = vresult; - - if (!result->Contains("schedule_start")) - result->Set("schedule_start", scheduleInfo->Get("schedule_start")); - - if (!result->Contains("schedule_end")) - result->Set("schedule_end", scheduleInfo->Get("schedule_end")); - - if (!result->Contains("execution_start")) - result->Set("execution_start", scheduleInfo->Get("execution_start")); - - if (!result->Contains("execution_end")) - result->Set("execution_end", scheduleInfo->Get("execution_end")); - - if (!result->Contains("active")) - result->Set("active", 1); - - ProcessCheckResult(result); - } + if (vresult.IsObjectType()) + result = vresult; } catch (const exception& ex) { stringstream msgbuf; msgbuf << "Exception occured during check for service '" << GetName() << "': " << ex.what(); - Logger::Write(LogWarning, "checker", msgbuf.str()); + String message = msgbuf.str(); + + Logger::Write(LogWarning, "checker", message); + + result = boost::make_shared(); + result->Set("state", StateUnknown); + result->Set("output", message); + } + + if (result) { + if (!result->Contains("schedule_start")) + result->Set("schedule_start", scheduleInfo->Get("schedule_start")); + + if (!result->Contains("schedule_end")) + result->Set("schedule_end", scheduleInfo->Get("schedule_end")); + + if (!result->Contains("execution_start")) + result->Set("execution_start", scheduleInfo->Get("execution_start")); + + if (!result->Contains("execution_end")) + result->Set("execution_end", scheduleInfo->Get("execution_end")); + + if (!result->Contains("active")) + result->Set("active", 1); + + ProcessCheckResult(result); } /* figure out when the next check is for this service; the call to