diff --git a/common/utils.cpp b/common/utils.cpp index 3878b30..04d7db4 100755 --- a/common/utils.cpp +++ b/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 Utils::getPartUuidMap(const QString &fstab) +{ + QHash 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个域: , 形如: + // 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 diff --git a/common/utils.h b/common/utils.h index 556e073..b91bd60 100755 --- a/common/utils.h +++ b/common/utils.h @@ -67,6 +67,13 @@ public: */ static QString getBackupPartitionUuid(); + /** + * @brief 获取分区对应的UUID映射关系 + * @param fstab文件路径 + * @return “分区挂载目录-分区UUID”键值对 + */ + static QHash 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 获取备份日志列表