From 7063bbfb1ee162d3cffbe1f94e942c8bce3a941e Mon Sep 17 00:00:00 2001 From: sunwen Date: Wed, 20 Sep 2023 10:09:57 +0800 Subject: [PATCH] Refactory network module. --- src/device/networkmanager.cpp | 249 ++++++++++------------- src/device/networkmanager.h | 35 +--- src/dialogs/DialogManager.cpp | 4 +- src/dialogs/DialogManager.h | 2 +- src/forms/settings/SystemSettingForm.cpp | 5 +- src/network/NetworkCfgDialog.cpp | 52 ++--- 6 files changed, 150 insertions(+), 197 deletions(-) diff --git a/src/device/networkmanager.cpp b/src/device/networkmanager.cpp index 18bbc0a..2889b0a 100644 --- a/src/device/networkmanager.cpp +++ b/src/device/networkmanager.cpp @@ -3,35 +3,73 @@ #include #include #include +#include +#include +#include -//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 interfaces = QNetworkInterface::allInterfaces(); + for (const QNetworkInterface &interface : interfaces) + { + if (!(interface.flags() & QNetworkInterface::IsLoopBack)) + { + QList 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 NetworkManager::getIpAddrList() { @@ -67,66 +105,58 @@ QList 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& 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& t3 = getIpAddrList(); - bool ret3 = setIpAddrList(t3, err3); - err_info.append(err3); - - qDebug() << "IpRouteList"; - const QList& 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& t2 = getIpAddrList(); - for (QStringList var : t2) - { - qDebug() << var[0] << " " << var[1]; - } - qDebug() << "getDefaultIpAddr()" << " : " << t1.ip << " " << t1.mask; - - qDebug() << "getIpRouteList()" << " : "; - const QList& t3 = getIpRouteList(); - for (QStringList var : t3) - { - qDebug() << var[0] << " " << var[1] << " " << var[2]; - } - -} diff --git a/src/device/networkmanager.h b/src/device/networkmanager.h index 36d91e4..cca660a 100644 --- a/src/device/networkmanager.h +++ b/src/device/networkmanager.h @@ -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 getIpAddrList(); static QString getDefaultGateway(); static QList 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& list, QString& err_info); static bool setDefaultGateway(const QString& gw, QString& err_info); static bool setIpRouteList(const QList& 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 addresses; - - //IpRoute default_IpRoute; - //QList routes; - - +private: + explicit NetworkManager(QObject* parent = nullptr); + bool mIsDHCP; + QString mIpAddress; + QString mSubNetMask; }; diff --git a/src/dialogs/DialogManager.cpp b/src/dialogs/DialogManager.cpp index 7d8c6a5..b35de5b 100644 --- a/src/dialogs/DialogManager.cpp +++ b/src/dialogs/DialogManager.cpp @@ -269,14 +269,14 @@ int DialogManager::requestEditDicomConfig() return ret; } -int DialogManager::requestInputAdminPasswd() +DialogResult DialogManager::requestInputAdminPasswd() { GetAdminPsw dialog(mTopWidget); setTopWidget(&dialog); dialog.setWindowModality(Qt::WindowModal); int ret = dialog.exec(); releaseTopWidget(&dialog); - return ret; + return DialogResult(ret, dialog.getPsw()); } int DialogManager::requestEditNetworkConfig() diff --git a/src/dialogs/DialogManager.h b/src/dialogs/DialogManager.h index 7a2da63..b9a0428 100644 --- a/src/dialogs/DialogManager.h +++ b/src/dialogs/DialogManager.h @@ -60,7 +60,7 @@ public: DialogResult requestSelectProtocal(); DialogResult requestSelectFilter(); int requestEditDicomConfig(); - int requestInputAdminPasswd(); + DialogResult requestInputAdminPasswd(); int requestEditNetworkConfig(); int requestGetWorkList(QSqlTableModel* aModel, QTableView* aTableView); int requestPatientConfirm(PatientInformation* patientInf, int type); diff --git a/src/forms/settings/SystemSettingForm.cpp b/src/forms/settings/SystemSettingForm.cpp index f414bb4..63ca4d6 100644 --- a/src/forms/settings/SystemSettingForm.cpp +++ b/src/forms/settings/SystemSettingForm.cpp @@ -93,9 +93,10 @@ SystemSettingForm::SystemSettingForm(QWidget* parent) JsonObject::Instance()->setCompleteNotify(scanCompleteButton->getChecked()); }); connect(mUI->btnNetwork, &QToolButton::clicked, [=]() { - if (DialogManager::Default()->requestInputAdminPasswd() == QDialog::Accepted) + auto result = DialogManager::Default()->requestInputAdminPasswd(); + if (result.ResultCode == QDialog::Accepted) { - //JsonObject::Instance()->setPassword(dialog.getPsw()); + JsonObject::Instance()->setPassword(result.ResultData.toString()); DialogManager::Default()->requestEditNetworkConfig(); } }); diff --git a/src/network/NetworkCfgDialog.cpp b/src/network/NetworkCfgDialog.cpp index 327de73..2ef513c 100644 --- a/src/network/NetworkCfgDialog.cpp +++ b/src/network/NetworkCfgDialog.cpp @@ -30,7 +30,10 @@ NetworkCfgDialog::NetworkCfgDialog(QWidget* parent) this->setWindowFlags(Qt::Dialog | Qt::FramelessWindowHint); setFocusPolicy(Qt::ClickFocus); - mUi->sw_dhcp->setChecked(true); + bool isDHCP = NetworkManager::getInstance()->isDHCP(); + mUi->sw_dhcp->setChecked(isDHCP); + mUi->addr_ip->setEnabled(!isDHCP); + mUi->addr_mask->setEnabled(!isDHCP); //ui->sw_dhcp->setButtonStyle(ImageSwitch::ButtonStyle_1); QStringList headerAddr; @@ -169,6 +172,12 @@ NetworkCfgDialog::NetworkCfgDialog(QWidget* parent) { reject(); }); + connect(mUi->sw_dhcp, &ImageSwitch::clicked, [&]() + { + mUi->addr_ip->setEnabled(!mUi->sw_dhcp->getChecked()); + mUi->addr_mask->setEnabled(!mUi->sw_dhcp->getChecked()); + }); + mUi->tabWidget->setCurrentIndex(0); } @@ -185,9 +194,7 @@ NetworkCfgDialog::~NetworkCfgDialog() void NetworkCfgDialog::loadData() { mUi->led_inface->setText(NetworkManager::interfaceName()); - //ui->led_inface->setDisabled(true); - mUi->sw_dhcp->setChecked(NetworkManager::isDHCP()); - const IpAddr& defaultIpAddress = NetworkManager::getDefaultIpAddr(); + const IpAddr& defaultIpAddress = NetworkManager::getInstance()->getDefaultIpAddr(); mUi->addr_ip->setText(defaultIpAddress.ip); mUi->addr_mask->setText(defaultIpAddress.mask); mUi->led_gw->setText(NetworkManager::getDefaultGateway()); @@ -236,12 +243,12 @@ void NetworkCfgDialog::saveJsonData() bool NetworkCfgDialog::isNetModified() { - if (mUi->sw_dhcp->getChecked() != NetworkManager::isDHCP()) + if (mUi->sw_dhcp->getChecked() != NetworkManager::getInstance()->isDHCP()) { return true; } - const IpAddr& defaultIpAddress = NetworkManager::getDefaultIpAddr(); + const IpAddr& defaultIpAddress = NetworkManager::getInstance()->getDefaultIpAddr(); if (mUi->addr_ip->text() != defaultIpAddress.ip) { return true; @@ -272,7 +279,14 @@ void NetworkCfgDialog::handleThreadStart() } void NetworkCfgDialog::handleThreadExit() { - DialogManager::Default()->hideTopSyncDialog(); + DialogManager::Default()->hideTopSyncDialog(); + NetworkManager::getInstance()->initNetworkInfo(); + bool isDHCP = NetworkManager::getInstance()->isDHCP(); + mUi->sw_dhcp->setChecked(isDHCP); + mUi->addr_ip->setText(NetworkManager::getInstance()->getDefaultIpAddr().ip); + mUi->addr_mask->setText(NetworkManager::getInstance()->getDefaultIpAddr().mask); + mUi->addr_ip->setEnabled(!isDHCP); + mUi->addr_mask->setEnabled(!isDHCP); mUi->output->setPlainText(mError); if (0 != mThread) { @@ -297,35 +311,21 @@ void NetworkCfgDialog::applyData() mThread = QThread::create([=]() { mError.clear(); - mError.append("restart\t\t"); - - bool result = NetworkManager::restart(mError); - //bool ret =true; - //err.append(boolToStr(ret)); - - mError.append("\n"); if (mUi->sw_dhcp->getChecked()) { - NetworkManager::setJsonDHCP(true); mError.append("network setting\t"); + bool result = NetworkManager::getInstance()->setDHCP(); + mError.append(boolToStr(result)); } else { - NetworkManager::setJsonDHCP(false); - IpAddr deIpAddress; deIpAddress.ip = mUi->addr_ip->text(); deIpAddress.mask = mUi->addr_mask->text(); - mError.append("setDefaultIpAddr\t"); - result = result & NetworkManager::setDefaultIpAddr(deIpAddress, mError); - mError.append("setDefaultGateway\t"); - result = result & NetworkManager::setDefaultGateway(mUi->led_gw->text(), mError); - mError.append("setIpAddrList\t"); - result = result & NetworkManager::setIpAddrList(mModelAddress->getData(), mError); - mError.append("setIpRouteList\t"); - result = result & NetworkManager::setIpRouteList(mModelRoute->getData(), mError); - mError.append("\n").append("network settings\t"); + QString gateway = mUi->led_gw->text(); + mError.append("network settings\t"); + bool result = NetworkManager::getInstance()->setIpAddr(deIpAddress, gateway, mError); mError.append(boolToStr(result)); } });