mikroman/py/libs/check_routeros/routeros_check/check/system_license.py

150 lines
5.1 KiB
Python
Raw Permalink Normal View History

# SPDX-FileCopyrightText: PhiBo DinoTools (2021)
# SPDX-License-Identifier: GPL-3.0-or-later
from datetime import datetime
from typing import List, Optional
import click
import nagiosplugin
from ..cli import cli
from ..helper import logger
from ..resource import RouterOSCheckResource
class SystemLicenseResource(RouterOSCheckResource):
name = "License"
def __init__(self, cmd_options):
super().__init__(cmd_options=cmd_options)
def days_left(value):
time_delta = self.parse_routeros_datetime(value) - datetime.now()
return int(time_delta.total_seconds()) / 60 / 60 / 24
logger.info("Fetching information ...")
call = self.api.path(
"/system/resource"
)
result = tuple(call)[0]
self.has_renewal = result["board-name"].lower() == "chr"
self.deadline_datetime: Optional[datetime] = None
self.next_renewal_datetime: Optional[datetime] = None
self._routeros_metric_values = []
if self.has_renewal:
self._routeros_metric_values += [
{"name": "level", "type": None},
{"name": "deadline-at", "dst": "deadline-in", "type": days_left, "missing_ok": True},
{"name": "next-renewal-at", "dst": "next-renewal-in", "type": days_left, "missing_ok": True},
]
else:
self._routeros_metric_values += [
{"name": "nlevel", "dst": "level", "type": None},
]
def probe(self):
logger.info("Fetching data ...")
call = self.api.path(
"/system/license"
)
result = tuple(call)[0]
if self.has_renewal:
if "deadline-at" in result:
self.deadline_datetime = self.parse_routeros_datetime(result["deadline-at"])
if "next-renewal-at" in result:
self.next_renewal_datetime = self.parse_routeros_datetime(result["next-renewal-at"])
return self.get_routeros_metric_item(result)
class SystemLicenseRenewSummary(nagiosplugin.Summary):
def ok(self, results: List[nagiosplugin.Result]):
hints = []
resource: Optional[SystemLicenseResource] = None
for result in results:
if result.resource:
resource = result.resource
if result.hint:
hints.append(result.hint)
if resource and resource.has_renewal:
if resource.next_renewal_datetime:
time_delta = resource.next_renewal_datetime - datetime.now()
hints.append(f"Next renewal in {time_delta.days} day(s) ({resource.next_renewal_datetime})")
if resource.deadline_datetime:
time_delta = resource.deadline_datetime - datetime.now()
hints.append(f"Deadline in {time_delta.days} day(s) ({resource.deadline_datetime})")
return ", ".join(hints)
class SystemLicenseLevelContext(nagiosplugin.Context):
def __init__(self, *args, levels=None, **kwargs):
self._levels = levels
super(SystemLicenseLevelContext, self).__init__(*args, **kwargs)
def evaluate(self, metric, resource):
if self._levels is None or len(self._levels) == 0 or metric.value in self._levels:
return nagiosplugin.Result(
nagiosplugin.Ok,
hint=f"License level is '{metric.value}'"
)
return nagiosplugin.Result(
nagiosplugin.Warn,
hint=f"License level '{metric.value}' not in list with allowed levels: {', '.join(self._levels)}"
)
@cli.command("system.license")
@click.option("--deadline-warning", default="28:", help="Number of days until deadline is reached (Default: '28:')")
@click.option("--deadline-critical", default="14:", help="Number of days until deadline is reached (Default: '14:')")
@click.option(
"--next-renewal-warning",
default=None,
help="Number of days until renewal is done (Default: None, Example: '-14:')"
)
@click.option("--next-renewal-critical", default=None, help="Number of days until renewal is done (Default: None)")
@click.option(
"--level",
"levels",
default=None,
multiple=True,
help="Allowed license levels. Repeat to use multiple values."
)
@click.pass_context
@nagiosplugin.guarded
def system_license(ctx, deadline_warning, deadline_critical, next_renewal_warning, next_renewal_critical, levels):
resource = SystemLicenseResource(
cmd_options=ctx.obj,
)
check = nagiosplugin.Check(resource)
if resource.has_renewal:
check.add(
nagiosplugin.ScalarContext(
name="deadline-in",
warning=deadline_warning,
critical=deadline_critical,
),
nagiosplugin.ScalarContext(
name="next-renewal-in",
warning=next_renewal_warning,
critical=next_renewal_critical,
),
SystemLicenseRenewSummary(),
)
check.add(
SystemLicenseLevelContext(
name="level",
levels=levels,
)
)
check.main(verbose=ctx.obj["verbose"])