Module: check_mk
Branch: master
Commit: 7d42d85c94dfae8c5895b67cfe6bc3dc3cebce81
URL:
http://git.mathias-kettner.de/git/?p=check_mk.git;a=commit;h=7d42d85c94dfae…
Author: Sven Panne <sp(a)mathias-kettner.de>
Date: Wed Apr 10 09:52:11 2019 +0200
Add source columns.
Some cleanups on the way. Still things a bit too much copy-n-paste for the
myriads of new columns, though...
CMK-1939
Change-Id: Ia940203735c5dffd7d379b13cf083653a5a19f0a
---
livestatus/src/MonitoringCore.h | 18 +++++++++++++++++-
livestatus/src/NagiosCore.cc | 19 +++----------------
livestatus/src/TableContacts.cc | 14 ++++++++++++++
livestatus/src/TableHosts.cc | 15 +++++++++++++++
livestatus/src/TableServices.cc | 15 +++++++++++++++
5 files changed, 64 insertions(+), 17 deletions(-)
diff --git a/livestatus/src/MonitoringCore.h b/livestatus/src/MonitoringCore.h
index 7262617..d4505e7 100644
--- a/livestatus/src/MonitoringCore.h
+++ b/livestatus/src/MonitoringCore.h
@@ -28,8 +28,10 @@
#include "config.h" // IWYU pragma: keep
#include <chrono>
#include <string>
+#include <tuple>
#include <unordered_map>
#include <vector>
+#include "StringUtils.h"
#include "Triggers.h"
#include "auth.h"
#include "data_encoding.h"
@@ -63,7 +65,21 @@ struct CommentData {
};
using Attributes = std::unordered_map<std::string, std::string>;
-enum class AttributeKind { custom_variables, tags, labels };
+enum class AttributeKind { custom_variables, tags, labels, sources };
+
+inline std::tuple<AttributeKind, std::string> to_attribute_kind(
+ const std::string &name) {
+ if (mk::starts_with(name, "_TAG_")) {
+ return {AttributeKind::tags, name.substr(5)};
+ }
+ if (mk::starts_with(name, "_LABEL_")) {
+ return {AttributeKind::labels, name.substr(7)};
+ }
+ if (mk::starts_with(name, "_SOURCES_")) {
+ return {AttributeKind::sources, name.substr(9)};
+ }
+ return {AttributeKind::custom_variables, name};
+}
/// An abstraction layer for the monitoring core (nagios or cmc)
class MonitoringCore {
diff --git a/livestatus/src/NagiosCore.cc b/livestatus/src/NagiosCore.cc
index 3b17a26..52404a8 100644
--- a/livestatus/src/NagiosCore.cc
+++ b/livestatus/src/NagiosCore.cc
@@ -210,22 +210,9 @@ Attributes NagiosCore::customAttributes(const void *holder,
auto h = *static_cast<const customvariablesmember *const *>(holder);
Attributes attrs;
for (auto cvm = h; cvm != nullptr; cvm = cvm->next) {
- bool is_tag = mk::starts_with(cvm->variable_name, "_TAG_");
- bool is_label = mk::starts_with(cvm->variable_name, "_LABEL_");
- bool part_of_result = false;
- switch (kind) {
- case AttributeKind::custom_variables:
- part_of_result = !is_tag && !is_label;
- break;
- case AttributeKind::tags:
- part_of_result = is_tag;
- break;
- case AttributeKind::labels:
- part_of_result = is_label;
- break;
- }
- if (part_of_result) {
- attrs.emplace(cvm->variable_name, cvm->variable_value);
+ auto [k, name] = to_attribute_kind(cvm->variable_name);
+ if (k == kind) {
+ attrs.emplace(name, cvm->variable_value);
}
}
return attrs;
diff --git a/livestatus/src/TableContacts.cc b/livestatus/src/TableContacts.cc
index c7cb62b..d2f1351 100644
--- a/livestatus/src/TableContacts.cc
+++ b/livestatus/src/TableContacts.cc
@@ -149,6 +149,20 @@ void TableContacts::addColumns(Table *table, const std::string
&prefix,
-1, DANGEROUS_OFFSETOF(contact, custom_variables), table->core(),
AttributeKind::labels));
+ table->addColumn(std::make_unique<CustomVarsNamesColumn>(
+ prefix + "source_names", "A list of all sources of the
contact",
+ indirect_offset, -1, -1, DANGEROUS_OFFSETOF(contact, custom_variables),
+ table->core(), AttributeKind::sources));
+ table->addColumn(std::make_unique<CustomVarsValuesColumn>(
+ prefix + "source_values",
+ "A list of the values of all sources of the contact", indirect_offset,
+ -1, -1, DANGEROUS_OFFSETOF(contact, custom_variables), table->core(),
+ AttributeKind::sources));
+ table->addColumn(std::make_unique<CustomVarsDictColumn>(
+ prefix + "sources", "A dictionary of the sources",
indirect_offset, -1,
+ -1, DANGEROUS_OFFSETOF(contact, custom_variables), table->core(),
+ AttributeKind::sources));
+
table->addColumn(std::make_unique<AttributeListAsIntColumn>(
prefix + "modified_attributes",
"A bitmask specifying which attributes have been modified",
diff --git a/livestatus/src/TableHosts.cc b/livestatus/src/TableHosts.cc
index 9c3ef2f..14e8f3e 100644
--- a/livestatus/src/TableHosts.cc
+++ b/livestatus/src/TableHosts.cc
@@ -532,6 +532,21 @@ void TableHosts::addColumns(Table *table, const std::string
&prefix,
extra_offset, -1, DANGEROUS_OFFSETOF(host, custom_variables),
table->core(), AttributeKind::labels));
+ table->addColumn(std::make_unique<CustomVarsNamesColumn>(
+ prefix + "source_names", "A list of the names of all
sources",
+ indirect_offset, extra_offset, -1,
+ DANGEROUS_OFFSETOF(host, custom_variables), table->core(),
+ AttributeKind::sources));
+ table->addColumn(std::make_unique<CustomVarsValuesColumn>(
+ prefix + "source_values", "A list of the values of the
sources",
+ indirect_offset, extra_offset, -1,
+ DANGEROUS_OFFSETOF(host, custom_variables), table->core(),
+ AttributeKind::sources));
+ table->addColumn(std::make_unique<CustomVarsDictColumn>(
+ prefix + "sources", "A dictionary of the sources",
indirect_offset,
+ extra_offset, -1, DANGEROUS_OFFSETOF(host, custom_variables),
+ table->core(), AttributeKind::sources));
+
// Add direct access to the custom macro _FILENAME. In a future version of
// Livestatus this will probably be configurable so access to further custom
// variable can be added, such that those variables are presented like
diff --git a/livestatus/src/TableServices.cc b/livestatus/src/TableServices.cc
index 0384588..885d84a 100644
--- a/livestatus/src/TableServices.cc
+++ b/livestatus/src/TableServices.cc
@@ -488,6 +488,21 @@ void TableServices::addColumns(Table *table, const std::string
&prefix,
-1, DANGEROUS_OFFSETOF(service, custom_variables), table->core(),
AttributeKind::labels));
+ table->addColumn(std::make_unique<CustomVarsNamesColumn>(
+ prefix + "source_names",
+ "A list of the names of all sources of the service", indirect_offset,
+ -1, -1, DANGEROUS_OFFSETOF(service, custom_variables), table->core(),
+ AttributeKind::sources));
+ table->addColumn(std::make_unique<CustomVarsValuesColumn>(
+ prefix + "source_values",
+ "A list of the values of all sources of the service", indirect_offset,
+ -1, -1, DANGEROUS_OFFSETOF(service, custom_variables), table->core(),
+ AttributeKind::sources));
+ table->addColumn(std::make_unique<CustomVarsDictColumn>(
+ prefix + "sources", "A dictionary of the sources",
indirect_offset, -1,
+ -1, DANGEROUS_OFFSETOF(service, custom_variables), table->core(),
+ AttributeKind::sources));
+
table->addColumn(std::make_unique<ServiceGroupsColumn>(
prefix + "groups", "A list of all service groups the service is
in",
indirect_offset, -1, -1, DANGEROUS_OFFSETOF(service, servicegroups_ptr),