add raid status check

This commit is contained in:
2025-02-10 01:29:20 +01:00
parent 47a7c1f95d
commit f9e933bd2b

View File

@@ -8,7 +8,7 @@
- https://easysnmp.readthedocs.io/en/latest/session_api.html
"""
__version__ = '0.12.0'
__version__ = '0.13.0'
__author__ = 'anima'
# imports
@@ -578,6 +578,63 @@ class SNMPSynologyRaidSpaceResource(nagiosplugin.Resource, SNMPSynologyRaid):
self.session = session
class SNMPSynologyRaidStatusResource(nagiosplugin.Resource, SNMPSynologyRaid):
def __init__(self, session) -> None:
self.session = session
def probe(self) -> list:
"""check staus and health of all raids
Returns:
Generator[nagisplugin.Metric]: multiple metric elements (yield)
"""
raids = self.get_raids()
for raid in raids:
yield nagiosplugin.Metric(name=raid['name'], value=raid, context='raid_status_context')
class SNMPSynologyRaidStatusContext(nagiosplugin.Context):
def __init__(self, name):
super().__init__(name, fmt_metric='{name} is', result_cls=SNMPSynologyRaidStatusResult)
def evaluate(self, metric, resource):
if metric.value['status'] in ['12', '18']:
return self.result_cls(nagiosplugin.Critical, "critical", metric)
elif metric.value['status'] in range(2,21):
return self.result_cls(nagiosplugin.Warn, "warning", metric)
elif metric.value['status'] == '1':
return self.result_cls(nagiosplugin.Ok, "ok", metric)
return self.result_cls(nagiosplugin.Unknown, "unknown", metric)
class SNMPSynologyRaidStatusResult(nagiosplugin.Result):
def __str__(self):
if self.metric.value['status'] == '1': status = 'Normal'
elif self.metric.value['status'] == '2': status = 'Repairing'
elif self.metric.value['status'] == '3': status = 'Migrating'
elif self.metric.value['status'] == '4': status = 'Expanding'
elif self.metric.value['status'] == '5': status = 'Deleting'
elif self.metric.value['status'] == '6': status = 'Creating'
elif self.metric.value['status'] == '7': status = 'RaidSyncing'
elif self.metric.value['status'] == '8': status = 'RaidParityChecking'
elif self.metric.value['status'] == '9': status = 'RaidAssembling'
elif self.metric.value['status'] == '10': status = 'Canceling'
elif self.metric.value['status'] == '11': status = 'Degrade'
elif self.metric.value['status'] == '12': status = 'Crashed'
elif self.metric.value['status'] == '13': status = 'DataScrubbing'
elif self.metric.value['status'] == '14': status = 'RaidDeploying'
elif self.metric.value['status'] == '15': status = 'RaidUnDeploying'
elif self.metric.value['status'] == '16': status = 'RaidMountCache'
elif self.metric.value['status'] == '17': status = 'RaidUnmountCache'
elif self.metric.value['status'] == '18': status = 'RaidExpandingUnnishedSHR'
elif self.metric.value['status'] == '19': status = 'RaidConvertSHRToPool'
elif self.metric.value['status'] == '20': status = 'RaidMigrateSHR1ToSHR2'
elif self.metric.value['status'] == '21': status = 'RaidUnknownStatus'
else: status = 'unknown'
return f'{self.metric.name} is in status {status}!'
#
# Arguments
#
@@ -611,6 +668,7 @@ def parse_args() -> argparse.Namespace:
'disk_life',
'disk_sectors',
'raid',
'raid_space',
],
help='check mode to run')
@@ -718,6 +776,11 @@ def main():
nagiosplugin.Summary())
check.name = "Disk BadSectors"
case 'raid':
check = nagiosplugin.Check(SNMPSynologyRaidStatusResource(session=session),
SNMPSynologyRaidStatusContext(name='raid_status_context'),
SNMPSynologySummary())
check.name = "Raid status"
case 'raid_space':
check = nagiosplugin.Check(SNMPSynologyRaidSpaceResource(session=session),
nagiosplugin.ScalarContext(name='raid_space_scalar_context', warning=args.warning, critical=args.critical),
nagiosplugin.Summary())