Skip to content

Commit e522c64

Browse files
authored
Merge pull request #136 from cgwalters/clear-error-install-no-container
install: Give better error if not run in a podman container
2 parents 70d0e7e + a78c9f9 commit e522c64

File tree

2 files changed

+16
-9
lines changed

2 files changed

+16
-9
lines changed

lib/src/containerenv.rs

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
//! Helpers for parsing the `/run/.containerenv` file generated by podman.
22
3-
use std::fs::File;
43
use std::io::{BufRead, BufReader};
54

6-
use anyhow::{Context, Result};
5+
use anyhow::Result;
6+
use cap_std_ext::cap_std::fs::Dir;
7+
use cap_std_ext::prelude::CapStdExtDirExt;
78
use fn_error_context::context;
89

9-
const PATH: &str = "/run/.containerenv";
10+
const PATH: &str = "run/.containerenv";
1011

1112
#[derive(Debug, Default)]
1213
pub(crate) struct ContainerExecutionInfo {
@@ -18,11 +19,14 @@ pub(crate) struct ContainerExecutionInfo {
1819
}
1920

2021
/// Load and parse the `/run/.containerenv` file.
21-
#[context("Parsing {PATH}")]
22-
pub(crate) fn get_container_execution_info() -> Result<ContainerExecutionInfo> {
23-
let f = File::open(PATH)
24-
.with_context(|| format!("Opening {PATH}"))
25-
.map(BufReader::new)?;
22+
#[context("Querying container")]
23+
pub(crate) fn get_container_execution_info(rootfs: &Dir) -> Result<ContainerExecutionInfo> {
24+
let f = match rootfs.open_optional(PATH)? {
25+
Some(f) => BufReader::new(f),
26+
None => {
27+
anyhow::bail!("This command must be executed inside a podman container (missing {PATH}")
28+
}
29+
};
2630
let mut r = ContainerExecutionInfo::default();
2731
for line in f.lines() {
2832
let line = line?;

lib/src/install.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -780,8 +780,11 @@ async fn prepare_install(
780780
crate::cli::require_root()?;
781781
require_systemd_pid1()?;
782782

783+
let rootfs = cap_std::fs::Dir::open_ambient_dir("/", cap_std::ambient_authority())
784+
.context("Opening /")?;
785+
783786
// This command currently *must* be run inside a privileged container.
784-
let container_info = crate::containerenv::get_container_execution_info()?;
787+
let container_info = crate::containerenv::get_container_execution_info(&rootfs)?;
785788
let source = SourceInfo::from_container(&container_info)?;
786789

787790
ensure_var()?;

0 commit comments

Comments
 (0)