use crate::virt::{err_not_found, Virtualization};
use std::{
fs::File,
io::{BufRead, BufReader, Error},
path::Path,
};
fn try_guess_container(value: &str) -> Result<Virtualization, Error> {
match value {
"lxc" => Ok(Virtualization::Lxc),
"lxc-libvirt" => Ok(Virtualization::LxcLibvirt),
"systemd-nspawn" => Ok(Virtualization::SystemdNspawn),
"docker" => Ok(Virtualization::Docker),
"podman" => Ok(Virtualization::Podman),
"rkt" => Ok(Virtualization::Rkt),
"wsl" => Ok(Virtualization::Wsl),
_ => Err(err_not_found()),
}
}
pub(crate) fn detect_wsl() -> Result<Virtualization, Error> {
let line = std::fs::read_to_string("/proc/sys/kernel/osrelease")?;
match line {
ref probe if probe.contains("Microsoft") => Ok(Virtualization::Wsl),
ref probe if probe.contains("WSL") => Ok(Virtualization::Wsl),
_ => Err(err_not_found()),
}
}
pub(crate) fn detect_openvz() -> Result<Virtualization, Error> {
match (
Path::new("/proc/vz").exists(),
Path::new("/proc/bc").exists(),
) {
(true, false) => Ok(Virtualization::OpenVz),
_ => Err(err_not_found()),
}
}
pub(crate) fn detect_systemd_container() -> Result<Virtualization, Error> {
let path = Path::new("/run/systemd/container");
if !path.exists() {
return Err(err_not_found());
}
let file = File::open("/run/systemd/container")?;
let mut file = BufReader::with_capacity(512, file);
let mut line = String::with_capacity(64);
file.read_line(&mut line)?;
try_guess_container(&line)
}