Prepare, configure, and manage Firecracker microVMs in seconds!
virtualization
linux
microvm
firecracker
1use crate::{command::run_command, config::get_config_dir};
2use anyhow::Error;
3use firecracker_state::repo;
4use glob::glob;
5use sqlx::{Pool, Sqlite};
6
7pub async fn ssh(pool: Pool<Sqlite>, name: Option<String>) -> Result<(), Error> {
8 let guest_ip = match name {
9 Some(name) => format!("{}.firecracker", name),
10 None => {
11 let current_dir = std::env::current_dir()
12 .map_err(|e| Error::msg(format!("Failed to get current directory: {}", e)))?
13 .display()
14 .to_string();
15 let vm = repo::virtual_machine::find_by_project_dir(&pool, ¤t_dir).await?;
16 match vm {
17 Some(vm) => format!("{}.firecracker", vm.name),
18 None => {
19 return Err(Error::msg(
20 "No virtual machine found with the given name or project directory.",
21 ))
22 }
23 }
24 }
25 };
26 let app_dir = get_config_dir()?;
27 let private_key = glob(format!("{}/id_rsa", app_dir).as_str())
28 .map_err(|e| Error::msg(format!("Failed to find SSH key: {}", e)))?
29 .last()
30 .ok_or_else(|| Error::msg("No SSH key file found"))?;
31 run_command(
32 "ssh",
33 &[
34 "-i",
35 &private_key?.display().to_string(),
36 "-o",
37 "StrictHostKeyChecking=no",
38 "-o",
39 "UserKnownHostsFile=/dev/null",
40 &format!("root@{}", guest_ip),
41 ],
42 true,
43 )?;
44 Ok(())
45}