diff --git a/apps/desktop/src-tauri/src/agent.rs b/apps/desktop/src-tauri/src/agent.rs index efe8139..d76e260 100644 --- a/apps/desktop/src-tauri/src/agent.rs +++ b/apps/desktop/src-tauri/src/agent.rs @@ -7,7 +7,7 @@ use parking_lot::Mutex; use serde::Serialize; use serde_json::json; use std::collections::HashMap; -use sysinfo::{DiskExt, Networks, System, SystemExt}; +use sysinfo::{Networks, System}; use tauri::async_runtime::{self, JoinHandle}; use tokio::sync::Notify; @@ -166,12 +166,13 @@ fn collect_network_addrs() -> Vec { entries } -fn collect_disks(system: &System) -> Vec { +fn collect_disks(_system: &System) -> Vec { 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 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 avail = disk.available_space(); out.push(json!({ @@ -183,23 +184,6 @@ fn collect_disks(system: &System) -> Vec { })); } - 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 } @@ -255,13 +239,13 @@ fn build_inventory_metadata(system: &System) -> serde_json::Value { .cpus() .first() .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 let mem_total_bytes = system.total_memory(); let network = collect_network_addrs(); let disks = collect_disks(system); let mut inventory = json!({ - "cpu": { "brand": cpu_brand }, + "cpu": { "brand": cpu_brand.clone() }, "memory": { "totalBytes": mem_total_bytes }, "network": network, "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 if let Some(obj) = inventory.as_object_mut() { + let extended_snapshot = obj + .get("extended") + .and_then(|v| v.as_object()) + .cloned(); // Merge software let mut software: Vec = Vec::new(); if let Some(existing) = obj.get("software").and_then(|v| v.as_array()) { 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 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()) { @@ -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()) { 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(wsvc) = win.get("services").and_then(|v| v.as_array()) { for s in wsvc { @@ -389,7 +377,7 @@ fn build_inventory_metadata(system: &System) -> serde_json::Value { } let mut gpus: Vec = 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(video) = win.get("videoControllers").and_then(|v| v.as_array()) { 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 }, "mountPoint": "", "fs": if !media.is_empty() { media } else { "—" }, - "interface": if !interface.is_empty() { interface } else { serde_json::Value::Null }, - "serial": if !serial.is_empty() { serial } 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() { serde_json::Value::String(serial.to_string()) } else { serde_json::Value::Null }, "totalBytes": size, "availableBytes": serde_json::Value::Null, })