use crate::core::tools::process_running::linux::is_process_running;
use colored::Colorize;
use regex::Regex;
use std::fs::{read_dir, read_link};
use std::path::Path;
#[derive(Debug)]
pub enum BedrockErrors {
NotOnBedrock,
NoStratas,
ReadError,
RegexError,
}
impl std::fmt::Display for BedrockErrors {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
let error_msg = match self {
BedrockErrors::NotOnBedrock => "Not on Bedrock",
BedrockErrors::NoStratas => "No stratas could be found",
BedrockErrors::ReadError => "Failed to read file",
BedrockErrors::RegexError => "Regex has failed",
};
write!(f, "{}: {:?}", "BedrockErr".bold().red(), error_msg)
}
}
impl std::error::Error for BedrockErrors {}
pub fn check_bedrock() -> bool {
Path::new("/bedrock").exists() && is_process_running("etcfs") && is_process_running("crossfs")
}
pub fn list_strata() -> Result<usize, BedrockErrors> {
if !check_bedrock() {
return Err(BedrockErrors::NotOnBedrock);
}
let bedrock_strata_folder = "/bedrock/strata";
if let Ok(strata_count) = read_dir(bedrock_strata_folder) {
Ok(strata_count.count() - 3)
} else {
Err(BedrockErrors::NoStratas)
}
}
pub fn running_in_strat() -> Result<bool, BedrockErrors> {
if !check_bedrock() {
return Err(BedrockErrors::NotOnBedrock);
}
let path = std::env::var("PATH");
match path {
Ok(path) => {
if !path.contains("/bedrock/cross/bin") {
return Ok(true);
}
}
Err(_) => return Err(BedrockErrors::ReadError),
}
Ok(false)
}
pub fn detect_pmm_interface() -> Result<String, BedrockErrors> {
if !check_bedrock() {
return Err(BedrockErrors::NotOnBedrock);
}
let bedrock_conf = "/bedrock/etc/bedrock.conf";
let content = std::fs::read_to_string(bedrock_conf).map_err(|_| BedrockErrors::ReadError)?;
let re = Regex::new(r#"(?m)^user-interface = (?:(?:"(.*?)")|(?:(.*)))$"#)
.map_err(|_| BedrockErrors::RegexError)?;
let captures = re.captures(&content).ok_or(BedrockErrors::RegexError)?;
captures
.get(2)
.or(captures.get(1))
.map(|m| m.as_str().to_string())
.ok_or(BedrockErrors::ReadError)
}
pub fn detect_stratum_init() -> Result<String, BedrockErrors> {
if !check_bedrock() {
return Err(BedrockErrors::NotOnBedrock);
}
let init_stratum_path =
read_link(Path::new("/bedrock/run/init-alias")).map_err(|_| BedrockErrors::ReadError)?;
let init_stratum = init_stratum_path
.to_string_lossy()
.to_string()
.replace("/bedrock/strata/", "");
Ok(init_stratum)
}