mirror of
https://github.com/Icinga/icinga2.git
synced 2025-07-25 22:54:57 +02:00
Implemented script tasks.
This commit is contained in:
parent
6cbccdc91c
commit
30aa16d9dc
@ -34,6 +34,10 @@ libbase_la_SOURCES = \
|
|||||||
process.h \
|
process.h \
|
||||||
ringbuffer.cpp \
|
ringbuffer.cpp \
|
||||||
ringbuffer.h \
|
ringbuffer.h \
|
||||||
|
scriptfunction.cpp \
|
||||||
|
scriptfunction.h \
|
||||||
|
scripttask.cpp \
|
||||||
|
scripttask.h \
|
||||||
socket.cpp \
|
socket.cpp \
|
||||||
socket.h \
|
socket.h \
|
||||||
streamlogger.cpp \
|
streamlogger.cpp \
|
||||||
|
@ -36,11 +36,11 @@ public:
|
|||||||
|
|
||||||
void Start(void);
|
void Start(void);
|
||||||
|
|
||||||
|
void Finish(void);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual void Run(void) = 0;
|
virtual void Run(void) = 0;
|
||||||
|
|
||||||
void Finish(void);
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void ForwardCallback(void);
|
void ForwardCallback(void);
|
||||||
|
|
||||||
|
@ -25,6 +25,8 @@
|
|||||||
<ClCompile Include="objectset.cpp" />
|
<ClCompile Include="objectset.cpp" />
|
||||||
<ClCompile Include="process.cpp" />
|
<ClCompile Include="process.cpp" />
|
||||||
<ClCompile Include="ringbuffer.cpp" />
|
<ClCompile Include="ringbuffer.cpp" />
|
||||||
|
<ClCompile Include="scriptfunction.cpp" />
|
||||||
|
<ClCompile Include="scripttask.cpp" />
|
||||||
<ClCompile Include="socket.cpp" />
|
<ClCompile Include="socket.cpp" />
|
||||||
<ClCompile Include="streamlogger.cpp" />
|
<ClCompile Include="streamlogger.cpp" />
|
||||||
<ClCompile Include="sysloglogger.cpp" />
|
<ClCompile Include="sysloglogger.cpp" />
|
||||||
@ -46,6 +48,8 @@
|
|||||||
<ClInclude Include="configobject.h" />
|
<ClInclude Include="configobject.h" />
|
||||||
<ClInclude Include="dictionary.h" />
|
<ClInclude Include="dictionary.h" />
|
||||||
<ClInclude Include="event.h" />
|
<ClInclude Include="event.h" />
|
||||||
|
<ClInclude Include="scriptfunction.h" />
|
||||||
|
<ClInclude Include="scripttask.h" />
|
||||||
<ClInclude Include="logger.h" />
|
<ClInclude Include="logger.h" />
|
||||||
<ClInclude Include="objectmap.h" />
|
<ClInclude Include="objectmap.h" />
|
||||||
<ClInclude Include="objectset.h" />
|
<ClInclude Include="objectset.h" />
|
||||||
|
@ -82,6 +82,12 @@
|
|||||||
<ClCompile Include="asynctask.cpp">
|
<ClCompile Include="asynctask.cpp">
|
||||||
<Filter>Quelldateien</Filter>
|
<Filter>Quelldateien</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="scriptfunction.cpp">
|
||||||
|
<Filter>Quelldateien</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="scripttask.cpp">
|
||||||
|
<Filter>Quelldateien</Filter>
|
||||||
|
</ClCompile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClInclude Include="application.h">
|
<ClInclude Include="application.h">
|
||||||
@ -168,6 +174,12 @@
|
|||||||
<ClInclude Include="process.h">
|
<ClInclude Include="process.h">
|
||||||
<Filter>Headerdateien</Filter>
|
<Filter>Headerdateien</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
<ClInclude Include="scripttask.h">
|
||||||
|
<Filter>Headerdateien</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="scriptfunction.h">
|
||||||
|
<Filter>Headerdateien</Filter>
|
||||||
|
</ClInclude>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Filter Include="Quelldateien">
|
<Filter Include="Quelldateien">
|
||||||
|
@ -154,9 +154,9 @@ ConfigObject::Ptr ConfigObject::GetObject(string type, string name)
|
|||||||
|
|
||||||
bool ConfigObject::TypeAndNameGetter(const ConfigObject::Ptr& object, pair<string, string> *key)
|
bool ConfigObject::TypeAndNameGetter(const ConfigObject::Ptr& object, pair<string, string> *key)
|
||||||
{
|
{
|
||||||
*key = make_pair(object->GetType(), object->GetName());
|
*key = make_pair(object->GetType(), object->GetName());
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
function<bool (ConfigObject::Ptr)> ConfigObject::MakeTypePredicate(string type)
|
function<bool (ConfigObject::Ptr)> ConfigObject::MakeTypePredicate(string type)
|
||||||
@ -196,3 +196,22 @@ void ConfigObject::RemoveTag(const string& key)
|
|||||||
{
|
{
|
||||||
GetTags()->Remove(key);
|
GetTags()->Remove(key);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ScriptTask::Ptr ConfigObject::InvokeHook(const string& hook,
|
||||||
|
const vector<Variant>& arguments, AsyncTask::CompletionCallback callback)
|
||||||
|
{
|
||||||
|
Dictionary::Ptr hooks;
|
||||||
|
string funcName;
|
||||||
|
if (!GetProperty("hooks", &hooks) || !hooks->Get(hook, &funcName))
|
||||||
|
return ScriptTask::Ptr();
|
||||||
|
|
||||||
|
ScriptFunction::Ptr func = ScriptFunction::GetByName(funcName);
|
||||||
|
|
||||||
|
if (!func)
|
||||||
|
throw invalid_argument("Function '" + funcName + "' does not exist.");
|
||||||
|
|
||||||
|
ScriptTask::Ptr task = boost::make_shared<ScriptTask>(func, arguments, callback);
|
||||||
|
task->Start();
|
||||||
|
|
||||||
|
return task;
|
||||||
|
}
|
||||||
|
@ -65,6 +65,9 @@ public:
|
|||||||
|
|
||||||
void RemoveTag(const string& key);
|
void RemoveTag(const string& key);
|
||||||
|
|
||||||
|
ScriptTask::Ptr InvokeHook(const string& hook,
|
||||||
|
const vector<Variant>& arguments, AsyncTask::CompletionCallback callback);
|
||||||
|
|
||||||
string GetType(void) const;
|
string GetType(void) const;
|
||||||
string GetName(void) const;
|
string GetName(void) const;
|
||||||
|
|
||||||
@ -98,7 +101,7 @@ private:
|
|||||||
void SetCommitTimestamp(time_t ts);
|
void SetCommitTimestamp(time_t ts);
|
||||||
|
|
||||||
static bool TypeAndNameGetter(const ConfigObject::Ptr& object, pair<string, string> *key);
|
static bool TypeAndNameGetter(const ConfigObject::Ptr& object, pair<string, string> *key);
|
||||||
static bool TypePredicate(const ConfigObject::Ptr& object, string type);
|
static bool TypePredicate(const ConfigObject::Ptr& object, string type);
|
||||||
|
|
||||||
static bool TypeGetter(const ConfigObject::Ptr& object, string *key);
|
static bool TypeGetter(const ConfigObject::Ptr& object, string *key);
|
||||||
};
|
};
|
||||||
|
@ -167,6 +167,10 @@ using boost::system_time;
|
|||||||
#include "tcpclient.h"
|
#include "tcpclient.h"
|
||||||
#include "tcpserver.h"
|
#include "tcpserver.h"
|
||||||
#include "tlsclient.h"
|
#include "tlsclient.h"
|
||||||
|
#include "asynctask.h"
|
||||||
|
#include "process.h"
|
||||||
|
#include "scriptfunction.h"
|
||||||
|
#include "scripttask.h"
|
||||||
#include "objectset.h"
|
#include "objectset.h"
|
||||||
#include "objectmap.h"
|
#include "objectmap.h"
|
||||||
#include "configobject.h"
|
#include "configobject.h"
|
||||||
@ -176,7 +180,5 @@ using boost::system_time;
|
|||||||
#include "logger.h"
|
#include "logger.h"
|
||||||
#include "streamlogger.h"
|
#include "streamlogger.h"
|
||||||
#include "sysloglogger.h"
|
#include "sysloglogger.h"
|
||||||
#include "asynctask.h"
|
|
||||||
#include "process.h"
|
|
||||||
|
|
||||||
#endif /* I2BASE_H */
|
#endif /* I2BASE_H */
|
||||||
|
36
base/scriptfunction.cpp
Normal file
36
base/scriptfunction.cpp
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
#include "i2-base.h"
|
||||||
|
|
||||||
|
using namespace icinga;
|
||||||
|
|
||||||
|
map<string, ScriptFunction::Ptr> ScriptFunction::m_Functions;
|
||||||
|
|
||||||
|
ScriptFunction::ScriptFunction(const Callback& function)
|
||||||
|
: m_Callback(function)
|
||||||
|
{ }
|
||||||
|
|
||||||
|
void ScriptFunction::Register(const string& name, const ScriptFunction::Ptr& function)
|
||||||
|
{
|
||||||
|
m_Functions[name] = function;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ScriptFunction::Unregister(const string& name)
|
||||||
|
{
|
||||||
|
m_Functions.erase(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
ScriptFunction::Ptr ScriptFunction::GetByName(const string& name)
|
||||||
|
{
|
||||||
|
map<string, ScriptFunction::Ptr>::iterator it;
|
||||||
|
|
||||||
|
it = m_Functions.find(name);
|
||||||
|
|
||||||
|
if (it == m_Functions.end())
|
||||||
|
return ScriptFunction::Ptr();
|
||||||
|
|
||||||
|
return it->second;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ScriptFunction::Invoke(const ScriptTask::Ptr& task, const vector<Variant>& arguments)
|
||||||
|
{
|
||||||
|
m_Callback(task, arguments);
|
||||||
|
}
|
52
base/scriptfunction.h
Normal file
52
base/scriptfunction.h
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
/******************************************************************************
|
||||||
|
* Icinga 2 *
|
||||||
|
* Copyright (C) 2012 Icinga Development Team (http://www.icinga.org/) *
|
||||||
|
* *
|
||||||
|
* This program is free software; you can redistribute it and/or *
|
||||||
|
* modify it under the terms of the GNU General Public License *
|
||||||
|
* as published by the Free Software Foundation; either version 2 *
|
||||||
|
* of the License, or (at your option) any later version. *
|
||||||
|
* *
|
||||||
|
* This program is distributed in the hope that it will be useful, *
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
||||||
|
* GNU General Public License for more details. *
|
||||||
|
* *
|
||||||
|
* You should have received a copy of the GNU General Public License *
|
||||||
|
* along with this program; if not, write to the Free Software Foundation *
|
||||||
|
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. *
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
#ifndef SCRIPTFUNCTION_H
|
||||||
|
#define SCRIPTFUNCTION_H
|
||||||
|
|
||||||
|
namespace icinga
|
||||||
|
{
|
||||||
|
|
||||||
|
class ScriptTask;
|
||||||
|
|
||||||
|
class I2_BASE_API ScriptFunction : public Object
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
typedef shared_ptr<ScriptFunction> Ptr;
|
||||||
|
typedef weak_ptr<ScriptFunction> WeakPtr;
|
||||||
|
|
||||||
|
typedef function<void (const shared_ptr<ScriptTask>&, const vector<Variant>& arguments)> Callback;
|
||||||
|
|
||||||
|
ScriptFunction(const Callback& function);
|
||||||
|
|
||||||
|
static void Register(const string& name, const ScriptFunction::Ptr& function);
|
||||||
|
static void Unregister(const string& name);
|
||||||
|
static ScriptFunction::Ptr GetByName(const string& name);
|
||||||
|
|
||||||
|
void Invoke(const shared_ptr<ScriptTask>& task, const vector<Variant>& arguments);
|
||||||
|
|
||||||
|
private:
|
||||||
|
Callback m_Callback;
|
||||||
|
|
||||||
|
static map<string, ScriptFunction::Ptr> m_Functions;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* SCRIPTFUNCTION_H */
|
22
base/scripttask.cpp
Normal file
22
base/scripttask.cpp
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
#include "i2-base.h"
|
||||||
|
|
||||||
|
using namespace icinga;
|
||||||
|
|
||||||
|
ScriptTask::ScriptTask(const ScriptFunction::Ptr& function, const vector<Variant>& arguments, CompletionCallback callback)
|
||||||
|
: AsyncTask(callback), m_Function(function), m_Arguments(arguments)
|
||||||
|
{ }
|
||||||
|
|
||||||
|
void ScriptTask::Run(void)
|
||||||
|
{
|
||||||
|
m_Function->Invoke(GetSelf(), m_Arguments);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ScriptTask::SetResult(const Variant& result)
|
||||||
|
{
|
||||||
|
m_Result = result;
|
||||||
|
}
|
||||||
|
|
||||||
|
Variant ScriptTask::GetResult(void)
|
||||||
|
{
|
||||||
|
return m_Result;
|
||||||
|
}
|
48
base/scripttask.h
Normal file
48
base/scripttask.h
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
/******************************************************************************
|
||||||
|
* Icinga 2 *
|
||||||
|
* Copyright (C) 2012 Icinga Development Team (http://www.icinga.org/) *
|
||||||
|
* *
|
||||||
|
* This program is free software; you can redistribute it and/or *
|
||||||
|
* modify it under the terms of the GNU General Public License *
|
||||||
|
* as published by the Free Software Foundation; either version 2 *
|
||||||
|
* of the License, or (at your option) any later version. *
|
||||||
|
* *
|
||||||
|
* This program is distributed in the hope that it will be useful, *
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
||||||
|
* GNU General Public License for more details. *
|
||||||
|
* *
|
||||||
|
* You should have received a copy of the GNU General Public License *
|
||||||
|
* along with this program; if not, write to the Free Software Foundation *
|
||||||
|
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. *
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
#ifndef SCRIPTTASK_H
|
||||||
|
#define SCRIPTTASK_H
|
||||||
|
|
||||||
|
namespace icinga
|
||||||
|
{
|
||||||
|
|
||||||
|
class I2_BASE_API ScriptTask : public AsyncTask
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
typedef shared_ptr<ScriptTask> Ptr;
|
||||||
|
typedef weak_ptr<ScriptTask> WeakPtr;
|
||||||
|
|
||||||
|
ScriptTask(const ScriptFunction::Ptr& function, const vector<Variant>& arguments, CompletionCallback callback);
|
||||||
|
|
||||||
|
void SetResult(const Variant& result);
|
||||||
|
Variant GetResult(void);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
virtual void Run(void);
|
||||||
|
|
||||||
|
private:
|
||||||
|
ScriptFunction::Ptr m_Function;
|
||||||
|
vector<Variant> m_Arguments;
|
||||||
|
Variant m_Result;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* SCRIPTTASK_H */
|
@ -81,7 +81,6 @@
|
|||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClInclude Include="checkresult.h" />
|
<ClInclude Include="checkresult.h" />
|
||||||
<ClInclude Include="checktask.h" />
|
|
||||||
<ClInclude Include="cib.h" />
|
<ClInclude Include="cib.h" />
|
||||||
<ClInclude Include="configobjectadapter.h" />
|
<ClInclude Include="configobjectadapter.h" />
|
||||||
<ClInclude Include="host.h" />
|
<ClInclude Include="host.h" />
|
||||||
@ -95,7 +94,6 @@
|
|||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClCompile Include="checkresult.cpp" />
|
<ClCompile Include="checkresult.cpp" />
|
||||||
<ClCompile Include="checktask.cpp" />
|
|
||||||
<ClCompile Include="cib.cpp" />
|
<ClCompile Include="cib.cpp" />
|
||||||
<ClCompile Include="configobjectadapter.cpp" />
|
<ClCompile Include="configobjectadapter.cpp" />
|
||||||
<ClCompile Include="host.cpp" />
|
<ClCompile Include="host.cpp" />
|
||||||
|
@ -14,9 +14,6 @@
|
|||||||
<ClInclude Include="checkresult.h">
|
<ClInclude Include="checkresult.h">
|
||||||
<Filter>Headerdateien</Filter>
|
<Filter>Headerdateien</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
<ClInclude Include="checktask.h">
|
|
||||||
<Filter>Headerdateien</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="cib.h">
|
<ClInclude Include="cib.h">
|
||||||
<Filter>Headerdateien</Filter>
|
<Filter>Headerdateien</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
@ -52,9 +49,6 @@
|
|||||||
<ClCompile Include="checkresult.cpp">
|
<ClCompile Include="checkresult.cpp">
|
||||||
<Filter>Quelldateien</Filter>
|
<Filter>Quelldateien</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClCompile Include="checktask.cpp">
|
|
||||||
<Filter>Quelldateien</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="cib.cpp">
|
<ClCompile Include="cib.cpp">
|
||||||
<Filter>Quelldateien</Filter>
|
<Filter>Quelldateien</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
@ -45,3 +45,9 @@ void ConfigObjectAdapter::RemoveTag(const string& key)
|
|||||||
{
|
{
|
||||||
m_ConfigObject->RemoveTag(key);
|
m_ConfigObject->RemoveTag(key);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ScriptTask::Ptr ConfigObjectAdapter::InvokeHook(const string& hook,
|
||||||
|
const vector<Variant>& arguments, AsyncTask::CompletionCallback callback)
|
||||||
|
{
|
||||||
|
return m_ConfigObject->InvokeHook(hook, arguments, callback);
|
||||||
|
}
|
@ -57,6 +57,9 @@ public:
|
|||||||
|
|
||||||
void RemoveTag(const string& key);
|
void RemoveTag(const string& key);
|
||||||
|
|
||||||
|
ScriptTask::Ptr InvokeHook(const string& hook,
|
||||||
|
const vector<Variant>& arguments, AsyncTask::CompletionCallback callback);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
ConfigObject::Ptr m_ConfigObject;
|
ConfigObject::Ptr m_ConfigObject;
|
||||||
};
|
};
|
||||||
|
@ -21,39 +21,47 @@
|
|||||||
|
|
||||||
using namespace icinga;
|
using namespace icinga;
|
||||||
|
|
||||||
NagiosCheckTask::NagiosCheckTask(const Service& service, const CompletionCallback& completionCallback)
|
void NagiosCheckTask::ScriptFunc(const ScriptTask::Ptr& task, const vector<Variant>& arguments)
|
||||||
: CheckTask(service, completionCallback)
|
|
||||||
{
|
{
|
||||||
|
if (arguments.size() < 1)
|
||||||
|
throw invalid_argument("Missing argument: Service must be specified.");
|
||||||
|
|
||||||
|
Variant vservice = arguments[0];
|
||||||
|
if (!vservice.IsObjectType<ConfigObject>())
|
||||||
|
throw invalid_argument("Argument must be a config object.");
|
||||||
|
|
||||||
|
Service service = static_cast<ConfigObject::Ptr>(vservice);
|
||||||
|
|
||||||
string checkCommand = service.GetCheckCommand();
|
string checkCommand = service.GetCheckCommand();
|
||||||
|
|
||||||
vector<Dictionary::Ptr> macroDicts;
|
vector<Dictionary::Ptr> macroDicts;
|
||||||
macroDicts.push_back(service.GetMacros());
|
macroDicts.push_back(service.GetMacros());
|
||||||
macroDicts.push_back(service.GetHost().GetMacros());
|
macroDicts.push_back(service.GetHost().GetMacros());
|
||||||
macroDicts.push_back(IcingaApplication::GetInstance()->GetMacros());
|
macroDicts.push_back(IcingaApplication::GetInstance()->GetMacros());
|
||||||
m_Command = MacroProcessor::ResolveMacros(checkCommand, macroDicts);
|
string command = MacroProcessor::ResolveMacros(checkCommand, macroDicts);
|
||||||
}
|
|
||||||
|
CheckResult result;
|
||||||
|
|
||||||
void NagiosCheckTask::Run(void)
|
|
||||||
{
|
|
||||||
time_t now;
|
time_t now;
|
||||||
time(&now);
|
time(&now);
|
||||||
GetResult().SetScheduleStart(now);
|
result.SetScheduleStart(now);
|
||||||
|
|
||||||
m_Process = boost::make_shared<Process>(m_Command, boost::bind(&NagiosCheckTask::ProcessFinishedHandler, static_cast<NagiosCheckTask::Ptr>(GetSelf())));
|
Process::Ptr process = boost::make_shared<Process>(command, boost::bind(&NagiosCheckTask::ProcessFinishedHandler, task, _1, result));
|
||||||
m_Process->Start();
|
process->Start();
|
||||||
}
|
}
|
||||||
|
|
||||||
void NagiosCheckTask::ProcessFinishedHandler(void)
|
void NagiosCheckTask::ProcessFinishedHandler(const ScriptTask::Ptr& task, const AsyncTask::Ptr& aprocess, CheckResult result)
|
||||||
{
|
{
|
||||||
GetResult().SetExecutionStart(m_Process->GetExecutionStart());
|
Process::Ptr process = static_pointer_cast<Process>(aprocess);
|
||||||
GetResult().SetExecutionEnd(m_Process->GetExecutionEnd());
|
|
||||||
|
|
||||||
string output = m_Process->GetOutput();
|
result.SetExecutionStart(process->GetExecutionStart());
|
||||||
long exitcode = m_Process->GetExitStatus();
|
result.SetExecutionEnd(process->GetExecutionEnd());
|
||||||
m_Process.reset();
|
|
||||||
|
string output = process->GetOutput();
|
||||||
|
long exitcode = process->GetExitStatus();
|
||||||
|
|
||||||
boost::algorithm::trim(output);
|
boost::algorithm::trim(output);
|
||||||
ProcessCheckOutput(output);
|
ProcessCheckOutput(result, output);
|
||||||
|
|
||||||
ServiceState state;
|
ServiceState state;
|
||||||
|
|
||||||
@ -72,16 +80,17 @@ void NagiosCheckTask::ProcessFinishedHandler(void)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
GetResult().SetState(state);
|
result.SetState(state);
|
||||||
|
|
||||||
time_t now;
|
time_t now;
|
||||||
time(&now);
|
time(&now);
|
||||||
GetResult().SetScheduleEnd(now);
|
result.SetScheduleEnd(now);
|
||||||
|
|
||||||
Finish();
|
task->SetResult(result.GetDictionary());
|
||||||
|
task->Finish();
|
||||||
}
|
}
|
||||||
|
|
||||||
void NagiosCheckTask::ProcessCheckOutput(const string& output)
|
void NagiosCheckTask::ProcessCheckOutput(CheckResult& result, const string& output)
|
||||||
{
|
{
|
||||||
string text;
|
string text;
|
||||||
string perfdata;
|
string perfdata;
|
||||||
@ -110,16 +119,12 @@ void NagiosCheckTask::ProcessCheckOutput(const string& output)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
GetResult().SetOutput(text);
|
result.SetOutput(text);
|
||||||
GetResult().SetPerformanceDataRaw(perfdata);
|
result.SetPerformanceDataRaw(perfdata);
|
||||||
}
|
|
||||||
|
|
||||||
CheckTask::Ptr NagiosCheckTask::CreateTask(const Service& service, const CompletionCallback& completionCallback)
|
|
||||||
{
|
|
||||||
return boost::make_shared<NagiosCheckTask>(service, completionCallback);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void NagiosCheckTask::Register(void)
|
void NagiosCheckTask::Register(void)
|
||||||
{
|
{
|
||||||
CheckTask::RegisterType("nagios", NagiosCheckTask::CreateTask);
|
ScriptFunction::Ptr func = boost::make_shared<ScriptFunction>(&NagiosCheckTask::ScriptFunc);
|
||||||
|
ScriptFunction::Register("builtin::NagiosCheck", func);
|
||||||
}
|
}
|
||||||
|
@ -23,25 +23,16 @@
|
|||||||
namespace icinga
|
namespace icinga
|
||||||
{
|
{
|
||||||
|
|
||||||
class I2_CIB_API NagiosCheckTask : public CheckTask
|
class I2_CIB_API NagiosCheckTask
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
typedef shared_ptr<NagiosCheckTask> Ptr;
|
static void ScriptFunc(const ScriptTask::Ptr& task, const vector<Variant>& arguments);
|
||||||
typedef weak_ptr<NagiosCheckTask> WeakPtr;
|
|
||||||
|
|
||||||
NagiosCheckTask(const Service& service, const CompletionCallback& completionCallback);
|
|
||||||
|
|
||||||
static CheckTask::Ptr CreateTask(const Service& service, const CompletionCallback& completionCallback);
|
|
||||||
|
|
||||||
static void Register(void);
|
static void Register(void);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
string m_Command;
|
static void ProcessFinishedHandler(const ScriptTask::Ptr& task, const AsyncTask::Ptr& aprocess, CheckResult result);
|
||||||
Process::Ptr m_Process;
|
static void ProcessCheckOutput(CheckResult& result, const string& output);
|
||||||
|
|
||||||
virtual void Run(void);
|
|
||||||
void ProcessFinishedHandler(void);
|
|
||||||
void ProcessCheckOutput(const string& output);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -68,13 +68,6 @@ Dictionary::Ptr Service::GetMacros(void) const
|
|||||||
return macros;
|
return macros;
|
||||||
}
|
}
|
||||||
|
|
||||||
string Service::GetCheckType(void) const
|
|
||||||
{
|
|
||||||
string value = "nagios";
|
|
||||||
GetProperty("check_type", &value);
|
|
||||||
return value;
|
|
||||||
}
|
|
||||||
|
|
||||||
string Service::GetCheckCommand(void) const
|
string Service::GetCheckCommand(void) const
|
||||||
{
|
{
|
||||||
string value;
|
string value;
|
||||||
@ -416,5 +409,5 @@ Dictionary::Ptr Service::ResolveDependencies(Host host, const Dictionary::Ptr& d
|
|||||||
result->Set(name, name);
|
result->Set(name, name);
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
@ -52,7 +52,6 @@ public:
|
|||||||
string GetAlias(void) const;
|
string GetAlias(void) const;
|
||||||
Host GetHost(void) const;
|
Host GetHost(void) const;
|
||||||
Dictionary::Ptr GetMacros(void) const;
|
Dictionary::Ptr GetMacros(void) const;
|
||||||
string GetCheckType(void) const;
|
|
||||||
string GetCheckCommand(void) const;
|
string GetCheckCommand(void) const;
|
||||||
long GetMaxCheckAttempts(void) const;
|
long GetMaxCheckAttempts(void) const;
|
||||||
long GetCheckInterval(void) const;
|
long GetCheckInterval(void) const;
|
||||||
|
@ -76,10 +76,16 @@ void CheckerComponent::CheckTimerHandler(void)
|
|||||||
|
|
||||||
Logger::Write(LogDebug, "checker", "Executing service check for '" + service.GetName() + "'");
|
Logger::Write(LogDebug, "checker", "Executing service check for '" + service.GetName() + "'");
|
||||||
|
|
||||||
|
vector<Variant> arguments;
|
||||||
|
arguments.push_back(service.GetConfigObject());
|
||||||
|
ScriptTask::Ptr task;
|
||||||
|
task = service.InvokeHook("check", arguments, boost::bind(&CheckerComponent::CheckCompletedHandler, this, service, _1));
|
||||||
|
assert(task); /* TODO: gracefully handle missing hooks */
|
||||||
|
|
||||||
m_PendingServices.insert(service.GetConfigObject());
|
m_PendingServices.insert(service.GetConfigObject());
|
||||||
|
|
||||||
CheckTask::Ptr task = CheckTask::CreateTask(service, boost::bind(&CheckerComponent::CheckCompletedHandler, this, _1));
|
/*CheckTask::Ptr task = CheckTask::CreateTask(service, boost::bind(&CheckerComponent::CheckCompletedHandler, this, _1));
|
||||||
task->Start();
|
task->Start();*/
|
||||||
|
|
||||||
service.SetTag("current_task", task);
|
service.SetTag("current_task", task);
|
||||||
|
|
||||||
@ -93,10 +99,9 @@ void CheckerComponent::CheckTimerHandler(void)
|
|||||||
Logger::Write(LogInformation, "checker", msgbuf.str());
|
Logger::Write(LogInformation, "checker", msgbuf.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
void CheckerComponent::CheckCompletedHandler(const AsyncTask::Ptr& atask)
|
void CheckerComponent::CheckCompletedHandler(Service& service, const AsyncTask::Ptr& atask)
|
||||||
{
|
{
|
||||||
CheckTask::Ptr task = static_pointer_cast<CheckTask>(atask);
|
ScriptTask::Ptr task = static_pointer_cast<ScriptTask>(atask);
|
||||||
Service service = task->GetService();
|
|
||||||
|
|
||||||
service.RemoveTag("current_task");
|
service.RemoveTag("current_task");
|
||||||
|
|
||||||
@ -105,7 +110,16 @@ void CheckerComponent::CheckCompletedHandler(const AsyncTask::Ptr& atask)
|
|||||||
if (m_PendingServices.find(service.GetConfigObject()) == m_PendingServices.end())
|
if (m_PendingServices.find(service.GetConfigObject()) == m_PendingServices.end())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
CheckResult result = task->GetResult();
|
/* remove the service from the list of pending services */
|
||||||
|
m_PendingServices.erase(service.GetConfigObject());
|
||||||
|
m_Services.push(service);
|
||||||
|
|
||||||
|
Variant vresult = task->GetResult();
|
||||||
|
if (!vresult.IsObjectType<Dictionary>())
|
||||||
|
return;
|
||||||
|
|
||||||
|
CheckResult result = static_cast<Dictionary::Ptr>(vresult);
|
||||||
|
|
||||||
Logger::Write(LogDebug, "checker", "Got result for service '" + service.GetName() + "'");
|
Logger::Write(LogDebug, "checker", "Got result for service '" + service.GetName() + "'");
|
||||||
|
|
||||||
long execution_time = result.GetExecutionEnd() - result.GetExecutionStart();
|
long execution_time = result.GetExecutionEnd() - result.GetExecutionStart();
|
||||||
@ -117,10 +131,6 @@ void CheckerComponent::CheckCompletedHandler(const AsyncTask::Ptr& atask)
|
|||||||
/* figure out when the next check is for this service */
|
/* figure out when the next check is for this service */
|
||||||
service.UpdateNextCheck();
|
service.UpdateNextCheck();
|
||||||
|
|
||||||
/* remove the service from the list of pending services */
|
|
||||||
m_PendingServices.erase(service.GetConfigObject());
|
|
||||||
m_Services.push(service);
|
|
||||||
|
|
||||||
RequestMessage rm;
|
RequestMessage rm;
|
||||||
rm.SetMethod("checker::CheckResult");
|
rm.SetMethod("checker::CheckResult");
|
||||||
|
|
||||||
|
@ -60,7 +60,7 @@ private:
|
|||||||
void CheckTimerHandler(void);
|
void CheckTimerHandler(void);
|
||||||
void ResultTimerHandler(void);
|
void ResultTimerHandler(void);
|
||||||
|
|
||||||
void CheckCompletedHandler(const AsyncTask::Ptr& task);
|
void CheckCompletedHandler(Service& service, const AsyncTask::Ptr& atask);
|
||||||
|
|
||||||
void AdjustCheckTimer(void);
|
void AdjustCheckTimer(void);
|
||||||
|
|
||||||
|
@ -40,7 +40,9 @@ object host "localhost" {
|
|||||||
}
|
}
|
||||||
|
|
||||||
abstract object service "nagios-service" {
|
abstract object service "nagios-service" {
|
||||||
check_type = "nagios",
|
hooks = {
|
||||||
|
check = "builtin::NagiosCheck"
|
||||||
|
},
|
||||||
|
|
||||||
macros = {
|
macros = {
|
||||||
plugindir = "/usr/local/icinga/libexec"
|
plugindir = "/usr/local/icinga/libexec"
|
||||||
|
@ -34,6 +34,12 @@ IcingaApplication::IcingaApplication(void)
|
|||||||
: m_PidPath(DefaultPidPath)
|
: m_PidPath(DefaultPidPath)
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
|
void TestScriptFunc(const ScriptTask::Ptr& task, const vector<Variant>& arguments)
|
||||||
|
{
|
||||||
|
std::cout << "Got " << arguments.size() << " arguments." << std::endl;
|
||||||
|
task->Finish();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The entry point for the Icinga application.
|
* The entry point for the Icinga application.
|
||||||
*
|
*
|
||||||
|
Loading…
x
Reference in New Issue
Block a user