CheckTimeView::iterator it = idx.begin();
Service::Ptr service = *it;
- if (service->GetNextCheck() > now)
+ double next_check = service->GetNextCheck();
+
+ if (next_check > now)
break;
idx.erase(it);
m_PendingServices.insert(service);
+ /* keep track of scheduling info in case the check type doesn't provide its own information */
+ Dictionary::Ptr scheduleInfo = boost::make_shared<Dictionary>();
+ scheduleInfo->Set("schedule_start", next_check);
+ scheduleInfo->Set("execution_start", Utility::GetTime());
+
vector<Value> arguments;
arguments.push_back(service);
ScriptTask::Ptr task;
- task = service->InvokeMethod("check", arguments, boost::bind(&CheckerComponent::CheckCompletedHandler, this, service, _1));
+ task = service->InvokeMethod("check", arguments, boost::bind(&CheckerComponent::CheckCompletedHandler, this, service, scheduleInfo, _1));
assert(task); /* TODO: gracefully handle missing methods */
service->Set("current_task", task);
}
}
-void CheckerComponent::CheckCompletedHandler(const Service::Ptr& service, const ScriptTask::Ptr& task)
+void CheckerComponent::CheckCompletedHandler(const Service::Ptr& service, const Dictionary::Ptr& scheduleInfo, const ScriptTask::Ptr& task)
{
service->Set("current_task", Empty);
+ scheduleInfo->Set("execution_end", Utility::GetTime());
+ scheduleInfo->Set("schedule_end", Utility::GetTime());
+
try {
Value vresult = task->GetResult();
if (vresult.IsObjectType<Dictionary>()) {
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"));
+
service->ApplyCheckResult(result);
RequestMessage rm;
double now = Utility::GetTime();
Dictionary::Ptr cr = boost::make_shared<Dictionary>();
- cr->Set("schedule_start", now);
- cr->Set("schedule_end", now);
- cr->Set("execution_start", now);
- cr->Set("execution_end", now);
cr->Set("state", StateUnknown);
task->FinishResult(cr);
PluginCheckTask ct(task, process);
- ct.m_Result = boost::make_shared<Dictionary>();
- ct.m_Result->Set("schedule_start", Utility::GetTime());
-
process->Start(boost::bind(&PluginCheckTask::ProcessFinishedHandler, ct));
}
return;
}
- ct.m_Result->Set("execution_start", pr.ExecutionStart);
- ct.m_Result->Set("execution_end", pr.ExecutionEnd);
+ Dictionary::Ptr result = boost::make_shared<Dictionary>();
+ result->Set("execution_start", pr.ExecutionStart);
+ result->Set("execution_end", pr.ExecutionEnd);
String output = pr.Output;
output.Trim();
- ProcessCheckOutput(ct.m_Result, output);
+ ProcessCheckOutput(result, output);
ServiceState state;
break;
}
- ct.m_Result->Set("state", state);
-
- ct.m_Result->Set("schedule_end", Utility::GetTime());
+ result->Set("state", state);
- ct.m_Task->FinishResult(ct.m_Result);
+ ct.m_Task->FinishResult(result);
}
void PluginCheckTask::ProcessCheckOutput(const Dictionary::Ptr& result, String& output)