From 773db2238d18540db859a274cbdc4fc0a5ed98fb Mon Sep 17 00:00:00 2001 From: Maxime Van Hees Date: Tue, 26 Aug 2025 17:46:42 +0200 Subject: [PATCH] working version 1 --- packages/system/virt/src/image_prep/mod.rs | 36 ++++++++++++++++++---- 1 file changed, 30 insertions(+), 6 deletions(-) diff --git a/packages/system/virt/src/image_prep/mod.rs b/packages/system/virt/src/image_prep/mod.rs index c9a4ee1..66b5c0d 100644 --- a/packages/system/virt/src/image_prep/mod.rs +++ b/packages/system/virt/src/image_prep/mod.rs @@ -204,7 +204,7 @@ if [ -z \"$NBD\" ]; then exit 1 fi -echo \"Selected NBD: $NBD\" +echo \"Selected NBD: $NBD\" >&2 # Settle and probe partitions udevadm settle >/dev/null 2>&1 || true @@ -234,7 +234,7 @@ else exit 33 fi -echo \"ROOT_DEV=$ROOT_DEV BOOT_DEV=$BOOT_DEV\" +echo \"ROOT_DEV=$ROOT_DEV BOOT_DEV=$BOOT_DEV\" >&2 if [ ! -b \"$ROOT_DEV\" ]; then echo \"Root partition not found: $ROOT_DEV\" >&2 @@ -357,8 +357,10 @@ fi rm -f \"$RAW\" qemu-img convert -U -f qcow2 -O raw \"$WORK\" \"$RAW\" -# Output result triple -echo \"$RAW|$ROOT_UUID|$BOOT_UUID\" +# Output result triple ONLY on stdout, then prevent any further trap output +echo \"RESULT:$RAW|$ROOT_UUID|$BOOT_UUID\" +trap - EXIT +exit 0 ", src = shell_escape(&src), vm_dir = shell_escape(&vm_dir), @@ -374,8 +376,30 @@ echo \"$RAW|$ROOT_UUID|$BOOT_UUID\" ); let res = run_script(&script)?; - let line = res.stdout.trim().lines().last().unwrap_or("").trim().to_string(); - let parts: Vec<_> = line.split('|').map(|s| s.to_string()).collect(); + // Prefer a RESULT:-prefixed line (robust against extra stdout noise) + let mut marker: Option = None; + for l in res.stdout.lines().rev() { + let lt = l.trim(); + if let Some(rest) = lt.strip_prefix("RESULT:") { + marker = Some(rest.trim().to_string()); + break; + } + } + // Fallback: last line that looks like A|B|C + let line = if let Some(x) = marker { + x + } else { + let mut cand: Option = None; + for l in res.stdout.lines().rev() { + let lt = l.trim(); + if lt.split('|').count() == 3 { + cand = Some(lt.to_string()); + break; + } + } + cand.ok_or_else(|| fail("no RAW|ROOT_UUID|BOOT_UUID line found in script output"))? + }; + let parts: Vec<_> = line.split('|').map(|s| s.trim().to_string()).collect(); if parts.len() != 3 { return Err(fail(&format!( "unexpected output from image_prepare script, expected RAW|ROOT_UUID|BOOT_UUID, got: {}",