Skip to content

Commit

Permalink
fix: [cmd] Remove bash calls and system script calls
Browse files Browse the repository at this point in the history
  Remove bash calls and system script calls

Log: Remove bash calls and system script calls
Task: https://pms.uniontech.com/task-view-362323.html
  • Loading branch information
starhcq committed Sep 13, 2024
1 parent ef73d60 commit 5506587
Show file tree
Hide file tree
Showing 11 changed files with 228 additions and 94 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,15 @@ bool DriverInstaller::isNetworkOnline(uint usec)
/*
-c 2(代表ping次数,ping 2次后结束ping操作) -w 2(代表超时时间,2秒后结束ping操作)
*/
system("ping www.baidu.com -c 2 -w 2 >netlog.bat");
// example: ping www.baidu.com -c 2 -w 2 >netlog.bat
QProcess process;
process.setStandardOutputFile("netlog.bat", QIODevice::WriteOnly);
process.start("ping", QStringList() << "www.baidu.com" << "-c" << "2" << "-w" << "2");
process.waitForFinished(-1);
bool bRet = (process.exitStatus() == QProcess::NormalExit && process.exitCode() == 0);
if (!bRet) {
return false;
}
usleep(usec);

//把文件一行一行读取放入vector
Expand Down
27 changes: 15 additions & 12 deletions deepin-devicemanager-server/src/DriverControl/DriverManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -393,9 +393,8 @@ bool DriverManager::isSigned(const QString &filepath)
strSignCheckString = "Verified successfully";
}

