From 40b09d19464abf96598ee3423f53c232090dbb4a Mon Sep 17 00:00:00 2001 From: ut001910 Date: Tue, 3 Sep 2024 13:21:04 +0800 Subject: [PATCH 1/4] fix: Command execution rectification Command execution rectification Log: Command execution rectification --- src/src/aria2/aria2rpcinterface.cpp | 39 +++++++++++-------- src/src/extensionService/extensionservice.cpp | 25 +++++++++--- 2 files changed, 41 insertions(+), 23 deletions(-) diff --git a/src/src/aria2/aria2rpcinterface.cpp b/src/src/aria2/aria2rpcinterface.cpp index 4e22b830..c4a3592c 100644 --- a/src/src/aria2/aria2rpcinterface.cpp +++ b/src/src/aria2/aria2rpcinterface.cpp @@ -45,6 +45,23 @@ Aria2RPCInterface *Aria2RPCInterface::m_instance = new Aria2RPCInterface; +QString runPipeProcess(QString cmd) { + FILE *pPipe = popen(cmd.toUtf8(), "r"); + QString strData; + if (pPipe) + { + while (!feof(pPipe)) + { + char tempStr[1024] = {0}; + fgets(tempStr, 1024, pPipe); + strData.append(QString::fromLocal8Bit(tempStr)); + } + fclose(pPipe); + return strData; + } + return strData; +} + Aria2RPCInterface *Aria2RPCInterface::instance() { // qDebug() << "[Aria2RPC] instance function started"; @@ -194,7 +211,7 @@ bool Aria2RPCInterface::startUp() QProcess proc; // = new QProcess; proc.setStandardOutputFile("/dev/null"); proc.setStandardErrorFile("/dev/null"); - proc.startDetached("sh -c \"" + m_basePath + m_aria2cCmd + " " + opt + "\""); + proc.startDetached(m_basePath + m_aria2cCmd + " " + opt); proc.waitForStarted(); #endif @@ -210,7 +227,7 @@ bool Aria2RPCInterface::startUp() // wwwww = proc.readAllStandardOutput(); bCheck = checkAria2cProc(); - qDebug() << "启动aria2c完成! " << proc.state() << bCheck; + qDebug() << "启动aria2c完成! " << bCheck; return bCheck; } @@ -234,14 +251,7 @@ bool Aria2RPCInterface::init() bool Aria2RPCInterface::checkAria2cProc() { qDebug() << "[Aria2RPC] checkAria2cProc function started"; - QProcess proc; - QStringList opt; - opt << "-c"; - //opt << "ps aux | grep aria2c"; - opt << "ps aux|grep " + m_aria2cCmd; - proc.start("/bin/bash", opt); - proc.waitForFinished(); - QString output = QString::fromLocal8Bit(proc.readAllStandardOutput()); + QString output = runPipeProcess("ps aux|grep " + m_aria2cCmd); QStringList lineList = output.split("\n"); int cnt = 0; for (QString t : lineList) { @@ -271,12 +281,8 @@ bool Aria2RPCInterface::checkAria2cProc() int Aria2RPCInterface::killAria2cProc() { qDebug() << "[Aria2RPC] killAria2cProc function started"; - QStringList opt; - opt << "-c"; - opt << "ps -ef|grep " + m_aria2cCmd + "|grep -v grep|awk '{print $2}'|xargs kill -9"; - int result = QProcess::execute("/bin/bash", opt); - qDebug() << "[Aria2RPC] killAria2cProc function ended with result:" << result; - return result; + runPipeProcess("ps -ef|grep " + m_aria2cCmd + "|grep -v grep|awk '{print $2}'|xargs kill -9"); + return 0; } void Aria2RPCInterface::setDefaultDownLoadDir(QString dir) @@ -1014,7 +1020,6 @@ long Aria2RPCInterface::getCapacityFreeByte(QString path) QProcess *proc = new QProcess; QStringList opt; - opt << "-c"; opt << "df " + path; proc->start("/bin/bash", opt); proc->waitForFinished(); diff --git a/src/src/extensionService/extensionservice.cpp b/src/src/extensionService/extensionservice.cpp index 5e85de35..33348ee7 100644 --- a/src/src/extensionService/extensionservice.cpp +++ b/src/src/extensionService/extensionservice.cpp @@ -48,6 +48,24 @@ #include "websockettransport.h" #include "websockethandle.h" +QString runPipeProcess(QString cmd) { + FILE *pPipe = popen(cmd.toUtf8(), "r"); + QString strData; + if (pPipe) + { + while (!feof(pPipe)) + { + char tempStr[1024] = {0}; + fgets(tempStr, 1024, pPipe); + strData.append(QString::fromLocal8Bit(tempStr)); + } + fclose(pPipe); + return strData; + } + return strData; +} + + extensionService::extensionService() { qDebug() << "[ExtensionService] Initializing WebSocket service"; @@ -112,12 +130,7 @@ void extensionService::checkConnection() { qDebug() << "[ExtensionService] Checking WebSocket connections"; - QProcess p; - QStringList options; - options << "-c" << "netstat -apn | grep dlmextensions"; - p.start("/bin/bash", options); - p.waitForFinished(); - QList strList = p.readAllStandardOutput().split('\n'); + QList strList = runPipeProcess("netstat -apn | grep dlmextensions").toUtf8().split('\n'); for(QString str : strList) { if(str.contains("ESTABLISHED")) { //存在websocket链接 qDebug() << "[ExtensionService] Active WebSocket connection found"; From 6dc87a6ec48f483c8992bf9fb17c997632bd6dad Mon Sep 17 00:00:00 2001 From: ut001910 Date: Tue, 10 Sep 2024 10:48:12 +0800 Subject: [PATCH 2/4] fix: cmd modify cmd modify Task: https://pms.uniontech.com/task-view-361913.html Log: cmd modify --- src/src/aria2/aria2rpcinterface.cpp | 53 +++++++++++++------ src/src/extensionService/extensionservice.cpp | 34 +++++++----- 2 files changed, 57 insertions(+), 30 deletions(-) diff --git a/src/src/aria2/aria2rpcinterface.cpp b/src/src/aria2/aria2rpcinterface.cpp index c4a3592c..19479745 100644 --- a/src/src/aria2/aria2rpcinterface.cpp +++ b/src/src/aria2/aria2rpcinterface.cpp @@ -45,21 +45,27 @@ Aria2RPCInterface *Aria2RPCInterface::m_instance = new Aria2RPCInterface; -QString runPipeProcess(QString cmd) { - FILE *pPipe = popen(cmd.toUtf8(), "r"); - QString strData; - if (pPipe) - { - while (!feof(pPipe)) - { - char tempStr[1024] = {0}; - fgets(tempStr, 1024, pPipe); - strData.append(QString::fromLocal8Bit(tempStr)); +QStringList runPipeProcess(const QString &command, const QString &filter) +{ + QProcess process; + process.start(command); + process.waitForFinished(); + + QString comStr = process.readAllStandardOutput(); + QStringList lines = comStr.split('\n'); + QStringList filteredLines; + if(filter.isEmpty()) { + return lines; //返回所有 + } + // 过滤包含指定关键字的行 + for (const QString &line : lines) { + if (line.contains(filter, Qt::CaseInsensitive)) { + filteredLines.append(line); } - fclose(pPipe); - return strData; } - return strData; + + // 合并过滤后的行并返回 + return filteredLines; // 返回以换行符分隔的字符串 } Aria2RPCInterface *Aria2RPCInterface::instance() @@ -251,8 +257,7 @@ bool Aria2RPCInterface::init() bool Aria2RPCInterface::checkAria2cProc() { qDebug() << "[Aria2RPC] checkAria2cProc function started"; - QString output = runPipeProcess("ps aux|grep " + m_aria2cCmd); - QStringList lineList = output.split("\n"); + QStringList lineList = runPipeProcess("ps aux", m_aria2cCmd); int cnt = 0; for (QString t : lineList) { if (t.isEmpty()) { @@ -281,7 +286,23 @@ bool Aria2RPCInterface::checkAria2cProc() int Aria2RPCInterface::killAria2cProc() { qDebug() << "[Aria2RPC] killAria2cProc function started"; - runPipeProcess("ps -ef|grep " + m_aria2cCmd + "|grep -v grep|awk '{print $2}'|xargs kill -9"); + QStringList lines = runPipeProcess("ps -eo pid,lstart,cmd", m_aria2cCmd); + QStringList processPids; + + for (const QString &line : lines) { + QStringList parts = line.split(QRegExp("\\s+"), QString::SkipEmptyParts); + if (parts.size() < 3) continue; + if (!parts[6].contains(m_aria2cCmd)) continue; + processPids.append(parts[0]); + } + + // 杀死以前启动的进程 + for (const QString &pid : processPids) { + QProcess killProcess; + killProcess.start("kill", QStringList() << "-9" << pid); + killProcess.waitForFinished(); + qInfo() << "Killed process with PID:" << pid; + } return 0; } diff --git a/src/src/extensionService/extensionservice.cpp b/src/src/extensionService/extensionservice.cpp index 33348ee7..0ff5811f 100644 --- a/src/src/extensionService/extensionservice.cpp +++ b/src/src/extensionService/extensionservice.cpp @@ -48,21 +48,27 @@ #include "websockettransport.h" #include "websockethandle.h" -QString runPipeProcess(QString cmd) { - FILE *pPipe = popen(cmd.toUtf8(), "r"); - QString strData; - if (pPipe) - { - while (!feof(pPipe)) - { - char tempStr[1024] = {0}; - fgets(tempStr, 1024, pPipe); - strData.append(QString::fromLocal8Bit(tempStr)); +QStringList runPipeProcess(const QString &command, const QString &filter) +{ + QProcess process; + process.start(command); + process.waitForFinished(); + + QString comStr = process.readAllStandardOutput(); + QStringList lines = comStr.split('\n'); + QStringList filteredLines; + if(filter.isEmpty()) { + return lines; //返回所有 + } + // 过滤包含指定关键字的行 + for (const QString &line : lines) { + if (line.contains(filter, Qt::CaseInsensitive)) { + filteredLines.append(line); } - fclose(pPipe); - return strData; } - return strData; + + // 合并过滤后的行并返回 + return filteredLines; // 返回以换行符分隔的字符串 } @@ -130,7 +136,7 @@ void extensionService::checkConnection() { qDebug() << "[ExtensionService] Checking WebSocket connections"; - QList strList = runPipeProcess("netstat -apn | grep dlmextensions").toUtf8().split('\n'); + QStringList strList = runPipeProcess("netstat -apn", "dlmextensions"); for(QString str : strList) { if(str.contains("ESTABLISHED")) { //存在websocket链接 qDebug() << "[ExtensionService] Active WebSocket connection found"; From 8346c691c8c117311b155b77516e9c72baf413f9 Mon Sep 17 00:00:00 2001 From: ut001910 Date: Mon, 25 Nov 2024 20:08:16 +0800 Subject: [PATCH 3/4] =?UTF-8?q?fix:=20=E4=B8=8B=E8=BD=BD=E7=A7=BB=E9=99=A4?= =?UTF-8?q?dht=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 下载移除dht文件 Task: https://pms.uniontech.com/task-view-368187.html Log: 下载移除dht文件 --- src/src/aria2/aria2rpcinterface.cpp | 13 ++----------- src/src/ui/mainFrame/mainframe.cpp | 18 ------------------ 2 files changed, 2 insertions(+), 29 deletions(-) diff --git a/src/src/aria2/aria2rpcinterface.cpp b/src/src/aria2/aria2rpcinterface.cpp index 19479745..c3b66180 100644 --- a/src/src/aria2/aria2rpcinterface.cpp +++ b/src/src/aria2/aria2rpcinterface.cpp @@ -113,15 +113,10 @@ bool Aria2RPCInterface::startUp() *设置aria2c session 路径 时间 input 路径 */ QString sessionCacheFile = QDir::homePath() + "/.cache/uos-aria2c.session"; //session 文件路径 - QString inputFile = QDir::homePath() + "/.cache/uos-aria2c.input"; //.input文件路径 - QString dhtFile = QDir::homePath() + "/.config/uos/downloader/dht.dat"; // - QString dht6File = QDir::homePath() + "/.config/uos/downloader/dht6.dat"; // QString saveSessionInterval = "30"; //秒 qDebug() << "创建session缓存文件: " << sessionCacheFile; QProcess::execute("touch", QStringList() << sessionCacheFile); //创建session缓存文件 - //QProcess::execute("touch", QStringList() << dhtFile); //创建dht文件 - //QProcess::execute("touch", QStringList() << dht6File); //创建dht6文件 #if QT_VERSION_MAJOR > 5 qDebug() << "[Aria2RPC] Using Qt version > 5"; @@ -156,8 +151,6 @@ bool Aria2RPCInterface::startUp() opt += "--save-session-interval=" + saveSessionInterval; opt += "--enable-dht=true"; //启动dht文件 opt += "--enable-dht6=false"; //禁用dht6文件 - opt += "--dht-file-path=" + dhtFile; - opt += "--dht-file-path6=" + dht6File; opt += "--follow-metalink=false"; if(QSysInfo::currentCpuArchitecture() == "loongarch64"){ qDebug() << "[Aria2RPC] Using loongarch64 architecture, disabling async-dns"; @@ -204,8 +197,6 @@ bool Aria2RPCInterface::startUp() opt += " --save-session-interval=" + saveSessionInterval; opt += " --enable-dht=true"; //启动dht文件 opt += " --enable-dht6=false"; //禁用dht6文件 - opt += " --dht-file-path=" + dhtFile; - opt += " --dht-file-path6=" + dht6File; opt += " --follow-metalink=false"; if(QSysInfo::currentCpuArchitecture() == "loongarch64"){ qDebug() << "[Aria2RPC] Using loongarch64 architecture, disabling async-dns"; @@ -1041,8 +1032,8 @@ long Aria2RPCInterface::getCapacityFreeByte(QString path) QProcess *proc = new QProcess; QStringList opt; - opt << "df " + path; - proc->start("/bin/bash", opt); + opt << path; + proc->start("df", opt); proc->waitForFinished(); QByteArray rt = proc->readAllStandardOutput(); proc->close(); diff --git a/src/src/ui/mainFrame/mainframe.cpp b/src/src/ui/mainFrame/mainframe.cpp index f0030370..a62a9d62 100644 --- a/src/src/ui/mainFrame/mainframe.cpp +++ b/src/src/ui/mainFrame/mainframe.cpp @@ -440,24 +440,6 @@ void MainFrame::updateDHTFile() } QFile::remove(QDir::homePath() + "/.config/uos/downloader/dht.dat"); QFile::remove(QDir::homePath() + "/.config/uos/downloader/dht6.dat"); - - QString dhtpah = QDir::homePath() + "/.config/uos/downloader/"; - static QProcess p; -#if QT_VERSION_MAJOR > 5 - p.start("curl", {"--connect-timeout", "10", "-m", "20", "https://github.com/P3TERX/aria2.conf/raw/master/dht6.dat", "-o", dhtpah, "dht6.dat -O"}); -#else - p.start("curl --connect-timeout 10 -m 20 https://github.com/P3TERX/aria2.conf/raw/master/dht6.dat -o" + dhtpah + "dht6.dat -O"); -#endif - p.setStandardOutputFile("/dev/null"); - - static QProcess p2; -#if QT_VERSION_MAJOR > 5 - p2.start("curl", {"--connect-timeout", "10", "-m", "20", "https://github.com/P3TERX/aria2.conf/raw/master/dht.dat", "-o", dhtpah, "dht.dat -O"}); -#else - p2.start("curl --connect-timeout 10 -m 20 https://github.com/P3TERX/aria2.conf/raw/master/dht.dat -o" + dhtpah + "dht.dat -O"); -#endif - p2.setStandardOutputFile("/dev/null"); - qDebug() << "[MainFrame] updateDHTFile function ended"; } void MainFrame::initConnection() From 65f38122b6a6a8482e5bd63ac4e12e5ac8799cd7 Mon Sep 17 00:00:00 2001 From: re2zero Date: Fri, 28 Nov 2025 17:17:31 +0800 Subject: [PATCH 4/4] fix: add Qt6 compatibility and prevent array out of bounds Added conditional compilation for Qt6 to handle the different split method signature and added bounds checking to prevent accessing array index 6 when the parts array has fewer elements. Log: Fix Qt6 build. --- src/src/aria2/aria2rpcinterface.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/src/aria2/aria2rpcinterface.cpp b/src/src/aria2/aria2rpcinterface.cpp index c3b66180..44afb3b7 100644 --- a/src/src/aria2/aria2rpcinterface.cpp +++ b/src/src/aria2/aria2rpcinterface.cpp @@ -281,9 +281,13 @@ int Aria2RPCInterface::killAria2cProc() QStringList processPids; for (const QString &line : lines) { +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) + QStringList parts = line.split(QRegularExpression("\\s+"), Qt::SkipEmptyParts); +#else QStringList parts = line.split(QRegExp("\\s+"), QString::SkipEmptyParts); +#endif if (parts.size() < 3) continue; - if (!parts[6].contains(m_aria2cCmd)) continue; + if (parts.size() <= 6 || !parts[6].contains(m_aria2cCmd)) continue; processPids.append(parts[0]); }