Refactory network module.

This commit is contained in:
sunwen
2023-09-20 10:09:57 +08:00
parent 298e6c6c53
commit 7063bbfb1e
6 changed files with 150 additions and 197 deletions

View File

@@ -3,35 +3,73 @@
#include <QProcess>
#include <QDebug>
#include <QRegularExpression>
#include <QNetworkSession>
#include <QHostAddress>
#include <QNetworkInterface>
//NetworkManager* NetworkManager::instance = nullptr;
namespace
{
unsigned int ipToUInt(const std::string& ip) {
unsigned int result = 0;
int start = 0;
for (int i = 0; i < 4; ++i) {
int end = ip.find('.', start);
if (end == std::string::npos) end = ip.length();
int octet = stoi(ip.substr(start, end - start));
result = (result << 8) | octet;
start = end + 1;
}
return result;
}
//NetworkManager::NetworkManager(QObject* parent) : QObject(parent)
//{
//
//}
QString cidrFromSubnet(const QString& subnet) {
unsigned int subnetMask = ipToUInt(subnet.toStdString());
int cidr = 0;
while (subnetMask != 0) {
subnetMask = (subnetMask << 1) & 0xFFFFFFFF;
cidr++;
}
return QString::number(cidr);
}
}
NetworkManager* NetworkManager::getInstance()
{
static NetworkManager instance;
return &instance;
}
//NetworkManager* NetworkManager::Instance()
//{
// if (nullptr == instance)
// {
// instance = new NetworkManager();
// }
// return instance;
//}
NetworkManager::NetworkManager(QObject* aParent)
: QObject(aParent)
, mIsDHCP()
, mIpAddress()
, mSubNetMask()
{
initNetworkInfo();
}
void NetworkManager::initNetworkInfo()
{
QList<QNetworkInterface> interfaces = QNetworkInterface::allInterfaces();
for (const QNetworkInterface &interface : interfaces)
{
if (!(interface.flags() & QNetworkInterface::IsLoopBack))
{
QList<QNetworkAddressEntry> entries = interface.addressEntries();
for (const QNetworkAddressEntry &entry : entries)
{
if (entry.ip().protocol() == QAbstractSocket::IPv4Protocol)
{
mIsDHCP = !entry.isPermanent();
mIpAddress = entry.ip().toString();
mSubNetMask = entry.netmask().toString();
return;
}
}
}
}
}
//void NetworkManager::qIfConfig(const localhost& lhost)
//{
// QProcess* myProcess = new QProcess;
// //QString cmd = QString("echo %1 | sudo -S ifconfig eth0 %2 up").;
// QString cmd = QString("echo %1 | sudo -S ifconfig eth0 %2 netmask %3 up; sudo -S route del default dev eth0; \
// sudo -S route add default gw %4").arg("klxts4047").arg(lhost.ip).arg(lhost.mask).arg(lhost.gateway);
// QStringList args;
// args << "-c" << cmd;
// myProcess->start("/bin/sh", args);
//}
host NetworkManager::getLocalHost()
{
return JsonObject::Instance()->getServer(JsonObject::LOCAL);
@@ -48,11 +86,11 @@ QString NetworkManager::interfaceName()
}
bool NetworkManager::isDHCP()
{
return JsonObject::Instance()->isDHCP();
return mIsDHCP;
}
IpAddr NetworkManager::getDefaultIpAddr()
{
return JsonObject::Instance()->getDefaultIpAddr();
return IpAddr{mIpAddress, mSubNetMask};
}
QList<QStringList> NetworkManager::getIpAddrList()
{
@@ -67,66 +105,58 @@ QList<QStringList> NetworkManager::getIpRouteList()
return JsonObject::Instance()->getIpRouteList();
}
bool NetworkManager::restart(QString& err_info)
bool NetworkManager::setDHCP()
{
QString pwd = JsonObject::Instance()->passWord();
qDebug()<< pwd;
QString dhcpCommand = QString("echo %1 | sudo -S nmcli con mod usct ipv4.method auto ipv4.address \"\" ipv4.gateway \"\"").arg(pwd);
QString networkUpdateCommand = QString("echo %1 | sudo -S nmcli con up usct").arg(pwd);
QProcess settingProcess;
settingProcess.start("/bin/bash" , QStringList() << "-c" << dhcpCommand);
settingProcess.waitForFinished();
if (settingProcess.exitStatus() != QProcess::NormalExit || settingProcess.exitCode() != 0)
{
return false;
}
QProcess* myProcess = new QProcess;
QString inface = JsonObject::Instance()->interfaceName();
QString pwd = JsonObject::Instance()->passWord();
QString cmd = QString("echo %1 | sudo -S rcnetwork restart %2").arg(pwd).arg(inface);
QStringList args;
args << "-c" << cmd;
connect(myProcess, SIGNAL(finished(int)), myProcess, SLOT(deleteLater()));
myProcess->start("/bin/sh", args);
if (!myProcess->waitForFinished(60000)) {
err_info.append("failed...\n");
return false;
}
if (myProcess->exitCode() == 0) {
err_info.append("suceess...\n");
return true;
}
else {
err_info.append(myProcess->readAllStandardError());
return false;
}
}
bool NetworkManager::setJsonDHCP(bool enable)
{
JsonObject::Instance()->autoDHCP(enable);
QProcess restartProcess;
restartProcess.start("/bin/bash", QStringList() << "-c" << networkUpdateCommand);
restartProcess.waitForFinished();
if (restartProcess.exitStatus() != QProcess::NormalExit && restartProcess.exitCode() != 0)
{
return false;
}
mIsDHCP = true;
JsonObject::Instance()->autoDHCP(true);
return true;
}
bool NetworkManager::setDefaultIpAddr(const IpAddr& addr, QString& err_info)
bool NetworkManager::setIpAddr(const IpAddr& addr, const QString& aGateWay, QString& err_info)
{
QString pwd = JsonObject::Instance()->passWord();
QString ipaddr = NewExp(addr.ip, addr.mask);
QProcess* myProcess = new QProcess;
QString inface = JsonObject::Instance()->interfaceName();
QString pwd = JsonObject::Instance()->passWord();
QString cmd = QString("echo %1 | sudo -S ip addr add %2 dev %3").arg(pwd).arg(ipaddr).arg(inface);
QProcess settingProcess;
QString setIpCommand = QString("echo %1 | sudo -S nmcli con mod usct ipv4.method manual ipv4.address %2 ipv4.gateway %3").arg(pwd).arg(ipaddr).arg(aGateWay);
QStringList args;
args << "-c" << cmd;
connect(myProcess, SIGNAL(finished(int)), myProcess, SLOT(deleteLater()));
myProcess->start("/bin/sh", args);
args << "-c" << setIpCommand;
settingProcess.start("/bin/sh", args);
settingProcess.waitForFinished();
if (settingProcess.exitStatus() != QProcess::NormalExit || settingProcess.exitCode() != 0)
{
return false;
}
if (!myProcess->waitForFinished()) {
err_info.append("failed...\n");
return false;
}
if (myProcess->exitCode() == 0) {
JsonObject::Instance()->setDefaultIpAddr(addr);
err_info.append("success...\n");
return true;
}
else {
err_info.append(myProcess->readAllStandardError());
return false;
}
QString networkUpdateCommand = QString("echo %1 | sudo -S nmcli con up usct").arg(pwd);
QProcess restartProcess;
restartProcess.start("/bin/bash", QStringList() << "-c" << networkUpdateCommand);
restartProcess.waitForFinished();
if (restartProcess.exitStatus() != QProcess::NormalExit && restartProcess.exitCode() != 0)
{
return false;
}
JsonObject::Instance()->setDefaultIpAddr(addr);
JsonObject::Instance()->autoDHCP(false);
return true;
}
bool NetworkManager::validate(const QString& addr)
@@ -142,17 +172,8 @@ bool NetworkManager::validate(const QString& addr)
QString NetworkManager::NewExp(QString ip, QString mask)
{
QStringList list = mask.split(".");
int count = 0;
for (QString str : list)
{
if (str == "255")
{
count++;
}
}
QString temp = "";
temp.append(ip).append("/").append(QString::number(count * 8));
temp.append(ip).append("/").append(cidrFromSubnet(mask));
return temp;
}
@@ -273,59 +294,3 @@ bool NetworkManager::setIpRouteList(const QList<QStringList>& list, QString& err
return false;
}
}
bool NetworkManager::testSetMode(QString& err_info)
{
// autoDHCP(true);
QString err1, err2, err3, err4;
qDebug() << "DefaultIpAddr";
const IpAddr& t1 = getDefaultIpAddr();
bool ret1 = setDefaultIpAddr(t1, err1);
err_info.append(err1);
qDebug() << "DefaultGateway";
const QString& t2 = getDefaultGateway();
bool ret2 = setDefaultGateway(t2, err2);
err_info.append(err2);
qDebug() << "IpAddrList";
const QList<QStringList>& t3 = getIpAddrList();
bool ret3 = setIpAddrList(t3, err3);
err_info.append(err3);
qDebug() << "IpRouteList";
const QList<QStringList>& t4 = getIpRouteList();
bool ret4 = setIpRouteList(t4, err4);
err_info.append(err4);
return true;
}
void NetworkManager::testGetMode()
{
qDebug() << "interfaceName()" << " : " << interfaceName();
qDebug() << "isDHCP()" << " : " << isDHCP();
IpAddr t1 = getDefaultIpAddr();
qDebug() << "getDefaultIpAddr()" << " : " << t1.ip << " " << t1.mask;
qDebug() << "getDefaultGateway()" << " : " << getDefaultGateway();
qDebug() << "ggetIpAddrList()" << " : ";
const QList<QStringList>& t2 = getIpAddrList();
for (QStringList var : t2)
{
qDebug() << var[0] << " " << var[1];
}
qDebug() << "getDefaultIpAddr()" << " : " << t1.ip << " " << t1.mask;
qDebug() << "getIpRouteList()" << " : ";
const QList<QStringList>& t3 = getIpRouteList();
for (QStringList var : t3)
{
qDebug() << var[0] << " " << var[1] << " " << var[2];
}
}

