阶段提交
This commit is contained in:
parent
61e25c5e75
commit
24147a44ce
112
common/utils.cpp
112
common/utils.cpp
|
@ -198,6 +198,12 @@ QString Utils::getBackupPartitionUuid()
|
|||
QString preLine;
|
||||
while (!in.atEnd()) {
|
||||
QString line = in.readLine();
|
||||
if (line.isEmpty())
|
||||
continue;
|
||||
if (line.startsWith("#")) {
|
||||
preLine = line;
|
||||
continue;
|
||||
}
|
||||
if (line.startsWith("UUID=") && line.contains("/backup")) {
|
||||
// like:
|
||||
// # /dev/add4 LABEL=KYLIN-BACKUP
|
||||
|
@ -228,8 +234,6 @@ QString Utils::getBackupPartitionUuid()
|
|||
break ;
|
||||
}
|
||||
}
|
||||
|
||||
preLine = line;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -238,6 +242,74 @@ QString Utils::getBackupPartitionUuid()
|
|||
return restoreUuid;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 获取分区对应的UUID映射关系
|
||||
* @param fstab文件路径
|
||||
* @return “分区挂载目录-分区UUID”键值对
|
||||
*/
|
||||
QHash<QString, QString> Utils::getPartUuidMap(const QString &fstab)
|
||||
{
|
||||
QHash<QString, QString> result;
|
||||
QFile file(fstab);
|
||||
if (file.exists()) {
|
||||
if (file.open(QIODevice::ReadOnly | QIODevice::Text)) {
|
||||
QTextStream in(&file);
|
||||
QString preLine;
|
||||
while (!in.atEnd()) {
|
||||
QString line = in.readLine();
|
||||
if (line.isEmpty())
|
||||
continue;
|
||||
if (line.startsWith("#")) {
|
||||
preLine = line;
|
||||
continue;
|
||||
}
|
||||
|
||||
// 配置文件/etc/fstab每行6个域: <file system> <mount point> <type> <options> <dump> <pass>, 形如:
|
||||
// UUID=232f5fb4-53e0-46b9-ba9b-22bfec64f2a2 /boot ext4 rw,relatime 0 0
|
||||
QStringList list = line.split(QRegularExpression("[ \t]"));
|
||||
QStringList fields;
|
||||
for (int i = 0; i < list.size(); ++i) {
|
||||
QString field = list.at(i);
|
||||
field = field.trimmed();
|
||||
if (field.isEmpty())
|
||||
continue;
|
||||
fields << field;
|
||||
}
|
||||
QString mountPonit = fields.at(1);
|
||||
|
||||
if (line.startsWith("UUID=")) {
|
||||
// like:
|
||||
// # /dev/add4 LABEL=KYLIN-BACKUP
|
||||
// UUID=40be1cac-cd92-49db-8a98-68ee21ddbc49 /backup ext4 noauto 0 0
|
||||
int indexOfSpace = line.indexOf(QRegularExpression("[ \t]"), 0);
|
||||
QString uuid = line.mid(0, indexOfSpace);
|
||||
uuid.replace("UUID=", "");
|
||||
uuid = uuid.trimmed();
|
||||
|
||||
result.insert(mountPonit, uuid);
|
||||
} else if (line.startsWith("/dev/")) {
|
||||
// like:
|
||||
// # UUID=40be1cac-cd92-49db-8a98-68ee21ddbc49 LABEL=KYLIN-BACKUP
|
||||
// /dev/add4 /backup ext4 noauto 0 0
|
||||
if (preLine.startsWith("#") && preLine.contains("UUID=")) {
|
||||
preLine.replace("# ", "");
|
||||
preLine.replace("#", "");
|
||||
|
||||
int indexOfSpace = preLine.indexOf(QRegularExpression("[ \t]"), 0);
|
||||
QString uuid = preLine.mid(0, indexOfSpace);
|
||||
uuid.replace("UUID=", "");
|
||||
uuid = uuid.trimmed();
|
||||
|
||||
result.insert(mountPonit, uuid);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 路径不存在则创建,不支持递归创建
|
||||
* @param path
|
||||
|
@ -702,7 +774,7 @@ bool Utils::isHuawei990()
|
|||
* @brief popen()函数通过创建一个管道,调用fork()产生一个子进程,执行一个shell以运行命令来开启一个进程。
|
||||
* @param cmd,是一个指向以 NULL 结束的 shell 命令字符串的指针。这行命令将被传到 bin/sh 并使用 -c 标志,shell 将执行这个命令
|
||||
* @param result 输出结果
|
||||
* @note 不建议桌面应用调用,因为会依赖终端使得开机自启无法启动起来
|
||||
* @note
|
||||
*/
|
||||
void Utils::executeCMD(const char* cmd, QString &result)
|
||||
{
|
||||
|
@ -710,6 +782,7 @@ void Utils::executeCMD(const char* cmd, QString &result)
|
|||
FILE* ptr = nullptr;
|
||||
// 只能是读或者写中的一种,得到的返回值(标准 I/O 流)也具有和 type 相应的只读或只写类型。
|
||||
// 如果 type 是 “r” 则文件指针连接到 command 的标准输出;如果 type 是 “w” 则文件指针连接到 command 的标准输入。
|
||||
qDebug() << cmd;
|
||||
if ((ptr = popen(cmd, "r")) != nullptr) {
|
||||
while (fgets(buf_ps, 1024, ptr) != nullptr) {
|
||||
result += buf_ps;
|
||||
|
@ -722,6 +795,39 @@ void Utils::executeCMD(const char* cmd, QString &result)
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Utils::executeCmd
|
||||
* @param cmd
|
||||
* @param args
|
||||
* @return 输出
|
||||
*/
|
||||
QString Utils::executeCmd(const QString &cmd, const QStringList &args)
|
||||
{
|
||||
QString cmdLine(cmd);
|
||||
for (const QString &arg : args) {
|
||||
cmdLine += " ";
|
||||
cmdLine += arg;
|
||||
}
|
||||
qDebug() << cmdLine;
|
||||
|
||||
QString result;
|
||||
char buf_ps[1024] = { 0 };
|
||||
FILE* ptr = nullptr;
|
||||
// 只能是读或者写中的一种,得到的返回值(标准 I/O 流)也具有和 type 相应的只读或只写类型。
|
||||
// 如果 type 是 “r” 则文件指针连接到 command 的标准输出;如果 type 是 “w” 则文件指针连接到 command 的标准输入。
|
||||
if ((ptr = popen(cmdLine.toStdString().data(), "r")) != nullptr) {
|
||||
while (fgets(buf_ps, 1024, ptr) != nullptr) {
|
||||
result += buf_ps;
|
||||
memset(buf_ps, 0, 1024);
|
||||
}
|
||||
pclose(ptr);
|
||||
ptr = nullptr;
|
||||
} else {
|
||||
qCritical("popen %s error", cmdLine.toStdString().data());
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 获取备份日志列表
|
||||
* @return
|
||||
|
|
|
@ -67,6 +67,13 @@ public:
|
|||
*/
|
||||
static QString getBackupPartitionUuid();
|
||||
|
||||
/**
|
||||
* @brief 获取分区对应的UUID映射关系
|
||||
* @param fstab文件路径
|
||||
* @return “分区挂载目录-分区UUID”键值对
|
||||
*/
|
||||
static QHash<QString, QString> getPartUuidMap(const QString &fstab);
|
||||
|
||||
/**
|
||||
* @brief 路径不存在则创建,不支持递归创建
|
||||
* @param path
|
||||
|
@ -197,6 +204,7 @@ public:
|
|||
* @note 不建议桌面应用调用,因为会依赖终端使得开机自启无法启动起来
|
||||
*/
|
||||
static void executeCMD(const char* cmd, QString &result);
|
||||
static QString executeCmd(const QString &cmd, const QStringList &args = QStringList());
|
||||
|
||||
/**
|
||||
* @brief 获取备份日志列表
|
||||
|
|
Loading…
Reference in New Issue