代码拉取完成,页面将自动刷新
同步操作将从 src-openEuler/kiran-cc-daemon 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
From 5c6cbc5e72570a5772b6ed4568cd2c303c02c9d9 Mon Sep 17 00:00:00 2001
From: yangfeng <yangfeng@kylinsec.com.cn>
Date: Tue, 20 Aug 2024 08:49:07 +0800
Subject: [PATCH] fix(systeminfo-hardware):Fix failure to get disk information
in virtual machine
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
- 修复虚拟机中获取磁盘信息失败
Related #46645
---
plugins/systeminfo/systeminfo-hardware.cpp | 67 +++++++++++++++-------
1 file changed, 45 insertions(+), 22 deletions(-)
diff --git a/plugins/systeminfo/systeminfo-hardware.cpp b/plugins/systeminfo/systeminfo-hardware.cpp
index 8ccb0e4..706a10d 100644
--- a/plugins/systeminfo/systeminfo-hardware.cpp
+++ b/plugins/systeminfo/systeminfo-hardware.cpp
@@ -19,6 +19,7 @@
#include <gudev/gudev.h>
#include <cinttypes>
#include <fstream>
+#include <regex>
namespace Kiran
{
@@ -233,13 +234,13 @@ std::map<std::string, std::string> SystemInfoHardware::parse_info_file(const std
DiskInfoVec SystemInfoHardware::get_disks_info()
{
- // 老版本lsblk不支持-J选项,所以这里不使用json格式
+ // 老版本lsblk不支持-J选项,所以这里不使用json格式
DiskInfoVec disks_info;
+ std::vector<std::string> argv{DISKINFO_CMD, "-d", "-b", "-P", "-o", "NAME,TYPE,SIZE,MODEL,VENDOR"};
std::string cmd_output;
try
{
- std::vector<std::string> argv{DISKINFO_CMD, "-d", "-b", "-P", "-o", "NAME,TYPE,SIZE,MODEL,VENDOR"};
Glib::spawn_sync("",
argv,
Glib::SPAWN_DEFAULT,
@@ -256,29 +257,51 @@ DiskInfoVec SystemInfoHardware::get_disks_info()
for (auto& line : lines)
{
- char name[BUFSIZ] = {0};
- char type[BUFSIZ] = {0};
- int64_t size = 0;
- char model[BUFSIZ] = {0};
- char vendor[BUFSIZ] = {0};
-
- std::string formatstr = "NAME=\"%" + std::to_string(BUFSIZ - 1) + "[^\"]\" TYPE=\"%" + std::to_string(BUFSIZ - 1) + "[^\"]\" SIZE=\"%" + PRId64 +
- "\" MODEL=\"%" + std::to_string(BUFSIZ - 1) + "[^\"]\" VENDOR=\"%" + std::to_string(BUFSIZ - 1) + "[^\"]\"";
-
- // model和vendor只要有一个不为空则认为合法,所以只要能读到4个变量即可
- //"NAME=\"%[^\"]\" TYPE=\"%[^\"]\" SIZE=\"%" PRId64 "\" MODEL=\"%[^\"]\" VENDOR=\"%[^\"]\""
- if (sscanf(line.c_str(), formatstr.c_str(),
- name, type, &size, model, vendor) >= 4)
+ std::regex pattern(R"(NAME=\"([^\"]*)\" TYPE=\"([^\"]*)\" SIZE=\"(\d+)\" MODEL=\"([^\"]*)\" VENDOR=\"([^\"]*)\")");
+ std::smatch matches;
+ if (std::regex_search(line, matches, pattern))
{
- if (std::string(type) == "disk")
+ if (matches[2].str() != "disk")
{
- DiskInfo disk_info;
- disk_info.name = name;
- disk_info.size = size;
- disk_info.model = StrUtils::trim(model);
- disk_info.vendor = StrUtils::trim(vendor);
- disks_info.push_back(disk_info);
+ continue;
+ }
+
+ int matched_count = 0;
+ for (size_t i = 1; i < matches.size(); ++i)
+ {
+ if (matches[i].str().size() > 0)
+ {
+ matched_count++;
+ }
+ }
+ // model和vendor只要有一个不为空则认为合法,所以只要能读到4个变量即可
+ if (matched_count < 4)
+ {
+ continue;
+ }
+ DiskInfo disk_info;
+ if (matches[1].str().size() > 0)
+ {
+ disk_info.name = matches[1].str();
+ }
+ if (matches[3].str().size() > 0)
+ {
+ disk_info.size = std::stoll(matches[3].str());
+ }
+ if (matches[4].str().size() > 0)
+ {
+ disk_info.model = matches[4].str();
}
+ else
+ {
+ disk_info.model = disk_info.name;
+ }
+ if (matches[5].str().size() > 0)
+ {
+ disk_info.vendor = matches[5].str();
+ }
+
+ disks_info.push_back(disk_info);
}
}
--
2.27.0
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。