diff options
author | PMR <pmr@pmr-lander> | 2017-07-21 13:05:19 +0000 |
---|---|---|
committer | PMR <pmr@pmr-lander> | 2017-07-21 13:05:19 +0000 |
commit | 061fd0910726a79f1e34e805f4714f368436d4b7 (patch) | |
tree | 1faa8bd30742c8be2f01da12fbc4da80e7ca9af4 /bin | |
parent | 8ff20a5a51c25245dd66331643ed329aa4e25955 (diff) | |
parent | 962939a1b8d0322808cb946fc6b415cdeef98595 (diff) |
Merge #327762 from ~rodsmith/plainbox-provider-checkbox:fix-smart-ob04
Diffstat (limited to 'bin')
-rwxr-xr-x | bin/disk_smart | 61 |
1 files changed, 29 insertions, 32 deletions
diff --git a/bin/disk_smart b/bin/disk_smart index 804b11f..a9b294e 100755 --- a/bin/disk_smart +++ b/bin/disk_smart @@ -206,22 +206,23 @@ def initiate_smart_test(disk, raid_element, raid_type, type='short'): return smart_proc.returncode -def get_smart_entries(disk, raid_element, raid_type, type='selftest'): +def get_smart_entries(disk, raid_element, raid_type, verbose=False): entries = [] + returncode = 0 try: if raid_type == 'none': - stdout = check_output(['smartctl', '-l', type, disk], + stdout = check_output(['smartctl', '-l', 'selftest', disk], universal_newlines=True) else: - stdout = check_output(['smartctl', '-l', type, disk, + stdout = check_output(['smartctl', '-l', 'selftest', disk, '-d', '{},{}'. format(raid_type, raid_element)], universal_newlines=True) - returncode = 0 except CalledProcessError as err: - logging.error("Error encountered checking SMART Log") - logging.error("\tsmartctl returned code: {}".format(err.returncode)) - logging.error("\tSee 'man smartctl' for info on return code meanings") + if verbose: + logging.error("Error encountered checking SMART Log") + logging.error("\tsmartctl returned: {}".format(err.returncode)) + logging.error("\tSee 'man smartctl' for info on return codes") stdout = err.output returncode = err.returncode @@ -239,7 +240,7 @@ def get_smart_entries(disk, raid_element, raid_type, type='selftest'): logging.info('No entries found in log') if not line.startswith('Num'): entries.append('No entries found in log yet') - return entries, returncode + return entries, stdout, returncode columns = ['number', 'description', 'status', 'remaining', 'lifetime', 'lba'] lengths = [line.index(i) for i in line.split()] @@ -258,7 +259,7 @@ def get_smart_entries(disk, raid_element, raid_type, type='selftest'): entry['number'] = int(entry['number'][1:]) entries.append(entry) - return entries, returncode + return entries, stdout, returncode def in_progress(current_entries): @@ -316,11 +317,12 @@ def poll_for_status(args, disk, raid_element, raid_type, previous_entries): keep_going = True while keep_going: - # Poll every sleep seconds until test is complete$ + # Poll every sleep seconds until test is complete time.sleep(args.sleep) - current_entries, returncode = get_smart_entries(disk, raid_element, - raid_type) + current_entries, output, returncode = get_smart_entries(disk, + raid_element, + raid_type) if current_entries != previous_entries: if not in_progress(current_entries): logging.debug("Current log entries differ from starting log" @@ -354,8 +356,9 @@ def run_smart_test(args, disk, raid_element, raid_type): :returns: True for success, False for failure """ - previous_entries, returncode = get_smart_entries(disk, raid_element, - raid_type) + previous_entries, output, returncode = get_smart_entries(disk, + raid_element, + raid_type) if raid_type == 'none': logging.info("Starting SMART self-test on {}".format(disk)) else: @@ -375,32 +378,26 @@ def run_smart_test(args, disk, raid_element, raid_type): logging.debug("Log is 20+ entries long. Restarting test to add an" " abort message to make the log diff easier") initiate_smart_test(disk, raid_element, raid_type) - previous_entries, returncode = get_smart_entries(disk, raid_element, - raid_type) + previous_entries, output, returncode = get_smart_entries(disk, + raid_element, + raid_type) status, returncode = poll_for_status(args, disk, raid_element, raid_type, previous_entries) if returncode != 0: - log, returncode = get_smart_entries(disk, raid_element, raid_type) + log, output, returncode = get_smart_entries(disk, raid_element, + raid_type, True) + logging.error("FAIL: SMART Self-Test appears to have failed " + "for some reason.") + logging.error("\tLast smartctl return code: %d", returncode) + logging.error("\tLast smartctl run status: %s", status) if raid_type == 'none': - logging.error("FAIL: SMART Self-Test appears to have failed " - "for some reason. Run 'sudo smartctl -l selftest " - "{}' to see the SMART log".format(disk)) + logging.error("\t'smartctl -l selftest {}' output:".format(disk)) else: - logging.error("FAIL: SMART Self-Test appears to have failed " - "for some reason. Run 'sudo smartctl -l selftest " - "{} -d {},{}' to see the SMART log". + logging.error("\t'smartctl -l selftest {} -d {},{}' output:". format(disk, raid_type, raid_element)) - logging.error("\tLast smartctl return code: %d", returncode) - logging.error("\tLast smartctl run status: %s", status) - logging.debug("\tMost Recent SMART LOG Entry:") - for log_entry in log: - if log_entry['number'] == 1: - logging.debug("\t# {}\t{}\t{}\t{}\t{}\t{}".format( - log_entry['number'], log_entry['description'], - log_entry['status'], log_entry['remaining'], - log_entry['lifetime'], log_entry['lba'])) + logging.error("\n%s", output) return False else: if raid_type == 'none': |