From f6a29e7801b4a71c175b14f46d28f4f7ab3dee48 Mon Sep 17 00:00:00 2001
From: "th.l" <thl-cmk@outlook.com>
Date: Sat, 2 Dec 2023 20:43:37 +0100
Subject: [PATCH] update project

---
 README.md                                     |   2 +-
 agent_based/squid.py                          | 123 +++++++++++++++---
 agents/plugins/squid                          |  10 +-
 gui/metrics/squid.py                          |  48 +++++++
 gui/wato/squid.py                             |  17 ++-
 .../cmk/base/cee/plugins/bakery/squid.py      |   9 +-
 mkp/squid-2.1.0-20231202.mkp                  | Bin 0 -> 5543 bytes
 packages/squid                                |   4 +-
 8 files changed, 186 insertions(+), 27 deletions(-)
 create mode 100644 mkp/squid-2.1.0-20231202.mkp

diff --git a/README.md b/README.md
index b848c4d..652b58e 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-[PACKAGE]: ../../raw/master/mkp/squid-2.0.4-2023-09-21.mkp "squid-2.0.4-2023-09-21.mkp"
+[PACKAGE]: ../../raw/master/mkp/squid-2.1.0-20231202.mkp "squid-2.1.0-20231202.mkp"
 # Squid Web Proxy
 
 This CheckMK plugin monitors the performance of the _**Squid Web Proxy**_. This plugin is intended to use with the Agent Bakery of CheckMK.
diff --git a/agent_based/squid.py b/agent_based/squid.py
index 2fdd9c3..3ea9382 100644
--- a/agent_based/squid.py
+++ b/agent_based/squid.py
@@ -13,8 +13,9 @@
 #
 # 2023-05-20: moved to ~/local/lib/check_mk/base/plugins/agent_based/utils
 #             renamed from check_squid.include to squid.py
-#
-
+# 2023-12-02: fixed crash on empty section or missing value
+#             added swap section
+#             added file descriptors section
 
 # !/usr/bin/env python3
 # -*- coding: utf-8 -*-
@@ -32,7 +33,7 @@
 
 # ToDo: add support for multiple instances
 
