Added methods: load_map and self_check(s)
* load_map() is called on BlockPair() instantiation * This partially replaces resume_from_map() * Also fixed improper method declarations lacking the self argument
This commit is contained in:
parent
f5ff65bfe0
commit
fa3b3b11b0
1 changed files with 62 additions and 9 deletions
|
|
@ -39,33 +39,75 @@ USAGE = """ {script_name} clone [source [destination]]
|
||||||
# Clases
|
# Clases
|
||||||
class BlockPair():
|
class BlockPair():
|
||||||
"""Object to track data and methods together for source and dest."""
|
"""Object to track data and methods together for source and dest."""
|
||||||
def __init__(self, source_path, dest_path, map_path, total_size):
|
def __init__(self, source_path, dest_path, map_path, mode, total_size):
|
||||||
self.source_path = source_path
|
self.source_path = source_path
|
||||||
self.dest_path = dest_path
|
self.dest_path = dest_path
|
||||||
self.map_path = map_path
|
self.map_path = map_path
|
||||||
|
self.mode = mode
|
||||||
self.pass_done = [False, False, False]
|
self.pass_done = [False, False, False]
|
||||||
self.rescued = 0
|
self.rescued = 0
|
||||||
self.total_size = total_size
|
self.total_size = total_size
|
||||||
self.status = ['Pending', 'Pending', 'Pending']
|
self.status = ['Pending', 'Pending', 'Pending']
|
||||||
|
if os.path.exists(self.map_path):
|
||||||
|
self.load_map_data()
|
||||||
|
|
||||||
def finish_pass(pass_num):
|
def finish_pass(self, pass_num):
|
||||||
"""Mark pass as done and check if 100% recovered."""
|
"""Mark pass as done and check if 100% recovered."""
|
||||||
if map_data['full recovery']:
|
if map_data['full recovery']:
|
||||||
self.pass_done = [True, True, True]
|
self.pass_done = [True, True, True]
|
||||||
self.recovered = self.total_size
|
self.rescued = self.total_size
|
||||||
self.status[pass_num] = get_formatted_status(100)
|
self.status[pass_num] = get_formatted_status(100)
|
||||||
|
# Mark future passes as Skipped
|
||||||
|
pass_num += 1
|
||||||
|
while pass_num <= 2
|
||||||
|
self.status[pass_num] = 'Skipped'
|
||||||
|
pass_num += 1
|
||||||
else:
|
else:
|
||||||
self.pass_done[pass_num] = True
|
self.pass_done[pass_num] = True
|
||||||
|
|
||||||
def get_pass_done(pass_num):
|
def get_pass_done(self, pass_num):
|
||||||
"""Return pass number's done state."""
|
"""Return pass number's done state."""
|
||||||
return self.pass_done[pass_num]
|
return self.pass_done[pass_num]
|
||||||
|
|
||||||
def get_rescued():
|
def get_rescued(self):
|
||||||
"""Return rescued size."""
|
"""Return rescued size."""
|
||||||
return self.rescued
|
return self.rescued
|
||||||
|
|
||||||
def update_progress(pass_num):
|
def load_map_data(self):
|
||||||
|
"""Load data from map file and set progress."""
|
||||||
|
map_data = read_map_file(self.map_path)
|
||||||
|
self.rescued = map_data['rescued'] * self.total_size
|
||||||
|
if map_data['full recovery']:
|
||||||
|
self.pass_done = [True, True, True]
|
||||||
|
self.rescued = self.total_size
|
||||||
|
self.status = ['Skipped', 'Skipped', 'Skipped']
|
||||||
|
elif map_data['non-tried'] > 0:
|
||||||
|
# Initial pass incomplete
|
||||||
|
pass
|
||||||
|
elif map_data['non-trimmed'] > 0:
|
||||||
|
self.pass_done[0] = True
|
||||||
|
self.status[0] = 'Skipped'
|
||||||
|
elif map_data['non-scraped'] > 0:
|
||||||
|
self.pass_done = [True, True, False]
|
||||||
|
self.status = ['Skipped', 'Skipped', 'Pending']
|
||||||
|
|
||||||
|
def self_check(self):
|
||||||
|
"""Self check to abort on bad dest/map combinations."""
|
||||||
|
dest_exists = os.path.exists(self.dest_path)
|
||||||
|
map_exists = os.path.exists(self.map_path)
|
||||||
|
if self.mode == 'image':
|
||||||
|
if dest_exists and not map_exists:
|
||||||
|
raise GenericError(
|
||||||
|
'Detected image "{}" but not the matching map'.format(
|
||||||
|
self.dest_path))
|
||||||
|
elif not dest_exists and map_exists:
|
||||||
|
raise GenericError(
|
||||||
|
'Detected map "{}" but not the matching image'.format(
|
||||||
|
self.map_path))
|
||||||
|
elif not dest_exists:
|
||||||
|
raise Genericerror('Destination device missing')
|
||||||
|
|
||||||
|
def update_progress(self, pass_num):
|
||||||
"""Update progress using map file."""
|
"""Update progress using map file."""
|
||||||
if os.path.exists(self.map_path):
|
if os.path.exists(self.map_path):
|
||||||
map_data = read_map_file(self.map_path)
|
map_data = read_map_file(self.map_path)
|
||||||
|
|
@ -83,16 +125,27 @@ class RecoveryState():
|
||||||
self.finished = False
|
self.finished = False
|
||||||
self.mode = mode.lower()
|
self.mode = mode.lower()
|
||||||
self.rescued = 0
|
self.rescued = 0
|
||||||
|
self.resumed = False
|
||||||
self.started = False
|
self.started = False
|
||||||
self.total_size = 0
|
self.total_size = 0
|
||||||
if mode not in ('clone', 'image'):
|
if mode not in ('clone', 'image'):
|
||||||
raise GenericError('Unsupported mode')
|
raise GenericError('Unsupported mode')
|
||||||
|
|
||||||
def add_block_pair(obj):
|
def add_block_pair(self, obj):
|
||||||
"""Append BlockPair object to internal list."""
|
"""Append BlockPair object to internal list."""
|
||||||
|
obj.set_mode(self.mode)
|
||||||
self.block_pairs.append(obj)
|
self.block_pairs.append(obj)
|
||||||
|
|
||||||
def set_pass_num():
|
def self_checks(self):
|
||||||
|
"""Run self-checks for each BlockPair object."""
|
||||||
|
for bp in self.block_pairs:
|
||||||
|
try:
|
||||||
|
bp.self_check()
|
||||||
|
except GenericError as err:
|
||||||
|
print_error(err)
|
||||||
|
abort_ddrescue_tui()
|
||||||
|
|
||||||
|
def set_pass_num(self):
|
||||||
"""Set current pass based on all block-pair's progress."""
|
"""Set current pass based on all block-pair's progress."""
|
||||||
self.current_pass = 0
|
self.current_pass = 0
|
||||||
for pass_num in (2, 1, 0):
|
for pass_num in (2, 1, 0):
|
||||||
|
|
@ -109,7 +162,7 @@ class RecoveryState():
|
||||||
self.finished = True
|
self.finished = True
|
||||||
break
|
break
|
||||||
|
|
||||||
def update_progress():
|
def update_progress(self):
|
||||||
"""Update overall progress using block_pairs."""
|
"""Update overall progress using block_pairs."""
|
||||||
self.rescued = 0
|
self.rescued = 0
|
||||||
for bp in self.block_pairs:
|
for bp in self.block_pairs:
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue