[skip ci] Fix agent for sysinfo 0.31

This commit is contained in:
Esdras Renan 2025-10-12 01:48:14 -03:00
parent 4075c048ca
commit 206d00700e

View file

@ -7,7 +7,7 @@ use parking_lot::Mutex;
use serde::Serialize; use serde::Serialize;
use serde_json::json; use serde_json::json;
use std::collections::HashMap; use std::collections::HashMap;
use sysinfo::{DiskExt, Networks, System, SystemExt}; use sysinfo::{Networks, System};
use tauri::async_runtime::{self, JoinHandle}; use tauri::async_runtime::{self, JoinHandle};
use tokio::sync::Notify; use tokio::sync::Notify;
@ -166,12 +166,13 @@ fn collect_network_addrs() -> Vec<serde_json::Value> {
entries entries
} }
fn collect_disks(system: &System) -> Vec<serde_json::Value> { fn collect_disks(_system: &System) -> Vec<serde_json::Value> {
let mut out = Vec::new(); let mut out = Vec::new();
for disk in system.disks() { let disks = sysinfo::Disks::new_with_refreshed_list();
for disk in disks.list() {
let name = disk.name().to_string_lossy().to_string(); let name = disk.name().to_string_lossy().to_string();
let mount = disk.mount_point().to_string_lossy().to_string(); let mount = disk.mount_point().to_string_lossy().to_string();
let fs = String::from_utf8_lossy(disk.file_system()).to_string(); let fs = disk.file_system().to_string_lossy().to_string();
let total = disk.total_space(); let total = disk.total_space();
let avail = disk.available_space(); let avail = disk.available_space();
out.push(json!({ out.push(json!({
@ -183,23 +184,6 @@ fn collect_disks(system: &System) -> Vec<serde_json::Value> {
})); }));
} }
if out.is_empty() {
let disks = sysinfo::Disks::new_with_refreshed_list();
for d in disks.list() {
let name = d.name().to_string_lossy().to_string();
let mount = d.mount_point().to_string_lossy().to_string();
let fs = String::from_utf8_lossy(d.file_system()).to_string();
let total = d.total_space();
let avail = d.available_space();
out.push(json!({
"name": if name.is_empty() { mount.clone() } else { name },
"mountPoint": mount,
"fs": fs,
"totalBytes": total,
"availableBytes": avail,
}));
}
}
out out
} }
@ -255,13 +239,13 @@ fn build_inventory_metadata(system: &System) -> serde_json::Value {
.cpus() .cpus()
.first() .first()
.map(|cpu| cpu.brand().to_string()) .map(|cpu| cpu.brand().to_string())
.unwrap_or_default(); .filter(|brand| !brand.trim().is_empty());
// sysinfo 0.31 já retorna bytes em total_memory/used_memory // sysinfo 0.31 já retorna bytes em total_memory/used_memory
let mem_total_bytes = system.total_memory(); let mem_total_bytes = system.total_memory();
let network = collect_network_addrs(); let network = collect_network_addrs();
let disks = collect_disks(system); let disks = collect_disks(system);
let mut inventory = json!({ let mut inventory = json!({
"cpu": { "brand": cpu_brand }, "cpu": { "brand": cpu_brand.clone() },
"memory": { "totalBytes": mem_total_bytes }, "memory": { "totalBytes": mem_total_bytes },
"network": network, "network": network,
"disks": disks, "disks": disks,
@ -326,12 +310,16 @@ fn build_inventory_metadata(system: &System) -> serde_json::Value {
// Normalização de software/serviços no topo do inventário // Normalização de software/serviços no topo do inventário
if let Some(obj) = inventory.as_object_mut() { if let Some(obj) = inventory.as_object_mut() {
let extended_snapshot = obj
.get("extended")
.and_then(|v| v.as_object())
.cloned();
// Merge software // Merge software
let mut software: Vec<serde_json::Value> = Vec::new(); let mut software: Vec<serde_json::Value> = Vec::new();
if let Some(existing) = obj.get("software").and_then(|v| v.as_array()) { if let Some(existing) = obj.get("software").and_then(|v| v.as_array()) {
software.extend(existing.iter().cloned()); software.extend(existing.iter().cloned());
} }
if let Some(ext) = obj.get("extended").and_then(|v| v.as_object()) { if let Some(ext) = extended_snapshot.as_ref() {
// Windows normalize // Windows normalize
if let Some(win) = ext.get("windows").and_then(|v| v.as_object()) { if let Some(win) = ext.get("windows").and_then(|v| v.as_object()) {
if let Some(ws) = win.get("software").and_then(|v| v.as_array()) { if let Some(ws) = win.get("software").and_then(|v| v.as_array()) {
@ -370,7 +358,7 @@ fn build_inventory_metadata(system: &System) -> serde_json::Value {
if let Some(existing) = obj.get("services").and_then(|v| v.as_array()) { if let Some(existing) = obj.get("services").and_then(|v| v.as_array()) {
services.extend(existing.iter().cloned()); services.extend(existing.iter().cloned());
} }
if let Some(ext) = obj.get("extended").and_then(|v| v.as_object()) { if let Some(ext) = extended_snapshot.as_ref() {
if let Some(win) = ext.get("windows").and_then(|v| v.as_object()) { if let Some(win) = ext.get("windows").and_then(|v| v.as_object()) {
if let Some(wsvc) = win.get("services").and_then(|v| v.as_array()) { if let Some(wsvc) = win.get("services").and_then(|v| v.as_array()) {
for s in wsvc { for s in wsvc {
@ -389,7 +377,7 @@ fn build_inventory_metadata(system: &System) -> serde_json::Value {
} }
let mut gpus: Vec<serde_json::Value> = Vec::new(); let mut gpus: Vec<serde_json::Value> = Vec::new();
if let Some(ext) = obj.get("extended").and_then(|v| v.as_object()) { if let Some(ext) = extended_snapshot.as_ref() {
if let Some(win) = ext.get("windows").and_then(|v| v.as_object()) { if let Some(win) = ext.get("windows").and_then(|v| v.as_object()) {
if let Some(video) = win.get("videoControllers").and_then(|v| v.as_array()) { if let Some(video) = win.get("videoControllers").and_then(|v| v.as_array()) {
for controller in video { for controller in video {
@ -418,8 +406,8 @@ fn build_inventory_metadata(system: &System) -> serde_json::Value {
"name": if !model.is_empty() { model } else { serial }, "name": if !model.is_empty() { model } else { serial },
"mountPoint": "", "mountPoint": "",
"fs": if !media.is_empty() { media } else { "" }, "fs": if !media.is_empty() { media } else { "" },
"interface": if !interface.is_empty() { interface } else { serde_json::Value::Null }, "interface": if !interface.is_empty() { serde_json::Value::String(interface.to_string()) } else { serde_json::Value::Null },
"serial": if !serial.is_empty() { serial } else { serde_json::Value::Null }, "serial": if !serial.is_empty() { serde_json::Value::String(serial.to_string()) } else { serde_json::Value::Null },
"totalBytes": size, "totalBytes": size,
"availableBytes": serde_json::Value::Null, "availableBytes": serde_json::Value::Null,
}) })