Prepare, configure, and manage Firecracker microVMs in seconds!
virtualization linux microvm firecracker
at main 45 lines 1.5 kB view raw
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, &current_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}