From cc13535eee0c84a0de46008436ee7e0e3352befa Mon Sep 17 00:00:00 2001
From: OMD site cmk16x <thl-cmk@outlook.com>
Date: Thu, 9 Mar 2023 23:24:04 +0100
Subject: [PATCH] update project

---
 agent_based/cisco_fw_nat_translations.py      | 117 ++++++++++++++++++
 cisco_fw_nat_translations.mkp                 | Bin 0 -> 2557 bytes
 packages/cisco_fw_nat_translations            |  12 ++
 .../metrics/cisco_fw_nat_translations.py      |  69 +++++++++++
 web/plugins/wato/cisco_fw_nat_translations.py |  55 ++++++++
 5 files changed, 253 insertions(+)
 create mode 100644 agent_based/cisco_fw_nat_translations.py
 create mode 100644 cisco_fw_nat_translations.mkp
 create mode 100644 packages/cisco_fw_nat_translations
 create mode 100644 web/plugins/metrics/cisco_fw_nat_translations.py
 create mode 100644 web/plugins/wato/cisco_fw_nat_translations.py

diff --git a/agent_based/cisco_fw_nat_translations.py b/agent_based/cisco_fw_nat_translations.py
new file mode 100644
index 0000000..d37bd9d
--- /dev/null
+++ b/agent_based/cisco_fw_nat_translations.py
@@ -0,0 +1,117 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+#
+# License: GNU General Public License v2
+#
+# Author: thl-cmk[at]outlook[dot]com
+# URL   : https://thl-cmk.hopto.org
+# Date  : 2023-03-09
+#
+# Monitors Cisco Firewall NAT Translations
+#
+#
+# sample snmp walk
+#
+# .1.3.6.1.4.1.9.9.532.1.1.1.1.1 = Gauge32: 2
+# .1.3.6.1.4.1.9.9.532.1.1.1.2.1 = Gauge32: 2
+#
+# CISCO-NAT-EXT-MIB::cneAddrTranslationNumActive.1 = Gauge32: 2 Number of address translation entries
+# CISCO-NAT-EXT-MIB::cneAddrTranslationNumPeak.1 = Gauge32: 2 Number of address translation entries
+#
+#
+
+from typing import NamedTuple, Optional
+
+from cmk.base.plugins.agent_based.agent_based_api.v1.type_defs import (
+    DiscoveryResult,
+    CheckResult,
+    StringTable,
+)
+
+from cmk.base.plugins.agent_based.agent_based_api.v1 import (
+    register,
+    Service,
+    check_levels,
+    check_levels_predictive,
+    SNMPTree,
+    startswith,
+    contains,
+    any_of,
+)
+
+
+class CiscoFwNatTranslations(NamedTuple):
+    active: int
+    peak: int
+
+
+# [['1102', '2290']]
+def parse_cisco_fw_nat_translations(string_table: StringTable) -> Optional[CiscoFwNatTranslations]:
+    try:
+        return CiscoFwNatTranslations(
+            active=int(string_table[0][0]),
+            peak=int(string_table[0][1])
+        )
+    except IndexError:
+        return
+
+
+#  CiscoFwNatTranslations(active=1102, peak=2290)
+def discovery_cisco_fw_nat_translations(section: CiscoFwNatTranslations) -> DiscoveryResult:
+    yield Service()
+
+
+def check_cisco_fw_nat_translations(params, section: CiscoFwNatTranslations) -> CheckResult:
+    levels_upper = params.get('levels_upper', None)
+    levels_lower = params.get('levels_lower', None)
+    yield from check_levels_predictive(
+        value=section.active,
+        label='Active',
+        metric_name='fw_nat_active',
+        render_func=lambda v: str(v),
+        levels=levels_upper,
+        boundaries=(0, None),
+    ) if isinstance(levels_upper, dict) else check_levels(
+        value=section.active,
+        label='Active',
+        levels_lower=levels_lower,
+        levels_upper=levels_upper,
+        metric_name='fw_nat_active',
+        render_func=lambda v: str(v),
+    )
+
+    yield from check_levels(
+        value=section.peak,
+        label='Peak (since system startup)',
+        metric_name='fw_nat_peak',
+        render_func=lambda v: '%s' % str(v),
+    )
+
+
+register.snmp_section(
+    name='cisco_fw_nat_translations',
+    parse_function=parse_cisco_fw_nat_translations,
+    fetch=SNMPTree(
+        # CISCO-NAT-EXT-MIB::cneAddrTranslationStatsEntry
+        base='.1.3.6.1.4.1.9.9.532.1.1.1',
+        oids=[
+            '1',  # cneAddrTranslationNumActive
+            '2',  # cneAddrTranslationNumPeak
+        ]
+    ),
+    detect=any_of(
+        # startswith('.1.3.6.1.2.1.1.1.0', 'cisco adaptive security'),
+        startswith('.1.3.6.1.2.1.1.1.0', 'cisco firepower threat defense'),
+        startswith('.1.3.6.1.2.1.1.1.0', 'cisco firewall services'),
+        # contains('.1.3.6.1.2.1.1.1.0', 'cisco pix security'),
+    )
+)
+
+register.check_plugin(
+    name='cisco_fw_nat_translations',
+    service_name='Firewall NAT translations',
+    discovery_function=discovery_cisco_fw_nat_translations,
+    check_function=check_cisco_fw_nat_translations,
+    check_default_parameters={},
+    check_ruleset_name='cisco_fw_nat_translations'
+)
\ No newline at end of file
diff --git a/cisco_fw_nat_translations.mkp b/cisco_fw_nat_translations.mkp
new file mode 100644
index 0000000000000000000000000000000000000000..cb1c447e9fc83435a878274ec21a5e84bfce61ed
GIT binary patch
literal 2557
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
B@xTB8

