pub mod log_parser;
pub mod models;
pub mod rules;
pub mod scanner;
pub mod scripts;
pub mod stage;
use models::{DataSource, SecureBootAnalysisResult, SecureBootScanState};
pub fn analyze(path: Option<&str>) -> Result<SecureBootAnalysisResult, crate::error::AppError> {
if let Some(log_path) = path {
let content = std::fs::read_to_string(log_path).map_err(crate::error::AppError::Io)?;
let (sessions, timeline) = log_parser::parse_log(&content);
let stage = stage::determine_stage_from_log(&sessions);
let scan_state = SecureBootScanState::default();
let diagnostics = rules::evaluate_all(&scan_state, stage, &sessions);
Ok(SecureBootAnalysisResult {
stage,
data_source: DataSource::LogImport,
scan_state,
sessions,
timeline,
diagnostics,
script_result: None,
})
} else {
let scan_state = scanner::scan_device()?;
let auto_log_path = {
#[cfg(target_os = "windows")]
{
std::env::var("ProgramData").ok().map(|pd| {
std::path::Path::new(&pd)
.join(r"Microsoft\IntuneManagementExtension\Logs\SecureBootCertificateUpdate.log")
.to_string_lossy()
.into_owned()
})
}
#[cfg(not(target_os = "windows"))]
{
None::<String>
}
};
let (sessions, timeline, data_source) = if let Some(ref lp) = auto_log_path {
if let Ok(content) = std::fs::read_to_string(lp) {
let (s, t) = log_parser::parse_log(&content);
(s, t, DataSource::Both)
} else {
(vec![], vec![], DataSource::LiveScan)
}
} else {
(vec![], vec![], DataSource::LiveScan)
};
let stage = stage::determine_stage(&scan_state);
let diagnostics = rules::evaluate_all(&scan_state, stage, &sessions);
Ok(SecureBootAnalysisResult {
stage,
data_source,
scan_state,
sessions,
timeline,
diagnostics,
script_result: None,
})
}
}