/*************************************************************************** * This file is part of pytextmonitor * * * * pytextmonitor is free software: you can redistribute it and/or * * modify it under the terms of the GNU General Public License as * * published by the Free Software Foundation, either version 3 of the * * License, or (at your option) any later version. * * * * pytextmonitor is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with pytextmonitor. If not, see http://www.gnu.org/licenses/ * ***************************************************************************/ #include "extsysmon.h" #include #include #include #include #include #include #include #include #include ExtendedSysMon::ExtendedSysMon(QObject* parent, const QVariantList& args) : Plasma::DataEngine(parent, args) { Q_UNUSED(args) // debug QProcessEnvironment environment = QProcessEnvironment::systemEnvironment(); QString debugEnv = environment.value(QString("PTM_DEBUG"), QString("no")); if (debugEnv == QString("yes")) debug = true; else debug = false; setMinimumPollingInterval(333); readConfiguration(); setProcesses(); setKeys(); } QString ExtendedSysMon::getAllHdd() { if (debug) qDebug() << "[DE]" << "[getAllHdd]"; QProcess command; QStringList devices; QString cmd = QString("find /dev -name [hms]d[a-z]"); QString qoutput = QString(""); if (debug) qDebug() << "[DE]" << "[getAllHdd]" << ":" << "Run cmd" << cmd; command.start(cmd); command.waitForFinished(-1); if (debug) qDebug() << "[DE]" << "[getAllHdd]" << ":" << "Cmd returns" << command.exitCode(); qoutput = QTextCodec::codecForMib(106)->toUnicode(command.readAllStandardOutput()); for (int i=0; itoUnicode(command.readAllStandardOutput()); if (qoutput.toLower().contains("nvidia")) gpu = QString("nvidia"); else if (qoutput.toLower().contains("radeon")) gpu = QString("ati"); if (debug) qDebug() << "[DE]" << "[getAutoGpu]" << ":" << "Device" << gpu; return gpu; } QString ExtendedSysMon::getAutoMpris() { if (debug) qDebug() << "[DE]" << "[getAutoMpris]"; QProcess command; QString mpris; QString cmd = QString("bash -c \"qdbus 'org.mpris.MediaPlayer2.*'\""); if (debug) qDebug() << "[DE]" << "[getAutoMpris]" << ":" << "Run cmd" << cmd; command.start(cmd); command.waitForFinished(-1); QString cmdOutput = QTextCodec::codecForMib(106)->toUnicode(command.readAllStandardOutput()).trimmed(); if (cmdOutput.split(QChar('\n'))[0].split(QChar('.')).count() > 3) mpris = cmdOutput.split(QChar('\n'))[0].split(QChar('.'))[3]; if (debug) qDebug() << "[DE]" << "[getAutoMpris]" << ":" << "Player found" << mpris; return mpris; } QStringList ExtendedSysMon::getDesktopNames() { if (debug) qDebug() << "[DE]" << "[getDesktopNames]"; QStringList list; QString fileName = KGlobal::dirs()->findResource("config", "kwinrc"); if (debug) qDebug() << "[DE]" << "[getDesktopNames]" << ":" << "Configuration file" << fileName; QFile configFile(fileName); if (!configFile.open(QIODevice::ReadOnly)) return list; QString fileStr; QStringList value; bool desktopSection = false; while (true) { fileStr = QString(configFile.readLine()).trimmed(); if ((fileStr.isEmpty()) && (!configFile.atEnd())) continue; if ((fileStr[0] == QChar('#')) && (!configFile.atEnd())) continue; if ((fileStr[0] == QChar(';')) && (!configFile.atEnd())) continue; if (fileStr[0] == QChar('[')) desktopSection = false; if (fileStr == QString("[Desktops]")) desktopSection = true; if (desktopSection) { if (fileStr.contains(QChar('='))) { value.clear(); for (int i=1; i ExtendedSysMon::updateConfiguration(const QMap rawConfig) { if (debug) qDebug() << "[DE]" << "[updateConfiguration]"; QMap config; QString key, value; // remove spaces and copy source map for (int i=0; i -1)) devices.append(deviceList[i]); if (devices.isEmpty()) config[QString("HDDDEV")] = getAllHdd(); else config[QString("HDDDEV")] = devices.join(QChar(',')); } // pkgcmd for (int i=config[QString("PKGNULL")].split(QString(","), QString::SkipEmptyParts).count(); istate() != QProcess::Running) && (processes[QString("desktop")][0]->state() != QProcess::Starting)) processes[QString("desktop")][0]->start(QString("bash -c \"") + cmd + QString("\"")); } void ExtendedSysMon::setCurrentDesktop(int exitCode, QProcess::ExitStatus exitStatus) { Q_UNUSED(exitStatus) if (debug) qDebug() << "[DE]" << "[setCurrentDesktop]"; if (debug) qDebug() << "[DE]" << "[setCurrentDesktop]" << ":" << "Cmd returns" << exitCode; QString qoutput = QTextCodec::codecForMib(106)->toUnicode(processes[QString("desktop")][0]->readAllStandardOutput()).trimmed(); int number = qoutput.toInt(); QString key, source, value; source = QString("desktop"); key = QString("list"); setData(source, key, configuration[QString("DESKTOP")]); key = QString("number"); setData(source, key, configuration[QString("DESKTOP")].split(QString(";;")).count()); key = QString("currentName"); setData(source, key, configuration[QString("DESKTOP")].split(QString(";;"))[number-1]); key = QString("currentNumber"); setData(source, key, number); } void ExtendedSysMon::getCustomCmd(const QString cmd, const int number) { if (debug) qDebug() << "[DE]" << "[getCustomCmd]"; if (debug) qDebug() << "[DE]" << "[getCustomCmd]" << ":" << "Run function with cmd" << cmd; if (debug) qDebug() << "[DE]" << "[getCustomCmd]" << ":" << "Run function with number" << number; if (debug) qDebug() << "[DE]" << "[getCustomCmd]" << ":" << "Run cmd" << QString("bash -c \"") + cmd + QString("\""); if ((processes[QString("custom")][number]->state() != QProcess::Running) && (processes[QString("custom")][number]->state() != QProcess::Starting)) processes[QString("custom")][number]->start(QString("bash -c \"") + cmd + QString("\"")); } void ExtendedSysMon::setCustomCmd(int exitCode, QProcess::ExitStatus exitStatus) { Q_UNUSED(exitStatus) if (debug) qDebug() << "[DE]" << "[setCustomCmd]"; if (debug) qDebug() << "[DE]" << "[setCustomCmd]" << ":" << "Cmd returns" << exitCode; for (int i=0; itoUnicode(processes[QString("custom")][i]->readAllStandardOutput()).trimmed(); if (!value.isEmpty()) { if (debug) qDebug() << "[DE]" << "[setCustomCmd]" << ":" << "Found data for cmd" << i; if (debug) qDebug() << "[DE]" << "[setCustomCmd]" << ":" << "Return" << value; QString source = QString("custom"); QString key = QString("custom") + QString::number(i); setData(source, key, value); } } } void ExtendedSysMon::getGpu(const QString device) { if (debug) qDebug() << "[DE]" << "[getGpu]"; if (debug) qDebug() << "[DE]" << "[getGpu]" << ":" << "Run function with device" << device; if ((device != QString("nvidia")) && (device != QString("ati"))) return; QString cmd = QString(""); if (device == QString("nvidia")) cmd = QString("nvidia-smi -q -d UTILIZATION"); else if (device == QString("ati")) cmd = QString("aticonfig --od-getclocks"); if (debug) qDebug() << "[DE]" << "[getGpu]" << ":" << "Run cmd" << cmd; if ((processes[QString("gpu")][0]->state() != QProcess::Running) && (processes[QString("gpu")][0]->state() != QProcess::Starting)) processes[QString("gpu")][0]->start(cmd); } void ExtendedSysMon::setGpu(int exitCode, QProcess::ExitStatus exitStatus) { Q_UNUSED(exitStatus) if (debug) qDebug() << "[DE]" << "[setGpu]"; if (debug) qDebug() << "[DE]" << "[setGpu]" << ":" << "Cmd returns" << exitCode; float value = 0.0; QString qoutput; if (configuration[QString("GPUDEV")] == QString("nvidia")) { qoutput = QTextCodec::codecForMib(106)->toUnicode(processes[QString("gpu")][0]->readAllStandardOutput()); for (int i=0; itoUnicode(processes[QString("gpu")][0]->readAllStandardOutput()); for (int i=0; istate() != QProcess::Running) && (processes[QString("gputemp")][0]->state() != QProcess::Running)) processes[QString("gputemp")][0]->start(cmd); } void ExtendedSysMon::setGpuTemp(int exitCode, QProcess::ExitStatus exitStatus) { Q_UNUSED(exitStatus) if (debug) qDebug() << "[DE]" << "[setGpuTemp]"; if (debug) qDebug() << "[DE]" << "[setGpuTemp]" << ":" << "Cmd returns" << exitCode; float value = 0.0; QString qoutput; if (configuration[QString("GPUDEV")] == QString("nvidia")) { qoutput = QTextCodec::codecForMib(106)->toUnicode(processes[QString("gputemp")][0]->readAllStandardOutput()); for (int i=0; itoUnicode(processes[QString("gputemp")][0]->readAllStandardOutput()); for (int i=0; istate() != QProcess::Running) && (processes[QString("hddtemp")][number]->state() != QProcess::Starting)) processes[QString("hddtemp")][number]->start(cmd + QString(" ") + device); } void ExtendedSysMon::setHddTemp(int exitCode, QProcess::ExitStatus exitStatus) { Q_UNUSED(exitStatus) if (debug) qDebug() << "[DE]" << "[setHddTemp]"; if (debug) qDebug() << "[DE]" << "[setHddTemp]" << ":" << "Cmd returns" << exitCode; for (int i=0; itoUnicode(processes[QString("hddtemp")][i]->readAllStandardOutput()).trimmed(); if (qoutput.split(QChar(':'), QString::SkipEmptyParts).count() >= 3) { if (debug) qDebug() << "[DE]" << "[setHddTemp]" << ":" << "Found data for cmd" << i; QString temp = qoutput.split(QChar(':'), QString::SkipEmptyParts)[2]; temp.remove(QChar(0260)).remove(QChar('C')); value = temp.toFloat(); if (debug) qDebug() << "[DE]" << "[setHddTemp]" << ":" << "Return" << value; QString source = QString("hddtemp"); QString key = configuration[QString("HDDDEV")].split(QChar(','), QString::SkipEmptyParts)[i]; setData(source, key, value); } } } void ExtendedSysMon::getPlayerInfo(const QString playerName, const QString mpdAddress, const QString mpdPort, QString mpris) { if (debug) qDebug() << "[DE]" << "[getPlayerInfo]"; if (debug) qDebug() << "[DE]" << "[getPlayerInfo]" << ":" << "Run function with player" << playerName; if (debug) qDebug() << "[DE]" << "[getPlayerInfo]" << ":" << "Run function with MPD parameters" << mpdAddress + QString(":") + mpdPort; if (debug) qDebug() << "[DE]" << "[getPlayerInfo]" << ":" << "Run function with MPRIS" << mpris; QString cmd; if (playerName == QString("mpd")) // mpd cmd = QString("bash -c \"echo 'currentsong\nstatus\nclose' | curl --connect-timeout 1 -fsm 3 telnet://") + mpdAddress + QString(":") + mpdPort + QString("\""); else if (playerName == QString("mpris")) { // players which supports mpris if (mpris == "auto") mpris = getAutoMpris(); cmd = QString("bash -c \"qdbus org.mpris.%1 /Player GetMetadata && qdbus org.mpris.%1 /Player PositionGet\"") .arg(mpris); } if (debug) qDebug() << "[DE]" << "[getPlayerInfo]" << ":" << "Run cmd" << cmd; if ((processes[QString("player")][0]->state() != QProcess::Running) && (processes[QString("player")][0]->state() != QProcess::Starting)) processes[QString("player")][0]->start(cmd); } void ExtendedSysMon::setPlayer(int exitCode, QProcess::ExitStatus exitStatus) { Q_UNUSED(exitStatus) if (debug) qDebug() << "[DE]" << "[setPlayer]"; if (debug) qDebug() << "[DE]" << "[setPlayer]" << ":" << "Cmd returns" << exitCode; QString playerName = configuration[QString("PLAYER")]; QString qoutput = QString(""); QString qstr = QString(""); QStringList info; // album info.append(QString("unknown")); // artist info.append(QString("unknown")); // progress info.append(QString("0")); // duration info.append(QString("0")); // title info.append(QString("unknown")); if (playerName == QString("mpd")) { qoutput = QTextCodec::codecForMib(106)->toUnicode(processes[QString("player")][0]->readAllStandardOutput()); for (int i=0; i 1) { if (qstr.split(QString(": "), QString::SkipEmptyParts)[0] == QString("Album")) info[0] = qstr.split(QString(": "), QString::SkipEmptyParts)[1].trimmed(); else if (qstr.split(QString(": "), QString::SkipEmptyParts)[0] == QString("Artist")) info[1] = qstr.split(QString(": "), QString::SkipEmptyParts)[1].trimmed(); else if (qstr.split(QString(": "), QString::SkipEmptyParts)[0] == QString("time")) { info[3] = qstr.split(QString(": "), QString::SkipEmptyParts)[1].trimmed().split(QString(":"))[0]; info[2] = qstr.split(QString(": "), QString::SkipEmptyParts)[1].trimmed().split(QString(":"))[1]; } else if (qstr.split(QString(": "), QString::SkipEmptyParts)[0] == QString("Title")) info[4] = qstr.split(QString(": "), QString::SkipEmptyParts)[1].trimmed(); } } } else if (playerName == QString("mpris")) { qoutput = QTextCodec::codecForMib(106)->toUnicode(processes[QString("player")][0]->readAllStandardOutput()); if (!qoutput.isEmpty()) { for (int i=0; i 1) { if (qstr.split(QString(": "), QString::SkipEmptyParts)[0] == QString("album")) info[0] = qstr.split(QString(": "), QString::SkipEmptyParts)[1].trimmed(); else if (qstr.split(QString(": "), QString::SkipEmptyParts)[0] == QString("artist")) info[1] = qstr.split(QString(": "), QString::SkipEmptyParts)[1].trimmed(); else if (qstr.split(QString(": "), QString::SkipEmptyParts)[0] == QString("time")) info[3] = qstr.split(QString(": "), QString::SkipEmptyParts)[1].trimmed(); else if (qstr.split(QString(": "), QString::SkipEmptyParts)[0] == QString("title")) info[4] = qstr.split(QString(": "), QString::SkipEmptyParts)[1].trimmed(); } else { int time = qstr.toInt() / 1000; info[2] = QString::number(time); } } } } QString source = QString("player"); QString key; key = QString("album"); setData(source, key, info[0]); key = QString("artist"); setData(source, key, info[1]); key = QString("progress"); setData(source, key, info[2]); key = QString("duration"); setData(source, key, info[3]); key = QString("title"); setData(source, key, info[4]); } void ExtendedSysMon::getPsStats() { if (debug) qDebug() << "[DE]" << "[getPsStats]"; QString cmd; cmd = QString("ps --no-headers -o command"); if (debug) qDebug() << "[DE]" << "[getPsStats]" << ":" << "Run cmd" << cmd; if ((processes[QString("ps")][0]->state() != QProcess::Running) && (processes[QString("ps")][0]->state() != QProcess::Starting)) processes[QString("ps")][0]->start(cmd); cmd = QString("ps -e --no-headers -o command"); if (debug) qDebug() << "[DE]" << "[getPsStats]" << ":" << "Run cmd" << cmd; if ((processes[QString("ps")][1]->state() != QProcess::Running) && (processes[QString("ps")][1]->state() != QProcess::Starting)) processes[QString("ps")][1]->start(cmd); } void ExtendedSysMon::setPs(int exitCode, QProcess::ExitStatus exitStatus) { Q_UNUSED(exitStatus) if (debug) qDebug() << "[DE]" << "[setPs]"; if (debug) qDebug() << "[DE]" << "[setPs]" << ":" << "Cmd returns" << exitCode; QString qoutput = QString(""); for (int i=0; itoUnicode(processes[QString("ps")][i]->readAllStandardOutput()).trimmed(); if (!qoutput.isEmpty()) { if (debug) qDebug() << "[DE]" << "[setPs]" << ":" << "Found data for cmd" << i; if (i == 0) { // pscount && ps QStringList psList; for (int i=0; istate() != QProcess::Running) && (processes[QString("pkg")][number]->state() != QProcess::Starting)) processes[QString("pkg")][number]->start(cmd); } void ExtendedSysMon::setUpgradeInfo(int exitCode, QProcess::ExitStatus exitStatus) { Q_UNUSED(exitStatus) if (debug) qDebug() << "[DE]" << "[setUpgradeInfo]"; if (debug) qDebug() << "[DE]" << "[setUpgradeInfo]" << ":" << "Cmd returns" << exitCode; for (int i=0; itoUnicode(processes[QString("pkg")][i]->readAllStandardOutput()).trimmed(); if (!qoutput.isEmpty()) { if (debug) qDebug() << "[DE]" << "[setUpgradeInfo]" << ":" << "Found data for cmd" << i; pkgNull = configuration[QString("PKGNULL")].split(QString(","), QString::SkipEmptyParts)[i].toInt(); value = qoutput.toInt(); if (debug) qDebug() << "[DE]" << "[setUpgradeInfo]" << ":" << "Return" << value; QString source = QString("pkg"); QString key = QString("pkgCount") + QString::number(i); setData(source, key, value - pkgNull); } } } bool ExtendedSysMon::sourceRequestEvent(const QString &name) { if (debug) qDebug() << "[DE]" << "[sourceRequestEvent]"; if (debug) qDebug() << "[DE]" << "[sourceRequestEvent]" << ":" << "Run function with source name" << name; return updateSourceEvent(name); } bool ExtendedSysMon::updateSourceEvent(const QString &source) { if (debug) qDebug() << "[DE]" << "[updateSourceEvent]"; if (debug) qDebug() << "[DE]" << "[updateSourceEvent]" << ":" << "Run function with source name" << source; if (source == QString("custom")) { for (int i=0; i