2019-10-31 09:56:53 +08:00
|
|
|
|
/*
|
2020-06-23 12:01:21 +08:00
|
|
|
|
* Copyright (C) 2020 Tianjin KYLIN Information Technology Co., Ltd.
|
2019-10-31 09:56:53 +08:00
|
|
|
|
*
|
|
|
|
|
* This program 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, or (at your option)
|
|
|
|
|
* any later version.
|
|
|
|
|
*
|
|
|
|
|
* This program 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 this program; if not, see <http://www.gnu.org/licenses/>.
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
#include "backthread.h"
|
2020-03-19 10:55:40 +08:00
|
|
|
|
#include "utils.h"
|
2019-10-31 09:56:53 +08:00
|
|
|
|
|
2020-01-09 16:32:16 +08:00
|
|
|
|
#include <unistd.h>
|
2020-02-25 21:52:01 +08:00
|
|
|
|
#include <stdlib.h>
|
2020-03-19 10:55:40 +08:00
|
|
|
|
#include <sys/syslog.h>
|
|
|
|
|
#include <sys/types.h>
|
|
|
|
|
#include <sys/wait.h>
|
2020-01-09 16:32:16 +08:00
|
|
|
|
|
2019-10-31 09:56:53 +08:00
|
|
|
|
#include <QFile>
|
|
|
|
|
#include <QRegExp>
|
2020-06-01 20:19:02 +08:00
|
|
|
|
#include <QDir>
|
2019-10-31 09:56:53 +08:00
|
|
|
|
|
2020-05-28 14:44:04 +08:00
|
|
|
|
BackThread::BackThread(QObject *parent) : QObject(parent)
|
|
|
|
|
{
|
2021-04-21 20:33:16 +08:00
|
|
|
|
cmdProcessWifi = new QProcess(this);
|
|
|
|
|
connect(cmdProcessWifi , SIGNAL(readyReadStandardOutput()) , this , SLOT(onReadOutputWifi()));
|
|
|
|
|
connect(cmdProcessWifi , SIGNAL(readyReadStandardError()) , this , SLOT(onReadErrorWifi()));
|
|
|
|
|
|
|
|
|
|
cmdProcessLan = new QProcess(this);
|
|
|
|
|
connect(cmdProcessLan , SIGNAL(readyReadStandardOutput()) , this , SLOT(onReadOutputLan()));
|
|
|
|
|
connect(cmdProcessLan , SIGNAL(readyReadStandardError()) , this , SLOT(onReadErrorLan()));
|
2020-01-09 16:32:16 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
BackThread::~BackThread()
|
|
|
|
|
{
|
2021-04-21 20:33:16 +08:00
|
|
|
|
cmdProcessWifi->close();
|
|
|
|
|
cmdProcessLan->close();
|
2019-10-31 09:56:53 +08:00
|
|
|
|
}
|
2020-05-28 20:02:25 +08:00
|
|
|
|
|
2020-05-28 14:44:04 +08:00
|
|
|
|
//get the connection state of wired and wireles network
|
|
|
|
|
IFace* BackThread::execGetIface()
|
|
|
|
|
{
|
2019-10-31 09:56:53 +08:00
|
|
|
|
IFace *iface = new IFace();
|
2020-04-13 15:15:35 +08:00
|
|
|
|
|
2020-06-01 20:19:02 +08:00
|
|
|
|
QString tmpPath = "/tmp/kylin-nm-iface-" + QDir::home().dirName();
|
|
|
|
|
QString cmd = "export LANG='en_US.UTF-8';export LANGUAGE='en_US';nmcli -f TYPE,DEVICE,STATE device > " + tmpPath;
|
2020-03-19 10:55:40 +08:00
|
|
|
|
Utils::m_system(cmd.toUtf8().data());
|
|
|
|
|
|
2020-06-01 20:19:02 +08:00
|
|
|
|
QFile file(tmpPath);
|
2020-05-28 14:44:04 +08:00
|
|
|
|
if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
|
|
|
|
|
// print information if can not open file ~/.config/kylin-nm-iface
|
|
|
|
|
syslog(LOG_ERR, "Can't open the file ~/.config/kylin-nm-iface!");
|
|
|
|
|
qDebug()<<"Can't open the file ~/.config/kylin-nm-iface!";
|
2019-10-31 09:56:53 +08:00
|
|
|
|
}
|
|
|
|
|
QString txt = file.readAll();
|
|
|
|
|
QStringList txtList = txt.split("\n");
|
|
|
|
|
file.close();
|
|
|
|
|
|
|
|
|
|
iface->lstate = 2;
|
|
|
|
|
iface->wstate = 2;
|
|
|
|
|
|
2020-05-28 14:44:04 +08:00
|
|
|
|
for (int i = 1; i < txtList.size(); i ++) {
|
2019-10-31 09:56:53 +08:00
|
|
|
|
QString line = txtList.at(i);
|
2020-05-28 14:44:04 +08:00
|
|
|
|
if (line != "") {
|
2019-10-31 09:56:53 +08:00
|
|
|
|
int index1 = line.indexOf(" ");
|
|
|
|
|
QString type = line.left(index1);
|
|
|
|
|
QString lastStr = line.mid(index1).trimmed();
|
|
|
|
|
int index2 = lastStr.indexOf(" ");
|
|
|
|
|
QString iname = lastStr.left(index2);
|
|
|
|
|
QString istateStr = lastStr.mid(index2).trimmed();
|
|
|
|
|
|
2020-12-11 14:53:20 +08:00
|
|
|
|
//只要存在一个有线设备已连接,就不再扫描其他有线设备状态,避免有线被误断开
|
|
|
|
|
if (type == "ethernet" && iface->lstate != 0) {
|
2020-05-28 14:44:04 +08:00
|
|
|
|
// if type is wired network
|
2019-10-31 09:56:53 +08:00
|
|
|
|
iface->lname = iname;
|
|
|
|
|
|
2020-05-28 14:44:04 +08:00
|
|
|
|
if (istateStr == "unmanaged") {
|
2021-01-11 16:34:46 +08:00
|
|
|
|
iface->lstate = 2; //switch of wired device is off
|
2021-01-10 11:52:59 +08:00
|
|
|
|
} else if (istateStr == "disconnected" || istateStr == "unavailable") {
|
2021-01-11 16:34:46 +08:00
|
|
|
|
iface->lstate = 1; //wired network is disconnected
|
2021-01-13 14:41:02 +08:00
|
|
|
|
} else if (istateStr == "connected" || istateStr == "connecting (getting IP configuration)") {
|
2021-01-11 16:34:46 +08:00
|
|
|
|
iface->lstate = 0; //wired network is connected
|
2021-01-10 11:52:59 +08:00
|
|
|
|
} else {
|
|
|
|
|
//连接中,正在配置
|
|
|
|
|
iface->lstate = 3;
|
2019-10-31 09:56:53 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
2021-03-23 15:20:46 +08:00
|
|
|
|
if (type == "wifi" && iface->wname.isEmpty()) { //仅统计第一个无线网卡,后续无线网卡状态必然等于或差与第一个获取到的无线网卡
|
2020-05-28 14:44:04 +08:00
|
|
|
|
// if type is wireless network
|
2019-10-31 09:56:53 +08:00
|
|
|
|
iface->wname = iname;
|
|
|
|
|
|
2020-05-28 14:44:04 +08:00
|
|
|
|
if (istateStr == "unmanaged" || istateStr == "unavailable") {
|
|
|
|
|
iface->wstate = 2; //switch of wireless device is off
|
2021-01-03 10:18:49 +08:00
|
|
|
|
} else if (istateStr == "disconnected") {
|
2020-05-28 14:44:04 +08:00
|
|
|
|
iface->wstate = 1; //wireless network is disconnected
|
2021-01-03 10:18:49 +08:00
|
|
|
|
} else if (istateStr == "connected") {
|
2020-05-28 14:44:04 +08:00
|
|
|
|
iface->wstate = 0; //wireless network is connected
|
2021-01-03 10:18:49 +08:00
|
|
|
|
} else {
|
|
|
|
|
//连接中,正在配置
|
|
|
|
|
iface->wstate = 3;
|
2019-10-31 09:56:53 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return iface;
|
|
|
|
|
}
|
|
|
|
|
|
2020-05-28 14:44:04 +08:00
|
|
|
|
//turn on the switch of network
|
|
|
|
|
void BackThread::execEnNet()
|
|
|
|
|
{
|
2020-03-19 10:55:40 +08:00
|
|
|
|
char *chr = "nmcli networking on";
|
|
|
|
|
Utils::m_system(chr);
|
|
|
|
|
|
2020-05-28 14:44:04 +08:00
|
|
|
|
while (1) {
|
|
|
|
|
if (execGetIface()->lstate != 2) {
|
2020-01-09 16:32:16 +08:00
|
|
|
|
sleep(3);
|
|
|
|
|
emit enNetDone();
|
|
|
|
|
emit btFinish();
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
sleep(1);
|
|
|
|
|
}
|
2019-10-31 09:56:53 +08:00
|
|
|
|
}
|
|
|
|
|
|
2020-05-28 14:44:04 +08:00
|
|
|
|
//turn off the switch of wireless network first, then turn off the switch of network
|
|
|
|
|
void BackThread::execDisNet()
|
|
|
|
|
{
|
|
|
|
|
if (execGetIface()->wstate != 2) {
|
2020-03-19 10:55:40 +08:00
|
|
|
|
char *chr = "nmcli radio wifi off";
|
|
|
|
|
Utils::m_system(chr);
|
|
|
|
|
|
2020-05-28 14:44:04 +08:00
|
|
|
|
while (1) {
|
|
|
|
|
if (execGetIface()->wstate == 2) {
|
2020-01-09 16:32:16 +08:00
|
|
|
|
emit disWifiDone();
|
|
|
|
|
emit btFinish();
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
sleep(1);
|
|
|
|
|
}
|
|
|
|
|
}
|
2020-03-19 10:55:40 +08:00
|
|
|
|
|
|
|
|
|
char *chr1 = "nmcli networking off";
|
|
|
|
|
Utils::m_system(chr1);
|
2020-12-08 14:45:58 +08:00
|
|
|
|
|
2020-05-28 14:44:04 +08:00
|
|
|
|
while (1) {
|
|
|
|
|
if (execGetIface()->lstate == 2) {
|
2020-01-09 16:32:16 +08:00
|
|
|
|
emit disNetDone();
|
|
|
|
|
emit btFinish();
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
sleep(1);
|
|
|
|
|
}
|
2019-10-31 09:56:53 +08:00
|
|
|
|
}
|
|
|
|
|
|
2020-05-28 14:44:04 +08:00
|
|
|
|
//turn on the switch of wireless network
|
|
|
|
|
void BackThread::execEnWifi()
|
|
|
|
|
{
|
2020-03-19 10:55:40 +08:00
|
|
|
|
char *chr1 = "nmcli radio wifi on";
|
|
|
|
|
Utils::m_system(chr1);
|
2021-01-12 13:56:39 +08:00
|
|
|
|
emit btFinish();
|
2021-04-16 07:46:21 +08:00
|
|
|
|
KylinDBus objBackThreadDBus;
|
2021-01-12 13:56:39 +08:00
|
|
|
|
|
2020-05-28 14:44:04 +08:00
|
|
|
|
while (1) {
|
|
|
|
|
if (execGetIface()->wstate != 2) {
|
|
|
|
|
while (1) {
|
2021-04-16 07:46:21 +08:00
|
|
|
|
if (objBackThreadDBus.getAccessPointsNumber() > 0) {
|
|
|
|
|
// objBackThreadDBus.getAccessPointsNumber()>0 standard can get wireless accesspoints now
|
2020-01-09 16:32:16 +08:00
|
|
|
|
emit enWifiDone();
|
|
|
|
|
emit btFinish();
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
sleep(2);
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
sleep(1);
|
2019-11-29 17:55:39 +08:00
|
|
|
|
}
|
2019-10-31 09:56:53 +08:00
|
|
|
|
}
|
|
|
|
|
|
2020-05-28 14:44:04 +08:00
|
|
|
|
//turn off the switch of wireless network
|
|
|
|
|
void BackThread::execDisWifi()
|
|
|
|
|
{
|
2020-03-19 10:55:40 +08:00
|
|
|
|
char *chr = "nmcli radio wifi off";
|
|
|
|
|
Utils::m_system(chr);
|
2020-05-28 14:44:04 +08:00
|
|
|
|
while (1) {
|
|
|
|
|
if (execGetIface()->wstate == 2) {
|
2020-01-09 16:32:16 +08:00
|
|
|
|
emit disWifiDone();
|
|
|
|
|
emit btFinish();
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
sleep(1);
|
2019-10-31 09:56:53 +08:00
|
|
|
|
}
|
2020-01-09 16:32:16 +08:00
|
|
|
|
}
|
2019-10-31 09:56:53 +08:00
|
|
|
|
|
2020-05-28 14:44:04 +08:00
|
|
|
|
//to connect wired network
|
2021-01-20 17:22:10 +08:00
|
|
|
|
void BackThread::execConnLan(QString connName, QString ifname, QString connectType)
|
2020-05-28 14:44:04 +08:00
|
|
|
|
{
|
2021-01-09 10:50:45 +08:00
|
|
|
|
currConnLanUuid = connName;
|
2021-01-20 19:33:10 +08:00
|
|
|
|
currConnLanType = connectType;
|
2021-01-21 14:57:48 +08:00
|
|
|
|
QString mycmd; //连接命令
|
2021-04-16 07:46:21 +08:00
|
|
|
|
KylinDBus objBackThreadDBus;
|
2020-12-21 17:09:23 +08:00
|
|
|
|
|
2021-04-16 07:46:21 +08:00
|
|
|
|
bool isWiredCableAlready = objBackThreadDBus.getWiredCableStateByIfname(ifname);
|
2021-01-21 14:57:48 +08:00
|
|
|
|
|
2021-05-21 14:34:24 +08:00
|
|
|
|
if (connectType == "bluetooth" || ifname == "") {
|
2021-04-02 12:15:25 +08:00
|
|
|
|
isWiredCableAlready = true; //对于蓝牙类型的网络不需要接入网线就可以连接
|
2021-01-21 14:57:48 +08:00
|
|
|
|
mycmd = "export LANG='en_US.UTF-8';export LANGUAGE='en_US';nmcli connection up '" + connName + "'";
|
|
|
|
|
} else {
|
|
|
|
|
mycmd = "export LANG='en_US.UTF-8';export LANGUAGE='en_US';nmcli connection up '" + connName + "' ifname '" + ifname + "'";
|
|
|
|
|
}
|
2021-05-22 09:40:48 +08:00
|
|
|
|
qDebug()<<"Trying to connect wifi. ssid="<<connName;
|
2021-01-21 14:57:48 +08:00
|
|
|
|
|
2021-04-02 12:15:25 +08:00
|
|
|
|
if (isWiredCableAlready) {
|
2021-01-09 10:50:45 +08:00
|
|
|
|
QStringList options;
|
|
|
|
|
options << "-c" << mycmd;
|
2021-04-21 20:33:16 +08:00
|
|
|
|
cmdProcessLan->start("/bin/bash",options);
|
|
|
|
|
cmdProcessLan->waitForStarted();
|
|
|
|
|
cmdProcessLan->waitForFinished();
|
2019-10-31 09:56:53 +08:00
|
|
|
|
} else {
|
2020-07-20 13:52:51 +08:00
|
|
|
|
qDebug()<<"connect wired network failed for without wired cable plug in.";
|
|
|
|
|
syslog(LOG_DEBUG, "connect wired network failed for without wired cable plug in.");
|
2019-10-31 09:56:53 +08:00
|
|
|
|
emit connDone(1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
emit btFinish();
|
|
|
|
|
}
|
|
|
|
|
|
2021-01-09 10:50:45 +08:00
|
|
|
|
void BackThread::onReadOutputLan()
|
|
|
|
|
{
|
2021-04-21 20:33:16 +08:00
|
|
|
|
QByteArray cmdout = cmdProcessLan->readAllStandardOutput();
|
2021-01-09 10:50:45 +08:00
|
|
|
|
QString strResult = QString::fromLocal8Bit(cmdout);
|
|
|
|
|
qDebug()<<"on_readoutput_lan: "<< strResult;
|
|
|
|
|
dellConnectLanResult(strResult);
|
|
|
|
|
}
|
|
|
|
|
void BackThread::onReadErrorLan()
|
|
|
|
|
{
|
2021-04-21 20:33:16 +08:00
|
|
|
|
QByteArray cmdout = cmdProcessLan->readAllStandardError();
|
2021-01-09 10:50:45 +08:00
|
|
|
|
QString strResult = QString::fromLocal8Bit(cmdout);
|
|
|
|
|
qDebug()<<"on_readerror_lan: "<< strResult;
|
|
|
|
|
dellConnectLanResult(strResult);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void BackThread::dellConnectLanResult(QString info)
|
|
|
|
|
{
|
|
|
|
|
if (info.indexOf("successfully") != -1) {
|
|
|
|
|
qDebug()<<"debug: in function execConnLan, wired net state is: "<<QString::number(execGetIface()->lstate);
|
|
|
|
|
syslog(LOG_DEBUG, "In function execConnLan, wired net state is: %d", execGetIface()->lstate);
|
2021-01-20 19:33:10 +08:00
|
|
|
|
|
|
|
|
|
if (currConnLanType == "bluetooth") {
|
|
|
|
|
emit connDone(2);
|
|
|
|
|
} else {
|
|
|
|
|
emit connDone(0);
|
|
|
|
|
}
|
2021-01-09 10:50:45 +08:00
|
|
|
|
} else {
|
|
|
|
|
QString cmd = "nmcli connection down '" + currConnLanUuid + "'";
|
|
|
|
|
Utils::m_system(cmd.toUtf8().data());
|
|
|
|
|
if (info.indexOf("IP configuration could not be reserved") != -1) {
|
|
|
|
|
emit connDone(4);
|
|
|
|
|
} else if(info.indexOf("MACs") != -1 || info.indexOf("Mac") != -1 || info.indexOf("MAC") != -1) {
|
|
|
|
|
emit connDone(5);
|
|
|
|
|
} else if(info.indexOf("Killed") != -1 || info.indexOf("killed") != -1) {
|
|
|
|
|
emit connDone(6);
|
2021-01-21 14:57:48 +08:00
|
|
|
|
} else if(info.indexOf("The Bluetooth connection failed") != -1) {
|
2021-01-09 10:50:45 +08:00
|
|
|
|
emit connDone(7);
|
2021-01-21 14:57:48 +08:00
|
|
|
|
} else if(info.indexOf("Carrier/link changed") != -1) {
|
|
|
|
|
emit connDone(8);
|
|
|
|
|
} else {
|
|
|
|
|
emit connDone(9);
|
2021-01-09 10:50:45 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2020-05-28 14:44:04 +08:00
|
|
|
|
//to connected wireless network need a password
|
2020-11-11 16:50:10 +08:00
|
|
|
|
void BackThread::execConnWifiPWD(QString connName, QString password, QString connType)
|
2020-05-28 14:44:04 +08:00
|
|
|
|
{
|
2020-05-19 20:26:06 +08:00
|
|
|
|
//disConnLanOrWifi("wifi");
|
2020-01-09 16:32:16 +08:00
|
|
|
|
|
2020-11-11 16:50:10 +08:00
|
|
|
|
if (!connType.isEmpty()) {
|
2021-03-10 11:07:42 +08:00
|
|
|
|
QString strConntype = "nmcli connection modify '" + connName + "' wifi-sec.psk-flags 0";
|
2020-11-11 16:50:10 +08:00
|
|
|
|
Utils::m_system(strConntype.toUtf8().data());
|
|
|
|
|
}
|
|
|
|
|
|
2020-06-01 20:19:02 +08:00
|
|
|
|
QString tmpPath = "/tmp/kylin-nm-btoutput-" + QDir::home().dirName();
|
|
|
|
|
QString cmdStr = "export LANG='en_US.UTF-8';export LANGUAGE='en_US';nmcli device wifi connect '" + connName + "' password '" + password + "' > " + tmpPath;
|
2020-03-19 10:55:40 +08:00
|
|
|
|
Utils::m_system(cmdStr.toUtf8().data());
|
2019-10-31 09:56:53 +08:00
|
|
|
|
|
2020-06-01 20:19:02 +08:00
|
|
|
|
QFile file(tmpPath);
|
2020-05-28 14:44:04 +08:00
|
|
|
|
if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
|
2020-01-09 16:32:16 +08:00
|
|
|
|
syslog(LOG_DEBUG, "Can't open the file /tmp/kylin-nm-btoutput !");
|
|
|
|
|
qDebug()<<"Can't open the file /tmp/kylin-nm-btoutput !"<<endl;
|
2019-10-31 09:56:53 +08:00
|
|
|
|
}
|
|
|
|
|
QString line = file.readLine();
|
|
|
|
|
file.close();
|
2021-01-09 15:39:31 +08:00
|
|
|
|
qDebug()<<"connect_wifi_result: "<< line;
|
2019-10-31 09:56:53 +08:00
|
|
|
|
|
2020-05-28 14:44:04 +08:00
|
|
|
|
if (line.indexOf("successfully") != -1) {
|
2019-10-31 09:56:53 +08:00
|
|
|
|
emit connDone(0);
|
2020-03-02 10:44:13 +08:00
|
|
|
|
qDebug()<<"debug: in function execConnWifiPWD, wireless net state is: "<<QString::number(execGetIface()->wstate);
|
|
|
|
|
syslog(LOG_DEBUG, "In function execConnWifiPWD, wireless net state is: %d", execGetIface()->wstate);
|
2020-11-11 16:50:10 +08:00
|
|
|
|
} else if(line.indexOf("Secrets were required") != -1){
|
2021-01-09 15:39:31 +08:00
|
|
|
|
//emit connDone(4);//发出信号4是之前添加每次连接输入密码的功能时需要的
|
|
|
|
|
emit connDone(1);
|
2020-05-28 14:44:04 +08:00
|
|
|
|
} else {
|
2019-10-31 09:56:53 +08:00
|
|
|
|
emit connDone(1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
emit btFinish();
|
|
|
|
|
}
|
|
|
|
|
|
2021-03-25 21:17:57 +08:00
|
|
|
|
void BackThread::execConnHiddenWifiWPA(QString wifiName, QString wifiPassword)
|
|
|
|
|
{
|
|
|
|
|
int x(1), n(0);
|
|
|
|
|
do {
|
|
|
|
|
n += 1;
|
2021-04-09 19:20:32 +08:00
|
|
|
|
if (n >= 4) {
|
2021-03-25 21:17:57 +08:00
|
|
|
|
syslog(LOG_ERR, "connection attempt of hidden wifi %s failed for 3 times, no more attempt", wifiName);
|
|
|
|
|
x = 0;
|
|
|
|
|
emit connDone(1);
|
2021-04-09 19:20:32 +08:00
|
|
|
|
emit btFinish();
|
|
|
|
|
return ;
|
2021-03-25 21:17:57 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QString tmpPath = "/tmp/kylin-nm-btoutput-" + QDir::home().dirName();
|
|
|
|
|
QString cmd = "nmcli device wifi connect '" + wifiName + "' password '" + wifiPassword + "' hidden yes > " + tmpPath + " 2>&1";
|
|
|
|
|
|
2021-05-08 09:28:33 +08:00
|
|
|
|
qDebug() << Q_FUNC_INFO << cmd << tmpPath;
|
2021-03-25 21:17:57 +08:00
|
|
|
|
int status = Utils::m_system(cmd.toUtf8().data());
|
|
|
|
|
if (status != 0) {
|
|
|
|
|
syslog(LOG_ERR, "execute 'nmcli device wifi connect' in function 'on_btnConnect_clicked' failed");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QFile file(tmpPath);
|
|
|
|
|
if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
|
|
|
|
|
qDebug()<<"Can't open the file!"<<endl;
|
|
|
|
|
}
|
|
|
|
|
QString text = file.readAll();
|
|
|
|
|
file.close();
|
|
|
|
|
if(text.indexOf("Scanning not allowed") != -1
|
|
|
|
|
|| text.isEmpty()
|
|
|
|
|
|| text.indexOf("No network with SSID") != -1){
|
|
|
|
|
x = 1;
|
2021-04-09 19:20:32 +08:00
|
|
|
|
sleep(10);//nm扫描冷却为10s
|
2021-03-25 21:17:57 +08:00
|
|
|
|
} else {
|
2021-05-08 09:28:33 +08:00
|
|
|
|
emit connDone(6);
|
2021-03-25 21:17:57 +08:00
|
|
|
|
x = 0;
|
|
|
|
|
}
|
|
|
|
|
// qDebug() << Q_FUNC_INFO << x << text;
|
|
|
|
|
} while (x == 1);
|
|
|
|
|
|
|
|
|
|
emit btFinish();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void BackThread::execConnRememberedHiddenWifi(QString wifiName)
|
|
|
|
|
{
|
|
|
|
|
QProcess shellProcess;
|
|
|
|
|
shellProcess.start("nmcli -f ssid device wifi");
|
|
|
|
|
shellProcess.waitForFinished(3000); // 等待最多3s
|
2021-05-08 15:12:21 +08:00
|
|
|
|
if (shellProcess.exitCode() == 0) {
|
2021-03-25 21:17:57 +08:00
|
|
|
|
QString shellOutput = shellProcess.readAllStandardOutput();
|
|
|
|
|
QStringList wlist = shellOutput.split("\n");
|
|
|
|
|
bool is_hidden = true;
|
|
|
|
|
foreach (QString wifi, wlist) {
|
|
|
|
|
if (wifi.trimmed() == wifiName) {
|
|
|
|
|
is_hidden = false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (! is_hidden) {
|
|
|
|
|
QString cmd = "nmcli connection up '" + wifiName + "'";
|
2021-05-22 09:40:48 +08:00
|
|
|
|
qDebug()<<"Trying to connect wifi. ssid="<<wifiName;
|
2021-03-25 21:17:57 +08:00
|
|
|
|
int res = Utils::m_system(cmd.toUtf8().data());
|
2021-05-08 15:12:21 +08:00
|
|
|
|
if (res == 0) {
|
|
|
|
|
emit connDone(6);
|
|
|
|
|
} else {
|
|
|
|
|
emit connDone(res);
|
|
|
|
|
}
|
2021-03-25 21:17:57 +08:00
|
|
|
|
} else {
|
|
|
|
|
//已保存的wifi没有在wifi列表找到(隐藏wifi保存后也会出现在wifi列表),则当前区域无法连接此wifi
|
|
|
|
|
syslog(LOG_DEBUG, "Choosen wifi can not be sacnned in finishedProcess() in dlghidewifiwpa.cpp 377.");
|
|
|
|
|
emit connDone(5);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
emit btFinish();
|
|
|
|
|
}
|
2021-01-26 10:39:01 +08:00
|
|
|
|
void BackThread::execConnWifiPsk(QString cmd)
|
|
|
|
|
{
|
|
|
|
|
int res = Utils::m_system(cmd.toUtf8().data());
|
|
|
|
|
emit connDone(res);
|
|
|
|
|
}
|
|
|
|
|
|
2020-05-28 14:44:04 +08:00
|
|
|
|
//to connected wireless network driectly do not need a password
|
2021-04-16 07:46:21 +08:00
|
|
|
|
void BackThread::execConnWifi(QString connName, QString connIfName)
|
2020-05-28 14:44:04 +08:00
|
|
|
|
{
|
2021-04-16 07:46:21 +08:00
|
|
|
|
qDebug() << "Will to connect wifi " << connName << " with wifi card named " <<connIfName;
|
|
|
|
|
syslog(LOG_DEBUG, "Will to connect wifi %s with wifi card named %s", connName.toUtf8().data(), connIfName.toUtf8().data());
|
|
|
|
|
|
|
|
|
|
QString cmdStr;
|
|
|
|
|
KylinDBus objBackThreadDBus;
|
|
|
|
|
QString wifiUuid = objBackThreadDBus.checkHasWifiConfigFile(connName);
|
|
|
|
|
if (!wifiUuid.isEmpty()) {
|
|
|
|
|
//有配置文件
|
2021-04-15 10:57:29 +08:00
|
|
|
|
//qDebug() << "-------------------------> wifiUuid = " << wifiUuid;
|
2021-04-16 07:46:21 +08:00
|
|
|
|
cmdStr = "export LANG='en_US.UTF-8';export LANGUAGE='en_US';nmcli connection up '" + wifiUuid + "'\n";
|
|
|
|
|
} else {
|
|
|
|
|
//没有配置文件
|
2021-04-15 10:57:29 +08:00
|
|
|
|
//qDebug() << "-------------------------> connName = " << connName;
|
2021-04-16 07:46:21 +08:00
|
|
|
|
cmdStr = "export LANG='en_US.UTF-8';export LANGUAGE='en_US';nmcli connection up '" + connName + "' ifname '" + connIfName + "'\n";
|
|
|
|
|
}
|
2021-05-22 09:40:48 +08:00
|
|
|
|
qDebug()<<"Trying to connect wifi. ssid="<<connName;
|
2019-10-31 09:56:53 +08:00
|
|
|
|
|
2021-04-21 20:33:16 +08:00
|
|
|
|
QStringList options;
|
|
|
|
|
options << "-c" << cmdStr;
|
|
|
|
|
cmdProcessWifi->start("/bin/bash",options);
|
|
|
|
|
cmdProcessWifi->waitForStarted();
|
|
|
|
|
cmdProcessWifi->waitForFinished();
|
2020-01-09 16:32:16 +08:00
|
|
|
|
}
|
|
|
|
|
|
2021-03-09 17:10:40 +08:00
|
|
|
|
void BackThread::execReconnWIfi(QString uuid)
|
|
|
|
|
{
|
|
|
|
|
QString cmd = "nmcli connection down " + uuid;
|
|
|
|
|
Utils::m_system(cmd.toUtf8().data());
|
2021-04-16 07:46:21 +08:00
|
|
|
|
cmd = "nmcli connection up " + uuid;
|
2021-03-09 17:10:40 +08:00
|
|
|
|
Utils::m_system(cmd.toUtf8().data());
|
2021-05-22 09:40:48 +08:00
|
|
|
|
qDebug()<<"Trying to connect wifi. uuid="<<uuid;
|
2021-03-09 17:10:40 +08:00
|
|
|
|
}
|
|
|
|
|
|
2021-01-09 10:50:45 +08:00
|
|
|
|
void BackThread::onReadOutputWifi()
|
2020-01-09 16:32:16 +08:00
|
|
|
|
{
|
2021-04-21 20:33:16 +08:00
|
|
|
|
QString str = cmdProcessWifi->readAllStandardOutput();
|
2021-01-09 10:50:45 +08:00
|
|
|
|
qDebug()<<"on_readoutput_wifi: "<< str;
|
|
|
|
|
syslog(LOG_DEBUG, "on_readoutput_wifi : %s", str.toUtf8().data());
|
|
|
|
|
dellConnectWifiResult(str);
|
2020-01-09 16:32:16 +08:00
|
|
|
|
}
|
2021-01-09 10:50:45 +08:00
|
|
|
|
void BackThread::onReadErrorWifi()
|
2020-01-09 16:32:16 +08:00
|
|
|
|
{
|
2021-04-21 20:33:16 +08:00
|
|
|
|
QString str = cmdProcessWifi->readAllStandardError();
|
2021-01-09 10:50:45 +08:00
|
|
|
|
qDebug()<<"on_readerror_wifi: "<< str;
|
|
|
|
|
syslog(LOG_DEBUG, "on_readerror_wifi : %s", str.toUtf8().data());
|
|
|
|
|
dellConnectWifiResult(str);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void BackThread::dellConnectWifiResult(QString info)
|
|
|
|
|
{
|
|
|
|
|
if (info.indexOf("successfully") != -1) {
|
|
|
|
|
emit connDone(0);
|
|
|
|
|
} else if(info.indexOf("unknown") != -1 || info.indexOf("not exist") != -1) {
|
2021-01-11 21:05:43 +08:00
|
|
|
|
//qDebug() << "send this signal if the network we want to connect has not a configuration file";
|
2021-01-09 10:50:45 +08:00
|
|
|
|
emit connDone(2);
|
2021-04-16 07:46:21 +08:00
|
|
|
|
} else if (info.indexOf("The connection was not a Wi-Fi connection..") != -1) {
|
|
|
|
|
emit connDone(2);
|
2021-01-11 21:05:43 +08:00
|
|
|
|
} else if(info.indexOf("not given") != -1 || info.indexOf("Secrets were required") != -1) {
|
2021-04-16 07:46:21 +08:00
|
|
|
|
//nothing need to do
|
2021-01-11 21:05:43 +08:00
|
|
|
|
} else if(info.indexOf("Passwords or encryption keys are required") != -1){
|
|
|
|
|
//qDebug() << "password for '802-11-wireless-security.psk' not given in 'passwd-file'";
|
2020-11-11 16:50:10 +08:00
|
|
|
|
emit connDone(4);
|
2020-05-28 14:44:04 +08:00
|
|
|
|
} else {
|
2021-01-11 21:05:43 +08:00
|
|
|
|
//qDebug() << "send this signal if connect net failed";
|
2021-01-09 10:50:45 +08:00
|
|
|
|
emit connDone(1);
|
2019-10-31 09:56:53 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
emit btFinish();
|
|
|
|
|
}
|
|
|
|
|
|
2021-01-09 10:50:45 +08:00
|
|
|
|
|
2020-05-28 14:44:04 +08:00
|
|
|
|
//get property of connected network
|
|
|
|
|
QString BackThread::getConnProp(QString connName)
|
|
|
|
|
{
|
2020-06-01 20:19:02 +08:00
|
|
|
|
QString tmpPath = "/tmp/kylin-nm-connprop-" + QDir::home().dirName();
|
|
|
|
|
QString cmd = "nmcli connection show '" + connName + "' > " + tmpPath;
|
2020-03-19 10:55:40 +08:00
|
|
|
|
Utils::m_system(cmd.toUtf8().data());
|
2019-10-31 09:56:53 +08:00
|
|
|
|
|
2020-06-01 20:19:02 +08:00
|
|
|
|
QFile file(tmpPath);
|
2020-05-28 14:44:04 +08:00
|
|
|
|
if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
|
2020-01-09 16:32:16 +08:00
|
|
|
|
syslog(LOG_ERR, "Can't open the file /tmp/kylin-nm-connprop!");
|
|
|
|
|
qDebug()<<"Can't open the file /tmp/kylin-nm-connprop!"<<endl;
|
2019-10-31 09:56:53 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QString txt = file.readAll();
|
|
|
|
|
QStringList txtLine = txt.split("\n");
|
|
|
|
|
file.close();
|
|
|
|
|
|
|
|
|
|
QString rtn = "";
|
|
|
|
|
foreach (QString line, txtLine) {
|
2020-05-28 14:44:04 +08:00
|
|
|
|
if (line.startsWith("ipv4.method:")) {
|
2019-10-31 09:56:53 +08:00
|
|
|
|
QString v4method = line.mid(12).trimmed();
|
|
|
|
|
rtn += "method:" + v4method + "|";
|
|
|
|
|
}
|
2020-06-04 11:51:40 +08:00
|
|
|
|
|
2020-05-28 14:44:04 +08:00
|
|
|
|
if (line.startsWith("ipv4.addresses:")) {
|
2019-10-31 09:56:53 +08:00
|
|
|
|
QString value = line.mid(15).trimmed();
|
2020-06-04 11:51:40 +08:00
|
|
|
|
if (value == "--" || value == "") {
|
2021-02-07 14:34:02 +08:00
|
|
|
|
rtn += "v4addr:|mask:|";
|
2020-05-28 14:44:04 +08:00
|
|
|
|
} else {
|
2019-10-31 09:56:53 +08:00
|
|
|
|
QString addr = value.split("/").at(0);
|
|
|
|
|
QString mask = value.trimmed().split("/").at(1);
|
2021-02-07 14:34:02 +08:00
|
|
|
|
rtn += "v4addr:" + addr + "|";
|
2019-10-31 09:56:53 +08:00
|
|
|
|
rtn += "mask:" + mask + "|";
|
|
|
|
|
}
|
|
|
|
|
}
|
2020-06-04 11:51:40 +08:00
|
|
|
|
|
2021-02-07 14:34:02 +08:00
|
|
|
|
if (line.startsWith("ipv6.method:")) {
|
|
|
|
|
QString value = line.mid(12).trimmed();
|
|
|
|
|
if (value == "auto") {
|
|
|
|
|
rtn += "v6method:auto|v6addr:|";
|
|
|
|
|
} else {
|
|
|
|
|
rtn += "v6method:manual|";
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (line.startsWith("ipv6.addresses:")) {
|
|
|
|
|
QString value = line.mid(15).trimmed();
|
|
|
|
|
if (value == "--" || value == "") {
|
|
|
|
|
rtn += "v6addr:|";
|
|
|
|
|
} else {
|
|
|
|
|
QString addr = value.split("/").at(0);
|
|
|
|
|
rtn += "v6addr:" + addr + "|";
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2020-05-28 14:44:04 +08:00
|
|
|
|
if (line.startsWith("ipv4.gateway:")) {
|
2019-10-31 09:56:53 +08:00
|
|
|
|
QString value = line.mid(13).trimmed();
|
2020-06-04 11:51:40 +08:00
|
|
|
|
if (value == "--" || value == "") {
|
2019-10-31 09:56:53 +08:00
|
|
|
|
rtn += "gateway:|";
|
2020-05-28 14:44:04 +08:00
|
|
|
|
} else {
|
2019-10-31 09:56:53 +08:00
|
|
|
|
rtn += "gateway:" + value + "|";
|
|
|
|
|
}
|
|
|
|
|
}
|
2020-06-04 11:51:40 +08:00
|
|
|
|
|
2020-05-28 14:44:04 +08:00
|
|
|
|
if (line.startsWith("ipv4.dns:")) {
|
2019-10-31 09:56:53 +08:00
|
|
|
|
QString value = line.mid(9).trimmed();
|
2020-06-04 11:51:40 +08:00
|
|
|
|
if (value == "--" || value == "") {
|
2019-10-31 09:56:53 +08:00
|
|
|
|
rtn += "dns:|";
|
2020-05-28 14:44:04 +08:00
|
|
|
|
} else {
|
2019-10-31 09:56:53 +08:00
|
|
|
|
rtn += "dns:" + value + "|";
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return rtn.left(rtn.length() - 1);
|
|
|
|
|
}
|
|
|
|
|
|
2020-05-28 14:44:04 +08:00
|
|
|
|
//get band width of wired network
|
|
|
|
|
QString BackThread::execChkLanWidth(QString ethName)
|
|
|
|
|
{
|
2020-06-01 20:19:02 +08:00
|
|
|
|
QString tmpPath = "/tmp/kylin-nm-bandwidth-" + QDir::home().dirName();
|
|
|
|
|
QString cmd = "export LANG='en_US.UTF-8';export LANGUAGE='en_US';ethtool '" + ethName + "' | grep Speed > " + tmpPath;
|
2020-03-19 10:55:40 +08:00
|
|
|
|
Utils::m_system(cmd.toUtf8().data());
|
2019-10-31 09:56:53 +08:00
|
|
|
|
|
2020-06-01 20:19:02 +08:00
|
|
|
|
QFile file(tmpPath);
|
2020-05-28 14:44:04 +08:00
|
|
|
|
if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
|
2020-01-09 16:32:16 +08:00
|
|
|
|
syslog(LOG_ERR, "Can't open the file /tmp/kylin-nm-bandwidth!");
|
|
|
|
|
qDebug()<<"Can't open the file /tmp/kylin-nm-bandwidth!"<<endl;
|
2019-10-31 09:56:53 +08:00
|
|
|
|
}
|
|
|
|
|
QString line = file.readLine();
|
|
|
|
|
file.close();
|
|
|
|
|
|
|
|
|
|
QStringList params = line.split(":");
|
2020-05-28 14:44:04 +08:00
|
|
|
|
if (params.size() < 2) {
|
2019-10-31 09:56:53 +08:00
|
|
|
|
return "";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QString rtn = params.at(1);
|
|
|
|
|
return rtn.trimmed();
|
2020-01-09 16:32:16 +08:00
|
|
|
|
}
|
|
|
|
|
|
2020-05-28 14:44:04 +08:00
|
|
|
|
//disconnected spare ethernet or wifi
|
2020-03-19 10:55:40 +08:00
|
|
|
|
void BackThread::disConnSparedNetSlot(QString type)
|
2020-01-09 16:32:16 +08:00
|
|
|
|
{
|
2020-05-28 14:44:04 +08:00
|
|
|
|
if (type == "wifi") {
|
2021-03-20 10:14:48 +08:00
|
|
|
|
//disConnLanOrWifi("wifi");
|
2020-03-19 10:55:40 +08:00
|
|
|
|
} else if(type == "ethernet") {
|
2021-04-26 11:36:11 +08:00
|
|
|
|
sleep(1);
|
2020-03-19 10:55:40 +08:00
|
|
|
|
disConnLanOrWifi("ethernet");
|
|
|
|
|
}
|
2020-01-09 16:32:16 +08:00
|
|
|
|
}
|
|
|
|
|
|
2020-05-28 14:44:04 +08:00
|
|
|
|
//disconnected ethernet or wifi according to network type
|
2020-03-19 10:55:40 +08:00
|
|
|
|
void BackThread::disConnLanOrWifi(QString type)
|
2020-01-09 16:32:16 +08:00
|
|
|
|
{
|
|
|
|
|
QString strSlist;
|
2020-03-19 10:55:40 +08:00
|
|
|
|
const int BUF_SIZE = 1024;
|
|
|
|
|
char buf[BUF_SIZE];
|
2020-01-09 16:32:16 +08:00
|
|
|
|
|
2020-03-19 10:55:40 +08:00
|
|
|
|
FILE * p_file = NULL;
|
2020-01-09 16:32:16 +08:00
|
|
|
|
|
2020-03-19 10:55:40 +08:00
|
|
|
|
p_file = popen("nmcli connection show -active", "r");
|
|
|
|
|
if (!p_file) {
|
2020-04-06 23:41:08 +08:00
|
|
|
|
syslog(LOG_ERR, "Error occurred when popen cmd 'nmcli connection show'");
|
|
|
|
|
qDebug()<<"Error occurred when popen cmd 'nmcli connection show";
|
2020-01-09 16:32:16 +08:00
|
|
|
|
}
|
|
|
|
|
|
2020-03-19 10:55:40 +08:00
|
|
|
|
while (fgets(buf, BUF_SIZE, p_file) != NULL) {
|
|
|
|
|
QString line(buf);
|
2020-05-12 09:23:39 +08:00
|
|
|
|
|
|
|
|
|
if (line.indexOf("802-11-wireless") != -1) {
|
|
|
|
|
if (type == "wifi") {
|
|
|
|
|
type = "802-11-wireless";
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (line.indexOf("802-3-ethernet") != -1) {
|
|
|
|
|
if (type == "ethernet") {
|
|
|
|
|
type = "802-3-ethernet";
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (line.indexOf(type) != -1) {
|
2020-01-09 16:32:16 +08:00
|
|
|
|
QStringList subLine = line.split(" ");
|
2020-05-12 09:23:39 +08:00
|
|
|
|
if (subLine[1].size() == 1) {
|
2020-01-09 16:32:16 +08:00
|
|
|
|
strSlist = subLine[0]+ " " + subLine[1];
|
2020-05-12 09:23:39 +08:00
|
|
|
|
} else {
|
2020-01-09 16:32:16 +08:00
|
|
|
|
strSlist = subLine[0];
|
|
|
|
|
}
|
|
|
|
|
kylin_network_set_con_down(strSlist.toUtf8().data());
|
|
|
|
|
}
|
2020-03-19 10:55:40 +08:00
|
|
|
|
}
|
2020-12-11 14:53:20 +08:00
|
|
|
|
emit btFinish();
|
2020-03-19 10:55:40 +08:00
|
|
|
|
pclose(p_file);
|
2019-10-31 09:56:53 +08:00
|
|
|
|
}
|