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())