fix: Improve EFI component error handling for non-OSTree systems
Some checks failed
Build deb-bootupd Artifacts / build (push) Failing after 8m52s

- Fix EFI component Drop implementation to only unmount when mountpoint exists
- Prevent 'No such file or directory' errors during EFI component cleanup
- Add graceful error handling in generate_update_metadata for component failures
- Allow metadata generation to continue even when some components fail
- Provide clear warning messages for failed components
- Maintain system stability during EFI component operations
This commit is contained in:
Joe 2025-08-28 12:48:01 -07:00
parent dc5a2ab86d
commit e054db031b
2 changed files with 42 additions and 11 deletions

View file

@ -217,15 +217,39 @@ pub(crate) fn generate_update_metadata(sysroot_path: &str) -> Result<()> {
let updates_dir = Path::new(sysroot_path).join(crate::model::BOOTUPD_UPDATES_DIR);
std::fs::create_dir_all(&updates_dir)
.with_context(|| format!("Failed to create updates dir {:?}", &updates_dir))?;
let mut successful_components = 0;
let mut failed_components = Vec::new();
for component in get_components().values() {
let v = component.generate_update_metadata(sysroot_path)?;
println!(
"Generated update layout for {}: {}",
component.name(),
v.version,
);
match component.generate_update_metadata(sysroot_path) {
Ok(v) => {
println!(
"Generated update layout for {}: {}",
component.name(),
v.version,
);
successful_components += 1;
}
Err(e) => {
let error_msg = format!("{}: {}", component.name(), e);
println!("Warning: Failed to generate metadata for {}: {}", component.name(), e);
failed_components.push(error_msg);
}
}
}
// If no components succeeded, return an error
if successful_components == 0 {
anyhow::bail!("Failed to generate metadata for any components: {}", failed_components.join("; "));
}
// If some components failed, log a warning but continue
if !failed_components.is_empty() {
println!("Note: {} component(s) failed, but {} component(s) succeeded",
failed_components.len(), successful_components);
}
Ok(())
}

View file

@ -467,7 +467,7 @@ impl Component for Efi {
// move EFI files to updates dir from /usr/lib/ostree-boot
if ostreebootdir.exists() {
let grub_dir_name = debian_tools::get_grub_dir_name();
let cruft = ["loader", grub_dir_name];
let cruft = ["loader", grub_dir_name];
for p in cruft.iter() {
let p = ostreebootdir.join(p);
if p.exists() {
@ -495,7 +495,9 @@ impl Component for Efi {
});
packagesystem::query_files(sysroot, files)?
} else {
anyhow::bail!("Failed to find {ostreebootdir}");
// On non-OSTree systems (like regular Debian), we can't generate EFI metadata
// Return a special error that indicates this component should be skipped
anyhow::bail!("EFI component not available on non-OSTree system: {ostreebootdir} not found");
}
};
@ -570,8 +572,13 @@ impl Component for Efi {
impl Drop for Efi {
fn drop(&mut self) {
log::debug!("Unmounting");
let _ = self.unmount();
// Only try to unmount if we actually have a mountpoint
if self.mountpoint.borrow().is_some() {
log::debug!("Unmounting");
let _ = self.unmount();
} else {
log::debug!("No mountpoint to unmount");
}
}
}