Add transports and counts for the monitor

This commit is contained in:
Simon Stürz 2023-02-12 23:36:32 +01:00
parent f43dc9f78e
commit 150f1fef3f
15 changed files with 90 additions and 17 deletions

View File

@ -294,6 +294,11 @@ void Engine::onTimerTick()
serverStatistics.value("proxyStatistic").toMap().value("troughput").toInt());
m_currentTimeCounter = 0;
if (m_tunnelProxyServer) {
m_tunnelProxyServer->tick();
}
}
}

View File

@ -70,6 +70,16 @@ void TcpSocketServer::killClientConnection(const QUuid &clientId, const QString
client->close();
}
QString TcpSocketServer::name() const
{
return "TcpSocketServer";
}
uint TcpSocketServer::connectionsCount() const
{
return m_clientList.count();
}
bool TcpSocketServer::running() const
{
if (!m_server)

View File

@ -75,6 +75,9 @@ public:
void sendData(const QUuid &clientId, const QByteArray &data) override;
void killClientConnection(const QUuid &clientId, const QString &killReason) override;
QString name() const override;
uint connectionsCount() const override;
bool running() const override;
private:

View File

@ -46,6 +46,9 @@ public:
virtual void sendData(const QUuid &clientId, const QByteArray &data) = 0;
virtual void killClientConnection(const QUuid &clientId, const QString &killReason) = 0;
virtual QString name() const = 0;
virtual uint connectionsCount() const = 0;
QUrl serverUrl() const;
void setServerUrl(const QUrl &serverUrl);

View File

@ -73,6 +73,16 @@ void UnixSocketServer::killClientConnection(const QUuid &clientId, const QString
}
}
QString UnixSocketServer::name() const
{
return "UnixSocketServer";
}
uint UnixSocketServer::connectionsCount() const
{
return m_clientList.count();
}
bool UnixSocketServer::running() const
{
if (!m_server)

View File

@ -47,6 +47,9 @@ public:
void sendData(const QUuid &clientId, const QByteArray &data) override;
void killClientConnection(const QUuid &clientId, const QString &killReason) override;
QString name() const override;
uint connectionsCount() const override;
bool running() const override;
public slots:

View File

@ -81,6 +81,16 @@ void WebSocketServer::killClientConnection(const QUuid &clientId, const QString
client->close(QWebSocketProtocol::CloseCodeBadOperation, killReason);
}
QString WebSocketServer::name() const
{
return "WebSocketServer";
}
uint WebSocketServer::connectionsCount() const
{
return m_clientList.count();
}
void WebSocketServer::onClientConnected()
{
// Got a new client connected

View File

@ -53,6 +53,9 @@ public:
void sendData(const QUuid &clientId, const QByteArray &data) override;
void killClientConnection(const QUuid &clientId, const QString &killReason) override;
QString name() const override;
uint connectionsCount() const override;
private:
QWebSocketServer *m_server = nullptr;
bool m_sslEnabled;

View File

@ -201,6 +201,11 @@ QVariantMap TunnelProxyServer::currentStatistics()
statisticsMap.insert("totalClientCount", m_proxyClients.count());
statisticsMap.insert("serverConnectionsCount", m_tunnelProxyServerConnections.count());
statisticsMap.insert("clientConnectionsCount", m_tunnelProxyClientConnections.count());
QVariantMap transports;
foreach (TransportInterface *transportInterface, m_transportInterfaces) {
transports.insert(transportInterface->name(), transportInterface->connectionsCount());
}
statisticsMap.insert("transports", transports);
statisticsMap.insert("troughput", m_troughput);
QVariantList tunnelConnections;
@ -267,8 +272,8 @@ void TunnelProxyServer::tick()
void TunnelProxyServer::onClientConnected(const QUuid &clientId, const QHostAddress &address)
{
TransportInterface *interface = static_cast<TransportInterface *>(sender());
qCDebug(dcTunnelProxyServer()) << "New client connected" << interface->serverName() << clientId.toString() << address.toString();
TunnelProxyClient *tunnelProxyClient = new TunnelProxyClient(interface, clientId, address, this);
m_proxyClients.insert(clientId, tunnelProxyClient);
m_jsonRpcServer->registerClient(tunnelProxyClient);

View File

@ -64,6 +64,9 @@ int main(int argc, char *argv[])
QCommandLineOption noninteractiveOption(QStringList() << "n" << "non-interactive", "Connect to the server, list all data and close the connection. This works only for the tunnelproxy.");
parser.addOption(noninteractiveOption);
QCommandLineOption jsonOption(QStringList() << "j" << "json", "Connect to the server and print the raw json data.");
parser.addOption(jsonOption);
parser.process(application);
// Check socket file
@ -82,7 +85,7 @@ int main(int argc, char *argv[])
NonInteractiveMonitor *monitor = new NonInteractiveMonitor(parser.value(socketOption));
Q_UNUSED(monitor);
} else {
Monitor *monitor = new Monitor(parser.value(socketOption));
Monitor *monitor = new Monitor(parser.value(socketOption), parser.isSet(jsonOption));
Q_UNUSED(monitor);
}

View File

@ -26,10 +26,13 @@
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
#include "monitor.h"
#include <QJsonDocument>
Monitor::Monitor(const QString &serverName, QObject *parent) : QObject(parent)
Monitor::Monitor(const QString &serverName, bool jsonMode, QObject *parent) :
QObject(parent),
m_jsonMode(jsonMode)
{
m_monitorClient = new MonitorClient(serverName, this);
m_monitorClient = new MonitorClient(serverName, jsonMode, this);
connect(m_monitorClient, &MonitorClient::connected, this, &Monitor::onConnected);
connect(m_monitorClient, &MonitorClient::disconnected, this, &Monitor::onDisconnected);
@ -38,8 +41,10 @@ Monitor::Monitor(const QString &serverName, QObject *parent) : QObject(parent)
void Monitor::onConnected()
{
m_terminal = new TerminalWindow(this);
connect(m_monitorClient, &MonitorClient::dataReady, m_terminal, &TerminalWindow::refreshWindow);
if (!m_jsonMode) {
m_terminal = new TerminalWindow(this);
connect(m_monitorClient, &MonitorClient::dataReady, m_terminal, &TerminalWindow::refreshWindow);
}
}
void Monitor::onDisconnected()

View File

@ -37,11 +37,12 @@ class Monitor : public QObject
{
Q_OBJECT
public:
explicit Monitor(const QString &serverName, QObject *parent = nullptr);
explicit Monitor(const QString &serverName, bool jsonMode, QObject *parent = nullptr);
private:
TerminalWindow *m_terminal = nullptr;
MonitorClient *m_monitorClient = nullptr;
bool m_jsonMode = false;
private slots:
void onConnected();

View File

@ -29,9 +29,10 @@
#include <QJsonDocument>
MonitorClient::MonitorClient(const QString &serverName, QObject *parent) :
MonitorClient::MonitorClient(const QString &serverName, bool jsonMode, QObject *parent) :
QObject(parent),
m_serverName(serverName)
m_serverName(serverName),
m_jsonMode(jsonMode)
{
m_socket = new QLocalSocket(this);
@ -65,7 +66,10 @@ void MonitorClient::onReadyRead()
return;
}
//qDebug() << qUtf8Printable(jsonDoc.toJson(QJsonDocument::Indented));
if (m_jsonMode) {
qDebug() << qUtf8Printable(jsonDoc.toJson(QJsonDocument::Indented));
return;
}
QVariantMap dataMap = jsonDoc.toVariant().toMap();
emit dataReady(dataMap);

View File

@ -37,11 +37,12 @@ class MonitorClient : public QObject
{
Q_OBJECT
public:
explicit MonitorClient(const QString &serverName, QObject *parent = nullptr);
explicit MonitorClient(const QString &serverName, bool jsonMode, QObject *parent = nullptr);
private:
QString m_serverName;
QLocalSocket *m_socket = nullptr;
bool m_jsonMode = false;
signals:
void connected();

View File

@ -33,7 +33,7 @@
NonInteractiveMonitor::NonInteractiveMonitor(const QString &serverName, QObject *parent)
: QObject{parent}
{
m_monitorClient = new MonitorClient(serverName, this);
m_monitorClient = new MonitorClient(serverName, false, this);
connect(m_monitorClient, &MonitorClient::connected, this, &NonInteractiveMonitor::onConnected);
m_monitorClient->connectMonitor();
@ -42,17 +42,24 @@ NonInteractiveMonitor::NonInteractiveMonitor(const QString &serverName, QObject
void NonInteractiveMonitor::onConnected()
{
connect(m_monitorClient, &MonitorClient::dataReady, this, [](const QVariantMap &dataMap){
QVariantMap tunnelProxyMap = dataMap.value("tunnelProxyStatistic").toMap();
qInfo().noquote() << "---------------------------------------------------------------------";
qInfo().noquote() << "Server name:" << dataMap.value("serverName", "-").toString();
qInfo().noquote() << "Server version:" << dataMap.value("serverVersion", "-").toString();
qInfo().noquote() << "API version:" << dataMap.value("apiVersion", "-").toString();
qInfo().noquote() << "Total client count:" << dataMap.value("tunnelProxyStatistic").toMap().value("totalClientCount", 0).toInt();
qInfo().noquote() << "Server connections:" << dataMap.value("tunnelProxyStatistic").toMap().value("serverConnectionsCount", 0).toInt();
qInfo().noquote() << "Client connections:" << dataMap.value("tunnelProxyStatistic").toMap().value("clientConnectionsCount", 0).toInt();
qInfo().noquote() << "Data troughput:" << Utils::humanReadableTraffic(dataMap.value("tunnelProxyStatistic").toMap().value("troughput", 0).toInt()) + " / s";
qInfo().noquote() << "Total client count:" << tunnelProxyMap.value("totalClientCount", 0).toInt();
qInfo().noquote() << "Server connections:" << tunnelProxyMap.value("serverConnectionsCount", 0).toInt();
qInfo().noquote() << "Client connections:" << tunnelProxyMap.value("clientConnectionsCount", 0).toInt();
qInfo().noquote() << "Data troughput:" << Utils::humanReadableTraffic(tunnelProxyMap.value("troughput", 0).toInt()) + " / s";
qInfo().noquote() << "---------------------------------------------------------------------";
QVariantMap transportsMap = tunnelProxyMap.value("transports").toMap();
foreach(const QString &transportInterface, transportsMap.keys()) {
qInfo().noquote().nospace() << "Connections on " << transportInterface << ": " << transportsMap.value(transportInterface).toInt();
}
qInfo().noquote() << "---------------------------------------------------------------------";
QVariantMap tunnelProxyMap = dataMap.value("tunnelProxyStatistic").toMap();
foreach (const QVariant &serverVariant, tunnelProxyMap.value("tunnelConnections").toList()) {
QVariantMap serverMap = serverVariant.toMap();
QVariantList clientList = serverMap.value("clientConnections").toList();