From cc872dac1f1c0d122cd12aa4aefd66f69e6815f1 Mon Sep 17 00:00:00 2001 From: "Alexander A. Klimov" Date: Wed, 1 Mar 2023 17:04:11 +0100 Subject: [PATCH] Remove CheckResultReader which has been deprecated for 5 major versions --- doc/09-object-types.md | 24 ----- doc/14-features.md | 26 ----- lib/compat/CMakeLists.txt | 2 - lib/compat/checkresultreader.cpp | 166 ------------------------------- lib/compat/checkresultreader.hpp | 38 ------- lib/compat/checkresultreader.ti | 20 ---- lib/icinga/compatutility.cpp | 2 +- tools/syntax/nano/icinga2.nanorc | 2 +- 8 files changed, 2 insertions(+), 278 deletions(-) delete mode 100644 lib/compat/checkresultreader.cpp delete mode 100644 lib/compat/checkresultreader.hpp delete mode 100644 lib/compat/checkresultreader.ti diff --git a/doc/09-object-types.md b/doc/09-object-types.md index 0d858f92a..0f92f28d8 100644 --- a/doc/09-object-types.md +++ b/doc/09-object-types.md @@ -1153,30 +1153,6 @@ use [MaxConcurrentChecks](17-language-reference.md#icinga-constants-global-confi This also applies to an agent as command endpoint where the checker feature is disabled. -### CheckResultReader - -Reads Icinga 1.x check result files from a directory. This functionality is provided -to help existing Icinga 1.x users and might be useful for migration scenarios. - -> **Note** -> -> This feature is DEPRECATED and may be removed in future releases. -> Check the [roadmap](https://github.com/Icinga/icinga2/milestones). - -Example: - -``` -object CheckResultReader "reader" { - spool_dir = "/data/check-results" -} -``` - -Configuration Attributes: - - Name | Type | Description - --------------------------|-----------------------|---------------------------------- - spool\_dir | String | **Optional.** The directory which contains the check result files. Defaults to DataDir + "/spool/checkresults/". - ### CompatLogger Writes log files in a format that's compatible with Icinga 1.x. diff --git a/doc/14-features.md b/doc/14-features.md index b1981e0f5..4a4ff32b7 100644 --- a/doc/14-features.md +++ b/doc/14-features.md @@ -1228,32 +1228,6 @@ Detailed information on the commands and their required parameters can be found on the [Icinga 1.x documentation](https://docs.icinga.com/latest/en/extcommands2.html). -### Check Result Files - -> **Note** -> -> This feature is DEPRECATED and may be removed in future releases. -> Check the [roadmap](https://github.com/Icinga/icinga2/milestones). - -Icinga 1.x writes its check result files to a temporary spool directory -where they are processed in a regular interval. -While this is extremely inefficient in performance regards it has been -rendered useful for passing passive check results directly into Icinga 1.x -skipping the external command pipe. - -Several clustered/distributed environments and check-aggregation addons -use that method. In order to support step-by-step migration of these -environments, Icinga 2 supports the `CheckResultReader` object. - -There is no feature configuration available, but it must be defined -on-demand in your Icinga 2 objects configuration. - -``` -object CheckResultReader "reader" { - spool_dir = "/data/check-results" -} -``` - ### Livestatus > **Note** diff --git a/lib/compat/CMakeLists.txt b/lib/compat/CMakeLists.txt index 638f3c193..f7d032fd4 100644 --- a/lib/compat/CMakeLists.txt +++ b/lib/compat/CMakeLists.txt @@ -1,11 +1,9 @@ # Icinga 2 | (c) 2012 Icinga GmbH | GPLv2+ -mkclass_target(checkresultreader.ti checkresultreader-ti.cpp checkresultreader-ti.hpp) mkclass_target(compatlogger.ti compatlogger-ti.cpp compatlogger-ti.hpp) mkclass_target(externalcommandlistener.ti externalcommandlistener-ti.cpp externalcommandlistener-ti.hpp) set(compat_SOURCES - checkresultreader.cpp checkresultreader.hpp checkresultreader-ti.hpp compatlogger.cpp compatlogger.hpp compatlogger-ti.hpp externalcommandlistener.cpp externalcommandlistener.hpp externalcommandlistener-ti.hpp ) diff --git a/lib/compat/checkresultreader.cpp b/lib/compat/checkresultreader.cpp deleted file mode 100644 index 1757333aa..000000000 --- a/lib/compat/checkresultreader.cpp +++ /dev/null @@ -1,166 +0,0 @@ -/* Icinga 2 | (c) 2012 Icinga GmbH | GPLv2+ */ - -#include "icinga/compatutility.hpp" -#include "compat/checkresultreader.hpp" -#include "compat/checkresultreader-ti.cpp" -#include "icinga/service.hpp" -#include "icinga/pluginutility.hpp" -#include "icinga/icingaapplication.hpp" -#include "base/configtype.hpp" -#include "base/objectlock.hpp" -#include "base/logger.hpp" -#include "base/convert.hpp" -#include "base/application.hpp" -#include "base/utility.hpp" -#include "base/exception.hpp" -#include "base/context.hpp" -#include "base/statsfunction.hpp" -#include - -using namespace icinga; - -REGISTER_TYPE(CheckResultReader); - -REGISTER_STATSFUNCTION(CheckResultReader, &CheckResultReader::StatsFunc); - -void CheckResultReader::StatsFunc(const Dictionary::Ptr& status, const Array::Ptr&) -{ - DictionaryData nodes; - - for (const CheckResultReader::Ptr& checkresultreader : ConfigType::GetObjectsByType()) { - nodes.emplace_back(checkresultreader->GetName(), 1); //add more stats - } - - status->Set("checkresultreader", new Dictionary(std::move(nodes))); -} - -/** - * @threadsafety Always. - */ -void CheckResultReader::Start(bool runtimeCreated) -{ - ObjectImpl::Start(runtimeCreated); - - Log(LogInformation, "CheckResultReader") - << "'" << GetName() << "' started."; - - Log(LogWarning, "CheckResultReader") - << "This feature is DEPRECATED and may be removed in future releases. Check the roadmap at https://github.com/Icinga/icinga2/milestones"; - -#ifndef _WIN32 - m_ReadTimer = new Timer(); - m_ReadTimer->OnTimerExpired.connect([this](const Timer * const&) { ReadTimerHandler(); }); - m_ReadTimer->SetInterval(5); - m_ReadTimer->Start(); -#endif /* _WIN32 */ -} - -/** - * @threadsafety Always. - */ -void CheckResultReader::Stop(bool runtimeRemoved) -{ - Log(LogInformation, "CheckResultReader") - << "'" << GetName() << "' stopped."; - - ObjectImpl::Stop(runtimeRemoved); -} - -/** - * @threadsafety Always. - */ -void CheckResultReader::ReadTimerHandler() const -{ - CONTEXT("Processing check result files in '" << GetSpoolDir() << "'"); - - Utility::Glob(GetSpoolDir() + "/c??????.ok", [this](const String& path) { ProcessCheckResultFile(path); }, GlobFile); -} - -void CheckResultReader::ProcessCheckResultFile(const String& path) const -{ - CONTEXT("Processing check result file '" << path << "'"); - - String crfile = String(path.Begin(), path.End() - 3); /* Remove the ".ok" extension. */ - - std::ifstream fp; - fp.exceptions(std::ifstream::badbit); - fp.open(crfile.CStr()); - - std::map attrs; - - while (fp.good()) { - std::string line; - std::getline(fp, line); - - if (line.empty() || line[0] == '#') - continue; /* Ignore comments and empty lines. */ - - size_t pos = line.find_first_of('='); - - if (pos == std::string::npos) - continue; /* Ignore invalid lines. */ - - String key = line.substr(0, pos); - String value = line.substr(pos + 1); - - attrs[key] = value; - } - - /* Remove the checkresult files. */ - Utility::Remove(path); - - Utility::Remove(crfile); - - Checkable::Ptr checkable; - - Host::Ptr host = Host::GetByName(attrs["host_name"]); - - if (!host) { - Log(LogWarning, "CheckResultReader") - << "Ignoring checkresult file for host '" << attrs["host_name"] << "': Host does not exist."; - - return; - } - - if (attrs.find("service_description") != attrs.end()) { - Service::Ptr service = host->GetServiceByShortName(attrs["service_description"]); - - if (!service) { - Log(LogWarning, "CheckResultReader") - << "Ignoring checkresult file for host '" << attrs["host_name"] - << "', service '" << attrs["service_description"] << "': Service does not exist."; - - return; - } - - checkable = service; - } else - checkable = host; - - CheckResult::Ptr result = new CheckResult(); - String output = CompatUtility::UnEscapeString(attrs["output"]); - std::pair co = PluginUtility::ParseCheckOutput(output); - result->SetOutput(co.first); - result->SetPerformanceData(PluginUtility::SplitPerfdata(co.second)); - result->SetState(PluginUtility::ExitStatusToState(Convert::ToLong(attrs["return_code"]))); - - if (attrs.find("start_time") != attrs.end()) - result->SetExecutionStart(Convert::ToDouble(attrs["start_time"])); - else - result->SetExecutionStart(Utility::GetTime()); - - if (attrs.find("finish_time") != attrs.end()) - result->SetExecutionEnd(Convert::ToDouble(attrs["finish_time"])); - else - result->SetExecutionEnd(result->GetExecutionStart()); - - checkable->ProcessCheckResult(result); - - Log(LogDebug, "CheckResultReader") - << "Processed checkresult file for object '" << checkable->GetName() << "'"; - - /* Reschedule the next check. The side effect of this is that for as long - * as we receive check result files for a host/service we won't execute any - * active checks. */ - checkable->SetNextCheck(Utility::GetTime() + checkable->GetCheckInterval()); -} diff --git a/lib/compat/checkresultreader.hpp b/lib/compat/checkresultreader.hpp deleted file mode 100644 index 6cd28e318..000000000 --- a/lib/compat/checkresultreader.hpp +++ /dev/null @@ -1,38 +0,0 @@ -/* Icinga 2 | (c) 2012 Icinga GmbH | GPLv2+ */ - -#ifndef CHECKRESULTREADER_H -#define CHECKRESULTREADER_H - -#include "compat/checkresultreader-ti.hpp" -#include "base/timer.hpp" -#include - -namespace icinga -{ - -/** - * An Icinga checkresult reader. - * - * @ingroup compat - */ -class CheckResultReader final : public ObjectImpl -{ -public: - DECLARE_OBJECT(CheckResultReader); - DECLARE_OBJECTNAME(CheckResultReader); - - static void StatsFunc(const Dictionary::Ptr& status, const Array::Ptr& perfdata); - -protected: - void Start(bool runtimeCreated) override; - void Stop(bool runtimeRemoved) override; - -private: - Timer::Ptr m_ReadTimer; - void ReadTimerHandler() const; - void ProcessCheckResultFile(const String& path) const; -}; - -} - -#endif /* CHECKRESULTREADER_H */ diff --git a/lib/compat/checkresultreader.ti b/lib/compat/checkresultreader.ti deleted file mode 100644 index 0132818cf..000000000 --- a/lib/compat/checkresultreader.ti +++ /dev/null @@ -1,20 +0,0 @@ -/* Icinga 2 | (c) 2012 Icinga GmbH | GPLv2+ */ - -#include "base/configobject.hpp" -#include "base/application.hpp" - -library compat; - -namespace icinga -{ - -class CheckResultReader : ConfigObject -{ - activation_priority 100; - - [config] String spool_dir { - default {{{ return Configuration::DataDir + "/spool/checkresults/"; }}} - }; -}; - -} diff --git a/lib/icinga/compatutility.cpp b/lib/icinga/compatutility.cpp index 344e95797..95aed4396 100644 --- a/lib/icinga/compatutility.cpp +++ b/lib/icinga/compatutility.cpp @@ -293,7 +293,7 @@ String CompatUtility::EscapeString(const String& str) return result; } -/* Used in ExternalCommandListener and CheckResultReader. */ +/* Used in ExternalCommandListener. */ String CompatUtility::UnEscapeString(const String& str) { String result = str; diff --git a/tools/syntax/nano/icinga2.nanorc b/tools/syntax/nano/icinga2.nanorc index 6f682891b..cff78be3b 100644 --- a/tools/syntax/nano/icinga2.nanorc +++ b/tools/syntax/nano/icinga2.nanorc @@ -9,7 +9,7 @@ icolor brightgreen "object[ \t]+(checkcommand|notificationcommand|eventcommand icolor brightgreen "object[ \t]+(timeperiod|scheduleddowntime|dependency|perfdatawriter)" icolor brightgreen "object[ \t]+(graphitewriter|idomysqlconnection|idomysqlconnection)" icolor brightgreen "object[ \t]+(livestatuslistener|externalcommandlistener)" -icolor brightgreen "object[ \t]+(compatlogger|checkresultreader|checkcomponent|notificationcomponent)" +icolor brightgreen "object[ \t]+(compatlogger|checkcomponent|notificationcomponent)" icolor brightgreen "object[ \t]+(filelogger|sysloglogger|journaldlogger|apilistener|endpoint|zone)" ## apply def