working version 1
This commit is contained in:
@@ -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<String> = 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<String> = 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: {}",
|
||||
|
Reference in New Issue
Block a user