lscpu: Show CPU vulnerability mitigation info

This commit is contained in:
alxndrv 2025-02-12 22:11:34 +02:00 committed by Andrey Aleksandrov
parent 01b5f3384e
commit 3980e7714f
2 changed files with 44 additions and 0 deletions
src/uu/lscpu/src

@ -15,6 +15,8 @@ mod options {
pub const JSON: &str = "json";
}
mod sysfs;
const ABOUT: &str = help_about!("lscpu.md");
const USAGE: &str = help_usage!("lscpu.md");
@ -126,6 +128,15 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> {
cpu_infos.push(vendor_info);
}
let vulns = sysfs::read_cpu_vulnerabilities();
if !vulns.is_empty() {
let mut vuln_info = CpuInfo::new("Vulnerabilities", "", None);
for vuln in vulns {
vuln_info.add_child(CpuInfo::new(&vuln.name, &vuln.mitigation, None));
}
cpu_infos.push(vuln_info);
}
print_output(cpu_infos, output_opts);
Ok(())

33
src/uu/lscpu/src/sysfs.rs Normal file

@ -0,0 +1,33 @@
use std::fs;
pub struct CpuVulnerability {
pub name: String,
pub mitigation: String,
}
pub fn read_cpu_vulnerabilities() -> Vec<CpuVulnerability> {
let mut out: Vec<CpuVulnerability> = vec![];
if let Ok(dir) = fs::read_dir("/sys/devices/system/cpu/vulnerabilities") {
let mut files: Vec<_> = dir
.flatten()
.map(|x| x.path())
.filter(|x| !x.is_dir())
.collect();
files.sort_by(|a, b| a.file_name().cmp(&b.file_name()));
for file in files {
if let Ok(content) = fs::read_to_string(&file) {
let name = file.file_name().unwrap().to_str().unwrap();
out.push(CpuVulnerability {
name: (name[..1].to_uppercase() + &name[1..]).replace("_", " "),
mitigation: content.trim().to_string(),
});
}
}
};
out
}