unraid-monitor/src/UnraidClient.h

92 lines
2.3 KiB
C++

#pragma once
#include <QDateTime>
#include <QObject>
#include <QString>
#include <QStringList>
#include <QVector>
class QNetworkAccessManager;
class QNetworkReply;
// Array-/Pool-Disk (Werte in KB, wie von der API geliefert)
struct DiskInfo {
QString name;
QString device;
QString status; // DISK_OK, DISK_NP, ...
qint64 sizeKb = 0;
qint64 fsSizeKb = 0;
qint64 fsFreeKb = 0;
qint64 fsUsedKb = 0;
qint64 numErrors = 0;
int temp = -1; // -1 = unbekannt / spun down
bool isSpinning = true;
};
// Physische Disk inkl. SMART (Größe in Bytes)
struct PhysicalDiskInfo {
QString device;
QString model; // "name" im Schema
QString vendor;
QString serial;
QString interfaceType;
QString smartStatus; // OK / UNKNOWN
double sizeBytes = 0;
double temperature = -1; // -1 = unbekannt
};
struct ContainerInfo {
QString name;
QString image;
QString state; // RUNNING, PAUSED, EXITED
QString status; // "Up 2 days" etc.
bool autoStart = false;
};
struct ServerSnapshot {
// System
QString hostname;
QString distro, release, kernel;
QString unraidVersion, apiVersion;
QString cpuBrand;
int cpuCores = 0, cpuThreads = 0;
QDateTime bootTime;
double cpuPercent = -1;
qint64 memTotal = 0, memUsed = 0, memAvailable = 0; // Bytes
double memPercent = -1;
// Array
QString arrayState;
qint64 capFreeKb = 0, capUsedKb = 0, capTotalKb = 0;
QVector<DiskInfo> dataDisks;
QVector<DiskInfo> parityDisks;
QVector<DiskInfo> cachePools;
QVector<PhysicalDiskInfo> physicalDisks;
QVector<ContainerInfo> containers;
QStringList partialErrors; // GraphQL-Fehler bei Teilantworten
};
class UnraidClient : public QObject {
Q_OBJECT
public:
explicit UnraidClient(QObject *parent = nullptr);
void setConnection(const QString &baseUrl, const QString &apiKey, bool ignoreSsl);
void refresh();
signals:
void snapshotReady(const ServerSnapshot &snapshot);
void requestFailed(const QString &error);
private:
void handleReply(QNetworkReply *reply);
static ServerSnapshot parseData(const QJsonObject &data);
QNetworkAccessManager *m_nam;
QString m_baseUrl;
QString m_apiKey;
bool m_ignoreSsl = false;
bool m_busy = false;
};