From 827451322d1f7196707410e725a062a20b4fd0c6 Mon Sep 17 00:00:00 2001 From: 2Shirt <2xShirt@gmail.com> Date: Sat, 5 Jul 2025 17:38:44 -0700 Subject: [PATCH] Update boot-diags menus --- boot_diags/src/app.rs | 150 ++++++++++++++++++++++++---------------- config/config.json5 | 12 ++++ core/src/state.rs | 1 + core/src/system/boot.rs | 17 +++-- deja_vu/src/app.rs | 14 +++- 5 files changed, 126 insertions(+), 68 deletions(-) diff --git a/boot_diags/src/app.rs b/boot_diags/src/app.rs index bec650a..11e3358 100644 --- a/boot_diags/src/app.rs +++ b/boot_diags/src/app.rs @@ -29,7 +29,7 @@ use core::{ line::{DVLine, get_disk_description_right, get_part_description}, state::{CloneSettings, Mode}, system::{ - boot::{self, SafeMode}, + boot::{self, SafeMode, configure_disk}, cpu::get_cpu_name, disk::PartitionTableType, drivers, @@ -76,6 +76,7 @@ pub struct App { diag_groups: Arc>>, list: StatefulList, boot_modes: Vec, + setup_modes: Vec, selections: Vec>, system32: String, tasks: Tasks, @@ -122,6 +123,7 @@ impl App { diag_groups: diag_groups_arc, list, boot_modes: vec![SafeMode::Enable, SafeMode::Disable], + setup_modes: vec![SafeMode::Disable, SafeMode::Enable], system32: String::new(), selections: vec![None, None], tasks, @@ -154,9 +156,10 @@ impl App { Mode::ScanDisks => Mode::SelectDisks, Mode::SelectDisks => Mode::SelectParts, Mode::SelectParts => Mode::DiagMenu, - Mode::BootDiags | Mode::BootSetup => Mode::DiagMenu, + Mode::BootDiags => Mode::DiagMenu, Mode::BootScan => Mode::BootDiags, - Mode::InjectDrivers | Mode::SetBootMode => Mode::DiagMenu, + Mode::BootSetup | Mode::InjectDrivers | Mode::SetBootMode => Mode::Process, + Mode::Process => Mode::DiagMenu, Mode::Done => Mode::DiagMenu, Mode::Failed => Mode::Failed, // Default to current mode @@ -204,6 +207,10 @@ impl App { self.queue_boot_scan_tasks()?; } Mode::InjectDrivers | Mode::InstallDrivers => self.clone.scan_drivers(), + Mode::Process => { + self.action_tx + .send(Action::DisplayPopup(popup::Type::Info, String::from("...")))?; + } Mode::ScanDisks => { if self.tasks.idle() { self.tasks.add(TaskType::ScanDisks); @@ -361,10 +368,6 @@ impl App { Mode::Done => { self.action_tx.send(Action::NextScreen)?; } - Mode::BootSetup => { - let new_mode = self.next_mode(); - self.action_tx.send(Action::SetMode(new_mode))?; - } _ => {} }, Action::Resize(w, h) => self.handle_resize(tui, w, h)?, @@ -384,6 +387,14 @@ impl App { } } } + Mode::BootSetup => { + if let Some(index) = one { + if let Some(boot_mode) = self.setup_modes.get(index) { + info!("create_boot_files?"); + create_boot_files(self, boot_mode.clone()); + } + } + } Mode::SelectDisks => { self.clone.disk_index_dest = one; } @@ -774,19 +785,17 @@ fn get_chunks(r: Rect) -> Vec { fn build_footer_string(cur_mode: Mode) -> String { match cur_mode { - Mode::BootDiags => { + Mode::BootDiags | Mode::BootSetup | Mode::InjectDrivers | Mode::SetBootMode => { String::from("(Enter) to select / (m) for menu / (s) to start over / (q) to quit") } - Mode::BootScan | Mode::BootSetup | Mode::Home | Mode::ScanDisks => { + Mode::BootScan | Mode::Home | Mode::Process | Mode::ScanDisks => { String::from("(q) to quit") } Mode::DiagMenu | Mode::SelectParts => { String::from("(Enter) to select / (s) to start over / (q) to quit") } Mode::Done => String::from("(Enter) to continue / (q) to quit"), - Mode::InstallDrivers | Mode::InjectDrivers | Mode::SetBootMode => { - String::from("(Enter) to select / (q) to quit") - } + Mode::InstallDrivers => String::from("(Enter) to select / (q) to quit"), Mode::LogView => { String::from("(Enter | Esc) to close log / (up | down) to scroll / (q) to quit") } @@ -848,7 +857,7 @@ fn build_left_items(app: &App) -> Action { .iter() .for_each(|disk| items.push(disk.description.to_string())); } - Mode::BootScan | Mode::ScanDisks => { + Mode::BootScan | Mode::Process | Mode::ScanDisks => { select_type = SelectionType::Loop; title = String::from("Processing"); } @@ -887,13 +896,18 @@ fn build_left_items(app: &App) -> Action { } } Mode::BootSetup => { - select_type = SelectionType::Loop; + select_type = SelectionType::One; let (new_title, _) = get_mode_strings(app.cur_mode); title = new_title; + app.boot_modes.iter().rev().for_each(|entry| match entry { + SafeMode::Disable => items.push(String::from("Normal Mode")), + SafeMode::Enable => items.push(String::from("Locked in Safe Mode")), + }); } Mode::SetBootMode => { select_type = SelectionType::One; - title = String::from("Set Boot Mode"); + let (new_title, _) = get_mode_strings(app.cur_mode); + title = new_title; app.boot_modes.iter().for_each(|entry| { items.push(format!("{:?} Safe Mode", entry)); }); @@ -919,13 +933,37 @@ fn build_right_items(app: &App) -> Action { let mut items: Vec> = Vec::new(); let mut labels: Vec> = Vec::new(); let mut start_index = 0; + let disk_header = get_disk_header(app); match app.cur_mode { - Mode::DiagMenu => { - let header_lines = get_disk_header(app); - if !header_lines.is_empty() { - items.push(header_lines); + Mode::BootDiags + | Mode::BootSetup + | Mode::DiagMenu + | Mode::InjectDrivers + | Mode::InstallDrivers + | Mode::Process + | Mode::SetBootMode => { + items.push(vec![DVLine { + line_parts: vec![String::from("CPU")], + line_colors: vec![Color::Cyan], + }]); + items.push(vec![DVLine { + line_parts: vec![get_cpu_name()], + line_colors: vec![Color::Reset], + }]); + items.push(vec![DVLine { + line_parts: vec![String::new()], + line_colors: vec![Color::Reset], + }]); + start_index += 3; + if !disk_header.is_empty() { + items.push(disk_header); start_index += 1; } + } + _ => {} + } + match app.cur_mode { + Mode::DiagMenu => { app.list.items.iter().for_each(|mode| { let (name, description) = get_mode_strings(*mode); items.push(vec![ @@ -945,11 +983,6 @@ fn build_right_items(app: &App) -> Action { }); } Mode::BootDiags => { - let header_lines = get_disk_header(app); - if !header_lines.is_empty() { - items.push(header_lines); - start_index += 1; - } if let Ok(diag_groups) = app.diag_groups.lock() { let mut summary: Vec = Vec::new(); diag_groups @@ -958,16 +991,15 @@ fn build_right_items(app: &App) -> Action { items.push(summary); } } - Mode::InjectDrivers | Mode::InstallDrivers => { + Mode::BootSetup => { items.push(vec![DVLine { - line_parts: vec![String::from("CPU")], - line_colors: vec![Color::Cyan], - }]); - items.push(vec![DVLine { - line_parts: vec![get_cpu_name()], + line_parts: vec![String::from("Normal Mode")], + line_colors: vec![Color::Reset], + }]); + items.push(vec![DVLine { + line_parts: vec![String::from("Safe Mode")], line_colors: vec![Color::Reset], }]); - start_index += 2; } Mode::SelectDisks => { let dest_dv_line = DVLine { @@ -1002,28 +1034,41 @@ fn build_right_items(app: &App) -> Action { } } Mode::SetBootMode => { - app.boot_modes.iter().for_each(|mode| { - match mode { - SafeMode::Disable => { - items.push(vec![DVLine { - line_parts: vec![String::from("Disable Safe Mode")], - line_colors: vec![Color::Reset], - }]); - } - SafeMode::Enable => { - items.push(vec![DVLine { - line_parts: vec![String::from("Enable Safe Mode (minimal)")], - line_colors: vec![Color::Reset], - }]); - } - }; - }); + items.push(vec![DVLine { + line_parts: vec![String::from("Enable Safe Mode (minimal)")], + line_colors: vec![Color::Reset], + }]); + items.push(vec![DVLine { + line_parts: vec![String::from("Disable Safe Mode")], + line_colors: vec![Color::Reset], + }]); } _ => {} } Action::UpdateRight(labels, start_index, items) } +fn create_boot_files(app: &mut App, safe_mode: SafeMode) { + let mut tasks: Vec = Vec::new(); + if let Some(index) = app.clone.disk_index_dest { + let disk_list = app.clone.disk_list.lock().unwrap(); + if let Some(disk) = disk_list.get(index) { + let letter_boot = disk.get_part_letter(app.clone.part_index_boot.unwrap()); + let letter_os = disk.get_part_letter(app.clone.part_index_os.unwrap()); + tasks = configure_disk( + &letter_boot, + &letter_os, + safe_mode, + &app.system32, + &disk.part_type, + ); + } + } + tasks + .into_iter() + .for_each(|task_type| app.tasks.add(task_type)); +} + fn get_disk_header(app: &App) -> Vec { let mut header_lines: Vec = Vec::new(); if let Some(index) = app.clone.disk_index_dest { @@ -1036,17 +1081,6 @@ fn get_disk_header(app: &App) -> Vec { if let Some(index) = app.clone.part_index_os { parts.push(index); } - // Disk Details - header_lines.append(&mut vec![ - DVLine { - line_parts: vec![String::from("Disk")], - line_colors: vec![Color::Cyan], - }, - DVLine { - line_parts: vec![String::new()], - line_colors: vec![Color::Reset], - }, - ]); header_lines.append(&mut get_disk_description_right(disk, &Some(parts))); } } diff --git a/config/config.json5 b/config/config.json5 index 3dec46f..81c4ee1 100644 --- a/config/config.json5 +++ b/config/config.json5 @@ -127,6 +127,8 @@ "": "Process", "": "KeyUp", "": "KeyDown", + "": "DiagMainMenu", + "": "ScanDisks", "": "Quit", "": "Quit", "": "Quit", @@ -150,6 +152,14 @@ "": "Process", "": "KeyUp", "": "KeyDown", + "": "DiagMainMenu", + "": "ScanDisks", + "": "Quit", + "": "Quit", + "": "Quit", + "": "Suspend" + }, + "Process": { "": "Quit", "": "Quit", "": "Quit", @@ -159,6 +169,8 @@ "": "Process", "": "KeyUp", "": "KeyDown", + "": "DiagMainMenu", + "": "ScanDisks", "": "Quit", "": "Quit", "": "Quit", diff --git a/core/src/state.rs b/core/src/state.rs index d304575..1992a2b 100644 --- a/core/src/state.rs +++ b/core/src/state.rs @@ -36,6 +36,7 @@ pub enum Mode { BootScan, BootSetup, LogView, + Process, InjectDrivers, SetBootMode, // Clone diff --git a/core/src/system/boot.rs b/core/src/system/boot.rs index d8daa44..547935d 100644 --- a/core/src/system/boot.rs +++ b/core/src/system/boot.rs @@ -20,7 +20,7 @@ use crate::tasks::TaskType; use color_eyre::Result; use std::path::PathBuf; -#[derive(Clone, Debug, Default)] +#[derive(Clone, Debug, Default, PartialEq)] pub enum SafeMode { #[default] Disable, @@ -31,6 +31,7 @@ pub enum SafeMode { pub fn configure_disk( letter_boot: &str, letter_os: &str, + safe_mode: SafeMode, system32: &str, table_type: &PartitionTableType, ) -> Vec { @@ -64,11 +65,13 @@ pub fn configure_disk( )); } - // Lock in safe mode - tasks.push( - set_mode(letter_boot, &SafeMode::Enable, system32, table_type) - .expect("Failed to create set_mode task."), - ); + // Lock in safe mode (if needed) + if safe_mode == SafeMode::Enable { + tasks.push( + set_mode(letter_boot, &SafeMode::Enable, system32, table_type) + .expect("Failed to create set_mode task."), + ); + } // Done tasks @@ -82,7 +85,7 @@ pub fn inject_driver(driver: &Driver, letter_os: &str, system32: &str) -> Result vec![ format!("/image:{letter_os}:\\"), String::from("/add-driver"), - format!("/driver:\"{}\"", driver_path,), + format!("/driver:{driver_path}"), String::from("/recurse"), ], )) diff --git a/deja_vu/src/app.rs b/deja_vu/src/app.rs index 5055e87..1f0275d 100644 --- a/deja_vu/src/app.rs +++ b/deja_vu/src/app.rs @@ -128,6 +128,7 @@ impl App { | Mode::InjectDrivers | Mode::LogView | Mode::PEMenu + | Mode::Process | Mode::SetBootMode => panic!("This shouldn't happen?"), } } @@ -152,6 +153,7 @@ impl App { | Mode::InjectDrivers | Mode::LogView | Mode::PEMenu + | Mode::Process | Mode::SetBootMode => panic!("This shouldn't happen?"), }; @@ -242,9 +244,13 @@ impl App { } // Create boot files - for task in - boot::configure_disk(&letter_boot, &letter_os, &system32, &table_type) - { + for task in boot::configure_disk( + &letter_boot, + &letter_os, + boot::SafeMode::Enable, + &system32, + &table_type, + ) { self.tasks.add(task); } @@ -631,6 +637,7 @@ fn build_footer_string(cur_mode: Mode) -> String { | Mode::InjectDrivers | Mode::LogView | Mode::PEMenu + | Mode::Process | Mode::SetBootMode => panic!("This shouldn't happen?"), } } @@ -703,6 +710,7 @@ fn build_left_items(app: &App, cur_mode: Mode) -> Action { | Mode::InjectDrivers | Mode::LogView | Mode::PEMenu + | Mode::Process | Mode::SetBootMode => panic!("This shouldn't happen?"), }; Action::UpdateLeft(title, labels, items, select_type)