Skip to content

Commit b7c1da3

Browse files
committed
bootupctl: only print the available component when running status
in container Skip the component if the update meatadata is missing
1 parent 83293cf commit b7c1da3

File tree

3 files changed

+55
-19
lines changed

3 files changed

+55
-19
lines changed

src/bootupd.rs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,20 @@ pub(crate) fn get_components() -> Components {
212212
get_components_impl(false)
213213
}
214214

215+
/// Return available components
216+
#[context("Get available components")]
217+
pub(crate) fn get_available_components(sysroot: &openat::Dir) -> Result<Components> {
218+
let mut avail = BTreeMap::new();
219+
220+
for (name, component) in get_components_impl(false) {
221+
if crate::component::get_component_update(sysroot, component.as_ref())?.is_some() {
222+
avail.insert(name, component);
223+
}
224+
}
225+
226+
Ok(avail)
227+
}
228+
215229
pub(crate) fn generate_update_metadata(sysroot_path: &str) -> Result<()> {
216230
// create bootupd update dir which will save component metadata files for both components
217231
let updates_dir = Path::new(sysroot_path).join(crate::model::BOOTUPD_UPDATES_DIR);

src/cli/bootupctl.rs

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use crate::bootupd;
2-
use anyhow::Result;
2+
use anyhow::{Context, Result};
33
use clap::Parser;
44
use log::LevelFilter;
55

@@ -214,20 +214,23 @@ fn ensure_running_in_systemd() -> Result<()> {
214214

215215
/// If running in container, just print the available payloads
216216
fn run_status_in_container(json_format: bool) -> Result<()> {
217-
let all_components = crate::bootupd::get_components();
218-
if all_components.is_empty() {
219-
return Ok(());
220-
}
221-
let avail: Vec<_> = all_components.keys().cloned().collect();
217+
let sysroot = openat::Dir::open("/").context("opening sysroot directory /")?;
218+
219+
let avail: Vec<_> = crate::bootupd::get_available_components(&sysroot)?
220+
.into_keys()
221+
.collect();
222+
222223
if json_format {
223224
let stdout = std::io::stdout();
224225
let mut stdout = stdout.lock();
225-
let output: serde_json::Value = serde_json::json!({
226+
let output = serde_json::json!({
226227
"components": avail
227228
});
228229
serde_json::to_writer(&mut stdout, &output)?;
229230
} else {
230-
println!("Available components: {}", avail.join(" "));
231+
if !avail.is_empty() {
232+
println!("Available components: {}", avail.join(" "));
233+
}
231234
}
232235
Ok(())
233236
}

tests/tests/bootupctl-status-in-bootc.sh

Lines changed: 30 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,22 +7,41 @@ if [ ! -d "/sysroot/ostree/repo/" ]; then
77
exit 100
88
fi
99

10+
components_text_x86_64='Available components: BIOS EFI'
11+
components_json_x86_64='{"components":["BIOS","EFI"]}'
12+
13+
components_text_aarch64='Available components: EFI'
14+
components_json_aarch64='{"components":["EFI"]}'
15+
16+
none_components_json='{"components":[]}'
17+
1018
# check if running in container
1119
if [ "$container" ] || [ -f /run/.containerenv ] || [ -f /.dockerenv ]; then
1220
arch="$(uname --machine)"
13-
if [[ "${arch}" == "x86_64" ]]; then
14-
components_text='Available components: BIOS EFI'
15-
components_json='{"components":["BIOS","EFI"]}'
16-
else
17-
# Assume aarch64 for now
18-
components_text='Available components: EFI'
19-
components_json='{"components":["EFI"]}'
21+
output_text=$(bootupctl status | tr -d '\r')
22+
output_json=$(bootupctl status --json)
23+
24+
if [ "${arch}" == "x86_64" ]; then
25+
[ "${components_text_x86_64}" == "${output_text}" ]
26+
[ "${components_json_x86_64}" == "${output_json}" ]
27+
# test if BIOS.json is missing
28+
mv /usr/lib/bootupd/updates/BIOS.json{,-bak}
29+
output_text=$(bootupctl status | tr -d '\r')
30+
output_json=$(bootupctl status --json)
2031
fi
2132

22-
output=$(bootupctl status | tr -d '\r')
23-
[ "${components_text}" == "${output}" ]
24-
output=$(bootupctl status --json)
25-
[ "${components_json}" == "${output}" ]
33+
if [ "${arch}" == "x86_64" ] || [ "${arch}" == "aarch64" ]; then
34+
[ "${components_text_aarch64}" == "${output_text}" ]
35+
[ "${components_json_aarch64}" == "${output_json}" ]
36+
fi
37+
38+
# test if no components
39+
mv /usr/lib/bootupd/updates/EFI.json{,-bak}
40+
output_text=$(bootupctl status | tr -d '\r')
41+
output_json=$(bootupctl status --json)
42+
[ -z "${output_text}" ]
43+
[ "${none_components_json}" == "${output_json}" ]
44+
2645
else
2746
echo "Skip running as not in container"
2847
fi

0 commit comments

Comments
 (0)