Skip to content

Commit d1918cd

Browse files
committed
Copy unmanaged BLS entries to staging dir on upgrade
1 parent 1805136 commit d1918cd

1 file changed

Lines changed: 65 additions & 0 deletions

File tree

crates/lib/src/bootc_composefs/backwards_compat/bcompat_boot.rs

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ use crate::{
1515
composefs_consts::{
1616
ORIGIN_KEY_BOOT, ORIGIN_KEY_BOOT_TYPE, STATE_DIR_RELATIVE, TYPE1_BOOT_DIR_PREFIX,
1717
TYPE1_ENT_PATH_STAGED, UKI_NAME_PREFIX, USER_CFG_STAGED,
18+
TYPE1_ENT_PATH, BLS_ENTRY_PREFIX,
1819
},
1920
parsers::bls_config::{BLSConfig, BLSConfigType, EFIKey},
2021
spec::BootloaderKind,
@@ -244,6 +245,15 @@ fn create_staged_bls_entries(boot_dir: &Dir, entries: &Vec<(String, BLSConfig)>)
244245
staged_entries.atomic_write(filename, new_entry.to_string().as_bytes())?;
245246
}
246247

248+
let original_entries = boot_dir.open_dir(TYPE1_ENT_PATH)?;
249+
for entry in original_entries.entries_utf8()? {
250+
let entry = entry?;
251+
let entry_name = entry.file_name()?;
252+
if entry.file_type()?.is_file() && !entry_name.starts_with(BLS_ENTRY_PREFIX) {
253+
original_entries.copy(entry_name.clone(), &staged_entries, entry_name).context("Staging non-managed BLS entry")?;
254+
}
255+
}
256+
247257
fsync(staged_entries.reopen_as_ownedfd()?).context("fsync")
248258
}
249259

@@ -396,3 +406,58 @@ pub(crate) async fn prepend_custom_prefix(
396406

397407
Ok(())
398408
}
409+
410+
#[cfg(test)]
411+
mod tests {
412+
use anyhow::Result;
413+
use cap_std_ext::{cap_std, dirext::CapStdExtDirExt};
414+
use crate::bootc_composefs::backwards_compat::bcompat_boot::*;
415+
use crate::parsers::bls_config::parse_bls_config;
416+
417+
#[test]
418+
fn test_create_staged_bls_entries() -> Result<()> {
419+
let tempdir = cap_std_ext::cap_tempfile::tempdir(cap_std::ambient_authority())?;
420+
421+
let entry1 = r#"
422+
title Fedora 42.20250623.3.1 (CoreOS)
423+
version fedora-42.0
424+
sort-key 1
425+
linux /boot/7e11ac46e3e022053e7226a20104ac656bf72d1a84e3a398b7cce70e9df188b6/vmlinuz-5.14.10
426+
initrd /boot/7e11ac46e3e022053e7226a20104ac656bf72d1a84e3a398b7cce70e9df188b6/initramfs-5.14.10.img
427+
options root=UUID=abc123 rw composefs=7e11ac46e3e022053e7226a20104ac656bf72d1a84e3a398b7cce70e9df188b6
428+
"#;
429+
let entry2 = r#"
430+
title Fedora 41.20250214.2.0 (CoreOS)
431+
version fedora-42.0
432+
sort-key 2
433+
efi /EFI/Linux/f7415d75017a12a387a39d2281e033a288fc15775108250ef70a01dcadb93346.efi
434+
options root=UUID=abc123 rw composefs=febdf62805de2ae7b6b597f2a9775d9c8a753ba1e5f09298fc8fbe0b0d13bf01
435+
"#;
436+
let entry3 = r#"
437+
title Test
438+
version 1
439+
sort-key 9
440+
efi /EFI/boot/test.efi
441+
"#;
442+
443+
tempdir.create_dir_all("loader/entries")?;
444+
tempdir.atomic_write("loader/entries/bootc_entry1.conf", entry1)?;
445+
tempdir.atomic_write("loader/entries/bootc_entry2.conf", entry2)?;
446+
tempdir.atomic_write("loader/entries/entry3.conf", entry3)?;
447+
448+
let entries = vec![
449+
("bootc_entry1.conf".to_string(), parse_bls_config(entry1).unwrap()),
450+
("bootc_entry2.conf".to_string(), parse_bls_config(entry2).unwrap()),
451+
];
452+
453+
create_staged_bls_entries(&tempdir, &entries).unwrap();
454+
455+
assert!(tempdir.exists("loader/entries.staged/bootc_entry1.conf"));
456+
assert!(tempdir.exists("loader/entries.staged/bootc_entry2.conf"));
457+
assert!(tempdir.exists("loader/entries.staged/entry3.conf"));
458+
459+
assert_eq!(str::from_utf8(&tempdir.read("loader/entries.staged/entry3.conf")?[..])?, entry3);
460+
461+
Ok(())
462+
}
463+
}

0 commit comments

Comments
 (0)