diff --git a/sources/gui/docs/netctl-gui-dbus-api.html b/sources/gui/docs/netctl-gui-dbus-api.html index 610bcf8..eae89be 100644 --- a/sources/gui/docs/netctl-gui-dbus-api.html +++ b/sources/gui/docs/netctl-gui-dbus-api.html @@ -196,6 +196,11 @@ small { yes + + QStringList CurrentWiFi() + returns current WiFi point in format NAME|SECURITY|TYPE|FREQS|MACS|SIGNAL|ACTIVE|EXISTS + yes + QStringList VerboseWiFi() returns available WiFi points in format NAME|SECURITY|TYPE|FREQS|MACS|SIGNAL|ACTIVE|EXISTS @@ -238,7 +243,7 @@ small { QStringList netctlVerboseProfileList() - returns available profiles in format NAME|DESCRIPTION|ESSID|ACTIVE|ENABLED from netctl even if netctl-auto is running + returns available profiles in format NAME|DESCRIPTION|TYPE|INTERFACE|ESSID|ACTIVE|ENABLED from netctl even if netctl-auto is running no @@ -248,7 +253,7 @@ small { QStringList VerboseProfileList() - returns available profiles in format NAME|DESCRIPTION|ESSID|ACTIVE|ENABLED + returns available profiles in format NAME|DESCRIPTION|TYPE|INTERFACE|ESSID|ACTIVE|ENABLED no diff --git a/sources/gui/src/dbusoperation.cpp b/sources/gui/src/dbusoperation.cpp index de353c2..f242dd6 100644 --- a/sources/gui/src/dbusoperation.cpp +++ b/sources/gui/src/dbusoperation.cpp @@ -33,13 +33,15 @@ QList parseOutputNetctl(const QList raw) QStringList list = raw[0].toStringList(); for (int i=0; itableWidget_main->setItem(i, 0, new QTableWidgetItem(profiles[i].name)); ui->tableWidget_main->item(i, 0)->setTextAlignment(Qt::AlignRight | Qt::AlignVCenter); @@ -296,9 +301,12 @@ void MainWindow::updateWifiTab() .arg(scanResults[i].macs[j]) .arg(scanResults[i].frequencies[j]) .arg(QApplication::translate("MainWindow", "MHz")); - toolTip += QString("%1: %2\n").arg(QApplication::translate("MainWindow", "Type")).arg(type); - toolTip += QString("%1: %2\n").arg(QApplication::translate("MainWindow", "Active")).arg(checkStatus(scanResults[i].active)); - toolTip += QString("%1: %2").arg(QApplication::translate("MainWindow", "Exists")).arg(checkStatus(scanResults[i].exists)); + toolTip += QString("%1: %2\n").arg(QApplication::translate("MainWindow", "Type")) + .arg(type); + toolTip += QString("%1: %2\n").arg(QApplication::translate("MainWindow", "Active")) + .arg(checkStatus(scanResults[i].active)); + toolTip += QString("%1: %2").arg(QApplication::translate("MainWindow", "Exists")) + .arg(checkStatus(scanResults[i].exists)); // name ui->tableWidget_wifi->setItem(i, 0, new QTableWidgetItem(scanResults[i].name)); ui->tableWidget_wifi->item(i, 0)->setTextAlignment(Qt::AlignRight | Qt::AlignVCenter); diff --git a/sources/gui/src/settingswindow.cpp b/sources/gui/src/settingswindow.cpp index 709f3b8..888b5d6 100644 --- a/sources/gui/src/settingswindow.cpp +++ b/sources/gui/src/settingswindow.cpp @@ -435,9 +435,9 @@ QMap SettingsWindow::getSettings(QString fileName) settings.beginGroup(QString("wpa_supplicant")); config[QString("WPASUP_PATH")] = settings.value(QString("WPASUP_PATH"), QString("/usr/bin/wpa_supplicant")).toString(); config[QString("WPACLI_PATH")] = settings.value(QString("WPACLI_PATH"), QString("/usr/bin/wpa_cli")).toString(); - config[QString("PID_FILE")] = settings.value(QString("PID_FILE"), QString("/run/wpa_supplicant_netctl-gui.pid")).toString(); + config[QString("PID_FILE")] = settings.value(QString("PID_FILE"), QString("/run/wpa_supplicant_$i.pid")).toString(); config[QString("WPA_DRIVERS")] = settings.value(QString("WPA_DRIVERS"), QString("nl80211,wext")).toString(); - config[QString("CTRL_DIR")] = settings.value(QString("CTRL_DIR"), QString("/run/wpa_supplicant_netctl-gui")).toString(); + config[QString("CTRL_DIR")] = settings.value(QString("CTRL_DIR"), QString("/run/wpa_supplicant")).toString(); config[QString("CTRL_GROUP")] = settings.value(QString("CTRL_GROUP"), QString("users")).toString(); settings.endGroup(); diff --git a/sources/helper/netctl-gui.conf b/sources/helper/netctl-gui.conf index 454c569..1d4ad88 100644 --- a/sources/helper/netctl-gui.conf +++ b/sources/helper/netctl-gui.conf @@ -60,11 +60,12 @@ WPASUP_PATH=/usr/bin/wpa_supplicant # path to wpa_cli WPACLI_PATH=/usr/bin/wpa_cli # wpa_supplicant PID file -PID_FILE=/run/wpa_supplicant_netctl-gui.pid +# $i is interface +PID_FILE=/run/wpa_supplicant_$i.pid # wpa_supplicant drivers for wireless interface comma separated WPA_DRIVERS=nl80211,wext # path to control directory which is required by wpa_supplicant -CTRL_DIR=/run/wpa_supplicant_netctl-gui +CTRL_DIR=/run/wpa_supplicant # group which is owner of CTRL_DIR CTRL_GROUP=users diff --git a/sources/helper/netctl-gui.conf.5 b/sources/helper/netctl-gui.conf.5 index 007a96c..327bc21 100644 --- a/sources/helper/netctl-gui.conf.5 +++ b/sources/helper/netctl-gui.conf.5 @@ -20,7 +20,7 @@ close helper after GUI application quit. This option is not recognized by .IP "CLOSETOTRAY=true" hide application to tray on exit if tray is available. This option is not recognized by .BR netctlgui-helper (1) -.IP "CTRL_DIR=/run/wpa_supplicant_netctl-gui" +.IP "CTRL_DIR=/run/wpa_supplicant" path to control directory which is required by .BR wpa_supplicant (8) .IP "CTRL_GROUP=users" @@ -56,7 +56,7 @@ path to service name without .I .service suffix -.IP "PID_FILE=/run/wpa_supplicant_netctl-gui.pid" +.IP "PID_FILE=/run/wpa_supplicant_$i.pid" .BR wpa_supplicant (8) PID file .IP "PREFERED_IFACE=" diff --git a/sources/helper/src/controladaptor.cpp b/sources/helper/src/controladaptor.cpp index cd9118d..68762af 100644 --- a/sources/helper/src/controladaptor.cpp +++ b/sources/helper/src/controladaptor.cpp @@ -90,7 +90,7 @@ QStringList ControlAdaptor::FindSettings() QString ControlAdaptor::LibraryDocs() { - return (QString("html/index.html").arg(QString(DOCS_PATH))); + return (QString("%1html/index.html").arg(QString(DOCS_PATH))); } @@ -249,6 +249,26 @@ bool ControlAdaptor::Remove(const QString profile) // wpaCommand +QString ControlAdaptor::CurrentWiFi() +{ + netctlWifiInfo wifiPoint = wpaCommand->current(); + QStringList point; + point.append(wifiPoint.name); + point.append(wifiPoint.security); + point.append(QString::number(wifiPoint.type)); + QStringList freqList; + for (int j=0; j wifiPoints = wpaCommand->scanWifi(); diff --git a/sources/helper/src/controladaptor.h b/sources/helper/src/controladaptor.h index 9d3b5f6..fabde9a 100644 --- a/sources/helper/src/controladaptor.h +++ b/sources/helper/src/controladaptor.h @@ -68,6 +68,7 @@ public slots: bool Create(const QString profile, const QStringList settingsList); bool Remove(const QString profile); // wpaCommand + QString CurrentWiFi(); QStringList VerboseWiFi(); QStringList WiFi(); diff --git a/sources/helper/src/netctladaptor.cpp b/sources/helper/src/netctladaptor.cpp index 2f3194b..9b1f725 100644 --- a/sources/helper/src/netctladaptor.cpp +++ b/sources/helper/src/netctladaptor.cpp @@ -137,6 +137,8 @@ QStringList NetctlAdaptor::netctlVerboseProfileList() QStringList profileInfo; profileInfo.append(profilesInfo[i].name); profileInfo.append(profilesInfo[i].description); + profileInfo.append(profilesInfo[i].type); + profileInfo.append(profilesInfo[i].interface); profileInfo.append(profilesInfo[i].essid); profileInfo.append(QString::number(profilesInfo[i].active)); profileInfo.append(QString::number(profilesInfo[i].enabled)); diff --git a/sources/helper/src/netctlhelper.cpp b/sources/helper/src/netctlhelper.cpp index e7c7551..f7f5ee1 100644 --- a/sources/helper/src/netctlhelper.cpp +++ b/sources/helper/src/netctlhelper.cpp @@ -164,9 +164,9 @@ QMap NetctlHelper::getSettings(const QString file) settings.beginGroup(QString("wpa_supplicant")); config[QString("WPASUP_PATH")] = settings.value(QString("WPASUP_PATH"), QString("/usr/bin/wpa_supplicant")).toString(); config[QString("WPACLI_PATH")] = settings.value(QString("WPACLI_PATH"), QString("/usr/bin/wpa_cli")).toString(); - config[QString("PID_FILE")] = settings.value(QString("PID_FILE"), QString("/run/wpa_supplicant_netctl-gui.pid")).toString(); + config[QString("PID_FILE")] = settings.value(QString("PID_FILE"), QString("/run/wpa_supplicant_$i.pid")).toString(); config[QString("WPA_DRIVERS")] = settings.value(QString("WPA_DRIVERS"), QString("nl80211,wext")).toString(); - config[QString("CTRL_DIR")] = settings.value(QString("CTRL_DIR"), QString("/run/wpa_supplicant_netctl-gui")).toString(); + config[QString("CTRL_DIR")] = settings.value(QString("CTRL_DIR"), QString("/run/wpa_supplicant")).toString(); config[QString("CTRL_GROUP")] = settings.value(QString("CTRL_GROUP"), QString("users")).toString(); settings.endGroup(); diff --git a/sources/netctlgui/include/netctlgui/netctlinteract.h b/sources/netctlgui/include/netctlgui/netctlinteract.h index 53ca7b6..70b5c4a 100644 --- a/sources/netctlgui/include/netctlgui/netctlinteract.h +++ b/sources/netctlgui/include/netctlgui/netctlinteract.h @@ -42,6 +42,10 @@ class NetctlProfile; * profile description * @var netctlProfileInfo::essid * ESSID if any + * @var netctlProfileInfo::interface + * profile interface + * @var netctlProfileInfo::type + * profile type * @var netctlProfileInfo::active * whether profile is active * @var netctlProfileInfo::enabled @@ -52,8 +56,10 @@ typedef struct QString name; QString description; QString essid; - bool active; - bool enabled; + QString interface; + QString type; + bool active = false; + bool enabled = false; } netctlProfileInfo; /** diff --git a/sources/netctlgui/include/netctlgui/wpasupinteract.h b/sources/netctlgui/include/netctlgui/wpasupinteract.h index 9631231..1b7e05f 100644 --- a/sources/netctlgui/include/netctlgui/wpasupinteract.h +++ b/sources/netctlgui/include/netctlgui/wpasupinteract.h @@ -81,8 +81,8 @@ typedef struct QString security; int signal; PointType type = PointType::None; - bool active; - bool exists; + bool active = false; + bool exists = false; } netctlWifiInfo; /** @@ -141,6 +141,11 @@ public: public slots: // functions + /** + * @brief method which returns active point information + * @return current point information + */ + netctlWifiInfo current(); /** * @brief method which scans WiFi networks * @return list of essids @@ -177,17 +182,17 @@ private: */ bool useSuid = true; /** - * @brief path to ctrl_directory. Defaults is "/run/wpa_supplicant_netctl-gui" + * @brief path to ctrl_directory. Defaults is "/run/wpa_supplicant" */ - QString ctrlDir = QString("/run/wpa_supplicant_netctl-gui"); + QString ctrlDir = QString("/run/wpa_supplicant"); /** * @brief group which is owner of CTRL_DIR. Default is "users" */ QString ctrlGroup = QString("users"); /** - * @brief wpa_supplicant PID file. Default is "/run/wpa_supplicant_netctl-gui.pid" + * @brief wpa_supplicant PID file. $i is interface. Default is "/run/wpa_supplicant_$i.pid" */ - QString pidFile = QString("/run/wpa_supplicant_netctl-gui.pid"); + QString pidFile = QString("/run/wpa_supplicant_$i.pid"); /** * @brief path to sudo command. Default is "/usr/bin/kdesu" */ diff --git a/sources/netctlgui/src/netctlinteract.cpp b/sources/netctlgui/src/netctlinteract.cpp index da9dd9a..7729f18 100644 --- a/sources/netctlgui/src/netctlinteract.cpp +++ b/sources/netctlgui/src/netctlinteract.cpp @@ -193,12 +193,16 @@ QList Netctl::getProfileList() profileInfo.enabled = isProfileEnabled(profileInfo.name); // external QStringList keys; + keys.append(QString("Connection")); keys.append(QString("Description")); keys.append(QString("ESSID")); + keys.append(QString("Interface")); QStringList profileValues = netctlProfile->getValuesFromProfile(profileInfo.name, keys); - profileInfo.description = profileValues[0]; - profileInfo.essid = profileValues[1]; + profileInfo.description = profileValues[1]; + profileInfo.essid = profileValues[2]; + profileInfo.interface = profileValues[3]; + profileInfo.type = profileValues[0]; fullProfilesInfo.append(profileInfo); } diff --git a/sources/netctlgui/src/netctlprofile.cpp b/sources/netctlgui/src/netctlprofile.cpp index 6371ec7..484463c 100644 --- a/sources/netctlgui/src/netctlprofile.cpp +++ b/sources/netctlgui/src/netctlprofile.cpp @@ -245,9 +245,7 @@ QString NetctlProfile::getValueFromProfile(const QString profile, const QString if (debug) qDebug() << PDEBUG << ":" << "Profile" << profile; if (debug) qDebug() << PDEBUG << ":" << "Key" << key; - QMap settings = getSettingsFromProfile(profile); - - return settings[key]; + return getValuesFromProfile(profile, QStringList() << key)[0]; } diff --git a/sources/netctlgui/src/wpasupinteract.cpp b/sources/netctlgui/src/wpasupinteract.cpp index 7283cb4..de9e245 100644 --- a/sources/netctlgui/src/wpasupinteract.cpp +++ b/sources/netctlgui/src/wpasupinteract.cpp @@ -115,7 +115,7 @@ QMap WpaSup::getRecommendedConfiguration() QStringList recommended; // ctrl directory // nothing to do - settings[QString("CTRL_DIR")] = QString("/run/wpa_supplicant_netctl-gui"); + settings[QString("CTRL_DIR")] = QString("/run/wpa_supplicant"); // ctrl group // check group list and find out 'network', 'users', 'root' settings[QString("CTRL_GROUP")] = QString(""); @@ -148,7 +148,7 @@ QMap WpaSup::getRecommendedConfiguration() } // pid file // nothing to do - settings[QString("PID_FILE")] = QString("/run/wpa_supplicant_netctl-gui.pid"); + settings[QString("PID_FILE")] = QString("/run/wpa_supplicant_$i.pid"); // sudo path // find out sudo, kdesu, gksu exes settings[QString("SUDO_PATH")] = QString(""); @@ -251,20 +251,102 @@ bool WpaSup::isProfileExists(const QString essid) } +/** + * @fn current + */ +netctlWifiInfo WpaSup::current() +{ + if (debug) qDebug() << PDEBUG; + if (pidFile.isEmpty()) { + if (debug) qDebug() << PDEBUG << ":" << "Could not find PID file"; + return netctlWifiInfo(); + } + QStringList interfaces = netctlCommand->getWirelessInterfaceList(); + if (interfaces.isEmpty()) { + if (debug) qDebug() << PDEBUG << ":" << "Could not find interfaces"; + return netctlWifiInfo(); + } + QString _pidFile = pidFile; + _pidFile.replace(QString("$i"), interfaces[0]); + if (debug) qDebug() << PDEBUG << ":" << "PID file" << _pidFile << QFile(_pidFile).exists(); + + bool terminateOnExit = (!QFile(_pidFile).exists()); + netctlWifiInfo current; + if (!startWpaSupplicant()) { + if (terminateOnExit) stopWpaSupplicant(); + return current; + } + + QStringList rawList = getWpaCliOutput(QString("status")).split(QChar('\n'), QString::SkipEmptyParts); + for (int i=0; i= 5000) && (line[1].toInt() < 6000)) + current.type = PointType::FiveG; + else if ((line[1].toInt() < 5000) && (line[1].toInt() > 2000)) + current.type = PointType::TwoG; + current.frequencies.append(line[1].toInt()); + } else if (line[0] == QString("ssid")) + current.name = line[1]; + else if (line[0] == QString("key_mgmt")) { + QString security = line[1]; + if (security.contains(QString("WPA2"))) + security = QString("WPA2"); + else if (security.contains(QString("WPA"))) + security = QString("WPA"); + else if (security.contains(QString("WEP"))) + security = QString("WEP"); + else + security = QString("none"); + current.security = security; + } + } + current.signal = 0; + if (terminateOnExit) stopWpaSupplicant(); + + // status + current.active = true; + QList profiles = netctlCommand->getProfileList(); + for (int j=0; j WpaSup::scanWifi() { if (debug) qDebug() << PDEBUG; + if (pidFile.isEmpty()) { + if (debug) qDebug() << PDEBUG << ":" << "Could not find PID file"; + return QList(); + } + QStringList interfaces = netctlCommand->getWirelessInterfaceList(); + if (interfaces.isEmpty()) { + if (debug) qDebug() << PDEBUG << ":" << "Could not find interfaces"; + return QList(); + } + QString _pidFile = pidFile; + _pidFile.replace(QString("$i"), interfaces[0]); + if (debug) qDebug() << PDEBUG << ":" << "PID file" << _pidFile << QFile(_pidFile).exists(); + bool terminateOnExit = (!QFile(_pidFile).exists()); QList scanResults; if (!startWpaSupplicant()) { - stopWpaSupplicant(); + if (terminateOnExit) stopWpaSupplicant(); return scanResults; } if (!wpaCliCall(QString("scan"))) return scanResults; - waitForProcess(1); + waitForProcess(3); QStringList rawList = getWpaCliOutput(QString("scan_results")).split(QChar('\n'), QString::SkipEmptyParts); // remove table header @@ -343,7 +425,7 @@ QList WpaSup::scanWifi() names.append(name); scanResults.append(wifiPoint); } - stopWpaSupplicant(); + if (terminateOnExit) stopWpaSupplicant(); return scanResults; } @@ -384,10 +466,13 @@ bool WpaSup::startWpaSupplicant() if (debug) qDebug() << PDEBUG << ":" << "Could not find interfaces"; return false; } + QString _pidFile = pidFile; + _pidFile.replace(QString("$i"), interfaces[0]); + if (debug) qDebug() << PDEBUG << ":" << "PID file" << _pidFile << QFile(_pidFile).exists(); - if (QFile(pidFile).exists()) return true; + if (QFile(_pidFile).exists()) return true; QString cmd = QString("%1 %2 -B -P \"%3\" -i %4 -D %5 -C \"DIR=%6 GROUP=%7\"") - .arg(sudoCommand).arg(wpaSupPath).arg(pidFile).arg(interfaces[0]) + .arg(sudoCommand).arg(wpaSupPath).arg(_pidFile).arg(interfaces[0]) .arg(wpaDrivers).arg(ctrlDir).arg(ctrlGroup); if (debug) qDebug() << PDEBUG << ":" << "Run cmd" << cmd; TaskResult process = runTask(cmd, useSuid); @@ -423,27 +508,12 @@ QString WpaSup::getWpaCliOutput(const QString commandLine) if (debug) qDebug() << PDEBUG << ":" << "Could not find directory"; return QString(); } - if (pidFile.isEmpty()) { - if (debug) qDebug() << PDEBUG << ":" << "Could not find PID file"; - return QString(); - } if (wpaCliPath.isEmpty()) { if (debug) qDebug() << PDEBUG << ":" << "Could not find wpa_cli"; return QString(); } - if (netctlCommand == nullptr) { - if (debug) qDebug() << PDEBUG << ":" << "Could not find library"; - return QString(); - } - QStringList interfaces = netctlCommand->getWirelessInterfaceList(); - if (interfaces.isEmpty()) { - if (debug) qDebug() << PDEBUG << ":" << "Could not find interfaces"; - return QString(); - } - QString interface = interfaces[0]; - QString cmd = QString("%1 -i %2 -p %3 -P %4 %5").arg(wpaCliPath).arg(interface) - .arg(ctrlDir).arg(pidFile).arg(commandLine); + QString cmd = QString("%1 -p %2 %3").arg(wpaCliPath).arg(ctrlDir).arg(commandLine); if (debug) qDebug() << PDEBUG << ":" << "Run cmd" << cmd; TaskResult process = runTask(cmd); if (debug) qDebug() << PDEBUG << ":" << "Cmd returns" << process.exitCode; @@ -462,7 +532,7 @@ bool WpaSup::waitForProcess(const int sec) if (debug) qDebug() << PDEBUG; if (debug) qDebug() << PDEBUG << ":" << "Interval" << sec; - QString cmd = QString("sleep %1").arg(QString::number(sec)); + QString cmd = QString("sleep %1").arg(sec); runTask(cmd); return true; @@ -480,27 +550,12 @@ bool WpaSup::wpaCliCall(const QString commandLine) if (debug) qDebug() << PDEBUG << ":" << "Could not find directory"; return false; } - if (pidFile.isEmpty()) { - if (debug) qDebug() << PDEBUG << ":" << "Could not find PID file"; - return false; - } if (wpaCliPath.isEmpty()) { if (debug) qDebug() << PDEBUG << ":" << "Could not find wpa_cli"; return false; } - if (netctlCommand == nullptr) { - if (debug) qDebug() << PDEBUG << ":" << "Could not find library"; - return false; - } - QStringList interfaces = netctlCommand->getWirelessInterfaceList(); - if (interfaces.isEmpty()) { - if (debug) qDebug() << PDEBUG << ":" << "Could not find interfaces"; - return false; - } - QString interface = interfaces[0]; - QString cmd = QString("%1 -i %2 -p %3 -P %4 %5").arg(wpaCliPath).arg(interface) - .arg(ctrlDir).arg(pidFile).arg(commandLine); + QString cmd = QString("%1 -p %2 %3").arg(wpaCliPath).arg(ctrlDir).arg(commandLine); if (debug) qDebug() << PDEBUG << ":" << "Run cmd" << cmd; TaskResult process = runTask(cmd); waitForProcess(1); diff --git a/sources/test/testwpasup.cpp b/sources/test/testwpasup.cpp index b00eb58..444b4d7 100644 --- a/sources/test/testwpasup.cpp +++ b/sources/test/testwpasup.cpp @@ -74,10 +74,10 @@ void TestWpaSup::cleanupTestCase() void TestWpaSup::test_getRecommendedConfiguration() { QStringList original; - original.append(QString("CTRL_DIR==/run/wpa_supplicant_netctl-gui")); + original.append(QString("CTRL_DIR==/run/wpa_supplicant")); original.append(QString("CTRL_GROUP==network")); original.append(QString("FORCE_SUDO==false")); - original.append(QString("PID_FILE==/run/wpa_supplicant_netctl-gui.pid")); + original.append(QString("PID_FILE==/run/wpa_supplicant_$i.pid")); original.append(QString("SUDO_PATH==/usr/bin/sudo")); original.append(QString("WPACLI_PATH==/usr/bin/wpa_cli")); original.append(QString("WPASUP_PATH==/usr/bin/wpa_supplicant"));