From 177ac39750f2a8d1dfbcba7e6a5039b9b078081d Mon Sep 17 00:00:00 2001
From: "th.l" <thl-cmk@outlook.com>
Date: Sat, 4 Dec 2021 15:13:13 +0100
Subject: [PATCH] update project

---
 active_check_traceroute.mkp               | Bin 7416 -> 7461 bytes
 checks/check_traceroute                   |   2 +
 lib/nagios/plugins/check_traceroute       | 111 +++++++++++-----------
 web/plugins/wato/active_checks_routing.py |   3 +-
 4 files changed, 60 insertions(+), 56 deletions(-)

diff --git a/active_check_traceroute.mkp b/active_check_traceroute.mkp
index eee1be96fd4510bf650e8f20aa5482d6fd5a576c..28e019ea7e1fceae1d73491f29a632014bec5a03 100644
GIT binary patch
literal 7461
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

literal 7416
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
A5&!@I

diff --git a/checks/check_traceroute b/checks/check_traceroute
index a0eec4b..634783a 100644
--- a/checks/check_traceroute
+++ b/checks/check_traceroute
@@ -15,6 +15,8 @@ def check_traceroute_arguments(params):
         args.append('-I')
     elif method == 'tcp':
         args.append('-T')
+    elif method == 'udp':
+        args.append('-U')
     # else: None -> default method
 
     for router, state in params['routers']:
diff --git a/lib/nagios/plugins/check_traceroute b/lib/nagios/plugins/check_traceroute
index e59d9df..3771dc5 100755
--- a/lib/nagios/plugins/check_traceroute
+++ b/lib/nagios/plugins/check_traceroute
@@ -12,10 +12,11 @@
 # - max hops
 # - queries per hop
 # - source address
-# - source interface (needs root permissions).
+# - source interface (needs root permissions)
+# - method UDP (default is UDP lite)
 #
-# Source address and source interface uses the "shell=True" option in in
-# the "subprocess.Popen" command. This is highly insecure, so be careful.
+# Source address and source interface uses the 'shell=True' option in in
+# the 'subprocess.Popen' command. This is highly insecure, so be careful.
 
 # This check does a traceroute to the specified target host
 # (usually $HOSTADDRESS$ itself) and checks which route(s) are
@@ -81,41 +82,41 @@ class ExecutionError(Exception):
 
 def parse_exception(exc):
     exc = str(exc)
-    if exc[0] == "{":
-        exc = "%d - %s" % list(ast.literal_eval(exc).values())[0]
+    if exc[0] == '{':
+        exc = '%d - %s' % list(ast.literal_eval(exc).values())[0]
     return str(exc)
 
 
 def output_check_result(s, perfdata):
     if perfdata:
-        perfdata_output_entries = ["%s=%s" % (p[0], ";".join(map(str, p[1:]))) for p in perfdata]
-        s += " | %s" % " ".join(perfdata_output_entries)
-    sys.stdout.write("%s\n" % s)
+        perfdata_output_entries = ['%s=%s' % (p[0], ';'.join(map(str, p[1:]))) for p in perfdata]
+        s += ' | %s' % ' '.join(perfdata_output_entries)
+    sys.stdout.write('%s\n' % s)
 
 
 def option_to_state(c):
-    return {"w": 1, "c": 2}[c.lower()]
+    return {'w': 1, 'c': 2}[c.lower()]
 
 
 def _execute_traceroute(target, nodns, method, address_family, queries, max_ttl, port, source_addr, source_int):
-    cmd = ["traceroute"]
+    cmd = ['traceroute']
     if nodns:
-        cmd.append("-n")
+        cmd.append('-n')
     if method:
         cmd.append(method)
     if address_family:
         cmd.append(address_family)
-    if port and method != "-I":
-        cmd.append(f"-p {port}")
+    if port and method != '-I':
+        cmd.append(f'-p {port}')
     if queries:
-        cmd.append(f"-q {queries}")
+        cmd.append(f'-q {queries}')
     if max_ttl:
-        cmd.append(f"-m {max_ttl}")
+        cmd.append(f'-m {max_ttl}')
     if source_int:
