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"),