Check for TRIM in HW Diagnostics and ddrescue-tui

Addresses issue #212
This commit is contained in:
2Shirt 2023-06-17 20:45:44 -07:00
parent d958945fe8
commit acd484f891
Signed by: 2Shirt
GPG key ID: 152FAC923B0E132C
2 changed files with 14 additions and 0 deletions

View file

@ -645,6 +645,11 @@ class State():
# Select source # Select source
self.source = select_disk_obj('source', disk_menu, docopt_args['<source>']) self.source = select_disk_obj('source', disk_menu, docopt_args['<source>'])
if self.source.trim:
cli.print_error('Source device supports TRIM')
cli.print_warning('Continuing recovery is STRONGLY DISADVISED!')
if not cli.ask(' Proceed with recovery?'):
cli.abort()
self.ui.set_title('Source', self.source.name) self.ui.set_title('Source', self.source.name)
# Select destination # Select destination

View file

@ -56,6 +56,7 @@ class Disk:
size: int = field(init=False) size: int = field(init=False)
ssd: bool = field(init=False) ssd: bool = field(init=False)
tests: list[Test] = field(init=False, default_factory=list) tests: list[Test] = field(init=False, default_factory=list)
trim: bool = field(init=False)
use_sat: bool = field(init=False, default=False) use_sat: bool = field(init=False, default=False)
def __post_init__(self): def __post_init__(self):
@ -213,6 +214,7 @@ class Disk:
self.serial = self.raw_details.get('serial', 'Unknown Serial') self.serial = self.raw_details.get('serial', 'Unknown Serial')
self.size = self.raw_details.get('size', -1) self.size = self.raw_details.get('size', -1)
self.ssd = self.raw_details.get('ssd', False) self.ssd = self.raw_details.get('ssd', False)
self.trim = self.raw_details.get('trim', False)
# Ensure certain attributes types # Ensure certain attributes types
## NOTE: This is ugly, deal. ## NOTE: This is ugly, deal.
@ -226,6 +228,10 @@ class Disk:
if attr == 'size': if attr == 'size':
setattr(self, attr, -1) setattr(self, attr, -1)
# Add TRIM note
if self.trim:
self.add_note('TRIM support detected', 'YELLOW')
# Functions # Functions
def get_disk_details_linux(disk_path, skip_children=True) -> dict[Any, Any]: def get_disk_details_linux(disk_path, skip_children=True) -> dict[Any, Any]:
@ -249,10 +255,12 @@ def get_disk_details_linux(disk_path, skip_children=True) -> dict[Any, Any]:
dev['bus'] = dev.pop('tran', '???') dev['bus'] = dev.pop('tran', '???')
dev['parent'] = dev.pop('pkname', None) dev['parent'] = dev.pop('pkname', None)
dev['ssd'] = not dev.pop('rota', True) dev['ssd'] = not dev.pop('rota', True)
dev['trim'] = bool(dev.pop('disc-max', 0))
if 'loop' in str(disk_path) and dev['bus'] is None: if 'loop' in str(disk_path) and dev['bus'] is None:
dev['bus'] = 'Image' dev['bus'] = 'Image'
dev['model'] = '' dev['model'] = ''
dev['serial'] = '' dev['serial'] = ''
dev['trim'] = False # NOTE: This check is just for physical devices
# Convert to dict # Convert to dict
details = dev_list.pop(0) details = dev_list.pop(0)
@ -310,6 +318,7 @@ def get_disk_details_macos(disk_path, skip_children=True) -> dict:
dev['serial'] = get_disk_serial_macos(dev['path']) dev['serial'] = get_disk_serial_macos(dev['path'])
dev['size'] = dev.pop('Size', -1) dev['size'] = dev.pop('Size', -1)
dev['ssd'] = dev.pop('SolidState', False) dev['ssd'] = dev.pop('SolidState', False)
dev['trim'] = False # TODO: ACtually check for TRIM
dev['vendor'] = '' dev['vendor'] = ''
if dev.get('WholeDisk', True): if dev.get('WholeDisk', True):
dev['parent'] = None dev['parent'] = None