Prepare, configure, and manage Firecracker microVMs in seconds!
virtualization linux microvm firecracker

feat: add credential validation for sudo and improve Firecracker startup timeout handling

+27 -1
+13
crates/firecracker-process/src/command.rs
··· 58 command 59 )); 60 } 61 let mut c = Command::new("sudo"); 62 c.arg(command); 63
··· 58 command 59 )); 60 } 61 + 62 + let status = Command::new("sudo") 63 + .arg("-v") 64 + .stdin(Stdio::inherit()) 65 + .stdout(Stdio::inherit()) 66 + .stderr(Stdio::inherit()) 67 + .status() 68 + .context("failed to run 'sudo -v' for credential validation")?; 69 + 70 + if !status.success() { 71 + return Err(anyhow!("'sudo -v' failed (wrong password or sudo policy)")); 72 + } 73 + 74 let mut c = Command::new("sudo"); 75 c.arg(command); 76
+14 -1
crates/firecracker-process/src/lib.rs
··· 1 - use std::process; 2 3 use anyhow::Result; 4 use firecracker_state::repo; ··· 19 stop(Some(name)).await?; 20 println!("[+] Starting Firecracker..."); 21 let pid = run_command_in_background("firecracker", &["--api-sock", &config.api_socket], true)?; 22 Ok(pid) 23 } 24
··· 1 + use std::{process, thread}; 2 3 use anyhow::Result; 4 use firecracker_state::repo; ··· 19 stop(Some(name)).await?; 20 println!("[+] Starting Firecracker..."); 21 let pid = run_command_in_background("firecracker", &["--api-sock", &config.api_socket], true)?; 22 + 23 + let mut attempts = 0; 24 + while !std::path::Path::new(&config.api_socket).exists() { 25 + if attempts >= 100 { 26 + println!( 27 + "[!] Timed out waiting for Firecracker to start. Please check the logs." 28 + ); 29 + process::exit(1); 30 + } 31 + attempts += 1; 32 + thread::sleep(std::time::Duration::from_millis(500)); 33 + } 34 + 35 Ok(pid) 36 } 37