#pragma once #include #include #include #include #include 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 dataDisks; QVector parityDisks; QVector cachePools; QVector physicalDisks; QVector 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; };