-        cmd.append(f"-i {source_int}")
+        cmd.append(f'-i {source_int}')
 
     if source_addr:
-        cmd.append(f"-s {source_addr}")
+        cmd.append(f'-s {source_addr}')
 
     cmd.append(target)
 
@@ -125,10 +126,10 @@ def _execute_traceroute(target, nodns, method, address_family, queries, max_ttl,
     else:
         shell = False
 
-    p = subprocess.Popen(args=cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, encoding="utf8", shell=shell)
+    p = subprocess.Popen(args=cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, encoding='utf8', shell=shell)
     sto, ste = p.communicate()
     if p.returncode:
-        raise ExecutionError("UNKNOWN - " + ste.replace("\n", " "))
+        raise ExecutionError('UNKNOWN - ' + ste.replace('\n', ' '))
     return sto
 
 
@@ -140,7 +141,7 @@ def check_traceroute(lines, routes):
         parts = line.strip().split()
         for part in parts:
             try:
-                part = part.lstrip("(").rstrip(",").rstrip(")")
+                part = part.lstrip('(').rstrip(',').rstrip(')')
                 ipaddress.ip_interface(part)
                 routers.add(part)
             except ValueError:
@@ -153,24 +154,24 @@ def check_traceroute(lines, routes):
         s = option_to_state(option)
         if option.islower() and route in routers:
             state = max(state, s)
-            bad_routers.append("%s(%s)" % (route, "!" * s))
+            bad_routers.append('%s(%s)' % (route, '!' * s))
         elif option.isupper() and route not in routers:
             state = max(state, s)
-            missing_routers.append("%s(%s)" % (route, "!" * s))
+            missing_routers.append('%s(%s)' % (route, '!' * s))
 
-    info_text = "%d hops, missing routers: %s, bad routers: %s" % (
+    info_text = '%d hops, missing routers: %s, bad routers: %s' % (
         hops,
-        missing_routers and ", ".join(missing_routers) or "none",
-        bad_routers and ", ".join(bad_routers) or "none",
+        missing_routers and ', '.join(missing_routers) or 'none',
+        bad_routers and ', '.join(bad_routers) or 'none',
     )
-    perfdata = [("hops", hops)]
+    perfdata = [('hops', hops)]
     return state, info_text, perfdata
 
 
 def validate_ip_version(address_arg, ip_version_arg):
     # ipv6 address can have an appended interface index/name: 'fe80::%{interface}'
     try:
-        ip_address_version = ipaddress.ip_interface(address_arg.split("%")[0]).ip.version
+        ip_address_version = ipaddress.ip_interface(address_arg.split('%')[0]).ip.version
     except ValueError:
         # May be a host or DNS name, don't execute the validation in this case.
         # check_traceroute will perform the name resolution for us.
@@ -178,14 +179,13 @@ def validate_ip_version(address_arg, ip_version_arg):
 
     if not ip_address_version == ip_version_arg:
         raise ProtocolVersionError(
-            'IP protocol version "%s" not the same as the IP address version "%s".'
-            % (ip_version_arg, ip_address_version)
+            f'IP protocol version "{ip_version_arg}" not the same as the IP address version "{ip_address_version}".'
         )
 
 
 def usage():
     sys.stdout.write(
-        """check_traceroute -{c|w|C|W} ROUTE  [-{o|c|w|O|C|W} ROUTE...] TARGET
+        '''check_traceroute -{c|w|C|W} ROUTE  [-{o|c|w|O|C|W} ROUTE...] TARGET
 
 Check by which routes TARGET is being reached. Each possible route is being
 prefixed with a state option:
@@ -202,6 +202,7 @@ Other options:
  -n             disable reverse DNS lookups
  -I             Use ICMP ECHO for probes
  -T             Use TCP SYN for probes
+ -U             Uses UDP without increasing the port per each probe
  -4             Use IPv4
  -6             Use IPv6
  -p port        Set the destination port to use
@@ -210,7 +211,7 @@ Other options:
  -i device      Specify a network interface to operate with
  -q nqueries    Set the number of probes per each hop. Default is 3
 
-"""
+'''
     )
 
 
@@ -218,7 +219,7 @@ def main(args=None):
     if args is None:
         args = sys.argv[1:]
 
-    os.unsetenv("LANG")
+    os.unsetenv('LANG')
 
     opt_verbose = 0
     opt_debug = False
@@ -231,11 +232,11 @@ def main(args=None):
     opt_queries = None
     opt_max_ttl = None
 
-    short_options = "hw:W:c:C:i:s:p:q:m:nTI46"
+    short_options = 'hw:W:c:C:i:s:p:q:m:nTIU46'
     long_options = [
-        "verbose",
-        "help",
-        "debug",
+        'verbose',
+        'help',
+        'debug',
     ]
 
     route_params = []
@@ -245,48 +246,48 @@ def main(args=None):
 
         if len(args) < 1:
             usage()
-            raise MissingValueError("Please specify the target destination.")
+            raise MissingValueError('Please specify the target destination.')
 
         target_address = args[0]
 
         # first parse modifers
         for o, a in opts:
-            if o in ["-v", "--verbose"]:
+            if o in ['-v', '--verbose']:
                 opt_verbose += 1
-            elif o in ["-d", "--debug"]:
+            elif o in ['-d', '--debug']:
                 opt_debug = True
-            elif o in ["-w", "-W", "-c", "-C"]:
+            elif o in ['-w', '-W', '-c', '-C']:
                 route_params.append((o[1], a))
-            elif o == "-n":
+            elif o == '-n':
                 opt_nodns = True
-            elif o in ["-T", "-I"]:
+            elif o in ['-T', '-I', '-U']:
                 opt_method = o
-            elif o in ["-4", "-6"]:
+            elif o in ['-4', '-6']:
                 if opt_address_family:
-                    raise ProtocolVersionError("Cannot use both IPv4 and IPv6")
-                validate_ip_version(target_address, int(o.lstrip("-")))
+                    raise ProtocolVersionError('Cannot use both IPv4 and IPv6')
+                validate_ip_version(target_address, int(o.lstrip('-')))
                 opt_address_family = o
-            elif o in ["-s"]:
+            elif o in ['-s']:
                 opt_source_addr = a
-            elif o in ["-i"]:
+            elif o in ['-i']:
                 opt_source_int = a
-            elif o in ["-p"]:
+            elif o in ['-p']:
                 opt_port = a
-            elif o in ["-q"]:
+            elif o in ['-q']:
                 opt_queries = a
-            elif o in ["-m"]:
+            elif o in ['-m']:
                 opt_max_ttl = a
 
         # now handle action options
         for o, a in opts:
-            if o in ["-h", "--help"]:
+            if o in ['-h', '--help']:
                 usage()
                 sys.exit(0)
 
         sto = _execute_traceroute(target_address, opt_nodns, opt_method, opt_address_family, opt_queries,
                                   opt_max_ttl, opt_port, opt_source_addr, opt_source_int)
-        status, output, perfdata = check_traceroute(sto.split("\n"), route_params)
-        info_text = output.strip() + "\n%s" % sto
+        status, output, perfdata = check_traceroute(sto.split('\n'), route_params)
+        info_text = output.strip() + '\n%s' % sto
         return status, info_text, perfdata
 
     except ExecutionError as e:
@@ -301,10 +302,10 @@ def main(args=None):
     except Exception as e:
         if opt_debug:
             raise
-        return 2, "Unhandled exception: %s" % parse_exception(e), None
+        return 2, 'Unhandled exception: %s' % parse_exception(e), None
 
 
-if __name__ == "__main__":
+if __name__ == '__main__':
     exitcode, info, perf = main()
     output_check_result(info, perf)
     sys.exit(exitcode)
diff --git a/web/plugins/wato/active_checks_routing.py b/web/plugins/wato/active_checks_routing.py
index a38eccf..d63af74 100644
--- a/web/plugins/wato/active_checks_routing.py
+++ b/web/plugins/wato/active_checks_routing.py
@@ -115,7 +115,8 @@ def _valuespec_active_checks_traceroute():
                  DropdownChoice(
                      title=_('Method of probing'),
                      choices=[
-                         (None, _('UDP (default behaviour of traceroute)')),
+                         (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')),
                      ],
-- 
GitLab