use anyhow::{Context, Result};
use std::path::Path;
use std::process::Command;
pub fn get_qemu_version(emulator: &str) -> Result<String> {
let output = Command::new(emulator)
.arg("--version")
.output()
.context("Failed to get QEMU version")?;
let stdout = String::from_utf8_lossy(&output.stdout);
Ok(stdout.lines().next().unwrap_or("Unknown").to_string())
}
pub fn is_emulator_available(emulator: &str) -> bool {
Command::new("which")
.arg(emulator)
.output()
.map(|o| o.status.success())
.unwrap_or(false)
}
pub fn list_available_emulators() -> Vec<String> {
let emulators = [
"qemu-system-x86_64",
"qemu-system-i386",
"qemu-system-ppc",
"qemu-system-m68k",
"qemu-system-arm",
"qemu-system-aarch64",
];
emulators
.iter()
.filter(|e| is_emulator_available(e))
.map(|e| e.to_string())
.collect()
}
pub fn is_kvm_available() -> bool {
Path::new("/dev/kvm").exists()
}
pub fn get_kvm_info() -> Option<String> {
if !is_kvm_available() {
return None;
}
let output = Command::new("lsmod").output().ok()?;
let stdout = String::from_utf8_lossy(&output.stdout);
for line in stdout.lines() {
if line.starts_with("kvm_intel") || line.starts_with("kvm_amd") {
return Some(line.split_whitespace().next()?.to_string());
}
}
Some("kvm".to_string())
}