Module: check_mk
Branch: master
Commit: 222cde81a9df6878e1b32cd7a12449d7a2111634
URL:
http://git.mathias-kettner.de/git/?p=check_mk.git;a=commit;h=222cde81a9df68…
Author: Sven Panne <sp(a)mathias-kettner.de>
Date: Mon Feb 25 13:59:11 2019 +0100
Move find_host into MonitoringCore abstraction.
Change-Id: I0569502e66189774d35dadea5a2c1288887d4ed0
---
livestatus/src/DowntimeOrComment.cc | 15 +++++++++------
livestatus/src/DowntimeOrComment.h | 10 +++++++---
livestatus/src/DowntimesOrComments.cc | 8 ++++----
livestatus/src/DowntimesOrComments.h | 4 +++-
livestatus/src/LogEntry.cc | 4 ++--
livestatus/src/MonitoringCore.h | 1 +
livestatus/src/Store.cc | 2 ++
livestatus/src/TableHosts.cc | 2 +-
livestatus/src/TableServices.cc | 6 ++++--
livestatus/src/module.cc | 5 +++++
10 files changed, 38 insertions(+), 19 deletions(-)
diff --git a/livestatus/src/DowntimeOrComment.cc b/livestatus/src/DowntimeOrComment.cc
index 32df461..1d3bdcc 100644
--- a/livestatus/src/DowntimeOrComment.cc
+++ b/livestatus/src/DowntimeOrComment.cc
@@ -23,12 +23,15 @@
// Boston, MA 02110-1301 USA.
#include "DowntimeOrComment.h"
+#include "MonitoringCore.h"
-DowntimeOrComment::DowntimeOrComment(nebstruct_downtime_struct *dt,
+// TODO(sp): Remove ugly cast.
+DowntimeOrComment::DowntimeOrComment(MonitoringCore *mc,
+ nebstruct_downtime_struct *dt,
unsigned long id)
: _type(dt->downtime_type)
, _is_service(dt->service_description != nullptr)
- , _host(find_host(dt->host_name))
+ , _host(reinterpret_cast<host *>(mc->find_host(dt->host_name)))
, _service(_is_service
? find_service(dt->host_name, dt->service_description)
: nullptr)
@@ -39,16 +42,16 @@ DowntimeOrComment::DowntimeOrComment(nebstruct_downtime_struct *dt,
DowntimeOrComment::~DowntimeOrComment() = default;
-Downtime::Downtime(nebstruct_downtime_struct *dt)
- : DowntimeOrComment(dt, dt->downtime_id)
+Downtime::Downtime(MonitoringCore *mc, nebstruct_downtime_struct *dt)
+ : DowntimeOrComment(mc, dt, dt->downtime_id)
, _start_time(dt->start_time)
, _end_time(dt->end_time)
, _fixed(dt->fixed)
, _duration(static_cast<int>(dt->duration))
, _triggered_by(static_cast<int>(dt->triggered_by)) {}
-Comment::Comment(nebstruct_comment_struct *co)
- : DowntimeOrComment(reinterpret_cast<nebstruct_downtime_struct *>(co),
+Comment::Comment(MonitoringCore *mc, nebstruct_comment_struct *co)
+ : DowntimeOrComment(mc, reinterpret_cast<nebstruct_downtime_struct *>(co),
co->comment_id)
, _expire_time(co->expire_time)
, _persistent(co->persistent)
diff --git a/livestatus/src/DowntimeOrComment.h b/livestatus/src/DowntimeOrComment.h
index c545829..4536fbd 100644
--- a/livestatus/src/DowntimeOrComment.h
+++ b/livestatus/src/DowntimeOrComment.h
@@ -29,6 +29,7 @@
#include <ctime>
#include <string>
#include "nagios.h"
+class MonitoringCore;
/* The structs for downtime and comment are so similar, that
we handle them with the same logic */
@@ -90,8 +91,11 @@ public:
std::string _comment;
unsigned long _id;
- DowntimeOrComment(nebstruct_downtime_struct *dt, unsigned long id);
virtual ~DowntimeOrComment();
+
+protected:
+ DowntimeOrComment(MonitoringCore *mc, nebstruct_downtime_struct *dt,
+ unsigned long id);
};
class Downtime : public DowntimeOrComment {
@@ -103,7 +107,7 @@ public:
// OffsetIntColumn, should be unsigned long
int _duration;
int _triggered_by;
- explicit Downtime(nebstruct_downtime_struct *dt);
+ explicit Downtime(MonitoringCore *mc, nebstruct_downtime_struct *dt);
};
class Comment : public DowntimeOrComment {
@@ -113,7 +117,7 @@ public:
int _source;
int _entry_type;
int _expires;
- explicit Comment(nebstruct_comment_struct *co);
+ explicit Comment(MonitoringCore *mc, nebstruct_comment_struct *co);
};
#endif // DowntimeOrComment_h
diff --git a/livestatus/src/DowntimesOrComments.cc
b/livestatus/src/DowntimesOrComments.cc
index 7aa44b2..6b87054 100644
--- a/livestatus/src/DowntimesOrComments.cc
+++ b/livestatus/src/DowntimesOrComments.cc
@@ -27,15 +27,15 @@
#include "DowntimeOrComment.h"
#include "Logger.h"
-DowntimesOrComments::DowntimesOrComments()
- : _logger(Logger::getLogger("cmk.livestatus")) {}
+DowntimesOrComments::DowntimesOrComments(MonitoringCore *mc)
+ : _mc(mc), _logger(Logger::getLogger("cmk.livestatus")) {}
void DowntimesOrComments::registerDowntime(nebstruct_downtime_data *data) {
unsigned long id = data->downtime_id;
switch (data->type) {
case NEBTYPE_DOWNTIME_ADD:
case NEBTYPE_DOWNTIME_LOAD:
- _entries[id] = std::make_unique<Downtime>(data);
+ _entries[id] = std::make_unique<Downtime>(_mc, data);
break;
case NEBTYPE_DOWNTIME_DELETE:
if (_entries.erase(id) == 0) {
@@ -53,7 +53,7 @@ void DowntimesOrComments::registerComment(nebstruct_comment_data *data)
{
switch (data->type) {
case NEBTYPE_COMMENT_ADD:
case NEBTYPE_COMMENT_LOAD:
- _entries[id] = std::make_unique<Comment>(data);
+ _entries[id] = std::make_unique<Comment>(_mc, data);
break;
case NEBTYPE_COMMENT_DELETE:
if (_entries.erase(id) == 0) {
diff --git a/livestatus/src/DowntimesOrComments.h b/livestatus/src/DowntimesOrComments.h
index 3ab368e..9112ccf 100644
--- a/livestatus/src/DowntimesOrComments.h
+++ b/livestatus/src/DowntimesOrComments.h
@@ -31,10 +31,11 @@
#include "nagios.h"
class DowntimeOrComment;
class Logger;
+class MonitoringCore;
class DowntimesOrComments {
public:
- DowntimesOrComments();
+ explicit DowntimesOrComments(MonitoringCore *mc);
void registerDowntime(nebstruct_downtime_data *data);
void registerComment(nebstruct_comment_data *data);
auto begin() const { return _entries.cbegin(); }
@@ -42,6 +43,7 @@ public:
private:
std::map<unsigned long, std::unique_ptr<DowntimeOrComment>> _entries;
+ MonitoringCore *const _mc;
Logger *const _logger;
};
diff --git a/livestatus/src/LogEntry.cc b/livestatus/src/LogEntry.cc
index 2be6023..ee9f01f 100644
--- a/livestatus/src/LogEntry.cc
+++ b/livestatus/src/LogEntry.cc
@@ -403,8 +403,8 @@ HostState LogEntry::parseHostState(const std::string &str) {
unsigned LogEntry::updateReferences(MonitoringCore *mc) {
unsigned updated = 0;
if (!_host_name.empty()) {
- // Older Nagios headers are not const-correct... :-P
- _host = find_host(const_cast<char *>(_host_name.c_str()));
+ // TODO(sp): Remove ugly cast.
+ _host = reinterpret_cast<host *>(mc->find_host(_host_name));
updated++;
}
if (!_service_description.empty()) {
diff --git a/livestatus/src/MonitoringCore.h b/livestatus/src/MonitoringCore.h
index 9b408eb..45b24a2 100644
--- a/livestatus/src/MonitoringCore.h
+++ b/livestatus/src/MonitoringCore.h
@@ -72,6 +72,7 @@ public:
virtual ~MonitoringCore() = default;
+ virtual Host *find_host(const std::string &name) = 0;
virtual Host *getHostByDesignation(const std::string &designation) = 0;
virtual ContactGroup *find_contactgroup(const std::string &name) = 0;
diff --git a/livestatus/src/Store.cc b/livestatus/src/Store.cc
index f168f69..7875659 100644
--- a/livestatus/src/Store.cc
+++ b/livestatus/src/Store.cc
@@ -45,6 +45,8 @@
Store::Store(MonitoringCore *mc)
: _mc(mc)
+ , _downtimes(mc)
+ , _comments(mc)
, _log_cache(mc, mc->maxCachedMessages())
, _table_columns(mc)
, _table_commands(mc)
diff --git a/livestatus/src/TableHosts.cc b/livestatus/src/TableHosts.cc
index 793abb5..cb2bfaf 100644
--- a/livestatus/src/TableHosts.cc
+++ b/livestatus/src/TableHosts.cc
@@ -683,5 +683,5 @@ bool TableHosts::isAuthorized(Row row, const contact *ctc) const {
}
Row TableHosts::findObject(const std::string &objectspec) const {
- return Row(find_host(const_cast<char *>(objectspec.c_str())));
+ return Row(core()->find_host(objectspec));
}
diff --git a/livestatus/src/TableServices.cc b/livestatus/src/TableServices.cc
index e0e3866..7491a7a 100644
--- a/livestatus/src/TableServices.cc
+++ b/livestatus/src/TableServices.cc
@@ -41,6 +41,7 @@
#include "FixedIntColumn.h"
#include "Logger.h"
#include "MetricsColumn.h"
+#include "MonitoringCore.h"
#include "OffsetDoubleColumn.h"
#include "OffsetIntColumn.h"
#include "OffsetPerfdataColumn.h"
@@ -478,8 +479,9 @@ void TableServices::answerQuery(Query *query) {
// do we know the host?
if (auto value = query->stringValueRestrictionFor("host_name")) {
Debug(logger()) << "using host name index with '" <<
*value << "'";
- // Older Nagios headers are not const-correct... :-P
- if (host *host = find_host(const_cast<char *>(value->c_str()))) {
+ // TODO(sp): Remove ugly cast.
+ if (host *host =
+ reinterpret_cast<::host *>(core()->find_host(*value))) {
for (servicesmember *m = host->services; m != nullptr;
m = m->next) {
if (!query->processDataset(Row(m->service_ptr))) {
diff --git a/livestatus/src/module.cc b/livestatus/src/module.cc
index 4f59fc6..ae5f5c0 100644
--- a/livestatus/src/module.cc
+++ b/livestatus/src/module.cc
@@ -566,6 +566,11 @@ int broker_event(int event_type __attribute__((__unused__)), void
*data) {
class NagiosCore : public MonitoringCore {
public:
+ Host *find_host(const std::string &name) override {
+ // Older Nagios headers are not const-correct... :-P
+ return fromImpl(::find_host(const_cast<char *>(name.c_str())));
+ }
+
Host *getHostByDesignation(const std::string &designation) override {
auto it = fl_hosts_by_designation.find(mk::unsafe_tolower(designation));
return it == fl_hosts_by_designation.end() ? nullptr