bootc_lib/bootc_composefs/
utils.rs1use 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}