/*************************************************************************** * This file is part of awesome-widgets * * * * awesome-widgets 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. * * * * awesome-widgets 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 awesome-widgets. If not, see http://www.gnu.org/licenses/ * ***************************************************************************/ #include "extsysmon.h" #include #include #include #include #include #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("DEBUG"), QString("no")); if (debugEnv == QString("yes")) debug = true; else debug = false; setMinimumPollingInterval(333); readConfiguration(); initScripts(); } QString ExtendedSysMon::getAllHdd() { if (debug) qDebug() << PDEBUG; QStringList devices; QString cmd = QString("find /dev -name [hms]d[a-z]"); if (debug) qDebug() << PDEBUG << ":" << "cmd" << cmd; TaskResult process = runTask(cmd); if (debug) qDebug() << PDEBUG << ":" << "Cmd returns" << process.exitCode; QString qoutput = QTextCodec::codecForMib(106)->toUnicode(process.output); for (int i=0; itoUnicode(process.output); if (qoutput.toLower().contains("nvidia")) gpu = QString("nvidia"); else if (qoutput.toLower().contains("radeon")) gpu = QString("ati"); if (debug) qDebug() << PDEBUG << ":" << "Device" << gpu; return gpu; } QString ExtendedSysMon::getAutoMpris() { if (debug) qDebug() << PDEBUG; QString mpris; QString cmd = QString("bash -c \"qdbus 'org.mpris.MediaPlayer2.*'\""); if (debug) qDebug() << PDEBUG << ":" << "cmd" << cmd; TaskResult process = runTask(cmd); QString qoutput = QTextCodec::codecForMib(106)->toUnicode(process.output).trimmed(); if (qoutput.split(QChar('\n'))[0].split(QChar('.')).count() > 3) mpris = qoutput.split(QChar('\n'))[0].split(QChar('.'))[3]; if (debug) qDebug() << PDEBUG << ":" << "Player found" << mpris; return mpris; } void ExtendedSysMon::initScripts() { if (debug) qDebug() << PDEBUG; // create directory at $HOME QString localDir = KStandardDirs::locateLocal("data", "plasma_engine_extsysmon/scripts"); if (KStandardDirs::makeDir(localDir)) if (debug) qDebug() << PDEBUG << ":" << "Created directory" << localDir; QStringList dirs = KGlobal::dirs()->findDirs("data", "plasma_engine_extsysmon/scripts"); QStringList names; for (int i=0; i rawConfig; rawConfig[QString("ACPIPATH")] = QString("/sys/class/power_supply/"); rawConfig[QString("GPUDEV")] = QString("auto"); rawConfig[QString("HDDDEV")] = QString("all"); rawConfig[QString("HDDTEMPCMD")] = QString("sudo hddtemp"); rawConfig[QString("MPDADDRESS")] = QString("localhost"); rawConfig[QString("MPDPORT")] = QString("6600"); rawConfig[QString("MPRIS")] = QString("auto"); rawConfig[QString("PKGCMD")] = QString("pacman -Qu"); rawConfig[QString("PKGNULL")] = QString("0"); rawConfig[QString("PLAYER")] = QString("mpris"); QString fileName = KGlobal::dirs()->findResource("config", "extsysmon.conf"); if (debug) qDebug() << PDEBUG << ":" << "Configuration file" << fileName; QFile configFile(fileName); if (!configFile.open(QIODevice::ReadOnly)) { configuration = updateConfiguration(rawConfig); return; } QString fileStr; QStringList value; 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.contains(QChar('='))) { value.clear(); for (int i=1; i ExtendedSysMon::updateConfiguration(const QMap rawConfig) { if (debug) qDebug() << PDEBUG; 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(); i battery; battery[QString("ac")] = false; battery[QString("bat")] = 0; QFile acFile(acpiPath + QString("/AC/online")); if (acFile.open(QIODevice::ReadOnly)) { if (QString(acFile.readLine()).trimmed().toInt() == 1) battery[QString("ac")] = true; } acFile.close(); // batterites QStringList allDevices = QDir(acpiPath).entryList(QDir::Dirs | QDir::NoDotAndDotDot, QDir::Name); QStringList batDevices; QRegExp batRegexp = QRegExp(QString("BAT.*")); for (int i=0; i ExtendedSysMon::getCurrentDesktop() { if (debug) qDebug() << PDEBUG; int number = KWindowSystem::currentDesktop(); int total = KWindowSystem::numberOfDesktops(); QMap currentDesktop; currentDesktop[QString("currentName")] = KWindowSystem::desktopName(number); currentDesktop[QString("currentNumber")] = number; QStringList list; for (int i=1; itoUnicode(process.output).trimmed(); if (configuration[QString("GPUDEV")] == QString("nvidia")) for (int i=0; i"))) { QString load = qoutput.split(QChar('\n'), QString::SkipEmptyParts)[i] .remove(QString("")) .remove(QString("")) .remove(QChar('%')); value = load.toFloat(); } } else if (configuration[QString("GPUDEV")] == QString("ati")) for (int i=0; itoUnicode(process.output); if (configuration[QString("GPUDEV")] == QString("nvidia")) for (int i=0; i"))) { QString temp = qoutput.split(QChar('\n'), QString::SkipEmptyParts)[i] .remove(QString("")) .remove(QString("C")); value = temp.toFloat(); } } else if (configuration[QString("GPUDEV")] == QString("ati")) for (int i=0; itoUnicode(process.output).trimmed(); if (qoutput.split(QChar(':'), QString::SkipEmptyParts).count() >= 3) { QString temp = qoutput.split(QChar(':'), QString::SkipEmptyParts)[2]; temp.remove(QChar(0260)).remove(QChar('C')); value = temp.toFloat(); } return value; } QMap ExtendedSysMon::getPlayerInfo(const QString playerName, const QString mpdAddress, const QString mpdPort, QString mpris) { if (debug) qDebug() << PDEBUG; if (debug) qDebug() << PDEBUG << ":" << "player" << playerName; if (debug) qDebug() << PDEBUG << ":" << "MPD" << mpdAddress + QString(":") + mpdPort; if (debug) qDebug() << PDEBUG << ":" << "MPRIS" << mpris; QMap info; info[QString("album")] = QString("unknown"); info[QString("artist")] = QString("unknown"); info[QString("duration")] = QString("0"); info[QString("progress")] = QString("0"); info[QString("title")] = QString("unknown"); QString cmd; if (playerName == QString("mpd")) // mpd cmd = QString("bash -c \"echo 'currentsong\nstatus\nclose' | curl --connect-timeout 1 -fsm 3 telnet://%1:%2\"") .arg(mpdAddress) .arg(mpdPort); 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() << PDEBUG << ":" << "cmd" << cmd; TaskResult process = runTask(cmd); if (debug) qDebug() << PDEBUG << ":" << "Cmd returns" << process.exitCode; QString qoutput = QTextCodec::codecForMib(106)->toUnicode(process.output).trimmed(); QString qstr = QString(""); if (playerName == QString("mpd")) for (int i=0; i 1) { if (qstr.split(QString(": "), QString::SkipEmptyParts)[0] == QString("Album")) info[QString("album")] = qstr.split(QString(": "), QString::SkipEmptyParts)[1].trimmed(); else if (qstr.split(QString(": "), QString::SkipEmptyParts)[0] == QString("Artist")) info[QString("artist")] = qstr.split(QString(": "), QString::SkipEmptyParts)[1].trimmed(); else if (qstr.split(QString(": "), QString::SkipEmptyParts)[0] == QString("time")) { info[QString("duration")] = qstr.split(QString(": "), QString::SkipEmptyParts)[1].trimmed().split(QString(":"))[0]; info[QString("progress")] = qstr.split(QString(": "), QString::SkipEmptyParts)[1].trimmed().split(QString(":"))[1]; } else if (qstr.split(QString(": "), QString::SkipEmptyParts)[0] == QString("Title")) info[QString("title")] = qstr.split(QString(": "), QString::SkipEmptyParts)[1].trimmed(); } } else if (playerName == QString("mpris")) for (int i=0; i 1) { if (qstr.split(QString(": "), QString::SkipEmptyParts)[0] == QString("album")) info[QString("album")] = qstr.split(QString(": "), QString::SkipEmptyParts)[1].trimmed(); else if (qstr.split(QString(": "), QString::SkipEmptyParts)[0] == QString("artist")) info[QString("artist")] = qstr.split(QString(": "), QString::SkipEmptyParts)[1].trimmed(); else if (qstr.split(QString(": "), QString::SkipEmptyParts)[0] == QString("time")) info[QString("duration")] = qstr.split(QString(": "), QString::SkipEmptyParts)[1].trimmed(); else if (qstr.split(QString(": "), QString::SkipEmptyParts)[0] == QString("title")) info[QString("title")] = qstr.split(QString(": "), QString::SkipEmptyParts)[1].trimmed(); } else { int time = qstr.toInt() / 1000; info[QString("progress")] = QString::number(time); } } return info; } QMap ExtendedSysMon::getPsStats() { if (debug) qDebug() << PDEBUG; QMap psStats; QString cmd, qoutput; cmd = QString("ps --no-headers -o command"); if (debug) qDebug() << PDEBUG << ":" << "Run cmd" << cmd; TaskResult process = runTask(cmd); if (debug) qDebug() << PDEBUG << ":" << "Cmd returns" << process.exitCode; qoutput = QTextCodec::codecForMib(106)->toUnicode(process.output).trimmed(); QStringList psList; for (int i=0; itoUnicode(process.output).trimmed(); psStats[QString("psTotal")] = qoutput.split(QChar('\n'), QString::SkipEmptyParts).count(); return psStats; } int ExtendedSysMon::getUpgradeInfo(const QString cmd) { if (debug) qDebug() << PDEBUG; if (debug) qDebug() << PDEBUG << ":" << "cmd" << cmd; TaskResult process = runTask(QString("bash -c \"") + cmd + QString("\"")); if (debug) qDebug() << PDEBUG << ":" << "Cmd returns" << process.exitCode; QString qoutput = QTextCodec::codecForMib(106)->toUnicode(process.output).trimmed(); int count = 0; for (int i=0; i battery = getBattery(configuration[QString("ACPIPATH")]); setData(source, QString("ac"), battery[QString("ac")].toBool()); for (int i=0; irun(times[i]); if (!data.active) return true; if (data.refresh) { times[i] = 1; setData(source, QString("custom") + QString::number(i), data.output); } else times[i]++; } } else if (source == QString("desktop")) { QMap desktop = getCurrentDesktop(); for (int i=0; i player = getPlayerInfo(configuration[QString("PLAYER")], configuration[QString("MPDADDRESS")], configuration[QString("MPDPORT")], configuration[QString("MPRIS")]); for (int i=0; i ps = getPsStats(); for (int i=0; i