/*************************************************************************** * This file is part of netctl-gui * * * * netctl-gui 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. * * * * netctl-gui 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 netctl-gui. If not, see http://www.gnu.org/licenses/ * ***************************************************************************/ #include "netctl.h" #include #include #include #include #include #include #include #include Netctl::Netctl(QObject *parent, const QVariantList &args) : Plasma::DataEngine(parent, args) { Q_UNUSED(args) // debug QProcessEnvironment environment = QProcessEnvironment::systemEnvironment(); QString debugEnv = environment.value(QString("NETCTLGUI_DEBUG"), QString("no")); if (debugEnv == QString("yes")) debug = true; else debug = false; setMinimumPollingInterval(333); readConfiguration(); setProcesses(); setKeys(); } Netctl::~Netctl() { if (debug) qDebug() << "[DE]" << "[~Netctl]"; QStringList processesKeys = processes.keys(); for (int i=0; iterminate(); delete processes[processesKeys[i]]; } } QStringList Netctl::sources() const { if (debug) qDebug() << "[DE]" << "[sources]"; QStringList sources; sources.append(QString("currentProfile")); sources.append(QString("extIp")); sources.append(QString("extIp6")); sources.append(QString("interfaces")); sources.append(QString("intIp")); sources.append(QString("intIp6")); sources.append(QString("netctlAuto")); sources.append(QString("profiles")); sources.append(QString("statusBool")); sources.append(QString("statusString")); return sources; } void Netctl::initValues() { if (debug) qDebug() << "[DE]" << "[initValues]"; netctlAutoStatus = false; QStringList sourcesList = sources(); for (int i=0; i rawConfig; rawConfig[QString("CMD")] = QString("/usr/bin/netctl"); rawConfig[QString("EXTIP")] = QString("false"); rawConfig[QString("EXTIPCMD")] = QString("curl ip4.telize.com"); rawConfig[QString("EXTIP6")] = QString("false"); rawConfig[QString("EXTIP6CMD")] = QString("curl ip6.telize.com"); rawConfig[QString("NETCTLAUTOCMD")] = QString("/usr/bin/netctl-auto"); QString fileName = KGlobal::dirs()->findResource("config", "netctl.conf"); if (debug) qDebug() << "[DE]" << "[readConfiguration]" << ":" << "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 Netctl::updateConfiguration(const QMap rawConfig) { if (debug) qDebug() << "[DE]" << "[updateConfiguration]"; QMap config; QString key, value; // remove spaces and copy source map for (int i=0; istate() != QProcess::NotRunning) return; QString cmd; if (netctlAutoStatus) cmd = cmdNetctlAuto; else cmd = cmdNetctl; if (debug) qDebug() << "[DE]" << "[getCurrentProfile]" << ":" << "Cmd" << cmd; processes[QString("currentProfile")]->start(cmd + QString(" list")); } void Netctl::setCurrentProfile(int exitCode, QProcess::ExitStatus exitStatus) { Q_UNUSED(exitStatus) if (debug) qDebug() << "[DE]" << "[setCurrentProfile]"; if (debug) qDebug() << "[DE]" << "[setCurrentProfile]" << ":" << "Cmd returns" << exitCode; currentProfile = QString(""); QString status = QString("false"); QString cmdOutput = QTextCodec::codecForMib(106) ->toUnicode(processes[QString("currentProfile")]->readAllStandardOutput()); QStringList profileList = cmdOutput.split(QChar('\n'), QString::SkipEmptyParts); for (int i=0; istate() != QProcess::NotRunning) return; processes[QString("extIp")]->start(cmd); } void Netctl::setExtIp(int exitCode, QProcess::ExitStatus exitStatus) { Q_UNUSED(exitStatus) if (debug) qDebug() << "[DE]" << "[setExtIp]"; if (debug) qDebug() << "[DE]" << "[setExtIp]" << ":" << "Cmd returns" << exitCode; QString extIp = QString(""); QString cmdOutput = QTextCodec::codecForMib(106) ->toUnicode(processes[QString("extIp")]->readAllStandardOutput()) .trimmed(); extIp = cmdOutput; setData(QString("extIp"), QString("value"), extIp); } void Netctl::getExtIp6(const QString cmd) { if (debug) qDebug() << "[DE]" << "[getExtIp6]"; if (debug) qDebug() << "[DE]" << "[getExtIp6]" << ":" << "Cmd" << cmd; if (processes[QString("extIp6")]->state() != QProcess::NotRunning) return; processes[QString("extIp6")]->start(cmd); } void Netctl::setExtIp6(int exitCode, QProcess::ExitStatus exitStatus) { Q_UNUSED(exitStatus) if (debug) qDebug() << "[DE]" << "[setExtIp6]"; if (debug) qDebug() << "[DE]" << "[setExtIp6]" << ":" << "Cmd returns" << exitCode; QString extIp = QString(""); QString cmdOutput = QTextCodec::codecForMib(106) ->toUnicode(processes[QString("extIp6")]->readAllStandardOutput()) .trimmed(); extIp = cmdOutput; setData(QString("extIp6"), QString("value"), extIp); } QStringList Netctl::getInterfaceList() { if (debug) qDebug() << "[DE]" << "[getInterfaceList]"; QList rawList = QNetworkInterface::allInterfaces(); QStringList interfacesList; for (int i=0; i rawList = QNetworkInterface::allAddresses(); for (int i=0; i rawList = QNetworkInterface::allAddresses(); for (int i=0; istate() != QProcess::NotRunning) return; processes[QString("netctlAuto")]->start(cmdNetctlAuto + QString(" list")); } void Netctl::setNetctlAutoStatus(int exitCode, QProcess::ExitStatus exitStatus) { Q_UNUSED(exitStatus) if (debug) qDebug() << "[DE]" << "[setNetctlAutoStatus]"; if (debug) qDebug() << "[DE]" << "[setNetctlAutoStatus]" << ":" << "Cmd returns" << exitCode; QString status; QString cmdOutput = QTextCodec::codecForMib(106) ->toUnicode(processes[QString("netctlAuto")]->readAllStandardOutput()); if (cmdOutput.isEmpty()) { netctlAutoStatus = false; status = QString("false"); } else { netctlAutoStatus = true; status = QString("true"); } setData(QString("netctlAuto"), QString("value"), status); } void Netctl::getProfileList(const QString cmdNetctl, const QString cmdNetctlAuto) { if (debug) qDebug() << "[DE]" << "[getProfileList]"; getNetctlAutoStatus(cmdNetctlAuto); if (processes[QString("profiles")]->state() != QProcess::NotRunning) return; QString cmd; if (netctlAutoStatus) cmd = cmdNetctlAuto; else cmd = cmdNetctl; if (debug) qDebug() << "[DE]" << "[getCurrentProfile]" << ":" << "Cmd" << cmd; processes[QString("profiles")]->start(cmd + QString(" list")); } void Netctl::setProfileList(int exitCode, QProcess::ExitStatus exitStatus) { Q_UNUSED(exitStatus) if (debug) qDebug() << "[DE]" << "[setProfileList]"; if (debug) qDebug() << "[DE]" << "[setProfileList]" << ":" << "Cmd returns" << exitCode; QString cmdOutput = QTextCodec::codecForMib(106) ->toUnicode(processes[QString("profiles")]->readAllStandardOutput()); QStringList profileList = cmdOutput.split(QChar('\n'), QString::SkipEmptyParts); for (int i=0; istate() != QProcess::NotRunning) return; processes[QString("statusString")]->start(cmdNetctl + QString(" is-enabled ") + currentProfile); } void Netctl::setProfileStringStatus(int exitCode, QProcess::ExitStatus exitStatus) { Q_UNUSED(exitStatus) if (debug) qDebug() << "[DE]" << "[setProfileStringStatus]"; if (debug) qDebug() << "[DE]" << "[setProfileStringStatus]" << ":" << "Cmd returns" << exitCode; QString status = QString("static"); if (exitCode == 0) status = QString("enabled"); setData(QString("statusString"), QString("value"), status); } bool Netctl::updateSourceEvent(const QString &source) { if (debug) qDebug() << "[DE]" << "[updateSourceEvent]"; if (debug) qDebug() << "[DE]" << "[updateSourceEvent]" << ":" << "Source name" << source; if (source == QString("currentProfile")) { getCurrentProfile(configuration[QString("CMD")], configuration[QString("NETCTLAUTOCMD")]); } else if (source == QString("extIp")) { if (configuration[QString("EXTIP")] == QString("true")) getExtIp(configuration[QString("EXTIPCMD")]); } else if (source == QString("extIp6")) { if (configuration[QString("EXTIP6")] == QString("true")) getExtIp(configuration[QString("EXTIP6CMD")]); } else if (source == QString("interfaces")) { QString value = getInterfaceList().join(QChar(',')); setData(source, QString("value"), value); } else if (source == QString("intIp")) { QString value = getIntIp(); setData(source, QString("value"), value); } else if (source == QString("intIp6")) { QString value = getIntIp6(); setData(source, QString("value"), value); } else if (source == QString("netctlAuto")) { getNetctlAutoStatus(configuration[QString("NETCTLAUTOCMD")]); } else if (source == QString("profiles")) { getProfileList(configuration[QString("CMD")], configuration[QString("NETCTLAUTOCMD")]); } else if (source == QString("statusBool")) { getCurrentProfile(configuration[QString("CMD")], configuration[QString("NETCTLAUTOCMD")]); } else if (source == QString("statusString")) { getProfileStringStatus(configuration[QString("CMD")], configuration[QString("NETCTLAUTOCMD")]); } return true; } K_EXPORT_PLASMA_DATAENGINE(netctl, Netctl) #include "netctl.moc"