}
}
-String Process::PrettyPrintArguments(void) const
+String Process::PrettyPrintArguments(const Process::Arguments& arguments)
{
#ifdef _WIN32
- return "'" + m_Arguments + "'";
+ return "'" + arguments + "'";
#else /* _WIN32 */
- return "'" + boost::algorithm::join(m_Arguments, "' '") + "'";
+ return "'" + boost::algorithm::join(arguments, "' '") + "'";
#endif /* _WIN32 */
}
m_FD = outReadPipe;
m_PID = pi.dwProcessId;
- Log(LogNotice, "Process", "Running command " + PrettyPrintArguments() +
+ Log(LogNotice, "Process", "Running command " + PrettyPrintArguments(m_Arguments) +
": PID " + Convert::ToString(m_PID));
#else /* _WIN32 */
// child process
if (dup2(fds[1], STDOUT_FILENO) < 0 || dup2(fds[1], STDERR_FILENO) < 0) {
- perror("dup2() failed.");
+ perror("dup2() failed");
_exit(128);
}
char errmsg[512];
strcpy(errmsg, "execvpe(");
strncat(errmsg, argv[0], sizeof(errmsg) - 1);
- strncat(errmsg, ") failed.", sizeof(errmsg) - 1);
+ strncat(errmsg, ") failed", sizeof(errmsg) - 1);
errmsg[sizeof(errmsg) - 1] = '\0';
perror(errmsg);
_exit(128);
m_PID = m_Process;
- Log(LogNotice, "Process", "Running command " + PrettyPrintArguments() + ": PID " + Convert::ToString(m_PID));
+ Log(LogNotice, "Process", "Running command " + PrettyPrintArguments(m_Arguments) +
+ ": PID " + Convert::ToString(m_PID));
// free arguments
for (int i = 0; argv[i] != NULL; i++)
if (timeout < Utility::GetTime()) {
Log(LogWarning, "Process", "Killing process " + Convert::ToString(m_PID) +
- " (" + PrettyPrintArguments() + ") after timeout of " + Convert::ToString(m_Timeout) + " seconds");
+ " (" + PrettyPrintArguments(m_Arguments) + ") after timeout of " +
+ Convert::ToString(m_Timeout) + " seconds");
m_OutputStream << "<Timeout exceeded.>";
#ifdef _WIN32
DWORD exitcode;
GetExitCodeProcess(m_Process, &exitcode);
- Log((exitcode == 0) ? LogNotice : LogWarning, "Process", "PID " + Convert::ToString(m_PID) +
- " (" + PrettyPrintArguments() + ") terminated with exit code " + Convert::ToString(exitcode));
+ Log(LogNotice, "Process", "PID " + Convert::ToString(m_PID) +
+ " (" + PrettyPrintArguments(m_Arguments) + ") terminated with exit code " +
+ Convert::ToString(exitcode));
#else /* _WIN32 */
int status, exitcode;
if (waitpid(m_Process, &status, 0) != m_Process) {
if (WIFEXITED(status)) {
exitcode = WEXITSTATUS(status);
- Log((exitcode == 0) ? LogNotice : LogWarning, "Process", "PID " + Convert::ToString(m_PID) +
- " (" + PrettyPrintArguments() + ") terminated with exit code " + Convert::ToString(exitcode));
+ Log(LogNotice, "Process", "PID " + Convert::ToString(m_PID) +
+ " (" + PrettyPrintArguments(m_Arguments) + ") terminated with exit code " +
+ Convert::ToString(exitcode));
} else if (WIFSIGNALED(status)) {
Log(LogWarning, "Process", "PID " + Convert::ToString(m_PID) + " was terminated by signal " +
Convert::ToString(WTERMSIG(status)));
}
#endif /* _WIN32 */
+ m_Result.PID = m_PID;
m_Result.ExecutionEnd = Utility::GetTime();
m_Result.ExitStatus = exitcode;
m_Result.Output = output;
*/
struct ProcessResult
{
+ pid_t PID;
double ExecutionStart;
double ExecutionEnd;
long ExitStatus;
static void StaticInitialize(void);
static void ThreadInitialize(void);
+ static String PrettyPrintArguments(const Arguments& arguments);
+
private:
Arguments m_Arguments;
Dictionary::Ptr m_ExtraEnvironment;
static void IOThreadProc(int tid);
bool DoEvents(void);
int GetTID(void) const;
-
- String PrettyPrintArguments(void) const;
};
}
#include "base/scriptfunction.hpp"
#include "base/utility.hpp"
#include "base/process.hpp"
+#include "base/convert.hpp"
#include <boost/algorithm/string/classification.hpp>
#include <boost/algorithm/string/split.hpp>
#include <boost/foreach.hpp>
void PluginCheckTask::ProcessFinishedHandler(const Checkable::Ptr& checkable, const CheckResult::Ptr& cr, const Value& commandLine, const ProcessResult& pr)
{
+ if (pr.ExitStatus > 3) {
+ Process::Arguments parguments = Process::PrepareCommand(commandLine);
+ Log(LogWarning, "PluginCheckTask", "Check command for object '" + checkable->GetName() + "' (PID: " + Convert::ToString(pr.PID) +
+ ", arguments: " + Process::PrettyPrintArguments(parguments) + ") terminated with exit code " +
+ Convert::ToString(pr.ExitStatus) + ", output: " + pr.Output);
+ }
+
String output = pr.Output;
output.Trim();
std::pair<String, Value> co = PluginUtility::ParseCheckOutput(output);
private:
PluginCheckTask(void);
- static void ProcessFinishedHandler(const Checkable::Ptr& service, const CheckResult::Ptr& cr, const Value& commandLine, const ProcessResult& pr);
-
+ static void ProcessFinishedHandler(const Checkable::Ptr& service,
+ const CheckResult::Ptr& cr, const Value& commandLine, const ProcessResult& pr);
};
}
#include "base/scriptfunction.hpp"
#include "base/utility.hpp"
#include "base/process.hpp"
+#include "base/convert.hpp"
#include <boost/foreach.hpp>
using namespace icinga;
PluginUtility::ExecuteCommand(commandObj, checkable, checkable->GetLastCheckResult(), resolvers, boost::bind(&PluginEventTask::ProcessFinishedHandler, checkable, _1, _2));
}
-void PluginEventTask::ProcessFinishedHandler(const Checkable::Ptr& checkable, const Value& command, const ProcessResult& pr)
+void PluginEventTask::ProcessFinishedHandler(const Checkable::Ptr& checkable, const Value& commandLine, const ProcessResult& pr)
{
if (pr.ExitStatus != 0) {
- std::ostringstream msgbuf;
- msgbuf << "Event command '" << command << "' for object '"
- << checkable->GetName() << "' failed; exit status: "
- << pr.ExitStatus << ", output: " << pr.Output;
- Log(LogWarning, "PluginEventTask", msgbuf.str());
+ Process::Arguments parguments = Process::PrepareCommand(commandLine);
+ Log(LogNotice, "PluginEventTask", "Event command for object '" + checkable->GetName() + "' (PID: " + Convert::ToString(pr.PID) +
+ ", arguments: " + Process::PrettyPrintArguments(parguments) + ") terminated with exit code " +
+ Convert::ToString(pr.ExitStatus) + ", output: " + pr.Output);
}
}
private:
PluginEventTask(void);
- static void ProcessFinishedHandler(const Checkable::Ptr& checkable, const Value& command, const ProcessResult& pr);
+ static void ProcessFinishedHandler(const Checkable::Ptr& checkable,
+ const Value& commandLine, const ProcessResult& pr);
};
}
#include "base/logger_fwd.hpp"
#include "base/utility.hpp"
#include "base/process.hpp"
+#include "base/convert.hpp"
#include <boost/foreach.hpp>
using namespace icinga;
PluginUtility::ExecuteCommand(commandObj, checkable, cr, resolvers, boost::bind(&PluginNotificationTask::ProcessFinishedHandler, checkable, _1, _2));
}
-void PluginNotificationTask::ProcessFinishedHandler(const Checkable::Ptr& checkable, const Value& command, const ProcessResult& pr)
+void PluginNotificationTask::ProcessFinishedHandler(const Checkable::Ptr& checkable, const Value& commandLine, const ProcessResult& pr)
{
if (pr.ExitStatus != 0) {
- std::ostringstream msgbuf;
- msgbuf << "Notification command '" << command << "' for object '"
- << checkable->GetName() << "' failed; exit status: "
- << pr.ExitStatus << ", output: " << pr.Output;
- Log(LogWarning, "PluginNotificationTask", msgbuf.str());
+ Process::Arguments parguments = Process::PrepareCommand(commandLine);
+ Log(LogWarning, "PluginNotificationTask", "Notification command for object '" + checkable->GetName() + "' (PID: " + Convert::ToString(pr.PID) +
+ ", arguments: " + Process::PrettyPrintArguments(parguments) + ") terminated with exit code " +
+ Convert::ToString(pr.ExitStatus) + ", output: " + pr.Output);
}
}
private:
PluginNotificationTask(void);
- static void ProcessFinishedHandler(const Checkable::Ptr& checkable, const Value& command, const ProcessResult& pr);
+ static void ProcessFinishedHandler(const Checkable::Ptr& checkable,
+ const Value& commandLine, const ProcessResult& pr);
};
}