bootc_lib/bootc_composefs/
utils.rs

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