#pragma once #include #include #include // ── DiscoveredPart ──────────────────────────────────────────────────────────── // One hardware component detected on the local machine, ready to send to the // inventory server via CMD_UPSERT_PART. struct DiscoveredPart { std::string type_name; // PTYPE_* constant, e.g. "memory_stick" std::map kv; // field-key → value (list fields use LS) }; // ── Discovery ───────────────────────────────────────────────────────────────── // Queries OS tools (dmidecode, lsblk, ip, sysctl, …) to detect hardware. // All methods are non-throwing: failures produce empty results + stderr warnings. class Discovery { public: // Detect all supported part types. std::vector discover_all(); // Detect parts of a single type (pass a PTYPE_* constant). std::vector discover(const std::string& type_name); private: std::vector discover_memory_sticks(); std::vector discover_memory_slots(); std::vector discover_cpus(); std::vector discover_cpu_slots(); std::vector discover_disks(); std::vector discover_nics(); std::vector discover_gpus(); // Run a shell command, return trimmed stdout (≤64 KB). "" on failure. static std::string run_cmd(const std::string& cmd); // Parse dmidecode -t output into a vector of field-map blocks. static std::vector> parse_dmi(const std::string& type_num); };