add disk health check
This commit is contained in:
@@ -8,7 +8,7 @@
|
|||||||
- https://easysnmp.readthedocs.io/en/latest/session_api.html
|
- https://easysnmp.readthedocs.io/en/latest/session_api.html
|
||||||
"""
|
"""
|
||||||
|
|
||||||
__version__ = '0.9.0'
|
__version__ = '0.10.0'
|
||||||
__author__ = 'anima'
|
__author__ = 'anima'
|
||||||
|
|
||||||
# imports
|
# imports
|
||||||
@@ -126,6 +126,26 @@ class SNMPSynologyDisk():
|
|||||||
return disks
|
return disks
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# Synology General Summary
|
||||||
|
#
|
||||||
|
|
||||||
|
class SNMPSynologySummary(nagiosplugin.Summary):
|
||||||
|
def verbose(self, results):
|
||||||
|
result_str = ''
|
||||||
|
for result in results:
|
||||||
|
result_str += f'{str(result)}\n'
|
||||||
|
return result_str
|
||||||
|
|
||||||
|
def ok(self, results):
|
||||||
|
return
|
||||||
|
|
||||||
|
def problem(self, results):
|
||||||
|
return
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Synology [DSM & DSM UC] System partition status.
|
# Synology [DSM & DSM UC] System partition status.
|
||||||
#
|
#
|
||||||
@@ -275,20 +295,6 @@ class SNMPSynologyFansResult(nagiosplugin.Result):
|
|||||||
return f'{self.metric.name} fan is in status {status}!'
|
return f'{self.metric.name} fan is in status {status}!'
|
||||||
|
|
||||||
|
|
||||||
class SNMPSynologyFansSummary(nagiosplugin.Summary):
|
|
||||||
def verbose(self, results):
|
|
||||||
result_str = ''
|
|
||||||
for result in results:
|
|
||||||
result_str += f'{str(result)}\n'
|
|
||||||
return result_str
|
|
||||||
|
|
||||||
def ok(self, results):
|
|
||||||
return
|
|
||||||
|
|
||||||
def problem(self, results):
|
|
||||||
return
|
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Synology [DSM & DSM UC] Checks whether a new version or update of DSM is available
|
# Synology [DSM & DSM UC] Checks whether a new version or update of DSM is available
|
||||||
#
|
#
|
||||||
@@ -381,6 +387,75 @@ class SNMPSynologyMemoryResource(nagiosplugin.Resource):
|
|||||||
self.session = session
|
self.session = session
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# Synology [DSM & DSM UC] Checks disks
|
||||||
|
#
|
||||||
|
class SNMPSynologyDiskHealthResource(nagiosplugin.Resource, SNMPSynologyDisk):
|
||||||
|
def __init__(self, session) -> None:
|
||||||
|
self.session = session
|
||||||
|
|
||||||
|
def probe(self) -> list:
|
||||||
|
"""check staus and health of all disks
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
Generator[nagisplugin.Metric]: multiple metric elements (yield)
|
||||||
|
"""
|
||||||
|
disks = self.get_disks()
|
||||||
|
for disk in disks:
|
||||||
|
yield nagiosplugin.Metric(name=disk['id'], value=disk, context='disk_status_context')
|
||||||
|
yield nagiosplugin.Metric(name=disk['id'], value=disk, context='disk_health_context')
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class SNMPSynologyDiskStatusContext(nagiosplugin.Context):
|
||||||
|
def __init__(self, name):
|
||||||
|
super().__init__(name, fmt_metric='{name} is', result_cls=SNMPSynologyDiskStatusResult)
|
||||||
|
|
||||||
|
def evaluate(self, metric, resource):
|
||||||
|
if metric.value['status'] in ['4', '5']:
|
||||||
|
return self.result_cls(nagiosplugin.Critical, "critical", metric)
|
||||||
|
elif metric.value['status'] in ['2', '3']:
|
||||||
|
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 SNMPSynologyDiskStatusResult(nagiosplugin.Result):
|
||||||
|
def __str__(self):
|
||||||
|
if self.metric.value['status'] == '1': status = 'Normal'
|
||||||
|
elif self.metric.value['status'] == '2': status = 'Initialized'
|
||||||
|
elif self.metric.value['status'] == '3': status = 'NotInitialized'
|
||||||
|
elif self.metric.value['status'] == '4': status = 'SystemPartitionFailed'
|
||||||
|
elif self.metric.value['status'] == '5': status = 'Crashed'
|
||||||
|
else: status = 'unknown'
|
||||||
|
return f'{self.metric.name} (role: {self.metric.value["role"]}) is in status {status}!'
|
||||||
|
|
||||||
|
|
||||||
|
class SNMPSynologyDiskHealthContext(nagiosplugin.Context):
|
||||||
|
def __init__(self, name):
|
||||||
|
super().__init__(name, fmt_metric='{name} is', result_cls=SNMPSynologyDiskHealthResult)
|
||||||
|
|
||||||
|
def evaluate(self, metric, resource):
|
||||||
|
if metric.value['health'] in ['3', '4']:
|
||||||
|
return self.result_cls(nagiosplugin.Critical, "critical", metric)
|
||||||
|
elif metric.value['health'] == '2':
|
||||||
|
return self.result_cls(nagiosplugin.Warn, "warning", metric)
|
||||||
|
elif metric.value['health'] == '1':
|
||||||
|
return self.result_cls(nagiosplugin.Ok, "ok", metric)
|
||||||
|
return self.result_cls(nagiosplugin.Unknown, "unknown", metric)
|
||||||
|
|
||||||
|
|
||||||
|
class SNMPSynologyDiskHealthResult(nagiosplugin.Result):
|
||||||
|
def __str__(self):
|
||||||
|
if self.metric.value['health'] == '1': status = 'Normal'
|
||||||
|
elif self.metric.value['health'] == '2': status = 'Warning'
|
||||||
|
elif self.metric.value['health'] == '3': status = 'Critical'
|
||||||
|
elif self.metric.value['health'] == '4': status = 'Failing'
|
||||||
|
else: status = 'unknown'
|
||||||
|
return f'Health of {self.metric.name} is in status {status}!'
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Arguments
|
# Arguments
|
||||||
#
|
#
|
||||||
@@ -472,7 +547,7 @@ def main():
|
|||||||
case 'fans':
|
case 'fans':
|
||||||
check = nagiosplugin.Check(SNMPSynologyFansResource(session=session),
|
check = nagiosplugin.Check(SNMPSynologyFansResource(session=session),
|
||||||
SNMPSynologyFansContext(name='fan_context'),
|
SNMPSynologyFansContext(name='fan_context'),
|
||||||
SNMPSynologyFansSummary())
|
SNMPSynologySummary())
|
||||||
check.name = "Fans Status"
|
check.name = "Fans Status"
|
||||||
case 'firmware':
|
case 'firmware':
|
||||||
check = nagiosplugin.Check(SNMPSynologyFirmwareResource(session=session),
|
check = nagiosplugin.Check(SNMPSynologyFirmwareResource(session=session),
|
||||||
@@ -490,10 +565,11 @@ def main():
|
|||||||
nagiosplugin.Summary())
|
nagiosplugin.Summary())
|
||||||
check.name = "Memory Usage"
|
check.name = "Memory Usage"
|
||||||
case 'disk':
|
case 'disk':
|
||||||
# check = nagiosplugin.Check(SNMPSynologyDiskResource(session=session),
|
check = nagiosplugin.Check(SNMPSynologyDiskHealthResource(session=session),
|
||||||
# nagiosplugin.ScalarContext(name='memory_scalar_context', warning=args.warning, critical=args.critical),
|
SNMPSynologyDiskHealthContext(name='disk_health_context'),
|
||||||
# nagiosplugin.Summary())
|
SNMPSynologyDiskStatusContext(name='disk_status_context'),
|
||||||
# check.name = "Memory Usage"
|
SNMPSynologySummary())
|
||||||
|
check.name = "Disk Health"
|
||||||
pass
|
pass
|
||||||
case _:
|
case _:
|
||||||
raise nagiosplugin.CheckError(f'Unknown check mode: {args.check_mode}')
|
raise nagiosplugin.CheckError(f'Unknown check mode: {args.check_mode}')
|
||||||
|
|||||||
Reference in New Issue
Block a user