124 lines
3.5 KiB
Python
124 lines
3.5 KiB
Python
# SPDX-FileCopyrightText: PhiBo DinoTools (2021)
|
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
|
|
|
import click
|
|
import librouteros
|
|
import librouteros.query
|
|
import nagiosplugin
|
|
|
|
from ..cli import cli
|
|
from ..context import BooleanContext
|
|
from ..helper import logger
|
|
from ..resource import RouterOSCheckResource
|
|
|
|
|
|
class InterfaceVrrpCheck(RouterOSCheckResource):
|
|
name = "VRRP"
|
|
|
|
def __init__(self, cmd_options, name, master_must):
|
|
super().__init__(cmd_options=cmd_options)
|
|
|
|
self._name = name
|
|
self.backup = None
|
|
self.disabled = None
|
|
self.enabled = None
|
|
self.invalid = None
|
|
self.master = None
|
|
self.master_must = master_must
|
|
self.running = None
|
|
|
|
def probe(self):
|
|
key_name = librouteros.query.Key("name")
|
|
api = self._connect_api()
|
|
|
|
logger.info("Fetching data ...")
|
|
call = api.path(
|
|
"/interface/vrrp"
|
|
).select(
|
|
key_name,
|
|
librouteros.query.Key("backup"),
|
|
librouteros.query.Key("disabled"),
|
|
librouteros.query.Key("invalid"),
|
|
librouteros.query.Key("master"),
|
|
librouteros.query.Key("running"),
|
|
).where(
|
|
key_name == self._name
|
|
)
|
|
results = tuple(call)
|
|
result = results[0]
|
|
|
|
self.disabled = result["disabled"]
|
|
self.enabled = not self.disabled
|
|
|
|
yield nagiosplugin.Metric(
|
|
name="disabled",
|
|
value=self.disabled,
|
|
)
|
|
|
|
if self.enabled:
|
|
for n in ("backup", "invalid", "master", "running"):
|
|
if n not in result:
|
|
continue
|
|
|
|
setattr(self, n, result[n])
|
|
yield nagiosplugin.Metric(
|
|
name=n,
|
|
value=result[n],
|
|
)
|
|
|
|
|
|
class InterfaceVrrpDisabled(BooleanContext):
|
|
def evaluate(self, metric, resource: InterfaceVrrpCheck):
|
|
if metric.value is True:
|
|
return self.result_cls(nagiosplugin.state.Warn, "VRRP is disabled", metric)
|
|
return self.result_cls(nagiosplugin.state.Ok)
|
|
|
|
|
|
class InterfaceVrrpInvalid(BooleanContext):
|
|
def evaluate(self, metric, resource: InterfaceVrrpCheck):
|
|
if metric.value is True:
|
|
return self.result_cls(
|
|
state=nagiosplugin.state.Warn,
|
|
hint="VRRP config is invalid"
|
|
)
|
|
return self.result_cls(nagiosplugin.state.Ok)
|
|
|
|
|
|
class InterfaceVrrpMaster(BooleanContext):
|
|
def evaluate(self, metric, resource: InterfaceVrrpCheck):
|
|
if not metric.value and resource.master_must:
|
|
return self.result_cls(
|
|
state=nagiosplugin.state.Warn,
|
|
hint="VRRP interface is not master"
|
|
)
|
|
return self.result_cls(nagiosplugin.state.Ok)
|
|
|
|
|
|
@cli.command("interface.vrrp")
|
|
@click.option(
|
|
"--name",
|
|
required=True,
|
|
help="The name of the VRRP interface to check",
|
|
)
|
|
@click.option(
|
|
"--master",
|
|
default=False,
|
|
help="If set the interface must be master",
|
|
)
|
|
@click.pass_context
|
|
def interface_vrrp(ctx, name, master):
|
|
"""Check the state of VRRP interfaces"""
|
|
check = nagiosplugin.Check(
|
|
InterfaceVrrpCheck(
|
|
cmd_options=ctx.obj,
|
|
name=name,
|
|
master_must=master,
|
|
),
|
|
BooleanContext("backup"),
|
|
InterfaceVrrpDisabled("disabled"),
|
|
InterfaceVrrpInvalid("invalid"),
|
|
InterfaceVrrpMaster("master"),
|
|
BooleanContext("running")
|
|
)
|
|
|
|
check.main(verbose=ctx.obj["verbose"])
|