use std::process::Command;
use crate::platform;
use crate::{Error, Headless, RunContext, Shutdown, VmId};
pub fn start(vid: &VmId, ctx: RunContext) -> Result<(), Error> {
let mut cmd = match ctx {
RunContext::GUI => {
let mut cmd = Command::new(platform::get_cmd("VBoxManage"));
cmd.arg("startvm");
cmd.arg(vid.to_string());
cmd.arg("--type");
cmd.arg("gui");
cmd
}
RunContext::Headless(Headless::Detached) => {
let mut cmd = Command::new(platform::get_cmd("VBoxManage"));
cmd.arg("startvm");
cmd.arg(vid.to_string());
cmd.arg("--type");
cmd.arg("headless");
cmd
}
RunContext::Headless(Headless::Blocking) => {
let mut cmd = Command::new(platform::get_cmd("VBoxHeadless"));
cmd.arg("--startvm");
cmd.arg(vid.to_string());
cmd
}
};
let out = match cmd.output() {
Ok(out) => out,
Err(_) => {
return Err(Error::FailedToExecute(format!("{:?}", cmd)));
}
};
if out.status.success() {
Ok(())
} else {
let s = format!("{:?}", cmd);
Err(Error::CommandFailed(s, out))
}
}
pub fn shutdown(vid: &VmId, method: Shutdown) -> Result<(), Error> {
let mut cmd = Command::new(platform::get_cmd("VBoxManage"));
cmd.arg("controlvm");
cmd.arg(vid.to_string());
match method {
Shutdown::PowerOff => {
cmd.arg("poweroff");
}
Shutdown::AcpiPowerOff => {
cmd.arg("acpipowerbutton");
}
Shutdown::SaveState => {
cmd.arg("savestate");
}
}
let out = match cmd.output() {
Ok(out) => out,
Err(_) => {
return Err(Error::FailedToExecute(format!("{:?}", cmd)));
}
};
if out.status.success() {
Ok(())
} else {
Err(Error::CommandFailed(format!("{:?}", cmd), out))
}
}
pub fn kill(vid: &VmId) -> Result<(), Error> {
let mut cmd = Command::new(platform::get_cmd("VBoxManage"));
cmd.arg("controlvm");
cmd.arg(vid.to_string());
cmd.arg("poweroff");
let out = match cmd.output() {
Ok(out) => out,
Err(_) => {
return Err(Error::FailedToExecute(format!("{:?}", cmd)));
}
};
if out.status.success() {
Ok(())
} else {
Err(Error::CommandFailed(format!("{:?}", cmd), out))
}
}
pub fn reset(vid: &VmId) -> Result<(), Error> {
let mut cmd = Command::new(platform::get_cmd("VBoxManage"));
cmd.arg("controlvm");
cmd.arg(vid.to_string());
cmd.arg("reset");
let out = match cmd.output() {
Ok(out) => out,
Err(_) => {
let s = format!("{:?}", cmd);
return Err(Error::FailedToExecute(s));
}
};
if out.status.success() {
Ok(())
} else {
Err(Error::CommandFailed(format!("{:?}", cmd), out))
}
}