Add parse functions for DISM and System Files
This commit is contained in:
parent
4fca7d6696
commit
ee7147a187
2 changed files with 123 additions and 2 deletions
|
|
@ -54,7 +54,10 @@ use ratatui::{
|
||||||
use tokio::sync::mpsc;
|
use tokio::sync::mpsc;
|
||||||
use tracing::{debug, info};
|
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 {
|
pub struct App {
|
||||||
// TUI
|
// TUI
|
||||||
|
|
@ -455,6 +458,16 @@ impl App {
|
||||||
parse_chkdsk(current_group, task_result.clone());
|
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(),
|
DiagType::ComponentStore.to_string().as_str(),
|
||||||
vec![TaskType::CommandWait(
|
vec![TaskType::CommandWait(
|
||||||
PathBuf::from(format!("{}\\dism.exe", &self.system32)),
|
PathBuf::from(format!("{}\\dism.exe", &self.system32)),
|
||||||
vec![format!("{letter_os}:")],
|
vec![
|
||||||
|
format!("/Image:{letter_os}:"),
|
||||||
|
String::from("/Cleanup-Image"),
|
||||||
|
String::from("/ScanHealth"),
|
||||||
|
],
|
||||||
)],
|
)],
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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 {
|
pub fn remove_carriage_returns(text: &str) -> String {
|
||||||
let re_carriage_returns = REGEXES.carriage_returns();
|
let re_carriage_returns = REGEXES.carriage_returns();
|
||||||
let parsed_lines: Vec<String> = text
|
let parsed_lines: Vec<String> = text
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue