diff --git a/src/bios.rs b/src/bios.rs index b4eaca5d..f97258f9 100644 --- a/src/bios.rs +++ b/src/bios.rs @@ -127,16 +127,17 @@ impl Component for Bios { }) } - fn generate_update_metadata(&self, sysroot_path: &str) -> Result { + fn generate_update_metadata(&self, sysroot_path: &str) -> Result> { let grub_install = Path::new(sysroot_path).join(GRUB_BIN); if !grub_install.exists() { - bail!("Failed to find {:?}", grub_install); + println!("Failed to find {:?}", grub_install); + return Ok(None); } // Query the rpm database and list the package and build times for /usr/sbin/grub2-install let meta = packagesystem::query_files(sysroot_path, [&grub_install])?; write_update_metadata(sysroot_path, self, &meta)?; - Ok(meta) + Ok(Some(meta)) } fn query_adopt(&self, devices: &Option>) -> Result> { diff --git a/src/bootupd.rs b/src/bootupd.rs index 4dc10c3e..34516ddf 100644 --- a/src/bootupd.rs +++ b/src/bootupd.rs @@ -93,6 +93,15 @@ pub(crate) fn install( continue; } + // skip components that don't have an update metadata + if component.query_update(&source_root_dir)?.is_none() { + println!( + "Skip installing component {} without update metadata", + component.name() + ); + continue; + } + let meta = component .install(&source_root, dest_root, device, update_firmware) .with_context(|| format!("installing component {}", component.name()))?; @@ -199,12 +208,18 @@ pub(crate) fn generate_update_metadata(sysroot_path: &str) -> Result<()> { std::fs::create_dir_all(&updates_dir) .with_context(|| format!("Failed to create updates dir {:?}", &updates_dir))?; for component in get_components().values() { - let v = component.generate_update_metadata(sysroot_path)?; - println!( - "Generated update layout for {}: {}", - component.name(), - v.version, - ); + if let Some(v) = component.generate_update_metadata(sysroot_path)? { + println!( + "Generated update layout for {}: {}", + component.name(), + v.version, + ); + } else { + println!( + "Generating update layout for {} was not possible, skipping.", + component.name(), + ); + } } Ok(()) diff --git a/src/component.rs b/src/component.rs index 8c3ec3cb..5e611590 100644 --- a/src/component.rs +++ b/src/component.rs @@ -62,7 +62,7 @@ pub(crate) trait Component { /// this is an `rpm-ostree compose tree` for example. For a dual-partition /// style updater, this would be run as part of a postprocessing step /// while the filesystem for the partition is mounted. - fn generate_update_metadata(&self, sysroot: &str) -> Result; + fn generate_update_metadata(&self, sysroot: &str) -> Result>; /// Used on the client to query for an update cached in the current booted OS. fn query_update(&self, sysroot: &openat::Dir) -> Result>; diff --git a/src/efi.rs b/src/efi.rs index 25d6ccd7..bc0fcc9c 100644 --- a/src/efi.rs +++ b/src/efi.rs @@ -460,7 +460,7 @@ impl Component for Efi { }) } - fn generate_update_metadata(&self, sysroot: &str) -> Result { + fn generate_update_metadata(&self, sysroot: &str) -> Result> { let sysroot_path = Utf8Path::new(sysroot); // copy EFI files to updates dir from usr/lib/efi @@ -533,7 +533,7 @@ impl Component for Efi { }; write_update_metadata(sysroot, self, &meta)?; - Ok(meta) + Ok(Some(meta)) } fn query_update(&self, sysroot: &openat::Dir) -> Result> {