diff --git a/boot_diags/src/app.rs b/boot_diags/src/app.rs index 5d75a15..3d3ecbd 100644 --- a/boot_diags/src/app.rs +++ b/boot_diags/src/app.rs @@ -14,7 +14,7 @@ // along with Deja-Vu. If not, see . // use core::{ - action::Action, + action::{Action, DiagResult}, components::{ Component, footer::Footer, @@ -470,6 +470,10 @@ impl App { } _ => (), } + self.action_tx.send(Action::DiagLineUpdate { + result: current_group.get_pass_fail_warn(), + text: current_group.result.clone(), + })?; } } return Ok(()); @@ -850,7 +854,7 @@ fn build_left_items(app: &App) -> Action { .iter() .map(|group| { let label = group.diag_type.to_string(); - let status = if group.passed { + let status = if group.get_pass_fail_warn() == DiagResult::Pass { "" // Leave blank if OK } else { " -- Issue(s) detected" diff --git a/boot_diags/src/diags.rs b/boot_diags/src/diags.rs index 8f169fc..a63abb3 100644 --- a/boot_diags/src/diags.rs +++ b/boot_diags/src/diags.rs @@ -13,7 +13,7 @@ // You should have received a copy of the GNU General Public License // along with Deja-Vu. If not, see . -use core::{line::DVLine, tasks::TaskResult}; +use core::{action::DiagResult, line::DVLine, tasks::TaskResult}; use std::{fmt, sync::OnceLock, thread::sleep, time::Duration}; use ratatui::style::Color; @@ -93,7 +93,7 @@ pub struct Log { #[derive(Clone, Debug)] pub struct DiagGroup { pub diag_type: Type, - pub passed: bool, + pub passed: Vec, pub logs: Vec, pub result: String, } @@ -102,7 +102,7 @@ impl DiagGroup { pub fn new(diag_type: Type) -> Self { DiagGroup { diag_type, - passed: true, + passed: Vec::new(), logs: Vec::new(), result: String::new(), } @@ -124,6 +124,18 @@ impl DiagGroup { .for_each(|log| summaries.extend(log.summary.clone().into_iter())); summaries } + + pub fn get_pass_fail_warn(&self) -> DiagResult { + let all_passed = self.passed.iter().fold(true, |acc, result| acc && *result); + let all_failed = self.passed.iter().fold(true, |acc, result| acc && !*result); + if all_passed { + DiagResult::Pass + } else if all_failed { + DiagResult::Fail + } else { + DiagResult::Warn + } + } } pub fn get_diag_type(label: &str) -> Type { @@ -151,7 +163,7 @@ pub fn parse_bitlocker(diag_group: &mut DiagGroup, task_result: TaskResult) { let re_bitlocker_off = REGEXES.bitlocker_off(); match task_result { TaskResult::Error(err) => { - diag_group.passed = false; + diag_group.passed.push(false); diag_group.result = String::from("Error"); diag_group.logs.push(Log { label: String::from("Bitlocker"), @@ -172,7 +184,7 @@ pub fn parse_bitlocker(diag_group: &mut DiagGroup, task_result: TaskResult) { let set_result_text = !output_text.contains("All Key Protectors"); if re_bitlocker_off.is_match(&output_text) { - diag_group.passed &= true; + diag_group.passed.push(true); result = String::from("OK"); diag_group.logs.push(Log { label: String::from("Bitlocker"), @@ -183,7 +195,7 @@ pub fn parse_bitlocker(diag_group: &mut DiagGroup, task_result: TaskResult) { raw: output_text, }); } else if re_bitlocker_locked.is_match(&output_text) { - diag_group.passed = false; + diag_group.passed.push(false); result = String::from("Locked"); diag_group.logs.push(Log { label: String::from("Bitlocker"), @@ -194,7 +206,7 @@ pub fn parse_bitlocker(diag_group: &mut DiagGroup, task_result: TaskResult) { raw: output_text, }); } else { - diag_group.passed &= true; + diag_group.passed.push(true); result = String::from("Unknown"); diag_group.logs.push(Log { label: String::from("Bitlocker"), @@ -216,7 +228,7 @@ pub fn parse_chkdsk(diag_group: &mut DiagGroup, task_result: TaskResult) { } match task_result { TaskResult::Error(err) => { - diag_group.passed = false; + diag_group.passed.push(false); diag_group.result = String::from("Error"); diag_group.logs.push(Log { label: String::from("CHKDSK"), @@ -241,7 +253,7 @@ pub fn parse_chkdsk(diag_group: &mut DiagGroup, task_result: TaskResult) { if parsed_output.contains("Windows has scanned the file system and found no problems.") { - diag_group.passed &= true; + diag_group.passed.push(true); diag_group.result = String::from("OK"); diag_group.logs.push(Log { label: String::from("CHKDSK"), @@ -252,7 +264,7 @@ pub fn parse_chkdsk(diag_group: &mut DiagGroup, task_result: TaskResult) { raw: parsed_output, }); } else { - diag_group.passed = false; + diag_group.passed.push(false); diag_group.result = String::from("Error"); diag_group.logs.push(Log { label: String::from("CHKDSK"), @@ -274,7 +286,7 @@ pub fn parse_dism(diag_group: &mut DiagGroup, task_result: TaskResult) { } match task_result { TaskResult::Error(err) => { - diag_group.passed = false; + diag_group.passed.push(false); diag_group.result = String::from("Error"); diag_group.logs.push(Log { label: String::from("DISM"), @@ -293,7 +305,7 @@ pub fn parse_dism(diag_group: &mut DiagGroup, task_result: TaskResult) { }; if output_text.contains("no component store corruption detected") { - diag_group.passed &= true; + diag_group.passed.push(true); diag_group.result = String::from("OK"); diag_group.logs.push(Log { label: String::from("DISM"), @@ -304,7 +316,7 @@ pub fn parse_dism(diag_group: &mut DiagGroup, task_result: TaskResult) { raw: output_text, }); } else { - diag_group.passed = false; + diag_group.passed.push(false); diag_group.result = String::from("Unknown"); diag_group.logs.push(Log { label: String::from("DISM"), @@ -326,7 +338,7 @@ pub fn parse_system_files(diag_group: &mut DiagGroup, task_result: TaskResult) { } match task_result { TaskResult::Error(err) => { - diag_group.passed = false; + diag_group.passed.push(false); diag_group.result = String::from("Error"); diag_group.logs.push(Log { label: String::from("System Files"), @@ -345,7 +357,7 @@ pub fn parse_system_files(diag_group: &mut DiagGroup, task_result: TaskResult) { }; if passed { - diag_group.passed &= true; + diag_group.passed.push(true); diag_group.result = String::from("OK"); diag_group.logs.push(Log { label: String::from("System Files"), @@ -356,7 +368,7 @@ pub fn parse_system_files(diag_group: &mut DiagGroup, task_result: TaskResult) { raw: output_text, }); } else { - diag_group.passed = false; + diag_group.passed.push(false); diag_group.result = String::from("Error"); diag_group.logs.push(Log { label: String::from("System Files"),