|
|
|
@ -19,6 +19,7 @@
|
|
|
|
|
|
|
|
|
|
#include <KI18n/KLocalizedString>
|
|
|
|
|
|
|
|
|
|
#include <QtConcurrent/QtConcurrent>
|
|
|
|
|
#include <QDateTime>
|
|
|
|
|
#include <QDir>
|
|
|
|
|
#include <QInputDialog>
|
|
|
|
@ -337,308 +338,16 @@ QStringList AWKeys::getHddDevices() const
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void AWKeys::setDataBySource(const QString sourceName, const QVariantMap data,
|
|
|
|
|
const QVariantMap params)
|
|
|
|
|
void AWKeys::dataUpdateReceived(const QString sourceName, const QVariantMap data,
|
|
|
|
|
const QVariantMap params)
|
|
|
|
|
{
|
|
|
|
|
qCDebug(LOG_AW);
|
|
|
|
|
qCDebug(LOG_AW) << "Source" << sourceName;
|
|
|
|
|
qCDebug(LOG_AW) << "Data" << data;
|
|
|
|
|
|
|
|
|
|
if (sourceName == QString("update")) return emit(needToBeUpdated());
|
|
|
|
|
|
|
|
|
|
// regular expressions
|
|
|
|
|
QRegExp cpuRegExp = QRegExp(QString("cpu/cpu.*/TotalLoad"));
|
|
|
|
|
QRegExp cpuclRegExp = QRegExp(QString("cpu/cpu.*/clock"));
|
|
|
|
|
QRegExp hddrRegExp = QRegExp(QString("disk/.*/Rate/rblk"));
|
|
|
|
|
QRegExp hddwRegExp = QRegExp(QString("disk/.*/Rate/wblk"));
|
|
|
|
|
QRegExp mountFillRegExp = QRegExp(QString("partitions/.*/filllevel"));
|
|
|
|
|
QRegExp mountFreeRegExp = QRegExp(QString("partitions/.*/freespace"));
|
|
|
|
|
QRegExp mountUsedRegExp = QRegExp(QString("partitions/.*/usedspace"));
|
|
|
|
|
QRegExp netRegExp = QRegExp(QString("network/interfaces/.*/(receiver|transmitter)/data$"));
|
|
|
|
|
|
|
|
|
|
if (sourceName == QString("battery")) {
|
|
|
|
|
// battery
|
|
|
|
|
foreach(QString key, data.keys()) {
|
|
|
|
|
if (key == QString("ac")) {
|
|
|
|
|
// notification
|
|
|
|
|
if ((values[QString("ac")] == params[QString("acOnline")].toString()) != data[QString("ac")].toBool()) {
|
|
|
|
|
if (data[QString("ac")].toBool())
|
|
|
|
|
AWActions::sendNotification(QString("event"), i18n("AC online"), enablePopup);
|
|
|
|
|
else
|
|
|
|
|
AWActions::sendNotification(QString("event"), i18n("AC offline"), enablePopup);
|
|
|
|
|
}
|
|
|
|
|
// value
|
|
|
|
|
if (data[QString("ac")].toBool())
|
|
|
|
|
values[QString("ac")] = params[QString("acOnline")].toString();
|
|
|
|
|
else
|
|
|
|
|
values[QString("ac")] = params[QString("acOffline")].toString();
|
|
|
|
|
} else
|
|
|
|
|
values[key] = QString("%1").arg(data[key].toFloat(), 3, 'f', 0);
|
|
|
|
|
}
|
|
|
|
|
} else if (sourceName == QString("cpu/system/TotalLoad")) {
|
|
|
|
|
// cpu
|
|
|
|
|
// notification
|
|
|
|
|
if ((data[QString("value")].toFloat() >= 90.0) && (values[QString("cpu")].toFloat() < 90.0))
|
|
|
|
|
AWActions::sendNotification(QString("event"), i18n("High CPU load"), enablePopup);
|
|
|
|
|
// value
|
|
|
|
|
values[QString("cpu")] = QString("%1").arg(data[QString("value")].toFloat(), 5, 'f', 1);
|
|
|
|
|
} else if (sourceName.contains(cpuRegExp)) {
|
|
|
|
|
// cpus
|
|
|
|
|
QString number = sourceName;
|
|
|
|
|
number.remove(QString("cpu/cpu")).remove(QString("/TotalLoad"));
|
|
|
|
|
values[QString("cpu") + number] = QString("%1").arg(data[QString("value")].toFloat(), 5, 'f', 1);
|
|
|
|
|
} else if (sourceName == QString("cpu/system/AverageClock")) {
|
|
|
|
|
// cpucl
|
|
|
|
|
values[QString("cpucl")] = QString("%1").arg(data[QString("value")].toFloat(), 4, 'f', 0);
|
|
|
|
|
} else if (sourceName.contains(cpuclRegExp)) {
|
|
|
|
|
// cpucls
|
|
|
|
|
QString number = sourceName;
|
|
|
|
|
number.remove(QString("cpu/cpu")).remove(QString("/clock"));
|
|
|
|
|
values[QString("cpucl") + number] = QString("%1").arg(data[QString("value")].toFloat(), 4, 'f', 0);
|
|
|
|
|
} else if (sourceName == QString("custom")) {
|
|
|
|
|
// custom
|
|
|
|
|
foreach(QString key, data.keys()) values[key] = data[key].toString();
|
|
|
|
|
} else if (sourceName == QString("desktop")) {
|
|
|
|
|
// desktops
|
|
|
|
|
values[QString("desktop")] = data[QString("currentName")].toString();
|
|
|
|
|
values[QString("ndesktop")] = QString("%1").arg(data[QString("currentNumber")].toInt());
|
|
|
|
|
values[QString("tdesktops")] = QString("%1").arg(data[QString("number")].toInt());
|
|
|
|
|
} else if (sourceName.contains(hddrRegExp)) {
|
|
|
|
|
// read speed
|
|
|
|
|
QString device = sourceName;
|
|
|
|
|
device.remove(QString("/Rate/rblk"));
|
|
|
|
|
for (int i=0; i<diskDevices.count(); i++) {
|
|
|
|
|
if (diskDevices.at(i) != device) continue;
|
|
|
|
|
values[QString("hddr%1").arg(i)] = QString("%1").arg(data[QString("value")].toFloat(), 5, 'f', 0);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
} else if (sourceName.contains(hddwRegExp)) {
|
|
|
|
|
// write speed
|
|
|
|
|
QString device = sourceName;
|
|
|
|
|
device.remove(QString("/Rate/wblk"));
|
|
|
|
|
for (int i=0; i<diskDevices.count(); i++) {
|
|
|
|
|
if (diskDevices.at(i) != device) continue;
|
|
|
|
|
values[QString("hddw%1").arg(i)] = QString("%1").arg(data[QString("value")].toFloat(), 5, 'f', 0);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
} else if (sourceName == QString("gpu")) {
|
|
|
|
|
// gpu load
|
|
|
|
|
// notification
|
|
|
|
|
if ((data[QString("value")].toFloat() >= 75.0) && (values[QString("gpu")].toFloat() < 75.0))
|
|
|
|
|
AWActions::sendNotification(QString("event"), i18n("High GPU load"), enablePopup);
|
|
|
|
|
// value
|
|
|
|
|
values[QString("gpu")] = QString("%1").arg(data[QString("value")].toFloat(), 5, 'f', 1);
|
|
|
|
|
} else if (sourceName == QString("gputemp")) {
|
|
|
|
|
// gpu temperature
|
|
|
|
|
values[QString("gputemp")] = QString("%1").arg(
|
|
|
|
|
temperature(data[QString("value")].toFloat(), params[QString("tempUnits")].toString()), 4, 'f', 1);
|
|
|
|
|
} else if (sourceName.contains(mountFillRegExp)) {
|
|
|
|
|
// fill level
|
|
|
|
|
QString mount = sourceName;
|
|
|
|
|
mount.remove(QString("partitions")).remove(QString("/filllevel"));
|
|
|
|
|
for (int i=0; i<mountDevices.count(); i++) {
|
|
|
|
|
if (mountDevices.at(i) != mount) continue;
|
|
|
|
|
if ((data[QString("value")].toFloat() >= 90.0) && (values[QString("hdd%1").arg(i)].toFloat() < 90.0))
|
|
|
|
|
AWActions::sendNotification(QString("event"), i18n("Free space on %1 less than 10%", mount), enablePopup);
|
|
|
|
|
values[QString("hdd%1").arg(i)] = QString("%1").arg(data[QString("value")].toFloat(), 5, 'f', 1);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
} else if (sourceName.contains(mountFreeRegExp)) {
|
|
|
|
|
// free space
|
|
|
|
|
QString mount = sourceName;
|
|
|
|
|
mount.remove(QString("partitions")).remove(QString("/freespace"));
|
|
|
|
|
for (int i=0; i<mountDevices.count(); i++) {
|
|
|
|
|
if (mountDevices.at(i) != mount) continue;
|
|
|
|
|
values[QString("hddfreemb%1").arg(i)] = QString("%1").arg(
|
|
|
|
|
data[QString("value")].toFloat() / 1024.0, 5, 'f', 0);
|
|
|
|
|
values[QString("hddfreegb%1").arg(i)] = QString("%1").arg(
|
|
|
|
|
data[QString("value")].toFloat() / (1024.0 * 1024.0), 5, 'f', 1);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
} else if (sourceName.contains(mountUsedRegExp)) {
|
|
|
|
|
// used
|
|
|
|
|
QString mount = sourceName;
|
|
|
|
|
mount.remove(QString("partitions")).remove(QString("/usedspace"));
|
|
|
|
|
for (int i=0; i<mountDevices.count(); i++) {
|
|
|
|
|
if (mountDevices.at(i) != mount) continue;
|
|
|
|
|
values[QString("hddmb%1").arg(i)] = QString("%1").arg(
|
|
|
|
|
data[QString("value")].toFloat() / 1024.0, 5, 'f', 0);
|
|
|
|
|
values[QString("hddgb%1").arg(i)] = QString("%1").arg(
|
|
|
|
|
data[QString("value")].toFloat() / (1024.0 * 1024.0), 5, 'f', 1);
|
|
|
|
|
// total
|
|
|
|
|
values[QString("hddtotmb%1").arg(i)] = QString("%1").arg(
|
|
|
|
|
values[QString("hddfreemb%1").arg(i)].toInt() +
|
|
|
|
|
values[QString("hddmb%1").arg(i)].toInt());
|
|
|
|
|
values[QString("hddtotgb%1").arg(i)] = QString("%1").arg(
|
|
|
|
|
values[QString("hddfreegb%1").arg(i)].toFloat() +
|
|
|
|
|
values[QString("hddgb%1").arg(i)].toFloat(), 5, 'f', 1);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
} else if (sourceName == QString("hddtemp")) {
|
|
|
|
|
// hdd temperature
|
|
|
|
|
foreach(QString key, data.keys())
|
|
|
|
|
for (int i=0; i<hddDevices.count(); i++) {
|
|
|
|
|
if (hddDevices.at(i) != key) continue;
|
|
|
|
|
values[QString("hddtemp%1").arg(i)] = QString("%1").arg(
|
|
|
|
|
temperature(data[key].toFloat(), params[QString("tempUnits")].toString()), 4, 'f', 1);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
} else if (sourceName.startsWith(QString("cpu/system/loadavg"))) {
|
|
|
|
|
// load average
|
|
|
|
|
QString time = sourceName;
|
|
|
|
|
time.remove(QString("cpu/system/loadavg"));
|
|
|
|
|
values[QString("la%1").arg(time)] = QString("%1").arg(data[QString("value")].toFloat(), 5, 'f', 2);
|
|
|
|
|
} else if (sourceName == QString("mem/physical/application")) {
|
|
|
|
|
// app memory
|
|
|
|
|
values[QString("memmb")] = QString("%1").arg(data[QString("value")].toFloat() / 1024.0, 5, 'f', 0);
|
|
|
|
|
values[QString("memgb")] = QString("%1").arg(data[QString("value")].toFloat() / (1024.0 * 1024.0), 5, 'f', 1);
|
|
|
|
|
} else if (sourceName == QString("mem/physical/free")) {
|
|
|
|
|
// free memory
|
|
|
|
|
values[QString("memfreemb")] = QString("%1").arg(data[QString("value")].toFloat() / 1024.0, 5, 'f', 0);
|
|
|
|
|
values[QString("memfreegb")] = QString("%1").arg(data[QString("value")].toFloat() / (1024.0 * 1024.0), 4, 'f', 1);
|
|
|
|
|
} else if (sourceName == QString("mem/physical/used")) {
|
|
|
|
|
// used memory
|
|
|
|
|
values[QString("memusedmb")] = QString("%1").arg(data[QString("value")].toFloat() / 1024.0, 0, 'f', 0);
|
|
|
|
|
values[QString("memusedgb")] = QString("%1").arg(data[QString("value")].toFloat() / (1024.0 * 1024.0), 4, 'f', 1);
|
|
|
|
|
// total
|
|
|
|
|
values[QString("memtotmb")] = QString("%1").arg(
|
|
|
|
|
values[QString("memusedmb")].toInt() + values[QString("memfreemb")].toInt(), 5);
|
|
|
|
|
values[QString("memtotgb")] = QString("%1").arg(
|
|
|
|
|
values[QString("memusedgb")].toFloat() + values[QString("memfreegb")].toFloat(), 4, 'f', 1);
|
|
|
|
|
// percentage
|
|
|
|
|
float value = 100.0 * values[QString("memmb")].toFloat() / values[QString("memtotmb")].toFloat();
|
|
|
|
|
// notification
|
|
|
|
|
if ((!isnan(value)) && (value >= 90.0) && (values[QString("mem")].toFloat() < 90.0))
|
|
|
|
|
AWActions::sendNotification(QString("event"), i18n("High memory usage"), enablePopup);
|
|
|
|
|
// value
|
|
|
|
|
values[QString("mem")] = QString("%1").arg(value, 5, 'f', 1);
|
|
|
|
|
} else if (sourceName == QString("netdev")) {
|
|
|
|
|
// network device
|
|
|
|
|
// notification
|
|
|
|
|
if (values[QString("netdev")] != data[QString("value")].toString())
|
|
|
|
|
AWActions::sendNotification(QString("event"), i18n("Network device has been changed to %1",
|
|
|
|
|
data[QString("value")].toString()),
|
|
|
|
|
enablePopup);
|
|
|
|
|
// value
|
|
|
|
|
values[QString("netdev")] = data[QString("value")].toString();
|
|
|
|
|
} else if (sourceName.contains(netRegExp)) {
|
|
|
|
|
// network speed
|
|
|
|
|
QString type = sourceName.contains(QString("receiver")) ? QString("down") : QString("up");
|
|
|
|
|
// device name
|
|
|
|
|
QString device = sourceName.split(QChar('/'))[2];
|
|
|
|
|
// values
|
|
|
|
|
float value = data[QString("value")].toFloat();
|
|
|
|
|
QString simplifiedValue = value > 1000.0 ?
|
|
|
|
|
QString("%1").arg(value / 1024.0, 4, 'f', 1) :
|
|
|
|
|
QString("%1").arg(value, 4, 'f', 0);
|
|
|
|
|
// units
|
|
|
|
|
QString units;
|
|
|
|
|
if (translateStrings)
|
|
|
|
|
units = value > 1000.0 ? i18n("MB/s") : i18n("KB/s");
|
|
|
|
|
else
|
|
|
|
|
units = value > 1000.0 ? QString("MB/s") : QString("KB/s");
|
|
|
|
|
// update
|
|
|
|
|
for (int i=0; i<networkDevices.count(); i++) {
|
|
|
|
|
if (networkDevices.at(i) != device) continue;
|
|
|
|
|
values[QString("%1kb%2").arg(type).arg(i)] = QString("%1").arg(value, 4, 'f', 0);
|
|
|
|
|
values[QString("%1%2").arg(type).arg(i)] = simplifiedValue;
|
|
|
|
|
values[QString("%1units%2").arg(type).arg(i)] = units;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
if (device == values[QString("netdev")]) {
|
|
|
|
|
values[QString("%1kb").arg(type)] = QString("%1").arg(value, 4, 'f', 0);
|
|
|
|
|
values[type] = simplifiedValue;
|
|
|
|
|
values[QString("%1units").arg(type)] = units;
|
|
|
|
|
}
|
|
|
|
|
} else if (sourceName == QString("pkg")) {
|
|
|
|
|
// package manager
|
|
|
|
|
foreach(QString key, data.keys()) values[key] = QString("%1").arg(data[key].toInt(), 2);
|
|
|
|
|
} else if (sourceName == QString("player")) {
|
|
|
|
|
// player
|
|
|
|
|
foreach(QString key, data.keys()) values[key] = data[key].toString();
|
|
|
|
|
} else if (sourceName == QString("ps")) {
|
|
|
|
|
// ps
|
|
|
|
|
values[QString("ps")] = data[QString("ps")].toString();
|
|
|
|
|
values[QString("pscount")] = QString("%1").arg(data[QString("pscount")].toInt(), 2);
|
|
|
|
|
values[QString("pstotal")] = QString("%1").arg(data[QString("pstotal")].toInt(), 3);
|
|
|
|
|
} else if (sourceName == QString("quotes")) {
|
|
|
|
|
// quotes
|
|
|
|
|
foreach(QString key, data.keys()) values[key] = QString("%1").arg(data[key].toFloat(), 7, 'f');
|
|
|
|
|
} else if (sourceName == QString("mem/swap/free")) {
|
|
|
|
|
// free swap
|
|
|
|
|
values[QString("swapfreemb")] = QString("%1").arg(data[QString("value")].toFloat() / 1024.0, 5, 'f', 0);
|
|
|
|
|
values[QString("swapfreegb")] = QString("%1").arg(data[QString("value")].toFloat() / (1024.0 * 1024.0), 4, 'f', 1);
|
|
|
|
|
} else if (sourceName == QString("mem/swap/used")) {
|
|
|
|
|
// used swap
|
|
|
|
|
values[QString("swapmb")] = QString("%1").arg(data[QString("value")].toFloat() / 1024.0, 5, 'f', 0);
|
|
|
|
|
values[QString("swapgb")] = QString("%1").arg(data[QString("value")].toFloat() / (1024.0 * 1024.0), 4, 'f', 1);
|
|
|
|
|
// total
|
|
|
|
|
values[QString("swaptotmb")] = QString("%1").arg(
|
|
|
|
|
values[QString("swapmb")].toInt() + values[QString("swapfreemb")].toInt(), 5);
|
|
|
|
|
values[QString("swaptotgb")] = QString("%1").arg(
|
|
|
|
|
values[QString("swapgb")].toFloat() + values[QString("swapfreegb")].toFloat(), 4, 'f', 1);
|
|
|
|
|
// percentage
|
|
|
|
|
float value = 100.0 * values[QString("swapmb")].toFloat() / values[QString("swaptotmb")].toFloat();
|
|
|
|
|
// notification
|
|
|
|
|
if ((!isnan(value)) && (value > 0.0) && (values[QString("swap")].toFloat() == 0.0))
|
|
|
|
|
AWActions::sendNotification(QString("event"), i18n("Swap is used"), enablePopup);
|
|
|
|
|
// value
|
|
|
|
|
values[QString("swap")] = QString("%1").arg(value, 5, 'f', 1);
|
|
|
|
|
} else if (sourceName.startsWith(QString("lmsensors/"))) {
|
|
|
|
|
// temperature devices
|
|
|
|
|
for (int i=0; i<tempDevices.count(); i++) {
|
|
|
|
|
if (sourceName != tempDevices.at(i)) continue;
|
|
|
|
|
float temp = data[QString("units")].toString() == QString("°C") ?
|
|
|
|
|
temperature(data[QString("value")].toFloat(), params[QString("tempUnits")].toString()) :
|
|
|
|
|
data[QString("value")].toFloat();
|
|
|
|
|
values[QString("temp%1").arg(i)] = QString("%1").arg(temp, 4, 'f', 1);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
} else if (sourceName == QString("Local")) {
|
|
|
|
|
// init locale
|
|
|
|
|
QLocale loc = translateStrings ? QLocale::system() : QLocale::c();
|
|
|
|
|
QDateTime dt = data[QString("DateTime")].toDateTime();
|
|
|
|
|
// time
|
|
|
|
|
values[QString("time")] = dt.toString(Qt::TextDate);
|
|
|
|
|
values[QString("isotime")] = dt.toString(Qt::ISODate);
|
|
|
|
|
values[QString("shorttime")] = loc.toString(dt, QLocale::ShortFormat);
|
|
|
|
|
values[QString("longtime")] = loc.toString(dt, QLocale::LongFormat);
|
|
|
|
|
values[QString("ctime")] = params[QString("customTime")].toString();
|
|
|
|
|
foreach(QString key, timeKeys)
|
|
|
|
|
values[QString("ctime")].replace(QString("$%1").arg(key), loc.toString(dt, key));
|
|
|
|
|
} else if (sourceName == QString("system/uptime")) {
|
|
|
|
|
// uptime
|
|
|
|
|
int uptime = data[QString("value")].toFloat();
|
|
|
|
|
int seconds = uptime - uptime % 60;
|
|
|
|
|
int minutes = seconds / 60 % 60;
|
|
|
|
|
int hours = ((seconds / 60) - minutes) / 60 % 24;
|
|
|
|
|
int days = (((seconds / 60) - minutes) / 60 - hours) / 24;
|
|
|
|
|
values[QString("uptime")] = QString("%1d%2h%3m").arg(days, 3).arg(hours, 2).arg(minutes, 2);
|
|
|
|
|
values[QString("cuptime")] = params[QString("customUptime")].toString();
|
|
|
|
|
values[QString("cuptime")].replace(QString("$dd"), QString("%1").arg(days, 3, 10, QChar('0')));
|
|
|
|
|
values[QString("cuptime")].replace(QString("$d"), QString("%1").arg(days));
|
|
|
|
|
values[QString("cuptime")].replace(QString("$hh"), QString("%1").arg(hours, 2, 10, QChar('0')));
|
|
|
|
|
values[QString("cuptime")].replace(QString("$h"), QString("%1").arg(hours));
|
|
|
|
|
values[QString("cuptime")].replace(QString("$mm"), QString("%1").arg(minutes, 2, 10, QChar('0')));
|
|
|
|
|
values[QString("cuptime")].replace(QString("$m"), QString("%1").arg(minutes));
|
|
|
|
|
} else if (sourceName == QString("weather")) {
|
|
|
|
|
foreach(QString key, data.keys()) {
|
|
|
|
|
if (key.startsWith(QString("weatherId")))
|
|
|
|
|
values[key] = QString("%1").arg(data[key].toInt(), 3);
|
|
|
|
|
else if (key.startsWith(QString("weather")))
|
|
|
|
|
values[key] = data[key].toString();
|
|
|
|
|
else if (key.startsWith(QString("humidity")))
|
|
|
|
|
values[key] = QString("%1").arg(data[key].toInt(), 3);
|
|
|
|
|
else if (key.startsWith(QString("pressure")))
|
|
|
|
|
values[key] = QString("%1").arg(data[key].toInt(), 4);
|
|
|
|
|
else if (key.startsWith(QString("temperature")))
|
|
|
|
|
values[key] = QString("%1").arg(
|
|
|
|
|
temperature(data[key].toFloat(), params[QString("tempUnits")].toString()), 4, 'f', 1);
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
qCDebug(LOG_AW) << "Source" << sourceName << "not found";
|
|
|
|
|
emit(dropSourceFromDataengine(sourceName));
|
|
|
|
|
}
|
|
|
|
|
QtConcurrent::run([this, sourceName, data, params]() {
|
|
|
|
|
return setDataBySource(sourceName, data, params);
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -934,6 +643,317 @@ QString AWKeys::parsePattern() const
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void AWKeys::setDataBySource(const QString sourceName, const QVariantMap data,
|
|
|
|
|
const QVariantMap params)
|
|
|
|
|
{
|
|
|
|
|
qCDebug(LOG_AW);
|
|
|
|
|
qCDebug(LOG_AW) << "Source" << sourceName;
|
|
|
|
|
qCDebug(LOG_AW) << "Data" << data;
|
|
|
|
|
|
|
|
|
|
if (sourceName == QString("update")) return emit(needToBeUpdated());
|
|
|
|
|
if (++queue > QUEUE_LIMIT) {
|
|
|
|
|
qCWarning(LOG_AW) << "Messages queue" << queue-- << "more than limits" << QUEUE_LIMIT;
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// regular expressions
|
|
|
|
|
QRegExp cpuRegExp = QRegExp(QString("cpu/cpu.*/TotalLoad"));
|
|
|
|
|
QRegExp cpuclRegExp = QRegExp(QString("cpu/cpu.*/clock"));
|
|
|
|
|
QRegExp hddrRegExp = QRegExp(QString("disk/.*/Rate/rblk"));
|
|
|
|
|
QRegExp hddwRegExp = QRegExp(QString("disk/.*/Rate/wblk"));
|
|
|
|
|
QRegExp mountFillRegExp = QRegExp(QString("partitions/.*/filllevel"));
|
|
|
|
|
QRegExp mountFreeRegExp = QRegExp(QString("partitions/.*/freespace"));
|
|
|
|
|
QRegExp mountUsedRegExp = QRegExp(QString("partitions/.*/usedspace"));
|
|
|
|
|
QRegExp netRegExp = QRegExp(QString("network/interfaces/.*/(receiver|transmitter)/data$"));
|
|
|
|
|
|
|
|
|
|
if (sourceName == QString("battery")) {
|
|
|
|
|
// battery
|
|
|
|
|
foreach(QString key, data.keys()) {
|
|
|
|
|
if (key == QString("ac")) {
|
|
|
|
|
// notification
|
|
|
|
|
if ((values[QString("ac")] == params[QString("acOnline")].toString()) != data[QString("ac")].toBool()) {
|
|
|
|
|
if (data[QString("ac")].toBool())
|
|
|
|
|
AWActions::sendNotification(QString("event"), i18n("AC online"), enablePopup);
|
|
|
|
|
else
|
|
|
|
|
AWActions::sendNotification(QString("event"), i18n("AC offline"), enablePopup);
|
|
|
|
|
}
|
|
|
|
|
// value
|
|
|
|
|
if (data[QString("ac")].toBool())
|
|
|
|
|
values[QString("ac")] = params[QString("acOnline")].toString();
|
|
|
|
|
else
|
|
|
|
|
values[QString("ac")] = params[QString("acOffline")].toString();
|
|
|
|
|
} else
|
|
|
|
|
values[key] = QString("%1").arg(data[key].toFloat(), 3, 'f', 0);
|
|
|
|
|
}
|
|
|
|
|
} else if (sourceName == QString("cpu/system/TotalLoad")) {
|
|
|
|
|
// cpu
|
|
|
|
|
// notification
|
|
|
|
|
if ((data[QString("value")].toFloat() >= 90.0) && (values[QString("cpu")].toFloat() < 90.0))
|
|
|
|
|
AWActions::sendNotification(QString("event"), i18n("High CPU load"), enablePopup);
|
|
|
|
|
// value
|
|
|
|
|
values[QString("cpu")] = QString("%1").arg(data[QString("value")].toFloat(), 5, 'f', 1);
|
|
|
|
|
} else if (sourceName.contains(cpuRegExp)) {
|
|
|
|
|
// cpus
|
|
|
|
|
QString number = sourceName;
|
|
|
|
|
number.remove(QString("cpu/cpu")).remove(QString("/TotalLoad"));
|
|
|
|
|
values[QString("cpu") + number] = QString("%1").arg(data[QString("value")].toFloat(), 5, 'f', 1);
|
|
|
|
|
} else if (sourceName == QString("cpu/system/AverageClock")) {
|
|
|
|
|
// cpucl
|
|
|
|
|
values[QString("cpucl")] = QString("%1").arg(data[QString("value")].toFloat(), 4, 'f', 0);
|
|
|
|
|
} else if (sourceName.contains(cpuclRegExp)) {
|
|
|
|
|
// cpucls
|
|
|
|
|
QString number = sourceName;
|
|
|
|
|
number.remove(QString("cpu/cpu")).remove(QString("/clock"));
|
|
|
|
|
values[QString("cpucl") + number] = QString("%1").arg(data[QString("value")].toFloat(), 4, 'f', 0);
|
|
|
|
|
} else if (sourceName == QString("custom")) {
|
|
|
|
|
// custom
|
|
|
|
|
foreach(QString key, data.keys()) values[key] = data[key].toString();
|
|
|
|
|
} else if (sourceName == QString("desktop")) {
|
|
|
|
|
// desktops
|
|
|
|
|
values[QString("desktop")] = data[QString("currentName")].toString();
|
|
|
|
|
values[QString("ndesktop")] = QString("%1").arg(data[QString("currentNumber")].toInt());
|
|
|
|
|
values[QString("tdesktops")] = QString("%1").arg(data[QString("number")].toInt());
|
|
|
|
|
} else if (sourceName.contains(hddrRegExp)) {
|
|
|
|
|
// read speed
|
|
|
|
|
QString device = sourceName;
|
|
|
|
|
device.remove(QString("/Rate/rblk"));
|
|
|
|
|
for (int i=0; i<diskDevices.count(); i++) {
|
|
|
|
|
if (diskDevices.at(i) != device) continue;
|
|
|
|
|
values[QString("hddr%1").arg(i)] = QString("%1").arg(data[QString("value")].toFloat(), 5, 'f', 0);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
} else if (sourceName.contains(hddwRegExp)) {
|
|
|
|
|
// write speed
|
|
|
|
|
QString device = sourceName;
|
|
|
|
|
device.remove(QString("/Rate/wblk"));
|
|
|
|
|
for (int i=0; i<diskDevices.count(); i++) {
|
|
|
|
|
if (diskDevices.at(i) != device) continue;
|
|
|
|
|
values[QString("hddw%1").arg(i)] = QString("%1").arg(data[QString("value")].toFloat(), 5, 'f', 0);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
} else if (sourceName == QString("gpu")) {
|
|
|
|
|
// gpu load
|
|
|
|
|
// notification
|
|
|
|
|
if ((data[QString("value")].toFloat() >= 75.0) && (values[QString("gpu")].toFloat() < 75.0))
|
|
|
|
|
AWActions::sendNotification(QString("event"), i18n("High GPU load"), enablePopup);
|
|
|
|
|
// value
|
|
|
|
|
values[QString("gpu")] = QString("%1").arg(data[QString("value")].toFloat(), 5, 'f', 1);
|
|
|
|
|
} else if (sourceName == QString("gputemp")) {
|
|
|
|
|
// gpu temperature
|
|
|
|
|
values[QString("gputemp")] = QString("%1").arg(
|
|
|
|
|
temperature(data[QString("value")].toFloat(), params[QString("tempUnits")].toString()), 4, 'f', 1);
|
|
|
|
|
} else if (sourceName.contains(mountFillRegExp)) {
|
|
|
|
|
// fill level
|
|
|
|
|
QString mount = sourceName;
|
|
|
|
|
mount.remove(QString("partitions")).remove(QString("/filllevel"));
|
|
|
|
|
for (int i=0; i<mountDevices.count(); i++) {
|
|
|
|
|
if (mountDevices.at(i) != mount) continue;
|
|
|
|
|
if ((data[QString("value")].toFloat() >= 90.0) && (values[QString("hdd%1").arg(i)].toFloat() < 90.0))
|
|
|
|
|
AWActions::sendNotification(QString("event"), i18n("Free space on %1 less than 10%", mount), enablePopup);
|
|
|
|
|
values[QString("hdd%1").arg(i)] = QString("%1").arg(data[QString("value")].toFloat(), 5, 'f', 1);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
} else if (sourceName.contains(mountFreeRegExp)) {
|
|
|
|
|
// free space
|
|
|
|
|
QString mount = sourceName;
|
|
|
|
|
mount.remove(QString("partitions")).remove(QString("/freespace"));
|
|
|
|
|
for (int i=0; i<mountDevices.count(); i++) {
|
|
|
|
|
if (mountDevices.at(i) != mount) continue;
|
|
|
|
|
values[QString("hddfreemb%1").arg(i)] = QString("%1").arg(
|
|
|
|
|
data[QString("value")].toFloat() / 1024.0, 5, 'f', 0);
|
|
|
|
|
values[QString("hddfreegb%1").arg(i)] = QString("%1").arg(
|
|
|
|
|
data[QString("value")].toFloat() / (1024.0 * 1024.0), 5, 'f', 1);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
} else if (sourceName.contains(mountUsedRegExp)) {
|
|
|
|
|
// used
|
|
|
|
|
QString mount = sourceName;
|
|
|
|
|
mount.remove(QString("partitions")).remove(QString("/usedspace"));
|
|
|
|
|
for (int i=0; i<mountDevices.count(); i++) {
|
|
|
|
|
if (mountDevices.at(i) != mount) continue;
|
|
|
|
|
values[QString("hddmb%1").arg(i)] = QString("%1").arg(
|
|
|
|
|
data[QString("value")].toFloat() / 1024.0, 5, 'f', 0);
|
|
|
|
|
values[QString("hddgb%1").arg(i)] = QString("%1").arg(
|
|
|
|
|
data[QString("value")].toFloat() / (1024.0 * 1024.0), 5, 'f', 1);
|
|
|
|
|
// total
|
|
|
|
|
values[QString("hddtotmb%1").arg(i)] = QString("%1").arg(
|
|
|
|
|
values[QString("hddfreemb%1").arg(i)].toInt() +
|
|
|
|
|
values[QString("hddmb%1").arg(i)].toInt());
|
|
|
|
|
values[QString("hddtotgb%1").arg(i)] = QString("%1").arg(
|
|
|
|
|
values[QString("hddfreegb%1").arg(i)].toFloat() +
|
|
|
|
|
values[QString("hddgb%1").arg(i)].toFloat(), 5, 'f', 1);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
} else if (sourceName == QString("hddtemp")) {
|
|
|
|
|
// hdd temperature
|
|
|
|
|
foreach(QString key, data.keys())
|
|
|
|
|
for (int i=0; i<hddDevices.count(); i++) {
|
|
|
|
|
if (hddDevices.at(i) != key) continue;
|
|
|
|
|
values[QString("hddtemp%1").arg(i)] = QString("%1").arg(
|
|
|
|
|
temperature(data[key].toFloat(), params[QString("tempUnits")].toString()), 4, 'f', 1);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
} else if (sourceName.startsWith(QString("cpu/system/loadavg"))) {
|
|
|
|
|
// load average
|
|
|
|
|
QString time = sourceName;
|
|
|
|
|
time.remove(QString("cpu/system/loadavg"));
|
|
|
|
|
values[QString("la%1").arg(time)] = QString("%1").arg(data[QString("value")].toFloat(), 5, 'f', 2);
|
|
|
|
|
} else if (sourceName == QString("mem/physical/application")) {
|
|
|
|
|
// app memory
|
|
|
|
|
values[QString("memmb")] = QString("%1").arg(data[QString("value")].toFloat() / 1024.0, 5, 'f', 0);
|
|
|
|
|
values[QString("memgb")] = QString("%1").arg(data[QString("value")].toFloat() / (1024.0 * 1024.0), 5, 'f', 1);
|
|
|
|
|
} else if (sourceName == QString("mem/physical/free")) {
|
|
|
|
|
// free memory
|
|
|
|
|
values[QString("memfreemb")] = QString("%1").arg(data[QString("value")].toFloat() / 1024.0, 5, 'f', 0);
|
|
|
|
|
values[QString("memfreegb")] = QString("%1").arg(data[QString("value")].toFloat() / (1024.0 * 1024.0), 4, 'f', 1);
|
|
|
|
|
} else if (sourceName == QString("mem/physical/used")) {
|
|
|
|
|
// used memory
|
|
|
|
|
values[QString("memusedmb")] = QString("%1").arg(data[QString("value")].toFloat() / 1024.0, 0, 'f', 0);
|
|
|
|
|
values[QString("memusedgb")] = QString("%1").arg(data[QString("value")].toFloat() / (1024.0 * 1024.0), 4, 'f', 1);
|
|
|
|
|
// total
|
|
|
|
|
values[QString("memtotmb")] = QString("%1").arg(
|
|
|
|
|
values[QString("memusedmb")].toInt() + values[QString("memfreemb")].toInt(), 5);
|
|
|
|
|
values[QString("memtotgb")] = QString("%1").arg(
|
|
|
|
|
values[QString("memusedgb")].toFloat() + values[QString("memfreegb")].toFloat(), 4, 'f', 1);
|
|
|
|
|
// percentage
|
|
|
|
|
float value = 100.0 * values[QString("memmb")].toFloat() / values[QString("memtotmb")].toFloat();
|
|
|
|
|
// notification
|
|
|
|
|
if ((!isnan(value)) && (value >= 90.0) && (values[QString("mem")].toFloat() < 90.0))
|
|
|
|
|
AWActions::sendNotification(QString("event"), i18n("High memory usage"), enablePopup);
|
|
|
|
|
// value
|
|
|
|
|
values[QString("mem")] = QString("%1").arg(value, 5, 'f', 1);
|
|
|
|
|
} else if (sourceName == QString("netdev")) {
|
|
|
|
|
// network device
|
|
|
|
|
// notification
|
|
|
|
|
if (values[QString("netdev")] != data[QString("value")].toString())
|
|
|
|
|
AWActions::sendNotification(QString("event"), i18n("Network device has been changed to %1",
|
|
|
|
|
data[QString("value")].toString()),
|
|
|
|
|
enablePopup);
|
|
|
|
|
// value
|
|
|
|
|
values[QString("netdev")] = data[QString("value")].toString();
|
|
|
|
|
} else if (sourceName.contains(netRegExp)) {
|
|
|
|
|
// network speed
|
|
|
|
|
QString type = sourceName.contains(QString("receiver")) ? QString("down") : QString("up");
|
|
|
|
|
// device name
|
|
|
|
|
QString device = sourceName.split(QChar('/'))[2];
|
|
|
|
|
// values
|
|
|
|
|
float value = data[QString("value")].toFloat();
|
|
|
|
|
QString simplifiedValue = value > 1000.0 ?
|
|
|
|
|
QString("%1").arg(value / 1024.0, 4, 'f', 1) :
|
|
|
|
|
QString("%1").arg(value, 4, 'f', 0);
|
|
|
|
|
// units
|
|
|
|
|
QString units;
|
|
|
|
|
if (translateStrings)
|
|
|
|
|
units = value > 1000.0 ? i18n("MB/s") : i18n("KB/s");
|
|
|
|
|
else
|
|
|
|
|
units = value > 1000.0 ? QString("MB/s") : QString("KB/s");
|
|
|
|
|
// update
|
|
|
|
|
for (int i=0; i<networkDevices.count(); i++) {
|
|
|
|
|
if (networkDevices.at(i) != device) continue;
|
|
|
|
|
values[QString("%1kb%2").arg(type).arg(i)] = QString("%1").arg(value, 4, 'f', 0);
|
|
|
|
|
values[QString("%1%2").arg(type).arg(i)] = simplifiedValue;
|
|
|
|
|
values[QString("%1units%2").arg(type).arg(i)] = units;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
if (device == values[QString("netdev")]) {
|
|
|
|
|
values[QString("%1kb").arg(type)] = QString("%1").arg(value, 4, 'f', 0);
|
|
|
|
|
values[type] = simplifiedValue;
|
|
|
|
|
values[QString("%1units").arg(type)] = units;
|
|
|
|
|
}
|
|
|
|
|
} else if (sourceName == QString("pkg")) {
|
|
|
|
|
// package manager
|
|
|
|
|
foreach(QString key, data.keys()) values[key] = QString("%1").arg(data[key].toInt(), 2);
|
|
|
|
|
} else if (sourceName == QString("player")) {
|
|
|
|
|
// player
|
|
|
|
|
foreach(QString key, data.keys()) values[key] = data[key].toString();
|
|
|
|
|
} else if (sourceName == QString("ps")) {
|
|
|
|
|
// ps
|
|
|
|
|
values[QString("ps")] = data[QString("ps")].toString();
|
|
|
|
|
values[QString("pscount")] = QString("%1").arg(data[QString("pscount")].toInt(), 2);
|
|
|
|
|
values[QString("pstotal")] = QString("%1").arg(data[QString("pstotal")].toInt(), 3);
|
|
|
|
|
} else if (sourceName == QString("quotes")) {
|
|
|
|
|
// quotes
|
|
|
|
|
foreach(QString key, data.keys()) values[key] = QString("%1").arg(data[key].toFloat(), 7, 'f');
|
|
|
|
|
} else if (sourceName == QString("mem/swap/free")) {
|
|
|
|
|
// free swap
|
|
|
|
|
values[QString("swapfreemb")] = QString("%1").arg(data[QString("value")].toFloat() / 1024.0, 5, 'f', 0);
|
|
|
|
|
values[QString("swapfreegb")] = QString("%1").arg(data[QString("value")].toFloat() / (1024.0 * 1024.0), 4, 'f', 1);
|
|
|
|
|
} else if (sourceName == QString("mem/swap/used")) {
|
|
|
|
|
// used swap
|
|
|
|
|
values[QString("swapmb")] = QString("%1").arg(data[QString("value")].toFloat() / 1024.0, 5, 'f', 0);
|
|
|
|
|
values[QString("swapgb")] = QString("%1").arg(data[QString("value")].toFloat() / (1024.0 * 1024.0), 4, 'f', 1);
|
|
|
|
|
// total
|
|
|
|
|
values[QString("swaptotmb")] = QString("%1").arg(
|
|
|
|
|
values[QString("swapmb")].toInt() + values[QString("swapfreemb")].toInt(), 5);
|
|
|
|
|
values[QString("swaptotgb")] = QString("%1").arg(
|
|
|
|
|
values[QString("swapgb")].toFloat() + values[QString("swapfreegb")].toFloat(), 4, 'f', 1);
|
|
|
|
|
// percentage
|
|
|
|
|
float value = 100.0 * values[QString("swapmb")].toFloat() / values[QString("swaptotmb")].toFloat();
|
|
|
|
|
// notification
|
|
|
|
|
if ((!isnan(value)) && (value > 0.0) && (values[QString("swap")].toFloat() == 0.0))
|
|
|
|
|
AWActions::sendNotification(QString("event"), i18n("Swap is used"), enablePopup);
|
|
|
|
|
// value
|
|
|
|
|
values[QString("swap")] = QString("%1").arg(value, 5, 'f', 1);
|
|
|
|
|
} else if (sourceName.startsWith(QString("lmsensors/"))) {
|
|
|
|
|
// temperature devices
|
|
|
|
|
for (int i=0; i<tempDevices.count(); i++) {
|
|
|
|
|
if (sourceName != tempDevices.at(i)) continue;
|
|
|
|
|
float temp = data[QString("units")].toString() == QString("°C") ?
|
|
|
|
|
temperature(data[QString("value")].toFloat(), params[QString("tempUnits")].toString()) :
|
|
|
|
|
data[QString("value")].toFloat();
|
|
|
|
|
values[QString("temp%1").arg(i)] = QString("%1").arg(temp, 4, 'f', 1);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
} else if (sourceName == QString("Local")) {
|
|
|
|
|
// init locale
|
|
|
|
|
QLocale loc = translateStrings ? QLocale::system() : QLocale::c();
|
|
|
|
|
QDateTime dt = data[QString("DateTime")].toDateTime();
|
|
|
|
|
// time
|
|
|
|
|
values[QString("time")] = dt.toString(Qt::TextDate);
|
|
|
|
|
values[QString("isotime")] = dt.toString(Qt::ISODate);
|
|
|
|
|
values[QString("shorttime")] = loc.toString(dt, QLocale::ShortFormat);
|
|
|
|
|
values[QString("longtime")] = loc.toString(dt, QLocale::LongFormat);
|
|
|
|
|
values[QString("ctime")] = params[QString("customTime")].toString();
|
|
|
|
|
foreach(QString key, timeKeys)
|
|
|
|
|
values[QString("ctime")].replace(QString("$%1").arg(key), loc.toString(dt, key));
|
|
|
|
|
} else if (sourceName == QString("system/uptime")) {
|
|
|
|
|
// uptime
|
|
|
|
|
int uptime = data[QString("value")].toFloat();
|
|
|
|
|
int seconds = uptime - uptime % 60;
|
|
|
|
|
int minutes = seconds / 60 % 60;
|
|
|
|
|
int hours = ((seconds / 60) - minutes) / 60 % 24;
|
|
|
|
|
int days = (((seconds / 60) - minutes) / 60 - hours) / 24;
|
|
|
|
|
values[QString("uptime")] = QString("%1d%2h%3m").arg(days, 3).arg(hours, 2).arg(minutes, 2);
|
|
|
|
|
values[QString("cuptime")] = params[QString("customUptime")].toString();
|
|
|
|
|
values[QString("cuptime")].replace(QString("$dd"), QString("%1").arg(days, 3, 10, QChar('0')));
|
|
|
|
|
values[QString("cuptime")].replace(QString("$d"), QString("%1").arg(days));
|
|
|
|
|
values[QString("cuptime")].replace(QString("$hh"), QString("%1").arg(hours, 2, 10, QChar('0')));
|
|
|
|
|
values[QString("cuptime")].replace(QString("$h"), QString("%1").arg(hours));
|
|
|
|
|
values[QString("cuptime")].replace(QString("$mm"), QString("%1").arg(minutes, 2, 10, QChar('0')));
|
|
|
|
|
values[QString("cuptime")].replace(QString("$m"), QString("%1").arg(minutes));
|
|
|
|
|
} else if (sourceName == QString("weather")) {
|
|
|
|
|
foreach(QString key, data.keys()) {
|
|
|
|
|
if (key.startsWith(QString("weatherId")))
|
|
|
|
|
values[key] = QString("%1").arg(data[key].toInt(), 3);
|
|
|
|
|
else if (key.startsWith(QString("weather")))
|
|
|
|
|
values[key] = data[key].toString();
|
|
|
|
|
else if (key.startsWith(QString("humidity")))
|
|
|
|
|
values[key] = QString("%1").arg(data[key].toInt(), 3);
|
|
|
|
|
else if (key.startsWith(QString("pressure")))
|
|
|
|
|
values[key] = QString("%1").arg(data[key].toInt(), 4);
|
|
|
|
|
else if (key.startsWith(QString("temperature")))
|
|
|
|
|
values[key] = QString("%1").arg(
|
|
|
|
|
temperature(data[key].toFloat(), params[QString("tempUnits")].toString()), 4, 'f', 1);
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
qCDebug(LOG_AW) << "Source" << sourceName << "not found";
|
|
|
|
|
emit(dropSourceFromDataengine(sourceName));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
queue--;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
float AWKeys::temperature(const float temp, const QString units) const
|
|
|
|
|
{
|
|
|
|
|
qCDebug(LOG_AW);
|
|
|
|
|