Check for data folder on startup
Currently, when starting up for the first time (running standalone, outside of Docker), bitwarden_rs panics when the `openssl` tool isn't able to create `data/rsa_key.pem` due to the `data` dir not existing. Instead, print a more helpful error message telling the user to create the directory.
This commit is contained in:
parent
ebe334fcc7
commit
513056f711
|
@ -19,7 +19,7 @@ use crate::{
|
||||||
db::{backup_database, models::*, DbConn, DbConnType},
|
db::{backup_database, models::*, DbConn, DbConnType},
|
||||||
error::{Error, MapResult},
|
error::{Error, MapResult},
|
||||||
mail,
|
mail,
|
||||||
util::{format_naive_datetime_local, get_display_size},
|
util::{format_naive_datetime_local, get_display_size, is_running_in_docker},
|
||||||
CONFIG,
|
CONFIG,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -486,7 +486,7 @@ fn diagnostics(_token: AdminToken, _conn: DbConn) -> ApiResult<Html<String>> {
|
||||||
let web_vault_version: WebVaultVersion = serde_json::from_str(&vault_version_str)?;
|
let web_vault_version: WebVaultVersion = serde_json::from_str(&vault_version_str)?;
|
||||||
|
|
||||||
// Execute some environment checks
|
// Execute some environment checks
|
||||||
let running_within_docker = std::path::Path::new("/.dockerenv").exists() || std::path::Path::new("/run/.containerenv").exists();
|
let running_within_docker = is_running_in_docker();
|
||||||
let has_http_access = has_http_access();
|
let has_http_access = has_http_access();
|
||||||
let uses_proxy = env::var_os("HTTP_PROXY").is_some()
|
let uses_proxy = env::var_os("HTTP_PROXY").is_some()
|
||||||
|| env::var_os("http_proxy").is_some()
|
|| env::var_os("http_proxy").is_some()
|
||||||
|
|
25
src/main.rs
25
src/main.rs
|
@ -38,6 +38,7 @@ mod util;
|
||||||
|
|
||||||
pub use config::CONFIG;
|
pub use config::CONFIG;
|
||||||
pub use error::{Error, MapResult};
|
pub use error::{Error, MapResult};
|
||||||
|
pub use util::is_running_in_docker;
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
parse_args();
|
parse_args();
|
||||||
|
@ -52,6 +53,7 @@ fn main() {
|
||||||
_ => false,
|
_ => false,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
check_data_folder();
|
||||||
check_rsa_keys();
|
check_rsa_keys();
|
||||||
check_web_vault();
|
check_web_vault();
|
||||||
|
|
||||||
|
@ -215,9 +217,28 @@ fn chain_syslog(logger: fern::Dispatch) -> fern::Dispatch {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn create_dir(path: &str, description: &str) {
|
||||||
|
// Try to create the specified dir, if it doesn't already exist.
|
||||||
|
let err_msg = format!("Error creating {} directory '{}'", description, path);
|
||||||
|
create_dir_all(path).expect(&err_msg);
|
||||||
|
}
|
||||||
|
|
||||||
fn create_icon_cache_folder() {
|
fn create_icon_cache_folder() {
|
||||||
// Try to create the icon cache folder, and generate an error if it could not.
|
create_dir(&CONFIG.icon_cache_folder(), "icon cache");
|
||||||
create_dir_all(&CONFIG.icon_cache_folder()).expect("Error creating icon cache directory");
|
}
|
||||||
|
|
||||||
|
fn check_data_folder() {
|
||||||
|
let data_folder = &CONFIG.data_folder();
|
||||||
|
let path = Path::new(data_folder);
|
||||||
|
if !path.exists() {
|
||||||
|
error!("Data folder '{}' doesn't exist.", data_folder);
|
||||||
|
if is_running_in_docker() {
|
||||||
|
error!("Verify that your data volume is mounted at the correct location.");
|
||||||
|
} else {
|
||||||
|
error!("Create the data folder and try again.");
|
||||||
|
}
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn check_rsa_keys() {
|
fn check_rsa_keys() {
|
||||||
|
|
|
@ -358,6 +358,15 @@ pub fn format_naive_datetime_local(dt: &NaiveDateTime, fmt: &str) -> String {
|
||||||
format_datetime_local(&Local.from_utc_datetime(dt), fmt)
|
format_datetime_local(&Local.from_utc_datetime(dt), fmt)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Deployment environment methods
|
||||||
|
//
|
||||||
|
|
||||||
|
/// Returns true if the program is running in Docker or Podman.
|
||||||
|
pub fn is_running_in_docker() -> bool {
|
||||||
|
Path::new("/.dockerenv").exists() || Path::new("/run/.containerenv").exists()
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Deserialization methods
|
// Deserialization methods
|
||||||
//
|
//
|
||||||
|
|
Loading…
Reference in New Issue