From d5dc453ffa3566f4e9f5554d96b1d14fc5b45c38 Mon Sep 17 00:00:00 2001 From: 2Shirt <2xShirt@gmail.com> Date: Tue, 5 Mar 2019 19:34:44 -0700 Subject: [PATCH] Added maximum threshold for NVMe/SMART attributes * Fixes issue #95 --- .bin/Scripts/functions/common.py | 3 ++- .bin/Scripts/functions/hw_diags.py | 25 ++++++++++++-------- .bin/Scripts/settings/hw_diags.py | 37 ++++++++++++++++++------------ 3 files changed, 40 insertions(+), 25 deletions(-) diff --git a/.bin/Scripts/functions/common.py b/.bin/Scripts/functions/common.py index 2bbb4291..a352f9d6 100644 --- a/.bin/Scripts/functions/common.py +++ b/.bin/Scripts/functions/common.py @@ -27,11 +27,12 @@ global_vars = {} # STATIC VARIABLES COLORS = { 'CLEAR': '\033[0m', - 'RED': '\033[31m', + 'RED': '\033[31m', 'ORANGE': '\033[31;1m', 'GREEN': '\033[32m', 'YELLOW': '\033[33m', 'BLUE': '\033[34m', + 'PURPLE': '\033[35m', 'CYAN': '\033[36m', } try: diff --git a/.bin/Scripts/functions/hw_diags.py b/.bin/Scripts/functions/hw_diags.py index 841abf8d..837aa62b 100644 --- a/.bin/Scripts/functions/hw_diags.py +++ b/.bin/Scripts/functions/hw_diags.py @@ -156,18 +156,23 @@ class DiskObj(): items = self.smart_attributes.items() for k, v in items: if k in ATTRIBUTES[attr_type]: - if 'Error' not in ATTRIBUTES[attr_type][k]: - # Only worried about error thresholds + if not ATTRIBUTES[attr_type][k]['Error']: + # Informational attribute, skip continue - if ATTRIBUTES[attr_type][k].get('Ignore', False): + if ATTRIBUTES[attr_type][k]['Ignore']: # Attribute is non-failing, skip continue if v['raw'] >= ATTRIBUTES[attr_type][k]['Error']: - self.disk_ok = False + if (ATTRIBUTES[attr_type][k]['Maximum'] + and v['raw'] >= ATTRIBUTES[attr_type][k]['Maximum']): + # Non-standard value, skip + continue + else: + self.disk_ok = False - # Disable override if necessary - override_disabled |= ATTRIBUTES[attr_type][k].get( - 'Critical', False) + # Disable override if necessary + override_disabled |= ATTRIBUTES[attr_type][k].get( + 'Critical', False) # SMART overall assessment ## NOTE: Only fail drives if the overall value exists and reports failed @@ -262,10 +267,12 @@ class DiskObj(): n=v['name'][:28]) # Set color - for _t, _c in [['Warning', 'YELLOW'], ['Error', 'RED']]: - if _t in ATTRIBUTES[attr_type][k]: + for _t, _c in ATTRIBUTE_COLORS: + if ATTRIBUTES[attr_type][k][_t]: if v['raw'] >= ATTRIBUTES[attr_type][k][_t]: _color = COLORS[_c] + if _t == 'Maximum': + _note = '(invalid?)' # 199/C7 warning if str(k) == '199' and v['raw'] > 0: diff --git a/.bin/Scripts/settings/hw_diags.py b/.bin/Scripts/settings/hw_diags.py index a5b718ef..877088db 100644 --- a/.bin/Scripts/settings/hw_diags.py +++ b/.bin/Scripts/settings/hw_diags.py @@ -1,5 +1,7 @@ # Wizard Kit: Settings - HW Diagnostics +from collections import OrderedDict + # General OVERRIDES_FORCED = False OVERRIDES_LIMITED = True # If True this disables OVERRIDE_FORCED @@ -67,25 +69,30 @@ IO_VARS = { # Tests: NVMe/SMART ATTRIBUTES = { 'NVMe': { - 'critical_warning': {'Error': 1, 'Critical': True}, - 'media_errors': {'Error': 1, 'Critical': True}, - 'power_on_hours': {'Warning': 12000, 'Error': 26298, 'Ignore': True}, - 'unsafe_shutdowns': {'Warning': 1}, + 'critical_warning': {'Critical': True, 'Ignore': False, 'Warning': None, 'Error': 1, 'Maximum': None, }, + 'media_errors': {'Critical': True, 'Ignore': False, 'Warning': None, 'Error': 1, 'Maximum': None, }, + 'power_on_hours': {'Critical': False, 'Ignore': True, 'Warning': 17532, 'Error': 26298, 'Maximum': None, }, + 'unsafe_shutdowns': {'Critical': False, 'Ignore': True, 'Warning': 1, 'Error': None, 'Maximum': None, }, }, 'SMART': { - 5: {'Hex': '05', 'Error': 1, 'Critical': True}, - 9: {'Hex': '09', 'Warning': 12000, 'Error': 26298, 'Ignore': True}, - 10: {'Hex': '0A', 'Error': 1}, - 184: {'Hex': 'B8', 'Error': 1}, - 187: {'Hex': 'BB', 'Error': 1}, - 188: {'Hex': 'BC', 'Error': 1}, - 196: {'Hex': 'C4', 'Error': 1}, - 197: {'Hex': 'C5', 'Error': 1, 'Critical': True}, - 198: {'Hex': 'C6', 'Error': 1, 'Critical': True}, - 199: {'Hex': 'C7', 'Error': 1, 'Ignore': True}, - 201: {'Hex': 'C9', 'Error': 1}, + 5: {'Hex': '05', 'Critical': True, 'Ignore': False, 'Warning': None, 'Error': 1, 'Maximum': None, }, + 9: {'Hex': '09', 'Critical': False, 'Ignore': True, 'Warning': 17532, 'Error': 26298, 'Maximum': None, }, + 10: {'Hex': '10', 'Critical': False, 'Ignore': False, 'Warning': 1, 'Error': 10, 'Maximum': 10000, }, + 184: {'Hex': 'B8', 'Critical': False, 'Ignore': False, 'Warning': 1, 'Error': 10, 'Maximum': 10000, }, + 187: {'Hex': 'BB', 'Critical': False, 'Ignore': False, 'Warning': 1, 'Error': 10, 'Maximum': 10000, }, + 188: {'Hex': 'BC', 'Critical': False, 'Ignore': False, 'Warning': 1, 'Error': 10, 'Maximum': 10000, }, + 196: {'Hex': 'C4', 'Critical': False, 'Ignore': False, 'Warning': 1, 'Error': 10, 'Maximum': 10000, }, + 197: {'Hex': 'C5', 'Critical': True, 'Ignore': False, 'Warning': None, 'Error': 1, 'Maximum': None, }, + 198: {'Hex': 'C6', 'Critical': True, 'Ignore': False, 'Warning': None, 'Error': 1, 'Maximum': None, }, + 199: {'Hex': 'C7', 'Critical': False, 'Ignore': True, 'Warning': None, 'Error': 1, 'Maximum': None, }, + 201: {'Hex': 'C9', 'Critical': False, 'Ignore': False, 'Warning': None, 'Error': 1, 'Maximum': 10000, }, }, } +ATTRIBUTE_COLORS = ( + ('Error', 'RED'), + ('Maximum', 'PURPLE'), + ('Warning', 'YELLOW'), + ) KEY_NVME = 'nvme_smart_health_information_log' KEY_SMART = 'ata_smart_attributes'