- NGL_ADD_LIBRARY2: 87 CMakeLists.txt konvertiert für Export-Header Generierung - 44 Export-Header Include-Pfade korrigiert (_export.h) - 81 DDS-Stub-Header generiert (*_dtc.h, *_fts.h, *_dts.h, *_ftc.h) - INGLLogger: Duplikat gelöscht, m_logger Member entfernt, variadische Makros - Q_FUNC_INFO Redefinition behoben (Qt6 definiert bereits) - FATAL_LOG Makro hinzugefügt - InfrastructureManagement DDS-Stubs (ism.hpp, ism_enums.hpp, ism_ftc.h) - FilterManagement DDS-Stubs (flt_ftc.h, flt_dts.h) - AreaEffectSimulation DDS-Stubs (aes.hpp, aes_enums.hpp) - SymbolAppearance Klasse vollständig definiert mit content() Methode - BuildingComponentFilter Klasse definiert mit Copy-Konstruktor - Ftc Factory: nullptr Return (abstract class) - AesFilter Klasse in aes.hpp hinzugefügt - Dtc Klasse in ppm.hpp mit participantChanged Signal - AesType Enum: alle 15 At* Werte definiert - AesEffectState_def: EsReceived hinzugefügt - DataModification Enum: eAdded/eModified/eRemoved - function_reply_object.h → core_types.h Include-Pfad (72 Dateien) - Enum-Class-Streaming Template-Operator in INGLLogger.h - ism_mounting_point.h: QImage → QtGui/QImage, QGuiApplication/QScreen - ism_data_plugin_interface.h: QSet Include, Include-Reihenfolge - QRegExp → QRegularExpression in tpm_js_parser.cpp - .underlying() Aufrufe zu direktem Enum-Vergleich korrigiert - Include-Pfade: aes.hpp in symbol_appearance_settings_impl.h und aes_display_filter_impl.h Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
253 lines
5.4 KiB
C++
Executable File
253 lines
5.4 KiB
C++
Executable File
|
|
|
|
|
|
#include "checkmk_handler.h"
|
|
|
|
#include <QTimer>
|
|
#include <QHostAddress>
|
|
#include <QDateTime>
|
|
|
|
|
|
|
|
|
|
|
|
namespace ComponentMonitor
|
|
{
|
|
|
|
CheckmkHandler::CheckmkHandler()
|
|
: QObject()
|
|
, m_socket(new QTcpSocket(this))
|
|
{
|
|
TRACE_LOG() << Q_FUNC_INFO << " START";
|
|
TRACE_LOG() << Q_FUNC_INFO << " END";
|
|
}
|
|
|
|
CheckmkHandler::~CheckmkHandler()
|
|
{
|
|
TRACE_LOG() << Q_FUNC_INFO << " START";
|
|
if (m_timer)
|
|
m_timer->stop();
|
|
delete m_socket;
|
|
TRACE_LOG() << Q_FUNC_INFO << " END";
|
|
}
|
|
|
|
bool CheckmkHandler::initialize(const QString &checkMkServerHostname, int checkMkServerPort,
|
|
int checkIntervalSec)
|
|
{
|
|
DEBUG_LOG() << Q_FUNC_INFO << " START"
|
|
<< " , hostname=" << checkMkServerHostname
|
|
<< " , port=" << checkMkServerPort
|
|
<< " , m_checkIntervalSec=" << checkIntervalSec;
|
|
|
|
m_checkMkHost = checkMkServerHostname;
|
|
m_checkMkPort = checkMkServerPort;
|
|
m_checkIntervalSec = checkIntervalSec;
|
|
|
|
if (!m_timer)
|
|
{
|
|
m_timer = new QTimer(this);
|
|
m_timer->setInterval(m_checkIntervalSec * 1000);
|
|
connect(m_timer, &QTimer::timeout, this, &CheckmkHandler::onTimeout);
|
|
}
|
|
|
|
connect(m_socket, &QTcpSocket::stateChanged, this, &CheckmkHandler::onStateChanged);
|
|
connect(m_socket, QOverload<QAbstractSocket::SocketError>::of(&QAbstractSocket::error),
|
|
this, &CheckmkHandler::onSocketError);
|
|
|
|
connect(m_socket, &QTcpSocket::connected,
|
|
this, &CheckmkHandler::onConnected);
|
|
connect(m_socket, &QTcpSocket::readyRead, this, &CheckmkHandler::readData);
|
|
|
|
INFO_LOG() << Q_FUNC_INFO << " END";
|
|
return true;
|
|
}
|
|
|
|
void CheckmkHandler::run()
|
|
{
|
|
INFO_LOG() << Q_FUNC_INFO << " START";
|
|
m_timer->start();
|
|
INFO_LOG() << Q_FUNC_INFO << " END";
|
|
}
|
|
|
|
void CheckmkHandler::stop()
|
|
{
|
|
INFO_LOG() << Q_FUNC_INFO << " START";
|
|
m_timer->stop();
|
|
INFO_LOG() << Q_FUNC_INFO << " END";
|
|
}
|
|
|
|
void CheckmkHandler::onTimeout()
|
|
{
|
|
if (m_highFrequencyCheck>=0)
|
|
{
|
|
--m_highFrequencyCheck;
|
|
m_timer->setInterval(2*1000);
|
|
} else {
|
|
m_timer->setInterval(m_checkIntervalSec*1000);
|
|
}
|
|
|
|
INFO_LOG() << Q_FUNC_INFO << " Timeout, m_highFrequencyCheck=" << m_highFrequencyCheck
|
|
<< ", current Interval=" << m_timer->interval() << " [msec]";
|
|
|
|
if (m_socket->state() == QAbstractSocket::SocketState::ConnectedState)
|
|
{
|
|
writeGetStateRequest();
|
|
} else {
|
|
doConnect();
|
|
}
|
|
}
|
|
|
|
bool CheckmkHandler::doConnect()
|
|
{
|
|
INFO_LOG() << Q_FUNC_INFO << " START, (int)m_socket->state()=" << (int)m_socket->state();
|
|
|
|
|
|
m_socket->connectToHost(m_checkMkHost, m_checkMkPort);
|
|
if (!m_socket->waitForConnected(5000))
|
|
{
|
|
ERROR_LOG() << Q_FUNC_INFO << " Could not (re)open tcp destination " << m_checkMkHost << ":" << m_checkMkPort << ", error: " << m_socket->errorString();
|
|
return false;
|
|
}
|
|
INFO_LOG() << Q_FUNC_INFO << " (Re)openend tcp destination " << m_checkMkHost << ":" << m_checkMkPort;
|
|
|
|
INFO_LOG() << Q_FUNC_INFO << " END";
|
|
return true;
|
|
}
|
|
|
|
void CheckmkHandler::onImmediateGetStateRequested()
|
|
{
|
|
INFO_LOG() << Q_FUNC_INFO << " START";
|
|
|
|
|
|
m_highFrequencyCheck = 3;
|
|
onTimeout();
|
|
|
|
INFO_LOG() << Q_FUNC_INFO << " END";
|
|
}
|
|
|
|
bool CheckmkHandler::writeGetStateRequest()
|
|
{
|
|
if (!m_socket->isOpen())
|
|
{
|
|
ERROR_LOG() << Q_FUNC_INFO << " socket not open";
|
|
return false;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const char* cmdCheck = "GET hosts\nResponseHeader: fixed16\nColumns: name state last_check \nKeepAlive: on\n\n";
|
|
int bWritten = m_socket->write(cmdCheck);
|
|
INFO_LOG() << Q_FUNC_INFO << " cmdCheck= '" << cmdCheck << "'";
|
|
|
|
|
|
INFO_LOG() << Q_FUNC_INFO << " bWritten= " << bWritten;
|
|
return true;
|
|
}
|
|
|
|
void CheckmkHandler::readData()
|
|
{
|
|
DEBUG_LOG() << Q_FUNC_INFO << " XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
|
|
|
|
while (m_socket->canReadLine())
|
|
processLine(m_socket->readLine().trimmed());
|
|
}
|
|
|
|
void CheckmkHandler::onConnected()
|
|
{
|
|
writeGetStateRequest();
|
|
}
|
|
|
|
void CheckmkHandler::onStateChanged(const QAbstractSocket::SocketState &newState)
|
|
{
|
|
qDebug() << "CheckmkHandler: SocketState changed to: " << newState;
|
|
}
|
|
|
|
|
|
void CheckmkHandler::onSocketError(const QAbstractSocket::SocketError &socketError)
|
|
{
|
|
qCritical() << "CheckmkHandler: Error occured: " << socketError;
|
|
}
|
|
|
|
bool CheckmkHandler::processLine(const QByteArray &line)
|
|
{
|
|
|
|
|
|
if (line.isEmpty())
|
|
return false;
|
|
|
|
QString str = QString::fromUtf8(line);
|
|
QStringList sl = str.split(QStringLiteral(";"));
|
|
|
|
if (sl.size() < 2)
|
|
{
|
|
if (str.startsWith(QStringLiteral("200")))
|
|
DEBUG_LOG() << Q_FUNC_INFO << " size to small " << sl.size()
|
|
<< ", line='" << str << "'";
|
|
else
|
|
WARNING_LOG() << Q_FUNC_INFO << " size to small " << sl.size()
|
|
<< ", line='" << str << "'";
|
|
return false;
|
|
}
|
|
|
|
QString name = sl.value(0);
|
|
name = name.section(QLatin1Char('.'), 0, 0);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
QString stateStr = sl.value(1);
|
|
int stateInt = stateStr.toInt();
|
|
bool reachable = stateInt == 0;
|
|
|
|
long long lastCheck = 0;
|
|
|
|
if (sl.size() >= 3)
|
|
{
|
|
QString lastCheckStr = sl.value(2);
|
|
lastCheck = lastCheckStr.toLongLong();
|
|
}
|
|
|
|
DEBUG_LOG() << Q_FUNC_INFO
|
|
<< " name: '" << name << "'"
|
|
<< ", stateInt: '" << stateInt << "'"
|
|
<< ", reachable: '" << reachable << "'"
|
|
<< ", lastCheck: '" << lastCheck << "'"
|
|
;
|
|
|
|
emit newState(name, reachable, lastCheck);
|
|
return true;
|
|
}
|
|
|
|
}
|