bootc_lib/bootc_composefs/
utils.rs1use crate::{
2 bootc_composefs::{
3 boot::{SYSTEMD_UKI_DIR, compute_boot_digest_uki},
4 state::update_boot_digest_in_origin,
5 },
6 store::Storage,
7};
8use anyhow::Result;
9use bootc_kernel_cmdline::utf8::Cmdline;
10use fn_error_context::context;
11
12fn get_uki(storage: &Storage, deployment_verity: &str) -> Result<Vec<u8>> {
13 let uki_dir = storage
14 .esp
15 .as_ref()
16 .ok_or_else(|| anyhow::anyhow!("ESP not mounted"))?
17 .fd
18 .open_dir(SYSTEMD_UKI_DIR)?;
19
20 let req_fname = format!("{deployment_verity}.efi");
21
22 for entry in uki_dir.entries_utf8()? {
23 let pe = entry?;
24
25 let filename = pe.file_name()?;
26
27 if filename != req_fname {
28 continue;
29 }
30
31 return Ok(uki_dir.read(filename)?);
32 }
33
34 anyhow::bail!("UKI for deployment {deployment_verity} not found")
35}
36
37#[context("Computing and storing boot digest for UKI")]
38pub(crate) fn compute_store_boot_digest_for_uki(
39 storage: &Storage,
40 deployment_verity: &str,
41) -> Result<String> {
42 let uki = get_uki(storage, deployment_verity)?;
43 let digest = compute_boot_digest_uki(&uki)?;
44
45 update_boot_digest_in_origin(storage, &deployment_verity, &digest)?;
46 return Ok(digest);
47}
48
49#[context("Getting UKI cmdline")]
50pub(crate) fn get_uki_cmdline(
51 storage: &Storage,
52 deployment_verity: &str,
53) -> Result<Cmdline<'static>> {
54 let uki = get_uki(storage, deployment_verity)?;
55 let cmdline = composefs_boot::uki::get_cmdline(&uki)?;
56
57 return Ok(Cmdline::from(cmdline.to_owned()));
58}