-from typing import Dict
+from typing import Dict, Optional
 from cmk.base.plugins.agent_based.agent_based_api.v1 import (
     register,
     check_levels,
@@ -58,7 +59,6 @@ def parse_squid(string_table) -> Dict[str, float]:
         if 'kbytes' in entry:
             value = value * 1024 + 8  # change kbytes to bits
         section[entry] = value
-
     return section
 
 
@@ -68,10 +68,44 @@ register.agent_section(
 )
 
 
+def parse_squid_file_descriptors(string_table) -> Dict[str, float]:
+    """
+        Maximum number of file descriptors:   1024
+        Available number of file descriptors: 1018
+        Reserved number of file descriptors:   100
+
+    Args:
+        string_table:
+
+    Returns:
+
+    """
+    section = {}
+    for line in string_table:
+        entry, value = line[0].split(':')
+        entry = entry.lower().strip().replace(' ', '_')
+        try:
+            value = float(value.strip())
+        except ValueError:
+            continue
+        section[entry] = value
+    return section
+
+
+register.agent_section(
+    name='squid_file_descriptors',
+    parse_function=parse_squid_file_descriptors,
+)
+
+
 def render_per_second(value: float) -> str:
     return f'{value:0.2f}/s'
 
 
+def render_count(value: float) -> str:
+    return f'{int(value)}'
+
+
 squid_map = {
     'Client': {
         'client_http.requests': {
@@ -152,36 +186,87 @@ squid_map = {
             'metric_name': 'dns_median_svc_time',
             'render_func': render.timespan,
         }},
+    'Swap': {
+        'swap.outs': {
+            'label': 'Out',
+            'levels_upper': 'swap_out',
+            'metric_name': 'swap_out',
+            'render_func': render_per_second,
+        },
+        'swap.ins': {
+            'label': 'In',
+            'levels_upper': 'swap_in',
+            'metric_name': 'swap_in',
+            'render_func': render_per_second,
+        },
+        'swap.files_cleaned': {
+            'label': 'Files cleaned',
+            'levels_upper': 'swap_files_cleaned',
+            'metric_name': 'swap_files_cleaned',
+            'render_func': render_per_second,
+        },
+    },
+    'File descriptors': {
+        'maximum_number_of_file_descriptors': {
+            'label': 'Maximum',
+            'levels_upper': 'maximum_number_of_file_descriptors',
+            'metric_name': 'maximum_number_of_file_descriptors',
+            'render_func': render_count,
+        },
+        'available_number_of_file_descriptors': {
+            'label': 'Available',
+            'levels_upper': 'available_number_of_file_descriptors',
+            'metric_name': 'available_number_of_file_descriptors',
+            'render_func': render_count,
+        },
+        'reserved_number_of_file_descriptors': {
+            'label': 'Reserved',
+            'levels_upper': 'reserved_number_of_file_descriptors',
+            'metric_name': 'reserved_number_of_file_descriptors',
+            'render_func': render_count,
+        },
+    }
 }
 
 
-def discovery_squid(section: Dict[str, float]) -> DiscoveryResult:
+def discovery_squid(
+        section_squid: Optional[Dict[str, float]],
+        section_squid_file_descriptors: Optional[Dict[str, float]]
+) -> DiscoveryResult:
     for item in squid_map.keys():
         yield Service(item=item)
 
 
-def check_squid(item, params, section: Dict[str, float]) -> CheckResult:
+def check_squid(
+        item,
+        params,
+        section_squid: Optional[Dict[str, float]],
+        section_squid_file_descriptors: Optional[Dict[str, float]],
+) -> CheckResult:
+    section_squid.update(section_squid_file_descriptors)
     for value in squid_map[item].keys():
         entry = squid_map[item][value]
         levels_upper = params.get(entry['levels_upper'], None)
-        yield from check_levels_predictive(
-            label=entry['label'],
-            value=section[value],
-            levels=levels_upper,
-            render_func=entry['render_func'],
-            metric_name=entry['metric_name'],
-        ) if isinstance(levels_upper, dict) else check_levels(
-            label=entry['label'],
-            value=section[value],
-            levels_upper=levels_upper,
-            render_func=entry['render_func'],
-            metric_name=entry['metric_name'],
-        )
+        if section_squid.get(value) is not None:
+            yield from check_levels_predictive(
+                label=entry['label'],
+                value=section_squid[value],
+                levels=levels_upper,
+                render_func=entry['render_func'],
+                metric_name=entry['metric_name'],
+            ) if isinstance(levels_upper, dict) else check_levels(
+                label=entry['label'],
+                value=section_squid[value],
+                levels_upper=levels_upper,
+                render_func=entry['render_func'],
+                metric_name=entry['metric_name'],
+            )
 
 
 register.check_plugin(
     name='squid',
     service_name='Squid %s',
+    sections=['squid', 'squid_file_descriptors'],
     discovery_function=discovery_squid,
     check_function=check_squid,
     check_default_parameters={
diff --git a/agents/plugins/squid b/agents/plugins/squid
index d88aaf6..475c7a0 100755
--- a/agents/plugins/squid
+++ b/agents/plugins/squid
@@ -9,6 +9,7 @@
 # 2023-05-20: changed separator to :sep(0)
 #             changed section from check_squid to squid
 # 2023-05-22: fixed missing "<" in section name
+# 2023-12-02: added -l "$ip_address" option
 #
 MK_CONFDIR="/etc/check_mk"
 
@@ -21,12 +22,17 @@ if [ -z "$port" ]; then
   port=$(ss -tlpn | grep squid | tr -s ' ' | cut -d' ' -f 4 | cut -d':' -f 2)
 fi
 
+if [ -z "$ip_address" ]; then
+  ip_address=localhost
+fi
 
 if type squidclient > /dev/null 2>&1 ; then
-  echo "<<<squid:sep(0)>>>"
+  echo "<<<squid_file_descriptors:sep(0)>>>"
+  squidclient -p "$port" -l "$ip_address" -T2 mgr:info | grep "file descriptors"
 
+  echo "<<<squid:sep(0)>>>"
   # one squid instance
-  squidclient -p "$port" -T2 mgr:5min | grep =
+  squidclient -p "$port" -l "$ip_address" -T2 mgr:5min | grep =
 
   # multiple squid instances
   # instance names must be without spaces and with colon char at the end
diff --git a/gui/metrics/squid.py b/gui/metrics/squid.py
index 41df441..6a9d0e1 100644
--- a/gui/metrics/squid.py
+++ b/gui/metrics/squid.py
@@ -25,6 +25,12 @@ check_metrics['check_mk-squid'] = {
     'predict_client_hits_per_second': {'auto_graph': False},
     'predict_server_all_requests': {'auto_graph': False},
     'predict_util': {'auto_graph': False},
+    # 'swap_out': {'auto_graph': False},
+    # 'swap_in': {'auto_graph': False},
+    # 'swap_files_cleaned': {'auto_graph': False},
+    # 'maximum_number_of_file_descriptors': {'auto_graph': False},
+    # 'available_number_of_file_descriptors': {'auto_graph': False},
+    # 'reserved_number_of_file_descriptors': {'auto_graph': False},
 }
 
 metric_info['client_hits_per_second'] = {'title': _('Cache hits'), 'unit': '1/s', 'color': '11/a', }
@@ -125,3 +131,45 @@ perfometer_info.append({
     'half_value': 2,
     'exponent': 2,
 })
+
+
+metric_info['swap_out'] = {'title': _('Out'), 'unit': '1/s', 'color': '26/a', }
+metric_info['swap_in'] = {'title': _('In'), 'unit': '1/s', 'color': '26/b', }
+metric_info['swap_files_cleaned'] = {'title': _('Files cleaned'), 'unit': '1/s', 'color': '26/b', }
+
+graph_info['squid_swap'] = {
+    'title': _('Squid Swap'),
+    'metrics': [
+        ('swap_out', 'line'),
+        ('swap_in', 'line'),
+        ('swap_files_cleaned', 'line'),
+    ],
+    # 'scalars': [
+    #     'swap_files_cleaned:warn',
+    #     'swap_files_cleaned:crit',
+    # ],
+}
+
+metric_info['maximum_number_of_file_descriptors'] = {'title': _('Maximum'), 'unit': 'count', 'color': '31/a', }
+metric_info['available_number_of_file_descriptors'] = {'title': _('Available'), 'unit': 'count', 'color': '26/a', }
+metric_info['reserved_number_of_file_descriptors'] = {'title': _('Reserved'), 'unit': 'count', 'color': '14/a', }
+
+graph_info['squid_file_descriptors'] = {
+    'title': _('Squid File Descriptors'),
+    'metrics': [
+        ('maximum_number_of_file_descriptors', 'line'),
+        ('available_number_of_file_descriptors', 'line'),
+        ('reserved_number_of_file_descriptors', 'line'),
+    ],
+    'scalars': [
+        'available_number_of_file_descriptors:warn',
+        'available_number_of_file_descriptors:crit',
+    ],
+}
+
+perfometer_info.append({
+    'type': 'logarithmic',
+    'metric': 'available_number_of_file_descriptors',
+    'half_value': 1000,
+    'exponent': 2,
+})
\ No newline at end of file
diff --git a/gui/wato/squid.py b/gui/wato/squid.py
index cf7e3f9..e7b4791 100644
--- a/gui/wato/squid.py
+++ b/gui/wato/squid.py
@@ -16,6 +16,8 @@
 #             changed client_reqps to client_requests
 #             changed server_reqps to server_requests
 #             changed cpu_time to cpu_usage
+# 2023-12-02: add ip_address option for agent plugin
+#             add available_number_of_file_descriptors for check section
 
 from cmk.gui.i18n import _
 from cmk.gui.valuespec import (
@@ -70,6 +72,12 @@ def _valuespec_squid():
                      Float(title=_('Warning at'), default_value=2.0, unit='seconds'),
                      Float(title=_('Critical at'), default_value=4.0, unit='seconds'),
                  ])),
+            ('available_number_of_file_descriptors',
+             Levels(
+                 title=_('Set levels for Squid available file descriptors'),
+                 unit='number of',
+                 # default_levels=(60.0, 80.0)
+             )),
         ]
     )
 
