Add details to read file errors (#1475)

If the files configured in `api_token_file` or `rpc_secret_file` are not found, garage exits with no details (at least not enough) of what went wrong:

    2026-06-14T23:40:34.517429Z  INFO garage::server: Loading configuration from tmp/config1.toml...
    Error: IO error: No such file or directory (os error 2)

This add the kind of file and the file path being read, to the returned error message:

    2026-06-14T23:41:41.136213Z  INFO garage::server: Loading configuration from tmp/config1.toml...
    Error: Failed to read secret file /run/secrets/rpc_secret: No such file or directory (os error 2)

Reviewed-on: https://git.deuxfleurs.fr/Deuxfleurs/garage/pulls/1475
Reviewed-by: Alex <lx@deuxfleurs.fr>
This commit is contained in:
jo
2026-06-17 13:53:43 +00:00
committed by Alex
parent a379406522
commit 1d1456f1d6
2 changed files with 13 additions and 3 deletions
+6 -2
View File
@@ -137,14 +137,18 @@ fn read_secret_file(file_path: &PathBuf, allow_world_readable: bool) -> Result<S
#[cfg(unix)]
{
use std::os::unix::fs::MetadataExt;
let metadata = std::fs::metadata(file_path)?;
let metadata = std::fs::metadata(file_path).map_err(|e| {
format!("Failed to read secret file {}: {}", file_path.display(), e)
})?;
if metadata.mode() & 0o077 != 0 {
return Err(format!("File {} is world-readable! (mode: 0{:o}, expected 0600)\nRefusing to start until this is fixed, or environment variable GARAGE_ALLOW_WORLD_READABLE_SECRETS is set to true.", file_path.display(), metadata.mode()).into());
}
}
}
let secret_buf = std::fs::read_to_string(file_path)?;
let secret_buf = std::fs::read_to_string(file_path)
.map_err(|e| format!("Failed to read secret file {}: {}", file_path.display(), e))?;
// trim_end: allows for use case such as `echo "$(openssl rand -hex 32)" > somefile`.
// also editors sometimes add a trailing newline
+7 -1
View File
@@ -282,7 +282,13 @@ pub fn default_block_max_concurrent_writes_per_request() -> usize {
}
/// Read and parse configuration
pub fn read_config(config_file: PathBuf) -> Result<Config, Error> {
let config = std::fs::read_to_string(config_file)?;
let config = std::fs::read_to_string(&config_file).map_err(|e| {
format!(
"Failed to read config file {}: {}",
config_file.display(),
e
)
})?;
Ok(toml::from_str(&config)?)
}