QString outInfo;
bool ret = Utils::runCmdSafeWithArgs(outInfo, program, arguments, -1);
return (ret && outInfo.contains(strSignCheckString));
QString outInfo = Utils::executeCmd(program, arguments, QString(), -1);
return outInfo.contains(strSignCheckString);
}
bool DriverManager::isArchMatched(const QString &path)
{
Expand Down Expand Up @@ -538,8 +537,15 @@ bool DriverManager::isNetworkOnline()
/*
-c 2(代表ping次数,ping 2次后结束ping操作) -w 2(代表超时时间,2秒后结束ping操作)
*/
// system("ping www.google.com -c 2 -w 2 >netlog.bat");
system("ping www.baidu.com -c 2 -w 2 >netlog.bat");
// example: ping www.baidu.com -c 2 -w 2 >netlog.bat
QProcess process;
process.setStandardOutputFile("netlog.bat", QIODevice::WriteOnly);
process.start("ping", QStringList() << "www.baidu.com" << "-c" << "2" << "-w" << "2");
process.waitForFinished(-1);
bool bRet = (process.exitStatus() == QProcess::NormalExit && process.exitCode() == 0);
if (!bRet) {
return false;
}
sleep(2);

//把文件一行一行读取放入vector
Expand Down Expand Up @@ -751,14 +757,11 @@ bool DriverManager::checkCameraInfo(QMap<QString, QString> &mapInfo)

QString DriverManager::getDriverVersion(QString strDriver)
{
QProcess process;
QStringList options;
options << "-c" << "modinfo " + strDriver + " | grep version";

process.start("/bin/bash", options);
process.waitForFinished(-1);
QString outInfo = Utils::executeCmd("modinfo", QStringList() << strDriver, QString(), -1);
if(outInfo.isEmpty())
return QString("");

QStringList str = QString(process.readAll()).split("\n\n");
QStringList str = outInfo.split("\n\n");
foreach (QString temp, str) {
if (temp.startsWith("version") && temp.contains(":") && temp.split(':').size() > 1) {
return temp.split(':')[2];
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -184,13 +184,8 @@ bool HttpDriverInterface::checkDriverInfo(QString strJson, DriverInfo &driverInf
bool HttpDriverInterface::isPkgInstalled(QString strPkgName, QString strVersion)
{
//调用apt命令查看包是否安装。
QStringList arguments;
QString program;
arguments << "policy" << strPkgName;
program = "apt";
QString outInfo;
bool ret = Utils::runCmdSafeWithArgs(outInfo, program, arguments, -1);
if(!ret)
QString outInfo = Utils::executeCmd("apt", QStringList() << "policy" << strPkgName, QString(), -1);
if(outInfo.isEmpty())
return false;
QStringList infoList = outInfo.split("\n");

Expand Down
82 changes: 42 additions & 40 deletions deepin-devicemanager-server/src/DriverControl/Utils.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -107,33 +107,22 @@ bool Utils::isDriverPackage(const QString &filepath)
if (tmpDir.mkdir(tmpPath)) {
tmpDir.cd(tmpPath);
QString strExtract = tmpDir.absolutePath();
QStringList arguments;
arguments << QString("-x") << filepath << strExtract;
QString program = QString("dpkg-deb");
QString outInfo;
bool ret = runCmdSafeWithArgs(outInfo, program, arguments);
if (ret) {
// 2021-12-24 [email protected] 修改过滤规则
// 关键字查找 insmod modprobe和 路径 /lib/module 会在设备管理器本身(后台服务)和libhd等安装包中返回true,因此暂不可使用
// 英伟达驱动中找不到 .ko 和 .ppd 等信息 , 但是可以找到 nvidia*.ko 字段,因此添加 nvidia*.ko 过滤字段
// 不能直接通过包名判断 比如 "deepin-devicemanager_1.0.deb" 判断是否包含 "deepin-devicemanager" 此时同样会过滤 "/home/uos/deepin-devicemanager/driver.deb"
QStringList arguments1;
arguments1 << QString("-irHE") << QString("nvidia*.ko") << strExtract;
QString outInfo1;
bool ret1 = runCmdSafeWithArgs(outInfo1, "grep", arguments1);
if (ret1 && !outInfo1.isEmpty()) {
bsuccess = true;
}
if(!bsuccess) {
QStringList arguments2;
arguments2 << strExtract << QString("-name") << QString("*.ko") << QString("-o") << QString("-name") << QString("*.ppd");
QString outInfo2;
bool ret2 = runCmdSafeWithArgs(outInfo2, "find", arguments2);
if (ret2 && !outInfo2.isEmpty()) {
bsuccess = true;
}
executeCmd("dpkg-deb", QStringList() << QString("-x") << filepath << strExtract);
// 2021-12-24 [email protected] 修改过滤规则
// 关键字查找 insmod modprobe和 路径 /lib/module 会在设备管理器本身(后台服务)和libhd等安装包中返回true,因此暂不可使用
// 英伟达驱动中找不到 .ko 和 .ppd 等信息 , 但是可以找到 nvidia*.ko 字段,因此添加 nvidia*.ko 过滤字段
// 不能直接通过包名判断 比如 "deepin-devicemanager_1.0.deb" 判断是否包含 "deepin-devicemanager" 此时同样会过滤 "/home/uos/deepin-devicemanager/driver.deb"
QString outInfo1 = executeCmd("grep", QStringList() << QString("-irHE") << QString("nvidia*.ko") << strExtract);
if (!outInfo1.isEmpty()) {
bsuccess = true;
}
if(!bsuccess) {
QString outInfo2 = executeCmd("find", QStringList() << strExtract << QString("-name") << QString("*.ko") << QString("-o") << QString("-name") << QString("*.ppd"));
if (!outInfo2.isEmpty()) {
bsuccess = true;
}
}

//此处主动调用删除临时文件,临时文件在/tmp目录每次重启会自动清除,所以不对删除结果做处理
tmpDir.removeRecursively();
}
Expand Down Expand Up @@ -195,15 +184,21 @@ bool Utils::isFileLocked(const QString &filepath, bool bread)
bool Utils::isDpkgLocked()
{
QProcess proc;
proc.setProgram("bash");
proc.setArguments(QStringList() << "-c"
<< "ps -e -o comm | grep dpkg");
proc.setProgram("ps");
proc.setArguments(QStringList() << "-e" << "-o" << "comm");
proc.start();
proc.waitForFinished();
QString info = proc.readAllStandardOutput();
info = info.trimmed();
if (info.isEmpty() || info == "dpkg-query")
if (!info.contains("dpkg"))
return false;

// Split the output search for the 'grep dpkg ' pattern
foreach (QString out, info.split("\n")) {
if (out.contains("dpkg")) {
if(out.trimmed() == "dpkg-query")
return false;
}
}
return true;
}

Expand All @@ -221,17 +216,24 @@ QString Utils::getUrl()
}
}

bool Utils::runCmdSafeWithArgs(QString &outInfo, const QString &program, const QStringList &arguments, int msecsWaiting)
QByteArray Utils::executeCmd(const QString &cmd, const QStringList &args, const QString &workPath, int msecsWaiting)
{
QProcess process;
process.start(program, arguments);
if (!process.waitForFinished(msecsWaiting)) {
qInfo() << program << arguments << "run null";
return false;
if (!workPath.isEmpty())
process.setWorkingDirectory(workPath);

process.setProgram(cmd);
process.setArguments(args);
process.setEnvironment({"LANG=en_US.UTF-8", "LANGUAGE=en_US"});
process.start();
// Wait for process to finish without timeout.
process.waitForFinished(msecsWaiting);
QByteArray outPut = process.readAllStandardOutput();
int nExitCode = process.exitCode();
bool bRet = (process.exitStatus() == QProcess::NormalExit && nExitCode == 0);
if (!bRet) {
qWarning() << "run cmd error, caused by:" << process.errorString() << "output:" << outPut;
return QByteArray();
}

outInfo = process.readAllStandardOutput();
qInfo() << program << arguments << outInfo;
return true;
return outPut;
}

3 changes: 2 additions & 1 deletion deepin-devicemanager-server/src/DriverControl/Utils.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
#ifndef UTILS_H
#define UTILS_H
#include <QString>
#include <QStringList>

class Utils
{
Expand All @@ -27,7 +28,7 @@ class Utils
static bool isDpkgLocked();
//获取url
static QString getUrl();
static bool runCmdSafeWithArgs(QString &outInfo, const QString &program, const QStringList &arguments, int msecsWaiting = 30000);
static QByteArray executeCmd(const QString& cmd, const QStringList& args = QStringList(), const QString& workPath = QString(), int msecsWaiting = 30000);
};

#endif // UTILS_H
14 changes: 10 additions & 4 deletions deepin-devicemanager-server/src/LoadInfo/ThreadPool.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -69,11 +69,17 @@ void ThreadPool::runCmdToCache(const Cmd &cmd)

// 2. 执行命令获取设备信息
QString info;
QString cmdExec = cmd.cmd.left(cmd.cmd.indexOf('>')).trimmed();
QString cmdStr = cmdExec.split(' ').first().trimmed();
QString cmdArg = cmdExec.mid(cmdStr.count() + 1).trimmed();
QStringList args;
if (!cmdArg.isEmpty())
args = cmdArg.split(' ');
if (cmdStr.isEmpty())
return;

QProcess process;
QString cmdT = cmd.cmd;
QStringList options;
options << "-c" << cmdT.replace(QString(" > ") + PATH + cmd.file, "");
process.start("/bin/bash", options);
process.start(cmdStr, args);
process.waitForFinished(-1);
info = process.readAllStandardOutput();
DeviceInfoManager::getInstance()->addInfo(key, info);
Expand Down
111 changes: 98 additions & 13 deletions deepin-devicemanager-server/src/LoadInfo/ThreadPoolTask.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,9 @@
// SPDX-License-Identifier: GPL-3.0-or-later

#include "ThreadPoolTask.h"
#include "DeviceInfoManager.h"
#include "cpu/CpuInfo.h"
#include "Utils.h"

#include <QTime>
#include <QProcess>
Expand All @@ -11,9 +14,6 @@
#include <QDir>
#include <unistd.h>

#include "DeviceInfoManager.h"
#include "cpu/CpuInfo.h"

ThreadPoolTask::ThreadPoolTask(QString cmd, QString file, bool replace, int waiting, QObject *parent)
: QObject(parent),
m_Cmd(cmd),
Expand All @@ -40,25 +40,110 @@ void ThreadPoolTask::run()

void ThreadPoolTask::runCmd(const QString &cmd)
{
QString outPath = cmd.split('>').last().trimmed();
QString cmdExec = cmd.left(cmd.indexOf('>')).trimmed();
QString cmdStr = cmd.split(' ').first().trimmed();
QString cmdArg = cmdExec.mid(cmdStr.count() + 1).trimmed();
QStringList args;
if (!cmdArg.isEmpty())
args = cmdArg.split(' ');

if (cmdStr.isEmpty())
return;

QProcess process;
QStringList options;
options << "-c" << cmd;
process.start("/bin/bash", options);
process.waitForFinished(m_Waiting);
if (!outPath.isEmpty())
process.setStandardOutputFile(outPath, QIODevice::WriteOnly);
process.start(cmdStr, args);
process.waitForFinished(-1);
}

void ThreadPoolTask::runCmd(const QString &cmd, QString &info)
{
QProcess process;
QString cmdT = cmd;
// process.start(cmdT.replace(QString(" > ") + PATH + m_File, ""));
QString cmdExec = cmd.left(cmd.indexOf('>')).trimmed();
QString cmdStr = cmdExec.split(' ').first().trimmed();
QString cmdArg = cmdExec.mid(cmdStr.count() + 1).trimmed();
QStringList args;
if (!cmdArg.isEmpty())
args = cmdArg.split(' ');
if (cmdStr.isEmpty())
return;

// 处理包含*的命令参数
if (cmdExec.startsWith("ls /dev/sg*")) {
info = runAsteriskCmd(cmdStr, args.first().trimmed());
return;
} else if (cmdExec.startsWith("cat /boot/config*")) {
QString filter = cmdExec.split('|').last().split(' ').last().replace('\'', "");
if (filter.isEmpty())
return;
QString outPut = runAsteriskCmd("ls", "/boot/config*");
if (outPut.isEmpty())
return;
QStringList paths = outPut.split('\n');
QStringList results;
for (auto path : paths) {
if (path.isEmpty())
continue;
QString info1 = Utils::executeCmd("cat", QStringList() << path);
if (info1.isEmpty())
continue;
QStringList lines = info1.split('\n');
for (auto line : lines) {
if (line.contains(filter))
results.push_back(line);
}
}

QStringList options;
options << "-c" << cmdT.replace(QString(" > ") + PATH + m_File, "");
process.start("/bin/bash", options);
if (!results.isEmpty())
info = results.join('\n');

return;
}

QProcess process;
process.start(cmdStr, args);
process.waitForFinished(m_Waiting);
info = process.readAllStandardOutput();

//qInfo() << "runcmdExec:" << cmdExec << "args:" << args << "outPut:" << info;
}

QString ThreadPoolTask::runAsteriskCmd(const QString &cmd, const QString &arg)
{
QString info = "";
if (cmd.isEmpty())
return info;

QStringList args;
QString path;
QString startWord;
if (arg == "/dev/sg*" || arg == "/boot/config*") {
path = arg.left(arg.lastIndexOf('/'));
args << path;
startWord = arg.split('/').last().replace('*', "");
} else {
return info;
}

QProcess process;
process.start(cmd, args);
process.waitForFinished(-1);

QString outPut = process.readAllStandardOutput();
QStringList outPutLines = outPut.trimmed().split('\n');
QStringList filterLines;
for (auto line : outPutLines) {
if (line.startsWith(startWord))
filterLines.push_back(path + "/" +line +"\n");
}

if (!filterLines.isEmpty())
info = filterLines.join(' ');

//qInfo() << "runAsteriskCmd:" << cmd << "arg:" << arg << "info:" << info;

return info;
}

void ThreadPoolTask::runCmdToCache(const QString &cmd)
Expand Down
8 changes: 8 additions & 0 deletions deepin-devicemanager-server/src/LoadInfo/ThreadPoolTask.h
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,14 @@ class ThreadPoolTask : public QObject, public QRunnable
*/
void runCmd(const QString &cmd, QString &info);

/**
* @brief runAsteriskCmd
* @param cmd
* @param arg
* @return info
*/
QString runAsteriskCmd(const QString &cmd, const QString &arg);

/**
* @brief runCmdToCache
* @param cmd
Expand Down
Loading

0 comments on commit 5506587

Please sign in to comment.