use super::Arch;
use std::path::PathBuf;
use std::process::Command;
#[derive(Debug)]
pub struct Image<'a> {
pub arch: Arch,
pub os: &'a str,
pub prompt: &'a str,
pub cdrom: &'a str,
pub snapshot: &'a str,
pub default_mem: &'a str,
pub url: &'a str,
pub extra_args: &'a [&'a str],
}
pub fn get_supported_image(name: &str) -> Image<'static> {
match name {
"x86_64_ubuntu_1804" => Image {
arch: Arch::x86_64,
os: "linux-64-ubuntu:4.15.0-72-generic-noaslr-nokaslr",
prompt: r#"root@ubuntu:.*#"#,
cdrom: "ide1-cd0",
snapshot: "root",
default_mem: "1024",
url: "https://panda-re.mit.edu/qcows/linux/ubuntu/1804/x86_64/bionic-server-cloudimg-amd64-noaslr-nokaslr.qcow2",
extra_args: &["-display", "none"]},
"x86_64" => get_supported_image("x86_64_ubuntu_1804"),
_ => panic!("Unsupported image {}", name)
}
}
fn panda_image_dir() -> PathBuf {
let dir = dirs::home_dir().unwrap().join(".panda");
if !dir.exists() {
std::fs::create_dir(&dir).unwrap();
}
dir
}
pub fn get_generic_path(name: &str) -> PathBuf {
let image = get_supported_image(name);
let filename = image.url.split('/').last().unwrap();
let path = panda_image_dir().join(filename);
if !path.exists() {
println!(
"QCOW {} doesn't exist. Downloading from https://panda-re.mit.edu. Thanks MIT!",
name
);
Command::new("wget")
.args(&["--quiet", &image.url, "-O"])
.arg(&path)
.status()
.unwrap();
}
path
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_install_qcow() {
let x = get_generic_path("x86_64");
assert!(x.exists());
}
}