From 9d35c010061ce0761d582d8b15742774c7a85bff Mon Sep 17 00:00:00 2001 From: Michael Zanetti Date: Mon, 11 Jun 2018 11:28:05 +0200 Subject: [PATCH] add a systemmonitor plugin --- nymea-plugins.pro | 1 + systemmonitor/devicepluginsystemmonitor.cpp | 90 +++++++++++++++++++ systemmonitor/devicepluginsystemmonitor.h | 56 ++++++++++++ systemmonitor/devicepluginsystemmonitor.json | 31 +++++++ systemmonitor/systemmonitor.pro | 9 ++ ...b4f18-dc0c-4940-a6f7-c0c01a2861b8-en_US.ts | 4 + ...bce59-59bf-48b3-b781-54a6f45800f3-en_US.ts | 4 + 7 files changed, 195 insertions(+) create mode 100644 systemmonitor/devicepluginsystemmonitor.cpp create mode 100644 systemmonitor/devicepluginsystemmonitor.h create mode 100644 systemmonitor/devicepluginsystemmonitor.json create mode 100644 systemmonitor/systemmonitor.pro create mode 100644 systemmonitor/translations/908b4f18-dc0c-4940-a6f7-c0c01a2861b8-en_US.ts create mode 100644 systemmonitor/translations/b82bce59-59bf-48b3-b781-54a6f45800f3-en_US.ts diff --git a/nymea-plugins.pro b/nymea-plugins.pro index f0d5856d..82a638c5 100644 --- a/nymea-plugins.pro +++ b/nymea-plugins.pro @@ -33,6 +33,7 @@ PLUGIN_DIRS = \ osdomotics \ philipshue \ pushbullet \ + systemmonitor \ remotessh \ senic \ serialportcommander \ diff --git a/systemmonitor/devicepluginsystemmonitor.cpp b/systemmonitor/devicepluginsystemmonitor.cpp new file mode 100644 index 00000000..6acd62c0 --- /dev/null +++ b/systemmonitor/devicepluginsystemmonitor.cpp @@ -0,0 +1,90 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * * + * Copyright (C) 2018 Michael Zanetti . * + * * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +#include "devicepluginsystemmonitor.h" +#include "plugininfo.h" + + +DevicePluginSystemMonitor::DevicePluginSystemMonitor() +{ + +} + +DevicePluginSystemMonitor::~DevicePluginSystemMonitor() +{ + if (m_refreshTimer) { + hardwareManager()->pluginTimerManager()->unregisterTimer(m_refreshTimer); + } +} + +DeviceManager::DeviceSetupStatus DevicePluginSystemMonitor::setupDevice(Device *device) +{ + Q_UNUSED(device) + + if (!m_refreshTimer) { + m_refreshTimer = hardwareManager()->pluginTimerManager()->registerTimer(2); + connect(m_refreshTimer, &PluginTimer::timeout, this, &DevicePluginSystemMonitor::onRefreshTimer); + } + + + return DeviceManager::DeviceSetupStatusSuccess; +} + +void DevicePluginSystemMonitor::deviceRemoved(Device *device) +{ + Q_UNUSED(device) + + if (myDevices().isEmpty()) { + hardwareManager()->pluginTimerManager()->unregisterTimer(m_refreshTimer); + m_refreshTimer = nullptr; + + } +} + +void DevicePluginSystemMonitor::onRefreshTimer() +{ + QProcess *p = new QProcess(this); + connect(p, SIGNAL(finished(int,QProcess::ExitStatus)), this, SLOT(onProcessFinished(int,QProcess::ExitStatus))); + p->start("ps", {"-C", "nymead", "-o", "rss="}); +} + +void DevicePluginSystemMonitor::onProcessFinished(int exitCode, QProcess::ExitStatus exitStatus) +{ + QProcess *p = static_cast(sender()); + p->deleteLater(); + + if (exitCode != 0 || exitStatus != QProcess::NormalExit) { + qWarning(dcSystemMonitor) << "Error reading process memory usage:" << p->readAllStandardError(); + return; + } + QByteArray data = p->readAllStandardOutput().trimmed(); + bool ok; + qreal rssMem = data.toDouble(&ok); + if (!ok) { + qWarning(dcSystemMonitor) << "Failed to parse RSS memory value to a number:" << data; + return; + } + foreach (Device *dev, myDevices()) { + dev->setStateValue(systemMonitorRssMemoryStateTypeId, rssMem); + } +} + diff --git a/systemmonitor/devicepluginsystemmonitor.h b/systemmonitor/devicepluginsystemmonitor.h new file mode 100644 index 00000000..7d69e0a9 --- /dev/null +++ b/systemmonitor/devicepluginsystemmonitor.h @@ -0,0 +1,56 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * * + * Copyright (C) 2018 Michael Zanetti . * + * * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +#ifndef DEVICEPLUGINSYSTEMMONITOR_H +#define DEVICEPLUGINSYSTEMMONITOR_H + +#include "devicemanager.h" +#include "plugin/deviceplugin.h" +#include "plugintimer.h" + +#include +#include +#include + + +class DevicePluginSystemMonitor: public DevicePlugin { + Q_OBJECT + Q_PLUGIN_METADATA(IID "io.nymea.DevicePlugin" FILE "devicepluginsystemmonitor.json") + Q_INTERFACES(DevicePlugin) + +public: + explicit DevicePluginSystemMonitor(); + ~DevicePluginSystemMonitor(); + + DeviceManager::DeviceSetupStatus setupDevice(Device *device) override; + void deviceRemoved(Device *device) override; + +private slots: + void onRefreshTimer(); + void onProcessFinished(int exitCode, QProcess::ExitStatus exitStatus); + +private: + PluginTimer *m_refreshTimer = nullptr; + +}; + +#endif // DEVICEPLUGINSYSTEMMONITOR_H diff --git a/systemmonitor/devicepluginsystemmonitor.json b/systemmonitor/devicepluginsystemmonitor.json new file mode 100644 index 00000000..6c4e13b1 --- /dev/null +++ b/systemmonitor/devicepluginsystemmonitor.json @@ -0,0 +1,31 @@ +{ + "name": "systemMonitor", + "displayName": "System Monitor", + "id": "908b4f18-dc0c-4940-a6f7-c0c01a2861b8", + "vendors": [ + { + "displayName": "guh GmbH", + "name": "guh", + "id": "2062d64d-3232-433c-88bc-0d33c0ba2ba6", + "deviceClasses": [ + { + "id": "a3a15700-c251-4803-a608-0f3ddfcbd7a8", + "name": "systemMonitor", + "displayName": "System monitor", + "createMethods": [ "manual" ], + "paramTypes": [ ], + "stateTypes": [ + { + "id": "d9671ee3-51be-4cf8-8601-125c0684aec9", + "name": "rssMemory", + "displayName": "RSS memory usage", + "displayNameEvent": "RSS memory usage changed", + "type": "double", + "defaultValue": 0 + } + ] + } + ] + } + ] +} diff --git a/systemmonitor/systemmonitor.pro b/systemmonitor/systemmonitor.pro new file mode 100644 index 00000000..3d40dee4 --- /dev/null +++ b/systemmonitor/systemmonitor.pro @@ -0,0 +1,9 @@ +include(../plugins.pri) + +TARGET = $$qtLibraryTarget(nymea_devicepluginsystemmonitor) + +SOURCES += \ + devicepluginsystemmonitor.cpp \ + +HEADERS += \ + devicepluginsystemmonitor.h \ diff --git a/systemmonitor/translations/908b4f18-dc0c-4940-a6f7-c0c01a2861b8-en_US.ts b/systemmonitor/translations/908b4f18-dc0c-4940-a6f7-c0c01a2861b8-en_US.ts new file mode 100644 index 00000000..f7f66d85 --- /dev/null +++ b/systemmonitor/translations/908b4f18-dc0c-4940-a6f7-c0c01a2861b8-en_US.ts @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/systemmonitor/translations/b82bce59-59bf-48b3-b781-54a6f45800f3-en_US.ts b/systemmonitor/translations/b82bce59-59bf-48b3-b781-54a6f45800f3-en_US.ts new file mode 100644 index 00000000..f7f66d85 --- /dev/null +++ b/systemmonitor/translations/b82bce59-59bf-48b3-b781-54a6f45800f3-en_US.ts @@ -0,0 +1,4 @@ + + + + \ No newline at end of file