/*************************************************************************** * 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 #include #include #include "extquotes.h" #include "extscript.h" #include "extupgrade.h" #include "version.h" // KF5-KDE4 compability #ifdef BUILD_KDE4 #include #include #else #include #endif /* BUILD_KDE4 */ 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")); debug = (debugEnv == QString("yes")); setMinimumPollingInterval(333); readConfiguration(); initQuotes(); initScripts(); initUpgrade(); } QString ExtendedSysMon::getAllHdd() { if (debug) qDebug() << PDEBUG; QStringList allDevices = QDir(QString("/dev")).entryList(QDir::System, QDir::Name); QStringList devices = allDevices.filter(QRegExp(QString("^[hms]d[a-z]$"))); for (int i=0; icall(QDBus::BlockWithGui, QString("ListNames")); if (listServices.arguments().count() == 0) return QString(); QStringList arguments = listServices.arguments()[0].toStringList(); for (int i=0; ifindDirs("data", "awesomewidgets/quotes"); #else localDir = QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation) + QString("/awesomewidgets/quotes"); QDir localDirectory; if ((!localDirectory.exists(localDir)) && (localDirectory.mkpath(localDir))) if (debug) qDebug() << PDEBUG << ":" << "Created directory" << localDir; dirs = QStandardPaths::locateAll(QStandardPaths::GenericDataLocation, QString("awesomewidgets/quotes"), QStandardPaths::LocateDirectory); #endif /* BUILD_KDE4 */ QStringList names; for (int i=0; ifindDirs("data", "awesomewidgets/scripts"); #else localDir = QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation) + QString("/awesomewidgets/scripts"); QDir localDirectory; if ((!localDirectory.exists(localDir)) && (localDirectory.mkpath(localDir))) if (debug) qDebug() << PDEBUG << ":" << "Created directory" << localDir; dirs = QStandardPaths::locateAll(QStandardPaths::GenericDataLocation, QString("awesomewidgets/scripts"), QStandardPaths::LocateDirectory); #endif /* BUILD_KDE4 */ QStringList names; for (int i=0; ifindDirs("data", "awesomewidgets/upgrade"); #else localDir = QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation) + QString("/awesomewidgets/upgrade"); QDir localDirectory; if ((!localDirectory.exists(localDir)) && (localDirectory.mkpath(localDir))) if (debug) qDebug() << PDEBUG << ":" << "Created directory" << localDir; dirs = QStandardPaths::locateAll(QStandardPaths::GenericDataLocation, QString("awesomewidgets/upgrade"), QStandardPaths::LocateDirectory); #endif /* BUILD_KDE4 */ QStringList names; for (int i=0; ifindResource("config", "plasma-dataengine-extsysmon.conf"); #else fileName = QStandardPaths::locate(QStandardPaths::ConfigLocation, QString("plasma-dataengine-extsysmon.conf")); #endif /* BUILD_KDE4 */ if (debug) qDebug() << PDEBUG << ":" << "Configuration file" << fileName; QSettings settings(fileName, QSettings::IniFormat); QMap rawConfig; settings.beginGroup(QString("Configuration")); rawConfig[QString("ACPIPATH")] = settings.value(QString("ACPIPATH"), QString("/sys/class/power_supply/")).toString(); rawConfig[QString("GPUDEV")] = settings.value(QString("GPUDEV"), QString("auto")).toString(); rawConfig[QString("HDDDEV")] = settings.value(QString("HDDDEV"), QString("all")).toString(); rawConfig[QString("HDDTEMPCMD")] = settings.value(QString("HDDTEMPCMD"), QString("sudo hddtemp")).toString(); rawConfig[QString("MPDADDRESS")] = settings.value(QString("MPDADDRESS"), QString("localhost")).toString(); rawConfig[QString("MPDPORT")] = settings.value(QString("MPDPORT"), QString("6600")).toString(); rawConfig[QString("MPRIS")] = settings.value(QString("MPRIS"), QString("auto")).toString(); rawConfig[QString("PLAYER")] = settings.value(QString("PLAYER"), QString("mpris")).toString(); settings.endGroup(); configuration = updateConfiguration(rawConfig); } QMap ExtendedSysMon::updateConfiguration(QMap rawConfig) { if (debug) qDebug() << PDEBUG; // gpudev if (rawConfig[QString("GPUDEV")] == QString("disable")) rawConfig[QString("GPUDEV")] = QString("disable"); else if (rawConfig[QString("GPUDEV")] == QString("auto")) rawConfig[QString("GPUDEV")] = getAutoGpu(); else if ((rawConfig[QString("GPUDEV")] != QString("ati")) && (rawConfig[QString("GPUDEV")] != QString("nvidia"))) rawConfig[QString("GPUDEV")] = getAutoGpu(); // hdddev allHddDevices = getAllHdd().split(QChar(','), QString::SkipEmptyParts); if (rawConfig[QString("HDDDEV")] == QString("all")) rawConfig[QString("HDDDEV")] = allHddDevices.join(QChar(',')); else if (rawConfig[QString("HDDDEV")] == QString("disable")) rawConfig[QString("HDDDEV")] = QString(""); else { QStringList deviceList = rawConfig[QString("HDDDEV")].split(QChar(','), QString::SkipEmptyParts); QStringList devices; QRegExp diskRegexp = QRegExp("^/dev/[hms]d[a-z]$"); for (int i=0; i -1)) devices.append(deviceList[i]); if (devices.isEmpty()) rawConfig[QString("HDDDEV")] = allHddDevices.join(QChar(',')); else rawConfig[QString("HDDDEV")] = devices.join(QChar(',')); } // player if ((rawConfig[QString("PLAYER")] != QString("mpd")) && (rawConfig[QString("PLAYER")] != QString("mpris"))) rawConfig[QString("PLAYER")] = QString("mpris"); for (int i=0; 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 (smartctl) { for (int i=0; i= 3) { QString temp = qoutput.split(QChar(':'), QString::SkipEmptyParts)[2]; temp.remove(QChar(0260)).remove(QChar('C')); value = temp.toFloat(); } } return value; } QString ExtendedSysMon::getNetworkDevice() { if (debug) qDebug() << PDEBUG; QString device = QString("lo"); QList rawInterfaceList = QNetworkInterface::allInterfaces(); for (int i=0; i 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"); if (playerName == QString("mpd")) // mpd return getPlayerMpdInfo(mpdAddress, mpdPort); else if (playerName == QString("mpris")) { // players which supports mpris if (mpris == QString("auto")) mpris = getAutoMpris(); if (mpris.isEmpty()) return info; return getPlayerMprisInfo(mpris); } return info; } QMap ExtendedSysMon::getPlayerMpdInfo(const QString mpdAddress, const QString mpdPort) { if (debug) qDebug() << PDEBUG; if (debug) qDebug() << PDEBUG << ":" << "MPD" << mpdAddress + QString(":") + mpdPort; 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 = QString("bash -c \"echo 'currentsong\nstatus\nclose' | curl --connect-timeout 1 -fsm 3 telnet://%1:%2\"") .arg(mpdAddress) .arg(mpdPort); if (debug) qDebug() << PDEBUG << ":" << "cmd" << cmd; TaskResult process = runTask(cmd); if (debug) qDebug() << PDEBUG << ":" << "Cmd returns" << process.exitCode; if (process.exitCode != 0) if (debug) qDebug() << PDEBUG << ":" << "Error" << process.error; QString qoutput = QTextCodec::codecForMib(106)->toUnicode(process.output).trimmed(); QString qstr = QString(""); 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(); } } return info; } QMap ExtendedSysMon::getPlayerMprisInfo(const QString mpris) { if (debug) qDebug() << PDEBUG; if (debug) qDebug() << PDEBUG << "MPRIS" << mpris; QMap info; info[QString("album")] = QString("unknown"); info[QString("artist")] = QString("unknown"); info[QString("duration")] = 0; info[QString("progress")] = 0; info[QString("title")] = QString("unknown"); // init QDBusArgument arg; QDBusConnection bus = QDBusConnection::sessionBus(); QDBusMessage response, request; QVariantMap map; // general information request = QDBusMessage::createMethodCall(QString("org.mpris.MediaPlayer2.%1").arg(mpris), QString("/Player"), QString(""), QString("GetMetadata")); response = bus.call(request, QDBus::BlockWithGui); if (response.arguments().size() == 0) { if (debug) qDebug() << PDEBUG << ":" << "Error message" << response.errorMessage(); } else { arg = response.arguments()[0].value(); arg >> map; info[QString("album")] = map[QString("album")]; info[QString("artist")] = map[QString("artist")]; info[QString("duration")] = map[QString("time")]; info[QString("title")] = map[QString("title")]; } // position request = QDBusMessage::createMethodCall(QString("org.mpris.MediaPlayer2.%1").arg(mpris), QString("/Player"), QString(""), QString("PositionGet")); response = bus.call(request, QDBus::BlockWithGui); if (response.arguments().size() == 0) { if (debug) qDebug() << PDEBUG << ":" << "Error message" << response.errorMessage(); } else info[QString("progress")] = response.arguments()[0].toInt() / 1000; return info; } QMap ExtendedSysMon::getPsStats() { if (debug) qDebug() << PDEBUG; QStringList allDirectories = QDir(QString("/proc")).entryList(QDir::Dirs | QDir::NoDotAndDotDot, QDir::Name); QStringList directories = allDirectories.filter(QRegExp(QString("(\\d+)"))); QStringList running; for (int i=0; i psStats; psStats[QString("pscount")] = running.count(); psStats[QString("ps")] = running.join(QString(",")); psStats[QString("pstotal")] = directories.count(); return psStats; } bool ExtendedSysMon::sourceRequestEvent(const QString &source) { if (debug) qDebug() << PDEBUG; if (debug) qDebug() << PDEBUG << ":" << "Source" << source; return updateSourceEvent(source); } bool ExtendedSysMon::updateSourceEvent(const QString &source) { if (debug) qDebug() << PDEBUG; if (debug) qDebug() << PDEBUG << ":" << "Source" << source; if (source == QString("battery")) { QMap battery = getBattery(configuration[QString("ACPIPATH")]); setData(source, QString("ac"), battery[QString("ac")].toBool()); for (int i=0; irun()); } else if (source == QString("desktop")) { QMap desktop = getCurrentDesktop(); for (int i=0; irun()); } else if (source == QString("player")) { QMap 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 data = externalQuotes[i]->run(); setData(source, QString("ask%1").arg(i), data[QString("ask")]); setData(source, QString("bid%1").arg(i), data[QString("bid")]); setData(source, QString("price%1").arg(i), data[QString("price")]); } } else if (source == QString("update")) { setData(source, QString("value"), true); } return true; } #ifdef BUILD_KDE4 K_EXPORT_PLASMA_DATAENGINE(extsysmon, ExtendedSysMon) #else K_EXPORT_PLASMA_DATAENGINE_WITH_JSON(extsysmon, ExtendedSysMon, "plasma-dataengine-extsysmon.json") #endif /* BUILD_KDE4 */ #include "extsysmon.moc"