阶段提交

This commit is contained in:
zhaominyong 2021-11-08 09:52:01 +08:00
parent 61e25c5e75
commit 24147a44ce
2 changed files with 117 additions and 3 deletions

View File

@ -198,6 +198,12 @@ QString Utils::getBackupPartitionUuid()
QString preLine; QString preLine;
while (!in.atEnd()) { while (!in.atEnd()) {
QString line = in.readLine(); QString line = in.readLine();
if (line.isEmpty())
continue;
if (line.startsWith("#")) {
preLine = line;
continue;
}
if (line.startsWith("UUID=") && line.contains("/backup")) { if (line.startsWith("UUID=") && line.contains("/backup")) {
// like: // like:
// # /dev/add4 LABEL=KYLIN-BACKUP // # /dev/add4 LABEL=KYLIN-BACKUP
@ -228,8 +234,6 @@ QString Utils::getBackupPartitionUuid()
break ; break ;
} }
} }
preLine = line;
} }
} }
} }
@ -238,6 +242,74 @@ QString Utils::getBackupPartitionUuid()
return restoreUuid; 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 * @brief
* @param path * @param path
@ -702,7 +774,7 @@ bool Utils::isHuawei990()
* @brief popen()fork()shell以运行命令来开启一个进程 * @brief popen()fork()shell以运行命令来开启一个进程
* @param cmd NULL shell bin/sh 使 -c shell * @param cmd NULL shell bin/sh 使 -c shell
* @param result * @param result
* @note 使 * @note
*/ */
void Utils::executeCMD(const char* cmd, QString &result) void Utils::executeCMD(const char* cmd, QString &result)
{ {
@ -710,6 +782,7 @@ void Utils::executeCMD(const char* cmd, QString &result)
FILE* ptr = nullptr; FILE* ptr = nullptr;
// 只能是读或者写中的一种,得到的返回值(标准 I/O 流)也具有和 type 相应的只读或只写类型。 // 只能是读或者写中的一种,得到的返回值(标准 I/O 流)也具有和 type 相应的只读或只写类型。
// 如果 type 是 “r” 则文件指针连接到 command 的标准输出;如果 type 是 “w” 则文件指针连接到 command 的标准输入。 // 如果 type 是 “r” 则文件指针连接到 command 的标准输出;如果 type 是 “w” 则文件指针连接到 command 的标准输入。
qDebug() << cmd;
if ((ptr = popen(cmd, "r")) != nullptr) { if ((ptr = popen(cmd, "r")) != nullptr) {
while (fgets(buf_ps, 1024, ptr) != nullptr) { while (fgets(buf_ps, 1024, ptr) != nullptr) {
result += buf_ps; 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 * @brief
* @return * @return

View File

@ -67,6 +67,13 @@ public:
*/ */
static QString getBackupPartitionUuid(); static QString getBackupPartitionUuid();
/**
* @brief UUID映射关系
* @param fstab文件路径
* @return -UUID
*/
static QHash<QString, QString> getPartUuidMap(const QString &fstab);
/** /**
* @brief * @brief
* @param path * @param path
@ -197,6 +204,7 @@ public:
* @note 使 * @note 使
*/ */
static void executeCMD(const char* cmd, QString &result); static void executeCMD(const char* cmd, QString &result);
static QString executeCmd(const QString &cmd, const QStringList &args = QStringList());
/** /**
* @brief * @brief