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 12, 2024
1 parent 1198960 commit 73cbd53
Show file tree
Hide file tree
Showing 18 changed files with 238 additions and 119 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ void DriverInstaller::undoInstallDriver()
void DriverInstaller::aptClean()
{
QProcess process;
process.start("sh", QStringList() << "-c" << QString("/usr/bin/lastore-apt-clean"));//调用商店后端lastore中的接口
process.start("/usr/bin/lastore-apt-clean");//调用商店后端lastore中的接口
process.waitForFinished();
}

Expand All @@ -88,7 +88,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
Original file line number Diff line number Diff line change
Expand Up @@ -387,9 +387,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 @@ -441,8 +440,16 @@ 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
Original file line number Diff line number Diff line change
Expand Up @@ -188,13 +188,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
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

#include "notifythread.h"
#include "DDLog.h"
#include "utils.h"

#include <QTimer>
#include <QtDebug>
Expand All @@ -22,14 +23,22 @@ void NotifyThread::run()
QProcess process;
forever {
//查看dde-desktop进程是否启动
process.start("sh", QStringList() << "-c" << " ps aux | grep desktop |grep -v grep");
process.waitForFinished(-1);
if (process.readAll().isEmpty()) {
QString outInfo = Utils::executeCmd("ps", QStringList() << "aux", QString(), -1);

// Split the output search for the 'grep desktop | grep -v grep' pattern
QStringList retLst;
foreach (QString out, outInfo.split("\n")) {
if (out.contains("desktop") && !out.contains("grep")) {
retLst << out;
}
}
bool bDeskboot = true;
if (retLst.size() < 1) {
sleep(2);
continue;
}
//查看用户名
process.start("sh", QStringList() << "-c" << "who");
process.start("who");
process.waitForFinished(-1);
strUsername = process.readAll().split(' ')[0];
qCInfo(appLog) << strUsername;
Expand All @@ -40,9 +49,9 @@ void NotifyThread::run()

QString name = QLocale::system().name();

//通知前端
QString strCmd = "runuser -l " + strUsername + " -c \"XDG_RUNTIME_DIR=\"/run/user/$(id -u " + strUsername + " )\" /usr/bin/deepin-devicemanager notify " + name + "\"";
process.start("sh", QStringList() << "-c" << strCmd);
//通知前端 example: runuser -l Username -c "XDG_RUNTIME_DIR=\"/run/user/\$(id -u $Username)\" /usr/bin/deepin-devicemanager notify zh_CN"
QString strCmd=QString("XDG_RUNTIME_DIR=\"/run/user/\$(id -u %1)\" /usr/bin/deepin-devicemanager notify %2").arg(strUsername).arg(name);
process.start("runuser", QStringList() << "-l" << strUsername << "-c" << strCmd);
process.waitForFinished(-1);
break;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -109,31 +109,19 @@ 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目录每次重启会自动清除,所以不对删除结果做处理
Expand Down Expand Up @@ -197,15 +185,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 @@ -223,17 +217,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/* = 30000*/)
{
QProcess process;
process.start(program, arguments);
if (!process.waitForFinished(msecsWaiting)) {
qCInfo(appLog) << 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) {
qCWarning(appLog) << "run cmd error, caused by:" << process.errorString() << "output:" << outPut;
return QByteArray();
}

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

Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
#ifndef UTILS_H
#define UTILS_H
#include <QString>
#include <QStringList>

class Utils
{
Expand All @@ -26,7 +27,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
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
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
// SPDX-License-Identifier: GPL-3.0-or-later

#include "threadpooltask.h"
#include "DDLog.h"
using namespace DDLog;

#include <QTime>
#include <QProcess>
Expand Down Expand Up @@ -40,25 +42,82 @@ 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;

QStringList options;
options << "-c" << cmdT.replace(QString(" > ") + PATH + m_File, "");
process.start("/bin/bash", options);
// 处理包含*的命令参数
if (cmd.startsWith("ls /dev/sg*")) {
info = runAsteriskCmd(cmdStr, args.first().trimmed());
return;
}

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

//qCInfo(deviceInfoLog) << "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*") {
path = arg.left(arg.lastIndexOf('/'));
args << path;
startWord = arg.split('/').last().replace('*', "");
}

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(' ');

//qCInfo(deviceInfoLog) << "runAsteriskCmd:" << cmd << "arg:" << arg << "info:" << info;

return info;
}

void ThreadPoolTask::runCmdToCache(const QString &cmd)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,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
4 changes: 2 additions & 2 deletions deepin-devicemanager-server/deepin-deviceinfo/src/mainjob.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -52,8 +52,8 @@ MainJob::MainJob(const char *name, QObject *parent)
// 后台加载后先禁用设备
QProcess process;
QStringList options;
options << "-c" << "hwinfo --netcard --keyboard --mouse --usb";
process.start("/bin/bash", options);
options << "--netcard" << "--keyboard" << "--mouse" << "--usb";
process.start("hwinfo", options);
process.waitForFinished(-1);
QString info = process.readAllStandardOutput();
process.close();
Expand Down
Loading

0 comments on commit 73cbd53

Please sign in to comment.