View File

@@ -12,21 +12,20 @@ class NetworkManager : public QObject
public:
static host getLocalHost();
static bool setLocalHost(const host& h);
//static NetworkManager* Instance();
static NetworkManager* getInstance();
//static void qIfConfig(const localhost& lhost);
static QString interfaceName();
static bool isDHCP();
static IpAddr getDefaultIpAddr();
bool isDHCP();
IpAddr getDefaultIpAddr();
static QList<QStringList> getIpAddrList();
static QString getDefaultGateway();
static QList<QStringList> getIpRouteList();
//static void setInterfaceName(const QString& name);
static bool checkPassWord(const QString& pwd, QString& err_info);
static bool restart(QString& err_info);
static bool setJsonDHCP(bool enable);
static bool setDefaultIpAddr(const IpAddr& addr, QString& err_info);
bool setDHCP();
bool setIpAddr(const IpAddr& addr, const QString& aGateWay, QString& err_info);
void initNetworkInfo();
static bool setIpAddrList(const QList<QStringList>& list, QString& err_info);
static bool setDefaultGateway(const QString& gw, QString& err_info);
static bool setIpRouteList(const QList<QStringList>& list, QString& err_info);
@@ -34,23 +33,11 @@ public:
static bool validate(const QString& addr);
static bool testSetMode(QString& err_info);
static void testGetMode();
//private:
//explicit NetworkManager(QObject* parent = nullptr);
//static NetworkManager* instance;
//QString InterfaceName;
//bool isDHCP;
//IpAddress default_IpAddr;
//QList<IpAddress> addresses;
//IpRoute default_IpRoute;
//QList<IpRoute> routes;
private:
explicit NetworkManager(QObject* parent = nullptr);
bool mIsDHCP;
QString mIpAddress;
QString mSubNetMask;
};