From 51553be8e3aad43f13aa383cd9dacaddac120401 Mon Sep 17 00:00:00 2001
From: "th.l" <thl-cmk@outlook.com>
Date: Wed, 7 Jun 2023 10:26:30 +0200
Subject: [PATCH] update project

---
 active_check_traceroute-0.0.2-20230607.mkp | Bin 0 -> 7224 bytes
 active_check_traceroute.mkp                | Bin 7211 -> 7224 bytes
 gui/metrics/traceroute.py                  |  29 ++++
 gui/wato/active_checks_routing.py          | 176 +++++++++++++++++++++
 lib/nagios/plugins/check_traceroute        |   2 +
 packages/active_check_traceroute           |  12 +-
 6 files changed, 212 insertions(+), 7 deletions(-)
 create mode 100644 active_check_traceroute-0.0.2-20230607.mkp
 create mode 100644 gui/metrics/traceroute.py
 create mode 100644 gui/wato/active_checks_routing.py

diff --git a/active_check_traceroute-0.0.2-20230607.mkp b/active_check_traceroute-0.0.2-20230607.mkp
new file mode 100644
index 0000000000000000000000000000000000000000..a9094ace724afdaeb5df5af74dc3567a090e3b55
GIT binary patch
literal 7224
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
T|B>sm@J|FZR#Gp(2mtUuMi3K@

literal 0
HcmV?d00001

diff --git a/active_check_traceroute.mkp b/active_check_traceroute.mkp
index 92b0a170ac12c41c5166e4f06c0572cbbde79b36..a9094ace724afdaeb5df5af74dc3567a090e3b55 100644
GIT binary patch
literal 7224
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
T|B>sm@J|FZR#Gp(2mtUuMi3K@

literal 7211
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

