Add pass completion detection sections

* Retry option now sets recovery back to pass 1
This commit is contained in:
2Shirt 2018-07-17 22:10:37 -06:00
parent a12a591279
commit c705ba6afc
Signed by: 2Shirt
GPG key ID: 152FAC923B0E132C

View file

@ -105,6 +105,20 @@ def get_status_color(s, t_success=99, t_warn=90):
color = COLORS['RED'] color = COLORS['RED']
return color return color
def mark_pass_complete(source):
"""Mark current pass complete and set next pass as current."""
current_pass = source['Current Pass']
current_pass_num = int(current_pass[-1:])
next_pass_num = current_pass_num + 1
next_pass = 'Pass {}'.format(next_pass_num)
# Update source vars
source['Current Pass'] = next_pass
source[current_pass]['Done'] = True
# TODO Remove test code
source[current_pass]['Status'] = str(11.078 * current_pass_num * 3)
def menu_clone(source_path, dest_path): def menu_clone(source_path, dest_path):
"""ddrescue cloning menu.""" """ddrescue cloning menu."""
@ -201,7 +215,7 @@ def menu_main(source):
# Build menu # Build menu
main_options = [ main_options = [
{'Base Name': 'Retry', 'Enabled': False}, {'Base Name': 'Retry (mark non-rescued sectors "non-tried")', 'Enabled': False},
{'Base Name': 'Reverse direction', 'Enabled': False}, {'Base Name': 'Reverse direction', 'Enabled': False},
] ]
actions =[ actions =[
@ -244,6 +258,10 @@ def menu_main(source):
for opt in main_options: for opt in main_options:
if 'Retry' in opt['Base Name'] and opt['Enabled']: if 'Retry' in opt['Base Name'] and opt['Enabled']:
settings.extend(['--retrim', '--try-again']) settings.extend(['--retrim', '--try-again'])
source['Current Pass'] = 'Pass 1'
source['Pass 1']['Done'] = False
source['Pass 2']['Done'] = False
source['Pass 3']['Done'] = False
if 'Reverse' in opt['Base Name'] and opt['Enabled']: if 'Reverse' in opt['Base Name'] and opt['Enabled']:
settings.append('--reverse') settings.append('--reverse')
# Disable for next pass # Disable for next pass
@ -492,21 +510,25 @@ def menu_settings(source):
def run_ddrescue(source, settings): def run_ddrescue(source, settings):
"""Run ddrescue pass.""" """Run ddrescue pass."""
if source['Current Pass'] == 'Pass 1': current_pass = source['Current Pass']
source[current_pass]['Status'] = 'Working'
update_progress(source)
if current_pass == 'Pass 1':
settings.extend(['--no-trim', '--no-scrape']) settings.extend(['--no-trim', '--no-scrape'])
elif source['Current Pass'] == 'Pass 2': elif current_pass == 'Pass 2':
# Allow trimming
settings.append('--no-scrape') settings.append('--no-scrape')
elif source['Current Pass'] == 'Pass 3': elif current_pass == 'Pass 3':
# Allow trimming and scraping
pass pass
else: else:
# Assuming Done raise GenericError("This shouldn't happen?")
return
# Set heights # Set heights
## NOTE: 10/32 is based on min heights for SMART/ddrescue panes (10 + 22) ## NOTE: 12/33 is based on min heights for SMART/ddrescue panes (12+22+1sep)
result = run_program(['tput', 'lines']) result = run_program(['tput', 'lines'])
height = int(result.stdout.decode().strip()) height = int(result.stdout.decode().strip())
height_smart = int(height * (12 / 34)) height_smart = int(height * (12 / 33))
height_ddrescue = height - height_smart height_ddrescue = height - height_smart
# Show SMART status # Show SMART status
@ -529,9 +551,14 @@ def run_ddrescue(source, settings):
return_code = ddrescue_proc.poll() return_code = ddrescue_proc.poll()
if return_code is None: if return_code is None:
print_warning('Aborted') print_warning('Aborted')
source[current_pass]['Status'] = 'Incomplete'
elif return_code: elif return_code:
# i.e. not None and not 0 # i.e. not None and not 0
print_error('Error(s) encountered, see message above.') print_error('Error(s) encountered, see message above.')
source[current_pass]['Status'] = 'Incomplete'
else:
# Not None and not non-zero int, assuming 0
mark_pass_complete(source)
# TODO # TODO
update_progress(source) update_progress(source)