Skip to content
Snippets Groups Projects

Features 9364

Merged Denis Sumin requested to merge features-9364 into master
Files
17
#include "AbstractDiagnostic.h"
#ifdef Q_OS_LINUX
#elif defined(Q_OS_WIN)
#include "registry.h"
#elif defined(Q_OS_MACOS)
#include "dap_common.h"
#endif
AbstractDiagnostic::AbstractDiagnostic(QObject *parent)
:QObject(parent)
{
#ifdef Q_OS_LINUX
s_nodeDataPath = "/opt/cellframe-node";
#elif defined(Q_OS_WIN)
s_nodeDataPath = QString("%1/cellframe-node").arg(regGetUsrPath());
#elif defined(Q_OS_MACOS)
s_nodeDataPath = QString("/Users/%1/Applications/Cellframe.app/Contents/Resources/").arg(getenv("USER"));
#endif
s_timer_update = new QTimer();
s_mac = get_mac();
}
@@ -127,7 +142,7 @@ QJsonObject AbstractDiagnostic::roles_processing()
{
QJsonObject rolesObject;
QDir currentFolder("/opt/cellframe-node/etc/network");
QDir currentFolder(s_nodeDataPath + "/etc/network");
currentFolder.setFilter( QDir::Dirs | QDir::Files | QDir::NoSymLinks );
currentFolder.setSorting( QDir::Name );
@@ -148,3 +163,209 @@ QJsonObject AbstractDiagnostic::roles_processing()
return rolesObject;
}
/// ---------------------------------------------------------------
/// Cli info
/// ---------------------------------------------------------------
QJsonObject AbstractDiagnostic::get_cli_info()
{
QStringList networks = get_networks();
QJsonObject netObj;
for(QString net : networks)
{
QJsonObject dataObj;
dataObj.insert("net_info", get_net_info(net));
dataObj.insert("mempool" , get_mempool_count(net));
// dataObj.insert("ledger" , get_ledger_count(net));
dataObj.insert("blocks" , get_blocks_count(net));
dataObj.insert("events" , get_events_count(net));
dataObj.insert("nodelist" , get_nodelist(net));
netObj.insert(net, dataObj);
}
return netObj;
}
QStringList AbstractDiagnostic::get_networks()
{
QProcess proc;
proc.start(QString(CLI_PATH), QStringList()<<"net"<<"list");
proc.waitForFinished(5000);
QString result = proc.readAll();
QStringList listNetworks;
result.remove(' ');
result.remove("\r");
result.remove("\n");
result.remove("Networks:");
if(!(result.isEmpty() || result.isNull() || result.contains('\'') || result.contains("error") || result.contains("Error") || result.contains("err")))
{
listNetworks = result.split("\t", QString::SkipEmptyParts);
}
return listNetworks;
}
QJsonObject AbstractDiagnostic::get_net_info(QString net)
{
QProcess proc;
proc.start(QString(CLI_PATH),
QStringList()<<"net"<<"-net"<<QString(net)<<"get"<<"status");
proc.waitForFinished(5000);
QString result = proc.readAll();
// ---------- State & TargetState ----------------
QRegularExpression rx(R"***(^Network "(\S+)" has state (\S+) \(target state (\S*)\), .*cur node address ([A-F0-9]{4}::[A-F0-9]{4}::[A-F0-9]{4}::[A-F0-9]{4}))***");
QRegularExpressionMatch match = rx.match(result);
if (!match.hasMatch()) {
return {};
}
QJsonObject resultObj({
{"state" , match.captured(2)},
{"target_state" , match.captured(3)},
{"node_address" , match.captured(4)}
});
// ---------- Links count ----------------
QRegularExpression rxLinks(R"(\), active links (\d+) from (\d+),)");
match = rxLinks.match(result);
if (!match.hasMatch()) {
return resultObj;
}
resultObj.insert("active_links_count", match.captured(1));
resultObj.insert("links_count" , match.captured(2));
resultObj.insert("balancer", get_balancer_links(net));
return resultObj;
}
QJsonObject AbstractDiagnostic::get_mempool_count(QString net)
{
QProcess proc;
proc.start(QString(CLI_PATH),
QStringList()<<"mempool_list"<<"-net"<<QString(net));
proc.waitForFinished(5000);
QString result = proc.readAll();
QRegularExpression rx(R"(\.(.+): Total (.+) records)");
///TODO: bug in requests. Always returns both chains
// QRegularExpressionMatch match = rx.match(result);
// if (!match.hasMatch()) {
// return {};
// }
// proc.start(QString(CLI_PATH),
// QStringList()<<"mempool_list"<<"-net"<<QString(net)<<"-chain"<<"zero");
// proc.waitForFinished(5000);
// result = proc.readAll();
QJsonObject resultObj;
QRegularExpressionMatchIterator matchItr = rx.globalMatch(result);
while (matchItr.hasNext())
{
QRegularExpressionMatch match = matchItr.next();
resultObj.insert(match.captured(1), match.captured(2));
}
return resultObj;
}
QJsonObject AbstractDiagnostic::get_ledger_count(QString net)
{
//TODO: legder tx -all -net NOT WORKING
return {};
}
QJsonObject AbstractDiagnostic::get_blocks_count(QString net)
{
QProcess proc;
proc.start(QString(CLI_PATH),
QStringList()<<"block"<<"list"<<"-net"<<QString(net) <<"-chain" << "main");
proc.waitForFinished(5000);
QString result = proc.readAll();
QRegularExpression rx(R"(\.(.+): Have (.+) blocks)");
QRegularExpressionMatch match = rx.match(result);
if (!match.hasMatch()) {
return {};
}
QJsonObject resultObj;
resultObj.insert(match.captured(1), match.captured(2));
return resultObj;
}
QJsonObject AbstractDiagnostic::get_events_count(QString net)
{
QProcess proc;
proc.start(QString(CLI_PATH),
QStringList()<<"dag"<<"event"<<"list"<<"-net"<<QString(net) <<"-chain" << "zerochain");
proc.waitForFinished(5000);
QString result = proc.readAll();
QRegularExpression rx(R"(\.(.+) have total (.+) events)");
QRegularExpressionMatch match = rx.match(result);
if (!match.hasMatch()) {
return {};
}
QJsonObject resultObj;
resultObj.insert(match.captured(1), match.captured(2));
return resultObj;
}
QJsonArray AbstractDiagnostic::get_nodelist(QString net)
{
QProcess proc;
proc.start(QString(CLI_PATH),
QStringList()<<"node"<<"dump"<<"-net"<<QString(net));
proc.waitForFinished(5000);
QString result = proc.readAll();
QJsonArray res;
for (auto l : result.split("\n"))
res.push_back(QJsonValue(l));
return res;
}
QJsonObject AbstractDiagnostic::get_balancer_links(QString net)
{
QProcess proc;
proc.start(QString(CLI_PATH),
QStringList()<<"node"<<"connections"<<"-net"<<QString(net));
proc.waitForFinished(5000);
QString result = proc.readAll();
QJsonObject resultObj;
for (auto line : result.split("\n"))
{
if (line.split(":").length() < 2)
continue;
if(line.startsWith("Uplinks:"))
resultObj.insert("uplinks", line.split(":")[1].trimmed());
if(line.startsWith("Downlinks:"))
resultObj.insert("downlinks", line.split(":")[1].trimmed());
}
qDebug() << resultObj;
return resultObj;
}
Loading