diff --git a/gui/metrics/traceroute.py b/gui/metrics/traceroute.py
new file mode 100644
index 0000000..4178f65
--- /dev/null
+++ b/gui/metrics/traceroute.py
@@ -0,0 +1,29 @@
+#!/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  : 2021-12-04
+#
+
+from cmk.gui.i18n import _
+
+from cmk.gui.plugins.metrics.utils import (
+    metric_info,
+    perfometer_info
+
+)
+
+metric_info['hops'] = {
+    'title': _('Number of hops'),
+    'unit': 'count',
+    'color': '41/a',
+}
+
+perfometer_info.append({
+    'type': 'linear',
+    'segments': ['hops'],
+    'total': 30,
+})
diff --git a/gui/wato/active_checks_routing.py b/gui/wato/active_checks_routing.py
new file mode 100644
index 0000000..5e7c237
--- /dev/null
+++ b/gui/wato/active_checks_routing.py
@@ -0,0 +1,176 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+#
+# License: GNU General Public License v2
+#
+# original form lib/check_mk/gui/plugins/wato/active_checks.py
+#
+# Author: thl-cmk[at]outlook[dot]com
+# URL   : https://thl-cmk.hopto.org
+# Date  : 2021-12-03
+#
+# added: description, method UDP, port, destination_address, queries, max_ttl, source_interface, source_address
+#
+
+from cmk.gui.i18n import _
+from cmk.gui.valuespec import (
+    Dictionary,
+    ListOf,
+    Tuple,
+    Transform,
+    Checkbox,
+    DropdownChoice,
+    TextInput,
+    Integer,
+    TextAscii,
+)
+
+from cmk.gui.plugins.wato.utils import (
+    rulespec_registry,
+    HostRulespec,
+)
+
+from cmk.gui.plugins.wato.active_checks import (
+    RulespecGroupActiveChecks
+)
+
+
+def _ip_address_family_element():
+    return (
+        'address_family',
+        DropdownChoice(
+            title=_('IP address family'),
+            choices=[
+                (None, _('Primary address family')),
+                ('ipv4', _('Enforce IPv4')),
+                ('ipv6', _('Enforce IPv6')),
+            ],
+            default_value=None,
+        ),
+    )
+
+
+def _transform_add_address_family(v):
+    v.setdefault('address_family', None)
+    return v
+
+
+def _valuespec_active_checks_traceroute():
+    return Transform(
+        Dictionary(
+            title=_('Check current routing'),
+            help=_(
+                'This active check uses <tt>traceroute</tt> in order to determine the current '
+                'routing from the monitoring host to the target host. You can specify any number '
+                'of missing or expected routes in order to detect e.g. an (unintended) failover '
+                'to a secondary route.'
+            ),
+            elements=[
+                ('description',
+                 TextAscii(
+                     title=_('Service Description suffix'),
+                     help=_('Must be unique for every host. The service description starts always with \"Routing\".'),
+                     size=30,
+                 )),
+                ('dns',
+                 Checkbox(
+                     title=_('Name resolution'),
+                     label=_('Use DNS to convert IP addresses into hostnames'),
+                     help=_(
+                         'If you use this option, then <tt>traceroute</tt> is <b>not</b> being '
+                         'called with the option <tt>-n</tt>. That means that all IP addresses '
+                         'are tried to be converted into names. This usually adds additional '
+                         'execution time. Also DNS resolution might fail for some addresses.'
+                     ),
+                 ),),
+                _ip_address_family_element(),
+                ('routers',
+                 ListOf(
+                     Tuple(
+                         elements=[
+                             TextInput(
+                                 title=_('Router (FQDN, IP-Address)'),
+                                 allow_empty=False,
+                             ),
+                             DropdownChoice(
+                                 title=_('How'),
+                                 choices=[
+                                     ('W', _('WARN - if this router is not being used')),
+                                     ('C', _('CRIT - if this router is not being used')),
+                                     ('w', _('WARN - if this router is being used')),
+                                     ('c', _('CRIT - if this router is being used')),
+                                 ],
+                             ),
+                         ]
+                     ),
+                     title=_('Router that must or must not be used'),
+                     add_label=_('Add Condition'),
+                 ),),
+                ('method',
+                 DropdownChoice(
+                     title=_('Method of probing'),
+                     choices=[
+                         (None, _('UDP lite (default behaviour of traceroute)')),
+                         ('udp', _('UDP (without increasing the port for each probe)')),
+                         ('icmp', _('ICMP Echo Request')),
+                         ('tcp', _('TCP SYN, needs root permissions')),
+                     ],
+                     default_value='icmp',
+                 ),),
+                ('port',
+                 Integer(
+                     title=_('Port'),
+                     help=_('Set the destination port to use. It is either initial udp port value for \"default\" '
+                            'method (incremented by each probe, default is 33434), or initial seq for \"icmp\" '
+                            '(incremented as well, default from 1), or some constant destination port for other '
+                            'methods (with default of 80 for \"tcp\", 53 for \"udp\", etc.)'),
+                     maxvalue=65535,
+                     default_value=53,
+                 ),),
+                ('destination_address',
+                 TextAscii(
+                     title=_('Alternate Destination'),
+                     help=_('Path trace to alternate destination instead of \"HOSTADDRESS\".'),
+                 ),),
+                ('queries',
+                 Integer(
+                     title=_('Number of queries'),
+                     help=_('Set the number of probes per each hop. Default is 3.'),
+                     default_value=3,
+                     minvalue=1,
+                     maxvalue=10,
+                 ),),
+                ('max_ttl',
+                 Integer(
+                     title=_('Max hops'),
+                     help=_('Set the max number of hops (max TTL to be reached). Default is 30'),
+                     default_value=30,
+                     minvalue=1,
+                     maxvalue=255,
+                 ),),
+                ('source_interface',
+                 TextAscii(
+                     title=_('Source interface'),
+                     help=_('Specify a network interface to operate with. Needs root permissions.'),
+                 ),),
+                ('source_address',
+                 TextAscii(
+                     title=_('Source address'),
+                     help=_('Use source source address for outgoing packets'),
+                 ),),
+            ],
+            optional_keys=['description', 'max_ttl', 'queries', 'destination_address', 'source_address',
+                           'source_interface', 'port'],
+        ),
+        forth=_transform_add_address_family,
+    )
+
+
+rulespec_registry.register(
+    HostRulespec(
+        group=RulespecGroupActiveChecks,
+        match_type='all',
+        name='active_checks:traceroute',
+        valuespec=_valuespec_active_checks_traceroute,
+    )
+)
diff --git a/lib/nagios/plugins/check_traceroute b/lib/nagios/plugins/check_traceroute
index a483066..df5a327 100755
--- a/lib/nagios/plugins/check_traceroute
+++ b/lib/nagios/plugins/check_traceroute
@@ -18,6 +18,8 @@
 # Source address and source interface uses the 'shell=True' option in in
 # the 'subprocess.Popen' command. This is highly insecure, so be careful.
 
+# 2023-06-07: moved gui files to ~/local/lib/chek_mk/gui/plugins/...
+
 # This check does a traceroute to the specified target host
 # (usually $HOSTADDRESS$ itself) and checks which route(s) are
 # being taken. That way you can check if your preferred or
diff --git a/packages/active_check_traceroute b/packages/active_check_traceroute
index 963bc24..b8638db 100644
--- a/packages/active_check_traceroute
+++ b/packages/active_check_traceroute
@@ -28,13 +28,11 @@
                 'on Ubuntu 20.04.3 LTS.\n',
  'download_url': 'https://thl-cmk.hopto.org',
  'files': {'checks': ['check_traceroute'],
-           'lib': ['nagios/plugins/check_traceroute'],
-           'web': ['plugins/wato/active_checks_routing.py',
-                   'plugins/metrics/traceroute.py']},
+           'gui': ['metrics/traceroute.py', 'wato/active_checks_routing.py'],
+           'lib': ['nagios/plugins/check_traceroute']},
  'name': 'active_check_traceroute',
- 'num_files': 4,
  'title': 'Check Traceroute (extended)',
- 'version': '20212107.v.0.0.1b',
- 'version.min_required': '2.0.0',
- 'version.packaged': '2021.09.20',
+ 'version': '0.0.2-20230607',
+ 'version.min_required': '2.1.0b1',
+ 'version.packaged': '2.1.0p21',
  'version.usable_until': None}
\ No newline at end of file
-- 
GitLab