parent
abd1855bc9
commit
0e4ee42f28
1 changed files with 49 additions and 5 deletions
|
|
@ -82,6 +82,7 @@ MENU_ACTIONS = (
|
||||||
'Add Tech Note',
|
'Add Tech Note',
|
||||||
f'Change settings {std.color_string("(experts only)", "YELLOW")}',
|
f'Change settings {std.color_string("(experts only)", "YELLOW")}',
|
||||||
f'Detect drives {std.color_string("(experts only)", "YELLOW")}',
|
f'Detect drives {std.color_string("(experts only)", "YELLOW")}',
|
||||||
|
f'Fresh start {std.color_string("(experts only)", "YELLOW")}',
|
||||||
'Quit')
|
'Quit')
|
||||||
MENU_TOGGLES = {
|
MENU_TOGGLES = {
|
||||||
'Auto continue (if recovery % over threshold)': True,
|
'Auto continue (if recovery % over threshold)': True,
|
||||||
|
|
@ -254,6 +255,22 @@ class BlockPair():
|
||||||
# Done
|
# Done
|
||||||
return complete
|
return complete
|
||||||
|
|
||||||
|
def reset_progress(self):
|
||||||
|
"""Reset progress to start fresh recovery."""
|
||||||
|
self.map_data = {}
|
||||||
|
self.status = OrderedDict({
|
||||||
|
'read': 'Pending',
|
||||||
|
'trim': 'Pending',
|
||||||
|
'scrape': 'Pending',
|
||||||
|
})
|
||||||
|
if 'DISPLAY' in os.environ or 'WAYLAND_DISPLAY' in os.environ:
|
||||||
|
# Enable opening ddrescueview during recovery
|
||||||
|
self.view_proc = None
|
||||||
|
self.map_path.touch()
|
||||||
|
|
||||||
|
# Set initial status
|
||||||
|
self.set_initial_status()
|
||||||
|
|
||||||
def safety_check(self):
|
def safety_check(self):
|
||||||
"""Run safety check and abort if necessary."""
|
"""Run safety check and abort if necessary."""
|
||||||
dest_size = -1
|
dest_size = -1
|
||||||
|
|
@ -742,7 +759,7 @@ class State():
|
||||||
|
|
||||||
# Start fresh if requested
|
# Start fresh if requested
|
||||||
if docopt_args['--start-fresh']:
|
if docopt_args['--start-fresh']:
|
||||||
clean_working_dir(self.working_dir)
|
clean_working_dir(self)
|
||||||
|
|
||||||
# Add block pairs
|
# Add block pairs
|
||||||
if self.mode == 'Clone':
|
if self.mode == 'Clone':
|
||||||
|
|
@ -1527,23 +1544,46 @@ def check_destination_health(destination):
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
|
||||||
def clean_working_dir(working_dir):
|
def clean_working_dir(state, confirm=False):
|
||||||
"""Clean working directory to ensure a fresh recovery session.
|
"""Clean working directory to ensure a fresh recovery session.
|
||||||
|
|
||||||
NOTE: Data from previous sessions will be preserved
|
NOTE: Data from previous sessions will be preserved
|
||||||
in a backup directory.
|
in a backup directory.
|
||||||
"""
|
"""
|
||||||
backup_dir = pathlib.Path(f'{working_dir}/prev')
|
backup_dir = pathlib.Path(f'{state.working_dir}/prev')
|
||||||
backup_dir = io.non_clobber_path(backup_dir)
|
backup_dir = io.non_clobber_path(backup_dir)
|
||||||
backup_dir.mkdir()
|
|
||||||
|
# Confirm
|
||||||
|
if confirm:
|
||||||
|
std.print_error(
|
||||||
|
'This will reset all progress and create new map file(s).',
|
||||||
|
)
|
||||||
|
std.print_warning(
|
||||||
|
"Please only proceed if you understand what you're doing!",
|
||||||
|
)
|
||||||
|
std.print_warning(
|
||||||
|
'NOTE: This will keep the current partition selection(s).',
|
||||||
|
)
|
||||||
|
if not std.ask('Continue?'):
|
||||||
|
return
|
||||||
|
|
||||||
# Move settings, maps, etc to backup_dir
|
# Move settings, maps, etc to backup_dir
|
||||||
for entry in os.scandir(working_dir):
|
backup_dir.mkdir()
|
||||||
|
for entry in os.scandir(state.working_dir):
|
||||||
if entry.name.endswith(('.dd', '.json', '.map')):
|
if entry.name.endswith(('.dd', '.json', '.map')):
|
||||||
|
if confirm and entry.name.endswith('.json'):
|
||||||
|
# Keep JSON settings if using the menu option
|
||||||
|
continue
|
||||||
new_path = f'{backup_dir}/{entry.name}'
|
new_path = f'{backup_dir}/{entry.name}'
|
||||||
new_path = io.non_clobber_path(new_path)
|
new_path = io.non_clobber_path(new_path)
|
||||||
shutil.move(entry.path, new_path)
|
shutil.move(entry.path, new_path)
|
||||||
|
|
||||||
|
# Update block pairs (if using the menu option)
|
||||||
|
if confirm:
|
||||||
|
for block_pair in state.block_pairs:
|
||||||
|
block_pair.reset_progress()
|
||||||
|
state.update_progress_pane('Idle')
|
||||||
|
|
||||||
|
|
||||||
def detect_drives(state):
|
def detect_drives(state):
|
||||||
"""Detect connected drives and check source/dest selections."""
|
"""Detect connected drives and check source/dest selections."""
|
||||||
|
|
@ -1932,6 +1972,10 @@ def main():
|
||||||
)
|
)
|
||||||
state.update_top_panes()
|
state.update_top_panes()
|
||||||
|
|
||||||
|
# Start over
|
||||||
|
if 'Fresh start' in selection[0]:
|
||||||
|
clean_working_dir(state, confirm=True)
|
||||||
|
|
||||||
# Start recovery
|
# Start recovery
|
||||||
if 'Start' in selection:
|
if 'Start' in selection:
|
||||||
std.clear_screen()
|
std.clear_screen()
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue