From 0358e8b2e8e4844fda204174ab475a63630a5ea7 Mon Sep 17 00:00:00 2001 From: Marsell Kukuljevic Date: Mon, 19 May 2025 10:03:34 +0200 Subject: [PATCH] cisco-ip-sla for CheckMK 2.3.0 looks like it was never committed. Here we go! --- .../2.2}/cisco_ip_sla-1.0.1.mkp | Bin .../wato/check_parameters/cisco_ip_sla.py | 0 cisco-ip-sla/2.2/cisco_ip_sla-1.0.1.mkp | Bin 0 -> 3724 bytes .../wato/check_parameters/cisco_ip_sla.py | 208 ++++++++++++++++ .../local/share/check_mk/checks/cisco_ip_sla | 2 +- cisco-ip-sla/2.3/cisco_ip_sla-0.1.0.mkp | Bin 0 -> 3761 bytes .../wato/check_parameters/cisco_ip_sla.py | 208 ++++++++++++++++ .../local/share/check_mk/checks/cisco_ip_sla | 225 ++++++++++++++++++ 8 files changed, 642 insertions(+), 1 deletion(-) rename {cisco-ip-sla => check_mk-cisco_ip_sla/2.2}/cisco_ip_sla-1.0.1.mkp (100%) rename {cisco-ip-sla => check_mk-cisco_ip_sla/2.2}/local/lib/python3/cmk/gui/plugins/wato/check_parameters/cisco_ip_sla.py (100%) create mode 100644 cisco-ip-sla/2.2/cisco_ip_sla-1.0.1.mkp create mode 100644 cisco-ip-sla/2.2/local/lib/python3/cmk/gui/plugins/wato/check_parameters/cisco_ip_sla.py rename cisco-ip-sla/{ => 2.2}/local/share/check_mk/checks/cisco_ip_sla (99%) create mode 100755 cisco-ip-sla/2.3/cisco_ip_sla-0.1.0.mkp create mode 100644 cisco-ip-sla/2.3/local/lib/python3/cmk/gui/plugins/wato/check_parameters/cisco_ip_sla.py create mode 100644 cisco-ip-sla/2.3/local/share/check_mk/checks/cisco_ip_sla diff --git a/cisco-ip-sla/cisco_ip_sla-1.0.1.mkp b/check_mk-cisco_ip_sla/2.2/cisco_ip_sla-1.0.1.mkp similarity index 100% rename from cisco-ip-sla/cisco_ip_sla-1.0.1.mkp rename to check_mk-cisco_ip_sla/2.2/cisco_ip_sla-1.0.1.mkp diff --git a/cisco-ip-sla/local/lib/python3/cmk/gui/plugins/wato/check_parameters/cisco_ip_sla.py b/check_mk-cisco_ip_sla/2.2/local/lib/python3/cmk/gui/plugins/wato/check_parameters/cisco_ip_sla.py similarity index 100% rename from cisco-ip-sla/local/lib/python3/cmk/gui/plugins/wato/check_parameters/cisco_ip_sla.py rename to check_mk-cisco_ip_sla/2.2/local/lib/python3/cmk/gui/plugins/wato/check_parameters/cisco_ip_sla.py diff --git a/cisco-ip-sla/2.2/cisco_ip_sla-1.0.1.mkp b/cisco-ip-sla/2.2/cisco_ip_sla-1.0.1.mkp new file mode 100644 index 0000000000000000000000000000000000000000..5a71703c805adda2d0d66366841120e75e7ce834 GIT binary patch literal 3724 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 literal 0 HcmV?d00001 diff --git a/cisco-ip-sla/2.2/local/lib/python3/cmk/gui/plugins/wato/check_parameters/cisco_ip_sla.py b/cisco-ip-sla/2.2/local/lib/python3/cmk/gui/plugins/wato/check_parameters/cisco_ip_sla.py new file mode 100644 index 0000000..2931e30 --- /dev/null +++ b/cisco-ip-sla/2.2/local/lib/python3/cmk/gui/plugins/wato/check_parameters/cisco_ip_sla.py @@ -0,0 +1,208 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +# Copyright (C) 2019 tribe29 GmbH - License: GNU General Public License v2 +# This file is part of Checkmk (https://checkmk.com). It is subject to the terms and +# conditions defined in the file COPYING, which is part of this source code package. + +from cmk.gui.i18n import _ +from cmk.gui.plugins.wato.utils import ( + CheckParameterRulespecWithItem, + rulespec_registry, + RulespecGroupCheckParametersNetworking, +) +from cmk.gui.valuespec import Dictionary, DropdownChoice, Integer, TextInput, Tuple + + +def _item_spec_cisco_ip_sla(): + return TextInput( + title=_("RTT row index of the service"), + allow_empty=True, + ) + + +def _parameter_valuespec_cisco_ip_sla(): + return Dictionary( + elements=[ + ( + "rtt_type", + DropdownChoice( + title=_("RTT type"), + choices=[ + ("echo", _("echo")), + ("path echo", _("path echo")), + ("file IO", _("file IO")), + ("UDP echo", _("UDP echo")), + ("TCP connect", _("TCP connect")), + ("HTTP", _("HTTP")), + ("DNS", _("DNS")), + ("jitter", _("jitter")), + ("DLSw", _("DLSw")), + ("DHCP", _("DHCP")), + ("FTP", _("FTP")), + ("VoIP", _("VoIP")), + ("RTP", _("RTP")), + ("LSP group", _("LSP group")), + ("ICMP jitter", _("ICMP jitter")), + ("LSP ping", _("LSP ping")), + ("LSP trace", _("LSP trace")), + ("ethernet ping", _("ethernet ping")), + ("ethernet jitter", _("ethernet jitter")), + ("LSP ping pseudowire", _("LSP ping pseudowire")), + ], + default_value="echo", + ), + ), + ( + "threshold", + Integer( + title=_("Treshold"), + help=_( + "Depending on the precision the unit can be " + "either milliseconds or micoseconds." + ), + unit=_("ms/us"), + minvalue=1, + default_value=5000, + ), + ), + ( + "state", + DropdownChoice( + title=_("State"), + choices=[ + ("active", _("active")), + ("inactive", _("inactive")), + ("reset", _("reset")), + ("orderly stop", _("orderly stop")), + ("immediate stop", _("immediate stop")), + ("pending", _("pending")), + ("restart", _("restart")), + ], + default_value="active", + ), + ), + ( + "connection_lost_occured", + DropdownChoice( + title=_("Connection lost occured"), + choices=[ + ("yes", _("yes")), + ("no", _("no")), + ], + default_value="no", + ), + ), + ( + "timeout_occured", + DropdownChoice( + title=_("Timeout occured"), + choices=[ + ("yes", _("yes")), + ("no", _("no")), + ], + default_value="no", + ), + ), + ( + "completion_time_over_treshold_occured", + DropdownChoice( + title=_("Completion time over treshold occured"), + choices=[ + ("yes", _("yes")), + ("no", _("no")), + ], + default_value="no", + ), + ), + ( + "latest_rtt_completion_time", + Tuple( + title=_("Latest RTT completion time"), + help=_( + "Depending on the precision the unit can be " + "either milliseconds or micoseconds." + ), + elements=[ + Integer( + title=_("Warning at"), + unit=_("ms/us"), + minvalue=1, + default_value=100, + ), + Integer( + title=_("Critical at"), + unit=_("ms/us"), + minvalue=1, + default_value=200, + ), + ], + ), + ), + ( + "latest_rtt_state", + DropdownChoice( + title=_("Latest RTT state"), + choices=[ + ("ok", _("OK")), + ("disconnected", _("disconnected")), + ("over treshold", _("over treshold")), + ("timeout", _("timeout")), + ("other", _("other")), + ], + default_value="ok", + ), + ), + ( + "packets_lost_src->dest", + Tuple( + title=_("Packets lost src->dest"), + elements=[ + Integer( + title=_("Warning at"), + unit=_("packets"), + minvalue=1, + default_value=100, + ), + Integer( + title=_("Critical at"), + unit=_("packets"), + minvalue=1, + default_value=1000, + ), + ], + ), + ), + ( + "packets_lost_dest->src", + Tuple( + title=_("Packets lost dest->src"), + elements=[ + Integer( + title=_("Warning at"), + unit=_("packets"), + minvalue=1, + default_value=100, + ), + Integer( + title=_("Critical at"), + unit=_("packets"), + minvalue=1, + default_value=1000, + ), + ], + ), + ), + ], + ) + + +rulespec_registry.register( + CheckParameterRulespecWithItem( + check_group_name="cisco_ip_sla", + group=RulespecGroupCheckParametersNetworking, + item_spec=_item_spec_cisco_ip_sla, + match_type="dict", + parameter_valuespec=_parameter_valuespec_cisco_ip_sla, + title=lambda: _("Cisco IP SLA"), + ) +) diff --git a/cisco-ip-sla/local/share/check_mk/checks/cisco_ip_sla b/cisco-ip-sla/2.2/local/share/check_mk/checks/cisco_ip_sla similarity index 99% rename from cisco-ip-sla/local/share/check_mk/checks/cisco_ip_sla rename to cisco-ip-sla/2.2/local/share/check_mk/checks/cisco_ip_sla index 66db9fa..15ace06 100644 --- a/cisco-ip-sla/local/share/check_mk/checks/cisco_ip_sla +++ b/cisco-ip-sla/2.2/local/share/check_mk/checks/cisco_ip_sla @@ -161,7 +161,7 @@ def check_cisco_ip_sla(_item, params, data): if state: infotext += " (warn/crit at %s/%s)" % (warn, crit) - if unit == "ms/us": + if unit == "ms" or unit == "us" or unit == "ms/us": factor = 1e3 if unit == "ms" else 1e6 perfdata = [ ("rtt", value / factor, warn / factor, crit / factor) diff --git a/cisco-ip-sla/2.3/cisco_ip_sla-0.1.0.mkp b/cisco-ip-sla/2.3/cisco_ip_sla-0.1.0.mkp new file mode 100755 index 0000000000000000000000000000000000000000..de599a0558ba108b87de69abeb00618787f769f8 GIT binary patch literal 3761 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 bP(uwh)KEhWHPleUUkv^SC_6NL0C)fZ;Vej$ literal 0 HcmV?d00001 diff --git a/cisco-ip-sla/2.3/local/lib/python3/cmk/gui/plugins/wato/check_parameters/cisco_ip_sla.py b/cisco-ip-sla/2.3/local/lib/python3/cmk/gui/plugins/wato/check_parameters/cisco_ip_sla.py new file mode 100644 index 0000000..919d003 --- /dev/null +++ b/cisco-ip-sla/2.3/local/lib/python3/cmk/gui/plugins/wato/check_parameters/cisco_ip_sla.py @@ -0,0 +1,208 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +# Copyright (C) 2019 Checkmk GmbH - License: GNU General Public License v2 +# This file is part of Checkmk (https://checkmk.com). It is subject to the terms and +# conditions defined in the file COPYING, which is part of this source code package. + +from cmk.gui.i18n import _ +from cmk.gui.plugins.wato.utils import ( + CheckParameterRulespecWithItem, + rulespec_registry, + RulespecGroupCheckParametersNetworking, +) +from cmk.gui.valuespec import Dictionary, DropdownChoice, Integer, TextInput, Tuple + + +def _item_spec_cisco_ip_sla(): + return TextInput( + title=_("RTT row index of the service"), + allow_empty=True, + ) + + +def _parameter_valuespec_cisco_ip_sla(): + return Dictionary( + elements=[ + ( + "rtt_type", + DropdownChoice( + title=_("RTT type"), + choices=[ + ("echo", _("echo")), + ("path echo", _("path echo")), + ("file IO", _("file IO")), + ("UDP echo", _("UDP echo")), + ("TCP connect", _("TCP connect")), + ("HTTP", _("HTTP")), + ("DNS", _("DNS")), + ("jitter", _("jitter")), + ("DLSw", _("DLSw")), + ("DHCP", _("DHCP")), + ("FTP", _("FTP")), + ("VoIP", _("VoIP")), + ("RTP", _("RTP")), + ("LSP group", _("LSP group")), + ("ICMP jitter", _("ICMP jitter")), + ("LSP ping", _("LSP ping")), + ("LSP trace", _("LSP trace")), + ("ethernet ping", _("ethernet ping")), + ("ethernet jitter", _("ethernet jitter")), + ("LSP ping pseudowire", _("LSP ping pseudowire")), + ], + default_value="echo", + ), + ), + ( + "threshold", + Integer( + title=_("Treshold"), + help=_( + "Depending on the precision the unit can be " + "either milliseconds or micoseconds." + ), + unit=_("ms/us"), + minvalue=1, + default_value=5000, + ), + ), + ( + "state", + DropdownChoice( + title=_("State"), + choices=[ + ("active", _("active")), + ("inactive", _("inactive")), + ("reset", _("reset")), + ("orderly stop", _("orderly stop")), + ("immediate stop", _("immediate stop")), + ("pending", _("pending")), + ("restart", _("restart")), + ], + default_value="active", + ), + ), + ( + "connection_lost_occured", + DropdownChoice( + title=_("Connection lost occured"), + choices=[ + ("yes", _("yes")), + ("no", _("no")), + ], + default_value="no", + ), + ), + ( + "timeout_occured", + DropdownChoice( + title=_("Timeout occured"), + choices=[ + ("yes", _("yes")), + ("no", _("no")), + ], + default_value="no", + ), + ), + ( + "completion_time_over_treshold_occured", + DropdownChoice( + title=_("Completion time over treshold occured"), + choices=[ + ("yes", _("yes")), + ("no", _("no")), + ], + default_value="no", + ), + ), + ( + "latest_rtt_completion_time", + Tuple( + title=_("Latest RTT completion time"), + help=_( + "Depending on the precision the unit can be " + "either milliseconds or micoseconds." + ), + elements=[ + Integer( + title=_("Warning at"), + unit=_("ms/us"), + minvalue=1, + default_value=100, + ), + Integer( + title=_("Critical at"), + unit=_("ms/us"), + minvalue=1, + default_value=200, + ), + ], + ), + ), + ( + "latest_rtt_state", + DropdownChoice( + title=_("Latest RTT state"), + choices=[ + ("ok", _("OK")), + ("disconnected", _("disconnected")), + ("over treshold", _("over treshold")), + ("timeout", _("timeout")), + ("other", _("other")), + ], + default_value="ok", + ), + ), + ( + "packets_lost_src->dest", + Tuple( + title=_("Packets lost src->dest"), + elements=[ + Integer( + title=_("Warning at"), + unit=_("packets"), + minvalue=1, + default_value=100, + ), + Integer( + title=_("Critical at"), + unit=_("packets"), + minvalue=1, + default_value=1000, + ), + ], + ), + ), + ( + "packets_lost_dest->src", + Tuple( + title=_("Packets lost dest->src"), + elements=[ + Integer( + title=_("Warning at"), + unit=_("packets"), + minvalue=1, + default_value=100, + ), + Integer( + title=_("Critical at"), + unit=_("packets"), + minvalue=1, + default_value=1000, + ), + ], + ), + ), + ], + ) + + +rulespec_registry.register( + CheckParameterRulespecWithItem( + check_group_name="cisco_ip_sla", + group=RulespecGroupCheckParametersNetworking, + item_spec=_item_spec_cisco_ip_sla, + match_type="dict", + parameter_valuespec=_parameter_valuespec_cisco_ip_sla, + title=lambda: _("Cisco IP SLA"), + ) +) diff --git a/cisco-ip-sla/2.3/local/share/check_mk/checks/cisco_ip_sla b/cisco-ip-sla/2.3/local/share/check_mk/checks/cisco_ip_sla new file mode 100644 index 0000000..2cf7942 --- /dev/null +++ b/cisco-ip-sla/2.3/local/share/check_mk/checks/cisco_ip_sla @@ -0,0 +1,225 @@ +#!/usr/bin/env python3 +# Copyright (C) 2019 Checkmk GmbH - License: GNU General Public License v2 +# This file is part of Checkmk (https://checkmk.com). It is subject to the terms and +# conditions defined in the file COPYING, which is part of this source code package. + + +from collections.abc import Callable, Sequence + +from cmk.base.check_api import LegacyCheckDefinition +from cmk.base.config import check_info + +from cmk.agent_based.v2 import all_of, contains, exists, OIDBytes, OIDEnd, SNMPTree + + +def parse_cisco_ip_sla(string_table): + precisions = {line[0]: "ms" if line[-1] == "1" else "us" for line in string_table[0]} + + rtt_types = { + "1": "echo", + "2": "path echo", + "3": "file IO", + "4": "script", + "5": "UDP echo", + "6": "TCP connect", + "7": "HTTP", + "8": "DNS", + "9": "jitter", + "10": "DLSw", + "11": "DHCP", + "12": "FTP", + "13": "VoIP", + "14": "RTP", + "15": "LSP group", + "16": "ICMP jitter", + "17": "LSP ping", + "18": "LSP trace", + "19": "ethernet ping", + "20": "ethernet jitter", + "21": "LSP ping pseudowire", + } + + states = { + "1": "reset", + "2": "orderly stop", + "3": "immediate stop", + "4": "pending", + "5": "inactive", + "6": "active", + "7": "restart", + } + + rtt_states = { + "0": "other", + "1": "ok", + "2": "disconnected", + "3": "over threshold", + "4": "timeout", + "5": "busy", + "6": "not connected", + "7": "dropped", + "8": "sequence error", + "9": "verify error", + "10": "application specific error", + } + + def to_ip_address(int_list): + if len(int_list) == 4: + return "%d.%d.%d.%d" % tuple(int_list) + elif len(int_list) == 6: + return "%d:%d:%d:%d:%d:%d" % tuple(int_list) + return "" + + # contains description, parse function, unit and type + contents: Sequence[tuple[tuple[str, Callable | None, str, str | None], ...]] = [ + ( # rttMonEchoAdminEntry + ("Target address", to_ip_address, "", None), + ("Source address", to_ip_address, "", None), + # rttMonEchoAdminPrecision is deliberatly dropped by zip below + ), + ( # rttMonCtrlAdminEntry + ("Owner", None, "", None), + ("Tag", None, "", None), + ("RTT type", lambda x: rtt_types.get(x, "unknown"), "", "option"), + ("Threshold", int, "ms", "option"), + ), + ( # rttMonCtrlOperEntry + ("State", lambda x: states.get(x, "unknown"), "", "option"), + ("Text", None, "", None), + ( + "Connection lost occured", + lambda x: "yes" if x == "1" else "no", + "", + "option", + ), + ("Timeout occured", lambda x: "yes" if x == "1" else "no", "", "option"), + ( + "Completion time over treshold occured", + lambda x: "yes" if x == "1" else "no", + "", + "option", + ), + ), + ( # rttMonLatestRttOperEntry + ("Latest RTT completion time", int, "ms/us", "level"), + ("Latest RTT state", lambda x: rtt_states.get(x, "unknown"), "", "option"), + ), + ( # rttMonJitterStatsEntry + ("Packets lost src->dest", int, "packets", "level"), + ("Packets lost dest->src", int, "packets", "level"), + ), + ] + + parsed: dict[str, list] = {} + for content, entries in zip(contents, string_table): + if not entries: + continue + + for entry in entries: + index, values = entry[0], entry[1:] + data = parsed.setdefault(index, []) + for (description, parser, unit, type_), value in zip(content, values): + if parser: + value = parser(value) + if unit == "ms/us": + unit = precisions[index] + data.append((description, value, unit, type_)) + + return parsed + + +def inventory_cisco_ip_sla(parsed): + for index in parsed: + yield index, {} + + +def check_cisco_ip_sla(item, params, parsed): + if not (data := parsed.get(item)): + return + for description, value, unit, type_ in data: + if not value and "packets" not in unit: + continue + + state = 0 + if unit: + infotext = f"{description}: {value} {unit}" + else: + infotext = f"{description}: {value}" + perfdata = [] + + param = params.get(description.lower().replace(" ", "_")) + + if type_ == "option": + if param and param != value: + state = 1 + infotext += " (expected %s)" % param + elif type_ == "level": + warn, crit = param # a default level hat to exist + if value >= crit: + state = 2 + elif value >= warn: + state = 1 + + if state: + infotext += f" (warn/crit at {warn}/{crit})" + + # last check ("ms/us") is probably a harmless bug, but keeping + if unit == "ms" or unit == "us" or unit == "ms/us": + factor = 1e3 if unit == "ms" else 1e6 + perfdata = [ + ("rtt", value / factor, warn / factor, crit / factor) + ] # fixed: true-division + elif unit == "packets": + perfdata = [ + ("lost", value, warn, crit) + ] + + yield state, infotext, perfdata + + +check_info["cisco_ip_sla"] = LegacyCheckDefinition( + detect=all_of( + contains(".1.3.6.1.2.1.1.1.0", "cisco"), + contains(".1.3.6.1.2.1.1.1.0", "ios"), + exists(".1.3.6.1.4.1.9.9.42.1.2.2.1.37.*"), + ), + fetch=[ + SNMPTree( + base=".1.3.6.1.4.1.9.9.42.1.2.2.1", + oids=[OIDEnd(), OIDBytes("2"), OIDBytes("6"), "37"], + ), + SNMPTree( + base=".1.3.6.1.4.1.9.9.42.1.2.1.1", + oids=[OIDEnd(), "2", "3", "4", "5"], + ), + SNMPTree( + base=".1.3.6.1.4.1.9.9.42.1.2.9.1", + oids=[OIDEnd(), "10", "2", "5", "6", "7"], + ), + SNMPTree( + base=".1.3.6.1.4.1.9.9.42.1.2.10.1", + oids=[OIDEnd(), "1", "2"], + ), + SNMPTree( + base=".1.3.6.1.4.1.9.9.42.1.5.2.1", + # rttMonLatestJitterOperPacketLossSD + # rttMonLatestJitterOperPacketLossDS + oids=[OIDEnd(), "26", "27"], + ), + ], + parse_function=parse_cisco_ip_sla, + service_name="Cisco IP SLA %s", + discovery_function=inventory_cisco_ip_sla, + check_function=check_cisco_ip_sla, + check_ruleset_name="cisco_ip_sla", + check_default_parameters={ + "state": "active", + "connection_lost_occured": "no", + "timeout_occured": "no", + "completion_time_over_treshold_occured": "no", + "latest_rtt_completion_time": (250, 500), + "latest_rtt_state": "ok", + "packets_lost_src->dest": (100, 1000), + "packets_lost_dest->src": (100, 1000), + }, +)