From f9e933bd2b400c1b79b5caa86088de6a7b754a1a Mon Sep 17 00:00:00 2001
From: anima
Date: Mon, 10 Feb 2025 01:29:20 +0100
Subject: [PATCH] add raid status check
---
checks/check_snmp_synology.py | 65 ++++++++++++++++++++++++++++++++++-
1 file changed, 64 insertions(+), 1 deletion(-)
diff --git a/checks/check_snmp_synology.py b/checks/check_snmp_synology.py
index e878869..f5132ec 100755
--- a/checks/check_snmp_synology.py
+++ b/checks/check_snmp_synology.py
@@ -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())