on main help sign in
feat: added provision error propagation
b5cd1f2robcholz
src/bin/vibebox.rs+8−2
@@ -120,9 +120,15 @@ fn main() -> Result<()> {
120 tracing::debug!(auto_shutdown_ms, "auto shutdown config");
120 tracing::debug!(auto_shutdown_ms, "auto shutdown config");
121 let manager_conn =
121 let manager_conn =
122 vm_manager::ensure_manager(&raw_args, auto_shutdown_ms, config_override.as_deref())
122 vm_manager::ensure_manager(&raw_args, auto_shutdown_ms, config_override.as_deref())
123+ .map_err(|err| {
124+ tracing::error!(error = %err, "failed to ensure vm manager");
123− .map_err(|err| color_eyre::eyre::eyre!(err.to_string()))?;
125+ color_eyre::eyre::eyre!(err.to_string())
126+ })?;
124
127
125− instance::run_with_ssh(manager_conn).map_err(|err| color_eyre::eyre::eyre!(err.to_string()))?;
128+ instance::run_with_ssh(manager_conn).map_err(|err| {
129+ tracing::error!(error = %err, "failed to ensure vm manager");
130+ color_eyre::eyre::eyre!(err.to_string())
131+ })?;
126
132
127 tracing::info!("See you again — keep vibecoding (no SEVs, only vibes) 😈");
133 tracing::info!("See you again — keep vibecoding (no SEVs, only vibes) 😈");
128
134
src/instance.rs+5
@@ -266,6 +266,11 @@ fn wait_for_vm_ipv4(
266 Ok(status) => {
266 Ok(status) => {
267 status_missing = false;
267 status_missing = false;
268 let status = status.trim().to_string();
268 let status = status.trim().to_string();
269+ if status.starts_with("error:") {
270+ let _ = fs::remove_file(&status_path);
271+ let message = status.trim_start_matches("error:").trim().to_string();
272+ return Err(message.into());
273+ }
269 if !status.is_empty() && last_status.as_deref() != Some(status.as_str()) {
274 if !status.is_empty() && last_status.as_deref() != Some(status.as_str()) {
270 tracing::info!("[background]: {}", status);
275 tracing::info!("[background]: {}", status);
271 last_status = Some(status);
276 last_status = Some(status);
src/vm_manager.rs+5
@@ -17,6 +17,7 @@ use std::{
17
17
18use crate::{
18use crate::{
19 config::CONFIG_PATH_ENV,
19 config::CONFIG_PATH_ENV,
20+ instance::STATUS_FILE_NAME,
20 instance::VM_ROOT_LOG_NAME,
21 instance::VM_ROOT_LOG_NAME,
21 instance::{
22 instance::{
22 DEFAULT_SSH_USER, InstanceConfig, build_ssh_login_actions, ensure_instance_dir,
23 DEFAULT_SSH_USER, InstanceConfig, build_ssh_login_actions, ensure_instance_dir,
@@ -765,6 +766,10 @@ fn run_manager_with(
765 );
766 );
766 tracing::info!("vm manager vm run completed");
767 tracing::info!("vm manager vm run completed");
767 let vm_err = vm_result.err().map(|e| e.to_string());
768 let vm_err = vm_result.err().map(|e| e.to_string());
769+ if let Some(err) = &vm_err {
770+ let status_path = instance_dir.join(STATUS_FILE_NAME);
771+ let _ = fs::write(&status_path, format!("error: {err}"));
772+ }
768 let _ = event_tx.send(ManagerEvent::VmExited(vm_err.clone()));
773 let _ = event_tx.send(ManagerEvent::VmExited(vm_err.clone()));
769 let event_loop_result: Result<(), String> = event_loop_handle
774 let event_loop_result: Result<(), String> = event_loop_handle
770 .join()
775 .join()