From 710fcc29dca4e47f8e8e8006d8c97942c0c070b8 Mon Sep 17 00:00:00 2001 From: 2Shirt <2xShirt@gmail.com> Date: Mon, 20 Jan 2020 18:31:29 -0700 Subject: [PATCH 1/4] Catch non-blocking SMART errors between tests * This doesn't block further tests, just ensures Disk Attributes fails --- scripts/wk/hw/diags.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/scripts/wk/hw/diags.py b/scripts/wk/hw/diags.py index 9925dd27..ff9c7a51 100644 --- a/scripts/wk/hw/diags.py +++ b/scripts/wk/hw/diags.py @@ -195,6 +195,11 @@ class State(): disk.tests['Disk Self-Test'].report.append( std.color_string('Please manually review SMART data', 'YELLOW'), ) + else: + # No blocking errors encountered, check for minor attribute failures + if not disk.check_attributes(only_blocking=False): + disk.tests['Disk Attributes'].failed = True + disk.tests['Disk Attributes'].set_status('Failed') # Disable tests if necessary if disable_tests: From 79abbcfaf89268b4f7c0ef6aa63004b6c265fff0 Mon Sep 17 00:00:00 2001 From: 2Shirt <2xShirt@gmail.com> Date: Wed, 22 Jan 2020 11:20:39 -0700 Subject: [PATCH 2/4] Avoid crash when getting NVMe attributes --- scripts/wk/hw/obj.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/wk/hw/obj.py b/scripts/wk/hw/obj.py index 1facbc15..a9e8cd57 100644 --- a/scripts/wk/hw/obj.py +++ b/scripts/wk/hw/obj.py @@ -539,7 +539,7 @@ class Disk(BaseObj): 'raw': int(value), 'raw_str': str(value), } - except ValueError: + except (TypeError, ValueError): # Ignoring invalid attribute LOG.error('Invalid NVMe attribute: %s %s', name, value) elif KEY_SMART in self.smartctl: From e92ceb070c87edf4b22f1e15a2f5e51f17535762 Mon Sep 17 00:00:00 2001 From: 2Shirt <2xShirt@gmail.com> Date: Wed, 22 Jan 2020 11:21:49 -0700 Subject: [PATCH 3/4] Adjusted I/O Benchmark screen layout --- scripts/wk/hw/diags.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/wk/hw/diags.py b/scripts/wk/hw/diags.py index ff9c7a51..741dba50 100644 --- a/scripts/wk/hw/diags.py +++ b/scripts/wk/hw/diags.py @@ -829,7 +829,7 @@ def disk_io_benchmark(state, test_objects, skip_usb=True): f'Disk I/O Benchmark{"s" if len(test_objects) > 1 else ""}', ) state.panes['I/O Benchmark'] = tmux.split_window( - percent=75, + percent=50, vertical=True, text=' ', ) From bfc17942cd4c02cb6a43f64dc020932c18fb3e10 Mon Sep 17 00:00:00 2001 From: 2Shirt <2xShirt@gmail.com> Date: Wed, 22 Jan 2020 11:22:47 -0700 Subject: [PATCH 4/4] Added header to SMART self-test output * Matches badblocks header * Also added Initializing message --- scripts/wk/cfg/hw.py | 2 +- scripts/wk/hw/diags.py | 2 +- scripts/wk/hw/obj.py | 10 +++++++++- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/scripts/wk/cfg/hw.py b/scripts/wk/cfg/hw.py index 59cd7248..f97e3acc 100644 --- a/scripts/wk/cfg/hw.py +++ b/scripts/wk/cfg/hw.py @@ -130,7 +130,7 @@ TMUX_LAYOUT = OrderedDict({ # Testing panes 'Temps': {'height': 1000, 'Check': False}, 'Prime95': {'height': 11, 'Check': False}, - 'SMART': {'height': 3, 'Check': True}, + 'SMART': {'height': 4, 'Check': True}, 'badblocks': {'height': 5, 'Check': True}, 'I/O Benchmark': {'height': 1000, 'Check': False}, }) diff --git a/scripts/wk/hw/diags.py b/scripts/wk/hw/diags.py index 741dba50..6ad9e8c9 100644 --- a/scripts/wk/hw/diags.py +++ b/scripts/wk/hw/diags.py @@ -933,7 +933,7 @@ def disk_self_test(state, test_objects): # Show progress if threads[-1].is_alive(): state.panes['SMART'].append( - tmux.split_window(lines=3, vertical=True, watch_file=test_log), + tmux.split_window(lines=4, vertical=True, watch_file=test_log), ) # Wait for all tests to complete diff --git a/scripts/wk/hw/obj.py b/scripts/wk/hw/obj.py index a9e8cd57..d934b30d 100644 --- a/scripts/wk/hw/obj.py +++ b/scripts/wk/hw/obj.py @@ -452,6 +452,12 @@ class Disk(BaseObj): status_str = 'Starting self-test...' test_details = self.get_smart_self_test_details() test_minutes = 15 + size_str = bytes_to_string(self.details["size"], use_binary=False) + header_str = color_string( + ['[', self.path.name, ' ', size_str, ']'], + [None, 'BLUE', None, 'CYAN', None], + sep='', + ) # Check if disk supports self-tests if not test_details: @@ -463,6 +469,8 @@ class Disk(BaseObj): test_minutes = int(test_minutes) + 10 # Start test + with open(log_path, 'w') as _f: + _f.write(f'{header_str}\nInitializing...') cmd = [ 'sudo', 'smartctl', @@ -487,7 +495,7 @@ class Disk(BaseObj): # Update log with open(log_path, 'w') as _f: - _f.write(f'SMART self-test status for {self.path}:\n {status_str}') + _f.write(f'{header_str}\nSMART self-test status:\n {status_str}') # Check if finished if 'remaining_percent' not in test_details['status']: