From e88e4ab3ebf644e2f8546a40d42561d2b2f5ef1c Mon Sep 17 00:00:00 2001 From: 2Shirt <2xShirt@gmail.com> Date: Mon, 30 Dec 2019 19:29:32 -0700 Subject: [PATCH] Added ddrescue settings sections --- scripts/wk/cfg/ddrescue.py | 1 + scripts/wk/hw/ddrescue.py | 41 ++++++++++++++++++++++++++++++++++++-- 2 files changed, 40 insertions(+), 2 deletions(-) diff --git a/scripts/wk/cfg/ddrescue.py b/scripts/wk/cfg/ddrescue.py index e617bae5..500f0056 100644 --- a/scripts/wk/cfg/ddrescue.py +++ b/scripts/wk/cfg/ddrescue.py @@ -27,6 +27,7 @@ DDRESCUE_SETTINGS = { '--min-read-rate': {'Selected': True, 'Value': '64KiB', }, '--reopen-on-error': {'Selected': True, }, '--retry-passes': {'Selected': True, 'Value': '0', }, + '--reverse': {'Selected': False, }, '--test-mode': {'Selected': False, 'Value': 'test.map', }, '--timeout': {'Selected': True, 'Value': '30m', }, '-vvvv': {'Selected': True, 'Hidden': True, }, diff --git a/scripts/wk/hw/ddrescue.py b/scripts/wk/hw/ddrescue.py index c85ad733..cf1220a4 100644 --- a/scripts/wk/hw/ddrescue.py +++ b/scripts/wk/hw/ddrescue.py @@ -69,7 +69,6 @@ MENU_ACTIONS = ( MENU_TOGGLES = { 'Auto continue (if recovery % over threshold)': True, 'Retry (mark non-rescued sectors "non-tried")': False, - 'Reverse direction': False, } PANE_RATIOS = ( 12, # SMART @@ -998,8 +997,8 @@ def build_settings_menu(silent=True): preset = _p # Add default settings - menu.add_action('Main Menu') menu.add_action('Load Preset') + menu.add_action('Main Menu') for name, details in cfg.ddrescue.DDRESCUE_SETTINGS['Default'].items(): menu.add_option(name, details.copy()) @@ -1094,6 +1093,26 @@ def fstype_is_ok(path, map_dir=False): return is_ok +def get_ddrescue_settings(main_menu, settings_menu): + """Get ddrescue settings from menu selections, returns list.""" + settings = [] + + # Check menu selections + for name, details in main_menu.toggles.items(): + if 'Retry' in name and details['Selected']: + settings.append('--retrim') + settings.append('--try-again') + for name, details in settings_menu.options.items(): + if details['Selected']: + if 'Value' in details: + settings.append(f'{name}={details["Value"]}') + else: + settings.append(name) + + # Done + return settings + + def get_etoc(): """Get EToC from ddrescue output, returns str.""" delta = None @@ -1351,6 +1370,14 @@ def mount_raw_image_macos(path): def run_recovery(state, main_menu, settings_menu): """Run recovery passes.""" atexit.register(state.save_debug_reports) + attempted_recovery = False + auto_continue = False + + # Get settings + for name, details in main_menu.toggles.items(): + if 'Auto continue' in name and details['Selected']: + auto_continue = True + settings = get_ddrescue_settings(main_menu, settings_menu) # Start SMART/Journal state.panes['SMART'] = tmux.split_window( @@ -1361,9 +1388,19 @@ def run_recovery(state, main_menu, settings_menu): lines=4, vertical=True, cmd='journalctl --dmesg --follow', ) + # Check if retrying + if '--retrim' in settings: + for pair in state.block_pairs: + for name in pair.status.keys(): + pair.status[name] = 'Pending' + # TODO # Run ddrescue state.update_progress_pane('Active') + print('ddrescue settings:') + for arg in settings: + print(f' {arg}') + std.pause('Run ddrescue pass?') # Stop SMART/Journal for pane in ('SMART', 'Journal'):