120 lines
4.2 KiB
Diff
120 lines
4.2 KiB
Diff
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
|
||
|