bootc_lib/bootc_composefs/
utils.rs

1use 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}