literal 0
HcmV?d00001

diff --git a/packages/cisco_fw_nat_translations b/packages/cisco_fw_nat_translations
new file mode 100644
index 0000000..0346694
--- /dev/null
+++ b/packages/cisco_fw_nat_translations
@@ -0,0 +1,12 @@
+{'author': 'Th.L. (thl-cmk[at]outlook[dot]com)',
+ 'description': 'Monitor Cisco Firewall NAT translations\n',
+ 'download_url': 'https://thl-cmk.hopto.org',
+ 'files': {'agent_based': ['cisco_fw_nat_translations.py'],
+           'web': ['plugins/metrics/cisco_fw_nat_translations.py',
+                   'plugins/wato/cisco_fw_nat_translations.py']},
+ 'name': 'cisco_fw_nat_translations',
+ 'title': 'Cisco Firewall NAT Translations',
+ 'version': '20230309.v0.0.1',
+ 'version.min_required': '2.0.0',
+ 'version.packaged': '2.1.0p22',
+ 'version.usable_until': None}
\ No newline at end of file
diff --git a/web/plugins/metrics/cisco_fw_nat_translations.py b/web/plugins/metrics/cisco_fw_nat_translations.py
new file mode 100644
index 0000000..272eeb9
--- /dev/null
+++ b/web/plugins/metrics/cisco_fw_nat_translations.py
@@ -0,0 +1,69 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+#
+# License: GNU General Public License v2
+#
+# Author: thl-cmk[at]outlook[dot]com
+# URL   : https://thl-cmk.hopto.org
+# Date  : 2023-03-09
+#
+# Cisco Firewall NAT translations metrics plugin
+#
+
+from cmk.gui.i18n import _
+
+from cmk.gui.plugins.metrics import (
+    metric_info,
+    graph_info,
+    check_metrics,
+    perfometer_info,
+)
+
+# for predictive monitoring
+check_metrics["check_mk-cisco_fw_nat_translations"] = {
+    "predict_fw_nat_active": {"auto_graph": False},
+}
+metric_info['predict_fw_nat_active'] = {
+    'title': _('_Predicted NAT translations'),
+    'unit': 'count',
+    'color': '26/b',
+}
+#
+
+metric_info['fw_nat_active'] = {
+    'title': _('Active'),
+    'unit': 'count',
+    'color': '26/a',
+}
+
+metric_info['fw_nat_peak'] = {
+    'title': _('Peak'),
+    'unit': 'count',
+    'color': '16/a',
+}
+
+graph_info['cisco_fw_nat_translations'] = {
+    'title': _('NAT translatins'),
+    'metrics': [
+        ('predict_fw_nat_active', 'line'),
+        ('fw_nat_peak', 'line'),
+        ('fw_nat_active', 'area'),
+    ],
+    'scalars': [
+        ('fw_nat_active:crit'),  # , _('CRIT')
+        ('fw_nat_active:warn'),  # , _('WARN')
+    ],
+    'optional_metrics': [
+        'predict_fw_nat_active',
+    ],
+
+}
+
+perfometer_info.append(
+    {
+        'type': 'logarithmic',
+        'metric': 'fw_nat_active',
+        'half_value': 100000.0,
+        'exponent': 2,
+    }
+)
diff --git a/web/plugins/wato/cisco_fw_nat_translations.py b/web/plugins/wato/cisco_fw_nat_translations.py
new file mode 100644
index 0000000..a1e77fa
--- /dev/null
+++ b/web/plugins/wato/cisco_fw_nat_translations.py
@@ -0,0 +1,55 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+#
+# License: GNU General Public License v2
+#
+# Author: thl-cmk[at]outlook[dot]com
+# URL   : https://thl-cmk.hopto.org
+# Date  : 2023-03-09
+#
+# Cisco Firewall NAT translations WATO plugin
+#
+
+from cmk.gui.i18n import _
+from cmk.gui.valuespec import (
+    Dictionary,
+    Integer,
+    Tuple,
+)
+
+from cmk.gui.plugins.wato import (
+    CheckParameterRulespecWithoutItem,
+    rulespec_registry,
+    RulespecGroupCheckParametersApplications,
+    Levels,
+)
+
+
+def _parameter_valuespec_cisco_fw_nat_translations():
+    return Dictionary(elements=[
+        ('levels_upper',
+         Levels(
+             title=_('NAT translations'),
+             unit=_('Translations'),
+         )),
+        ('levels_lower',
+         Tuple(
+             help=_('This rule sets lower levels to the active number of NAT translations through the firewall. '
+                    'Will only be used if NAT translations is not predictive levels.'),
+             title=_('NAT translations lower levels'),
+             elements=[
+                 Integer(title=_('Warning if below'), unit='Translations'),
+                 Integer(title=_('Critical if below'), unit='Translations'),
+             ],
+         )),
+    ],)
+
+
+rulespec_registry.register(
+    CheckParameterRulespecWithoutItem(
+        check_group_name='cisco_fw_nat_translations',
+        group=RulespecGroupCheckParametersApplications,
+        match_type='dict',
+        parameter_valuespec=_parameter_valuespec_cisco_fw_nat_translations,
+        title=lambda: _('Firewall NAT translatins'),
+    ))
-- 
GitLab