@@ -93,13 +101,18 @@ def _valuespec_agent_squid():
         help=_('The plugin <tt>squid</tt> allows monitoring of Squid Web Proxies.'),
         title=_('Squid Web Proxy (Linux)'),
         elements=[
+            ('ip_address',
+             TextInput(
+                 title=_('IP Address'),
+                 help=_('Thi IP-Address squidclient connects to.'),
+                 default_value='localhost',
+             )),
             ('port',
              Integer(
                  title=_('Port number'),
                  help=_('TCP port number that squidclient connects to.'),
                  default_value=3128,
-             )
-             )
+             )),
         ]
     )
 
diff --git a/lib/python3/cmk/base/cee/plugins/bakery/squid.py b/lib/python3/cmk/base/cee/plugins/bakery/squid.py
index 23c3d7c..05189f7 100644
--- a/lib/python3/cmk/base/cee/plugins/bakery/squid.py
+++ b/lib/python3/cmk/base/cee/plugins/bakery/squid.py
@@ -16,6 +16,7 @@
 #             renamed bakery plugin from squid to squid.py
 # 2023-09-21: moved file to ~/local/lib/check_mk/base/cee/plugins/bakery
 #             fix crash if port not configured in wato
+# 2023-12-02: added IP-Address option
 
 from pathlib import Path
 from cmk.base.cee.plugins.bakery.bakery_api.v1 import (
@@ -35,12 +36,18 @@ def get_squid_files(conf) -> FileGenerator:
 
     yield PluginConfig(
         base_os=OS.LINUX,
-        lines=[f'port={conf.get("port", 3128)}'],
+        lines=[f'{key}={value}' for key, value in conf.items()],
+        # lines=[
+        #     f'port={conf.get("port", 3128)}',
+        #     f'ip_address={conf.get("ip_address", "localhost")}'
+        # ],
         target=Path('squid.cfg'),
         include_header=False,
     )
 
 
+
+
 register.bakery_plugin(
     name='squid',
     files_function=get_squid_files,
diff --git a/mkp/squid-2.1.0-20231202.mkp b/mkp/squid-2.1.0-20231202.mkp
new file mode 100644
index 0000000000000000000000000000000000000000..94e873f08d61ff46db3f0cb7530ec6f9c899cbd8
GIT binary patch
literal 5543
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

literal 0
HcmV?d00001

diff --git a/packages/squid b/packages/squid
index 649e379..23522f2 100644
--- a/packages/squid
+++ b/packages/squid
@@ -13,7 +13,7 @@
            'lib': ['python3/cmk/base/cee/plugins/bakery/squid.py']},
  'name': 'squid',
  'title': 'Squid3 Health Check',
- 'version': '2.0.4-2023-09-21',
+ 'version': '2.1.0-20231202',
  'version.min_required': '2.1.0b1',
- 'version.packaged': '2.2.0p11',
+ 'version.packaged': '2.2.0p14',
  'version.usable_until': None}
-- 
GitLab