diff --git a/boot_diags/src/app.rs b/boot_diags/src/app.rs index c34d06f..5d75a15 100644 --- a/boot_diags/src/app.rs +++ b/boot_diags/src/app.rs @@ -54,7 +54,10 @@ use ratatui::{ use tokio::sync::mpsc; use tracing::{debug, info}; -use crate::diags::{DiagGroup, Type as DiagType, get_diag_type, parse_bitlocker, parse_chkdsk}; +use crate::diags::{ + DiagGroup, Type as DiagType, get_diag_type, parse_bitlocker, parse_chkdsk, parse_dism, + parse_system_files, +}; pub struct App { // TUI @@ -455,6 +458,16 @@ impl App { parse_chkdsk(current_group, task_result.clone()); } } + DiagType::ComponentStore => { + if let Some(task_result) = &task.result { + parse_dism(current_group, task_result.clone()); + } + } + DiagType::SystemFiles => { + if let Some(task_result) = &task.result { + parse_system_files(current_group, task_result.clone()); + } + } _ => (), } } @@ -576,7 +589,11 @@ impl App { DiagType::ComponentStore.to_string().as_str(), vec![TaskType::CommandWait( PathBuf::from(format!("{}\\dism.exe", &self.system32)), - vec![format!("{letter_os}:")], + vec![ + format!("/Image:{letter_os}:"), + String::from("/Cleanup-Image"), + String::from("/ScanHealth"), + ], )], ); diff --git a/boot_diags/src/diags.rs b/boot_diags/src/diags.rs index e0e1403..8f169fc 100644 --- a/boot_diags/src/diags.rs +++ b/boot_diags/src/diags.rs @@ -267,6 +267,110 @@ pub fn parse_chkdsk(diag_group: &mut DiagGroup, task_result: TaskResult) { } } +pub fn parse_dism(diag_group: &mut DiagGroup, task_result: TaskResult) { + if !cfg!(windows) { + sleep(Duration::from_millis(500)); + return (); + } + match task_result { + TaskResult::Error(err) => { + diag_group.passed = false; + diag_group.result = String::from("Error"); + diag_group.logs.push(Log { + label: String::from("DISM"), + summary: vec![DVLine { + line_parts: vec![String::from("DISM: "), String::from("Error")], + line_colors: vec![Color::Reset, Color::Red], + }], + raw: err, + }); + } + TaskResult::Output(stdout, stderr, _) => { + let output_text = if stderr.is_empty() { + stdout.clone() + } else { + format!("{stdout}\n\n-------\n\n{stderr}") + }; + + if output_text.contains("no component store corruption detected") { + diag_group.passed &= true; + diag_group.result = String::from("OK"); + diag_group.logs.push(Log { + label: String::from("DISM"), + summary: vec![DVLine { + line_parts: vec![String::from("DISM: "), String::from("OK")], + line_colors: vec![Color::Reset, Color::Green], + }], + raw: output_text, + }); + } else { + diag_group.passed = false; + diag_group.result = String::from("Unknown"); + diag_group.logs.push(Log { + label: String::from("DISM"), + summary: vec![DVLine { + line_parts: vec![String::from("DISM: "), String::from("Unknown")], + line_colors: vec![Color::Reset, Color::Yellow], + }], + raw: output_text, + }); + } + } + } +} + +pub fn parse_system_files(diag_group: &mut DiagGroup, task_result: TaskResult) { + if !cfg!(windows) { + sleep(Duration::from_millis(500)); + return (); + } + match task_result { + TaskResult::Error(err) => { + diag_group.passed = false; + diag_group.result = String::from("Error"); + diag_group.logs.push(Log { + label: String::from("System Files"), + summary: vec![DVLine { + line_parts: vec![String::from("System Files: "), String::from("Error")], + line_colors: vec![Color::Reset, Color::Red], + }], + raw: err, + }); + } + TaskResult::Output(stdout, stderr, passed) => { + let output_text = if stderr.is_empty() { + stdout.clone() + } else { + format!("{stdout}\n\n{stderr}") + }; + + if passed { + diag_group.passed &= true; + diag_group.result = String::from("OK"); + diag_group.logs.push(Log { + label: String::from("System Files"), + summary: vec![DVLine { + line_parts: vec![String::from("System Files: "), String::from("OK")], + line_colors: vec![Color::Reset, Color::Green], + }], + raw: output_text, + }); + } else { + diag_group.passed = false; + diag_group.result = String::from("Error"); + diag_group.logs.push(Log { + label: String::from("System Files"), + summary: vec![DVLine { + line_parts: vec![String::from("System Files: "), String::from("Error")], + line_colors: vec![Color::Reset, Color::Red], + }], + raw: output_text, + }); + } + } + } +} + pub fn remove_carriage_returns(text: &str) -> String { let re_carriage_returns = REGEXES.carriage_returns(); let parsed_lines: Vec = text