From: Gunnar Beutner Date: Thu, 24 Jan 2013 22:42:02 +0000 (+0100) Subject: Implement the PROCESS_FILE external command. X-Git-Tag: v0.0.2~653 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=54ffa0a1445bb77baeac5386d994fbab64a67cd9;p=icinga2 Implement the PROCESS_FILE external command. --- diff --git a/components/compat/compatcomponent.cpp b/components/compat/compatcomponent.cpp index a4235d2cc..531f04be5 100644 --- a/components/compat/compatcomponent.cpp +++ b/components/compat/compatcomponent.cpp @@ -147,48 +147,10 @@ void CompatComponent::CommandPipeThread(const String& commandPath) void CompatComponent::ProcessCommand(const String& command) { - if (command.IsEmpty()) - return; - - if (command[0] != '[') { - Logger::Write(LogWarning, "compat", "Missing timestamp in command: " + command); - - return; - } - - size_t pos = command.FindFirstOf("]"); - - if (pos == String::NPos) { - Logger::Write(LogWarning, "compat", "Missing timestamp in command: " + command); - - return; - } - - String timestamp = command.SubStr(1, pos - 1); - String args = command.SubStr(pos + 2, String::NPos); - - double ts = timestamp.ToDouble(); - - if (ts == 0) { - Logger::Write(LogWarning, "compat", "Invalid timestamp in command: " + command); - - return; - } - - vector argv = args.Split(is_any_of(";")); - - if (argv.size() == 0) { - Logger::Write(LogWarning, "compat", "Missing arguments in command: " + command); - - return; - } - - vector argvExtra(argv.begin() + 1, argv.end()); - try { Logger::Write(LogInformation, "compat", "Executing external command: " + command); - ExternalCommand::Execute(ts, argv[0], argvExtra); + ExternalCommand::Execute(command); } catch (const exception& ex) { stringstream msgbuf; msgbuf << "External command failed: " << ex.what(); diff --git a/lib/icinga/externalcommand.cpp b/lib/icinga/externalcommand.cpp index f4d99041a..cf7296ed0 100644 --- a/lib/icinga/externalcommand.cpp +++ b/lib/icinga/externalcommand.cpp @@ -24,6 +24,36 @@ using namespace icinga; bool I2_EXPORT ExternalCommand::m_Initialized; map I2_EXPORT ExternalCommand::m_Commands; +void ExternalCommand::Execute(const String& line) +{ + if (line.IsEmpty()) + return; + + if (line[0] != '[') + throw_exception(invalid_argument("Missing timestamp in command: " + line)); + + size_t pos = line.FindFirstOf("]"); + + if (pos == String::NPos) + throw_exception(invalid_argument("Missing timestamp in command: " + line)); + + String timestamp = line.SubStr(1, pos - 1); + String args = line.SubStr(pos + 2, String::NPos); + + double ts = timestamp.ToDouble(); + + if (ts == 0) + throw_exception(invalid_argument("Invalid timestamp in command: " + line)); + + vector argv = args.Split(is_any_of(";")); + + if (argv.size() == 0) + throw_exception(invalid_argument("Missing arguments in command: " + line)); + + vector argvExtra(argv.begin() + 1, argv.end()); + Execute(ts, argv[0], argvExtra); +} + void ExternalCommand::Execute(double time, const String& command, const vector& arguments) { if (!m_Initialized) { @@ -51,6 +81,7 @@ void ExternalCommand::Execute(double time, const String& command, const vector& arguments) +{ + if (arguments.size() < 2) + throw_exception(invalid_argument("Expected 2 arguments.")); + + String file = arguments[0]; + int del = arguments[1].ToDouble(); + + ifstream ifp; + ifp.exceptions(ifstream::badbit); + + ifp.open(file, ifstream::in); + + while(ifp.good()) { + std::string line; + std::getline(ifp, line); + + try { + Logger::Write(LogInformation, "compat", "Executing external command: " + line); + + Execute(line); + } catch (const exception& ex) { + stringstream msgbuf; + msgbuf << "External command failed: " << ex.what(); + Logger::Write(LogWarning, "icinga", msgbuf.str()); + } + } + + ifp.close(); + + if (del) + (void) unlink(file.CStr()); +} diff --git a/lib/icinga/externalcommand.h b/lib/icinga/externalcommand.h index 10bdb29aa..973113bdf 100644 --- a/lib/icinga/externalcommand.h +++ b/lib/icinga/externalcommand.h @@ -25,7 +25,7 @@ namespace icinga class I2_ICINGA_API ExternalCommand { public: - + static void Execute(const String& line); static void Execute(double time, const String& command, const vector& arguments); static void HelloWorld(double time, const vector& arguments); @@ -52,6 +52,7 @@ public: static void DisableServicegroupPassiveSvcChecks(double time, const vector& arguments); static void EnableHostgroupPassiveSvcChecks(double time, const vector& arguments); static void DisableHostgroupPassiveSvcChecks(double time, const vector& arguments); + static void ProcessFile(double time, const vector& arguments); private: typedef function& arguments)> Callback;