From 799b4622974d4ff62642130205561819b1ce55cd Mon Sep 17 00:00:00 2001
From: "th.l" <thl-cmk@outlook.com>
Date: Wed, 1 May 2024 13:10:50 +0200
Subject: [PATCH] update project

---
 README.md                                     |   2 +-
 mkp/freeradius-0.1.2-20240501.mkp             | Bin 0 -> 16315 bytes
 .../gui/wato/check_parameters/freeradius.py   | 343 ++++++++++++++++++
 .../cmk/special_agents/agent_freeradius.py    |   5 +-
 source/packages/freeradius                    |   5 +-
 5 files changed, 348 insertions(+), 7 deletions(-)
 create mode 100644 mkp/freeradius-0.1.2-20240501.mkp
 create mode 100644 source/gui/wato/check_parameters/freeradius.py

diff --git a/README.md b/README.md
index 2fb51e5..0a4b174 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-[PACKAGE]: ../../raw/master/mkp/freeradius-0.1.1-20240430.mkp "freeradius-0.1.1-20240430.mkp"
+[PACKAGE]: ../../raw/master/mkp/freeradius-0.1.2-20240501.mkp "freeradius-0.1.2-20240501.mkp"
 [PYRADLIB]: ../../raw/master/mkp/pyrad-2.4.0-240421.mkp "pyrad-2.4.0-240421.mkp"
 # FreeRADIUS
 
diff --git a/mkp/freeradius-0.1.2-20240501.mkp b/mkp/freeradius-0.1.2-20240501.mkp
new file mode 100644
index 0000000000000000000000000000000000000000..e1126acb7ff7ad17bfe26de117e3073fa80814d4
GIT binary patch
literal 16315
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

literal 0
HcmV?d00001

diff --git a/source/gui/wato/check_parameters/freeradius.py b/source/gui/wato/check_parameters/freeradius.py
new file mode 100644
index 0000000..646f71e
--- /dev/null
+++ b/source/gui/wato/check_parameters/freeradius.py
@@ -0,0 +1,343 @@
+#!/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  : 2024-04-29
+# File  : freeradius.py (WATO)
+
+from cmk.gui.i18n import _
+from cmk.gui.plugins.wato.utils import (
+    CheckParameterRulespecWithoutItem,
+    RulespecGroupCheckParametersApplications,
+    rulespec_registry,
+)
+from cmk.gui.valuespec import (
+    Alternative,
+    Dictionary,
+    FixedValue,
+    Integer,
+    ListOf,
+    Tuple,
+    ValueSpec,
+)
+
+_list_attributes = (
+    'list_attributes',
+    FixedValue(
+        True, title=_('List response attributes in service details'), totext=_('yes'),
+    ))
+
+
+def _parameter_valuespec_freeradius():
+    return Dictionary(
+        title=_('FreeRADIUS queue'),
+        optional_keys=True,
+        elements=[
+            _list_attributes,
+        ],
+        required_keys=['attributes']
+    )
+
+
+def _attributes(_attribute_list, _attribute_type) -> ValueSpec:
+    return ('attributes',
+            ListOf(
+                Alternative(
+                    orientation='horizontal',
+                    elements=[
+                        _attribute_values(attribute, name) for attribute, name in _attribute_list
+                    ]
+                ),
+                title=_(f'{_attribute_type} Attributes'),
+                add_label=_('add attribute'),
+            ))
+
+
+rulespec_registry.register(
+    CheckParameterRulespecWithoutItem(
+        title=lambda: _('FreeRADIUS'),
+        check_group_name='freeradius',
+        group=RulespecGroupCheckParametersApplications,
+        parameter_valuespec=_parameter_valuespec_freeradius,
+        match_type='dict',
+    )
+)
+
+# names
+_Accepts = 'Accepts'
+_Accounting = 'Accounting'
+_Authentication = 'Authentication'
+_Challenges = 'Challenges'
+_Conflicts = 'Conflicts'
+_Detail = 'Detail'
+_Dropped = 'Dropped'
+_Duplicate = 'Duplicate'
+_Internal = 'Internal'
+_Invalid = 'Invalid'
+_Malformed = 'Malformed'
+_PPS_In = 'PPS In'
+_PPS_Out = 'PSS Out'
+_Proxy = 'Proxy'
+_Rejects = 'Rejects'
+_Requests = 'Requests'
+_Responses = 'Responses'
+_Unknown_Types = 'Unknown Types'
+
+# Internal Attributes
+_FreeRADIUS_Queue_Len_Internal = 'FreeRADIUS-Queue-Len-Internal'
+_FreeRADIUS_Queue_Len_Proxy = 'FreeRADIUS-Queue-Len-Proxy'
+_FreeRADIUS_Queue_Len_Auth = 'FreeRADIUS-Queue-Len-Auth'
+_FreeRADIUS_Queue_Len_Acct = 'FreeRADIUS-Queue-Len-Acct'
+_FreeRADIUS_Queue_Len_Detail = 'FreeRADIUS-Queue-Len-Detail'
+_FreeRADIUS_Queue_PPS_In = 'FreeRADIUS-Queue-PPS-In'
+_FreeRADIUS_Queue_PPS_Out = 'FreeRADIUS-Queue-PPS-Out'
+
+_FreeRADIUS_Queue = [
+    (_FreeRADIUS_Queue_Len_Acct, _Accounting),
+    (_FreeRADIUS_Queue_Len_Auth, _Authentication),
+    (_FreeRADIUS_Queue_Len_Detail, _Detail),
+    (_FreeRADIUS_Queue_Len_Internal, _Internal),
+    (_FreeRADIUS_Queue_Len_Proxy, _Proxy),
+    (_FreeRADIUS_Queue_PPS_In, _PPS_In),
+    (_FreeRADIUS_Queue_PPS_Out, _PPS_Out),
+]
+
+
+def _attribute_values(attribute, name):
+    return Tuple(
+        title=name,
+        elements=[
+            FixedValue(attribute, totext=name),
+            Dictionary(
+                # title=_('Settings'),
+                elements=[
+                    ('upper',
+                     Tuple(
+                         title='Upper Levels',
+                         orientation='horizontal',
+                         elements=[
+                             Integer(title='Warning at'),
+                             Integer(title='Critical at'),
+                         ])),
+                    ('lower',
+                     Tuple(
+                         title='Lower Levels',
+                         orientation='horizontal',
+                         elements=[
+                             Integer(title='Warning below', unit='count'),
+                             Integer(title='Critical below', unit='count'),
+                         ])),
+                    ('info_line',
+                     FixedValue(False, title='Show on info line', totext='yes')
+                     )
+                ],
+            )])
+
+
+def _parameter_valuespec_freeradius_queue():
+    return Dictionary(
+        title=_('FreeRADIUS queue'),
+        optional_keys=True,
+        elements=[
+            _list_attributes,
+            _attributes(_FreeRADIUS_Queue, 'Queue'),
+        ],
+        required_keys=['attributes']
+    )
+
+
+rulespec_registry.register(
+    CheckParameterRulespecWithoutItem(
+        title=lambda: _('FreeRADIUS queue'),
+        check_group_name='freeradius_queue',
+        group=RulespecGroupCheckParametersApplications,
+        parameter_valuespec=_parameter_valuespec_freeradius_queue,
+        match_type='dict',
+    )
+)
+
+_FreeRADIUS_Total_Access_Requests = 'FreeRADIUS-Total-Access-Requests'
+_FreeRADIUS_Total_Access_Accepts = 'FreeRADIUS-Total-Access-Accepts'
+_FreeRADIUS_Total_Access_Rejects = 'FreeRADIUS-Total-Access-Rejects'
+_FreeRADIUS_Total_Access_Challenges = 'FreeRADIUS-Total-Access-Challenges'
+_FreeRADIUS_Total_Auth_Responses = 'FreeRADIUS-Total-Auth-Responses'
+_FreeRADIUS_Total_Auth_Duplicate_Requests = 'FreeRADIUS-Total-Auth-Duplicate-Requests'
+_FreeRADIUS_Total_Auth_Malformed_Requests = 'FreeRADIUS-Total-Auth-Malformed-Requests'
+_FreeRADIUS_Total_Auth_Invalid_Requests = 'FreeRADIUS-Total-Auth-Invalid-Requests'
+_FreeRADIUS_Total_Auth_Dropped_Requests = 'FreeRADIUS-Total-Auth-Dropped-Requests'
+_FreeRADIUS_Total_Auth_Unknown_Types = 'FreeRADIUS-Total-Auth-Unknown-Types'
+_FreeRADIUS_Total_Auth_Conflicts = 'FreeRADIUS-Total-Auth-Conflicts'
+
+_FreeRADIUS_Total_Authentication = [
+    (_FreeRADIUS_Total_Access_Accepts, _Accepts),
+    (_FreeRADIUS_Total_Access_Challenges, _Challenges),
+    (_FreeRADIUS_Total_Auth_Conflicts, _Conflicts),
+    (_FreeRADIUS_Total_Auth_Dropped_Requests, _Dropped),
+    (_FreeRADIUS_Total_Auth_Duplicate_Requests, _Duplicate),
+    (_FreeRADIUS_Total_Auth_Invalid_Requests, _Invalid),
+    (_FreeRADIUS_Total_Auth_Malformed_Requests, _Malformed),
+    (_FreeRADIUS_Total_Access_Rejects, _Rejects),
+    (_FreeRADIUS_Total_Access_Requests, _Requests),
+    (_FreeRADIUS_Total_Auth_Responses, _Responses),
+    (_FreeRADIUS_Total_Auth_Unknown_Types, _Unknown_Types),
+]
+
+
+def _parameter_valuespec_freeradius_total_authentication():
+    return Dictionary(
+        title=_('FreeRADIUS authentication'),
+        optional_keys=True,
+        elements=[
+            _list_attributes,
+            _attributes(_FreeRADIUS_Total_Authentication, 'Authentication'),
+        ],
+        required_keys=['attributes']
+    )
+
+
+rulespec_registry.register(
+    CheckParameterRulespecWithoutItem(
+        title=lambda: _('FreeRADIUS authentication'),
+        check_group_name='freeradius_total_authentication',
+        group=RulespecGroupCheckParametersApplications,
+        parameter_valuespec=_parameter_valuespec_freeradius_total_authentication,
+        match_type='dict',
+    )
+)
+
+# Accounting attributes
+_FreeRADIUS_Total_Accounting_Requests = 'FreeRADIUS-Total-Accounting-Requests'
+_FreeRADIUS_Total_Accounting_Responses = 'FreeRADIUS-Total-Accounting-Responses'
+_FreeRADIUS_Total_Acct_Duplicate_Requests = 'FreeRADIUS-Total-Acct_Duplicate-Requests'
+_FreeRADIUS_Total_Acct_Malformed_Requests = 'FreeRADIUS-Total-Acct-Malformed-Requests'
+_FreeRADIUS_Total_Acct_Invalid_Requests = 'FreeRADIUS-Total-Acct-Invalid-Requests'
+_FreeRADIUS_Total_Acct_Dropped_Requests = 'FreeRADIUS-Total-Acct-Dropped-Requests'
+_FreeRADIUS_Total_Acct_Unknown_Types = 'FreeRADIUS-Total-Acct-Unknown-Types'
+_FreeRADIUS_Total_Acct_Conflicts = 'FreeRADIUS-Total-Acct-Conflicts'
+
+_FreeRADIUS_Total_Accounting = [
+    (_FreeRADIUS_Total_Accounting_Requests, _Requests),
+    (_FreeRADIUS_Total_Accounting_Responses, _Responses),
+    (_FreeRADIUS_Total_Acct_Duplicate_Requests, _Duplicate),
+    (_FreeRADIUS_Total_Acct_Malformed_Requests, _Malformed),
+    (_FreeRADIUS_Total_Acct_Invalid_Requests, _Invalid),
+    (_FreeRADIUS_Total_Acct_Dropped_Requests, _Dropped),
+    (_FreeRADIUS_Total_Acct_Unknown_Types, _Unknown_Types),
+    (_FreeRADIUS_Total_Acct_Conflicts, _Conflicts),
+]
+
+
+def _parameter_valuespec_freeradius_total_accounting():
+    return Dictionary(
+        title=_('FreeRADIUS accounting'),
+        optional_keys=True,
+        elements=[
+            _list_attributes,
+            _attributes(_FreeRADIUS_Total_Accounting, 'Accounting'),
+        ],
+        required_keys=['attributes']
+    )
+
+
+rulespec_registry.register(
+    CheckParameterRulespecWithoutItem(
+        title=lambda: _('FreeRADIUS acconting'),
+        check_group_name='freeradius_total_accounting',
+        group=RulespecGroupCheckParametersApplications,
+        parameter_valuespec=_parameter_valuespec_freeradius_total_accounting,
+        match_type='dict',
+    )
+)
+
+# Proxy-Authentication
+_FreeRADIUS_Total_Proxy_Access_Requests = 'FreeRADIUS-Total-Proxy-Access-Requests'
+_FreeRADIUS_Total_Proxy_Access_Accepts = 'FreeRADIUS-Total-Proxy-Access-Accepts'
+_FreeRADIUS_Total_Proxy_Access_Rejects = 'FreeRADIUS-Total-Proxy-Access-Rejects'
+_FreeRADIUS_Total_Proxy_Access_Challenges = 'FreeRADIUS-Total-Proxy-Access-Challenges'
+_FreeRADIUS_Total_Proxy_Auth_Responses = 'FreeRADIUS-Total-Proxy-Auth-Responses'
+_FreeRADIUS_Total_Proxy_Auth_Duplicate_Requests = 'FreeRADIUS-Total-Proxy-Auth-Duplicate-Requests'
+_FreeRADIUS_Total_Proxy_Auth_Malformed_Requests = 'FreeRADIUS-Total-Proxy-Auth-Malformed-Requests'
+_FreeRADIUS_Total_Proxy_Auth_Invalid_Requests = 'FreeRADIUS-Total-Proxy-Auth-Invalid-Requests'
+_FreeRADIUS_Total_Proxy_Auth_Dropped_Requests = 'FreeRADIUS-Total-Proxy-Auth-Dropped-Requests'
+_FreeRADIUS_Total_Proxy_Auth_Unknown_Types = 'FreeRADIUS-Total-Proxy-Auth-Unknown-Types'
+
+_FreeRADIUS_Total_Proxy_Authentication = [
+    (_FreeRADIUS_Total_Proxy_Access_Accepts, _Accepts),
+    (_FreeRADIUS_Total_Proxy_Access_Challenges, _Challenges),
+    (_FreeRADIUS_Total_Proxy_Auth_Dropped_Requests, _Dropped),
+    (_FreeRADIUS_Total_Proxy_Auth_Duplicate_Requests, _Duplicate),
+    (_FreeRADIUS_Total_Proxy_Auth_Invalid_Requests, _Invalid),
+    (_FreeRADIUS_Total_Proxy_Auth_Malformed_Requests, _Malformed),
+    (_FreeRADIUS_Total_Proxy_Access_Rejects, _Rejects),
+    (_FreeRADIUS_Total_Proxy_Access_Requests, _Requests),
+    (_FreeRADIUS_Total_Proxy_Auth_Responses, _Responses),
+    (_FreeRADIUS_Total_Proxy_Auth_Unknown_Types, _Unknown_Types),
+]
+
+
+def _parameter_valuespec_freeradius_total_proxy_authentication():
+    return Dictionary(
+        title=_('FreeRADIUS proxy authentication'),
+        optional_keys=True,
+        elements=[
+            _list_attributes,
+            _attributes(_FreeRADIUS_Total_Proxy_Authentication, 'Proxy Authentication'),
+        ],
+        required_keys=['attributes']
+    )
+
+
+rulespec_registry.register(
+    CheckParameterRulespecWithoutItem(
+        title=lambda: _('FreeRADIUS proxy authentication'),
+        check_group_name='freeradius_total_proxy_authentication',
+        group=RulespecGroupCheckParametersApplications,
+        parameter_valuespec=_parameter_valuespec_freeradius_total_proxy_authentication,
+        match_type='dict',
+    )
+)
+
+# Proxy-Accounting
+_FreeRADIUS_Total_Proxy_Accounting_Requests = 'FreeRADIUS-Total-Proxy-Accounting-Requests'
+_FreeRADIUS_Total_Proxy_Accounting_Responses = 'FreeRADIUS-Total-Proxy-Accounting-Responses'
+_FreeRADIUS_Total_Proxy_Acct_Duplicate_Requests = 'FreeRADIUS-Total-Proxy-Acct-Duplicate-Requests'
+_FreeRADIUS_Total_Proxy_Acct_Malformed_Requests = 'FreeRADIUS-Total-Proxy-Acct-Malformed-Requests'
+_FreeRADIUS_Total_Proxy_Acct_Invalid_Requests = 'FreeRADIUS-Total-Proxy-Acct-Invalid-Requests'
+_FreeRADIUS_Total_Proxy_Acct_Dropped_Requests = 'FreeRADIUS-Total-Proxy-Acct-Dropped-Requests'
+_FreeRADIUS_Total_Proxy_Acct_Unknown_Types = 'FreeRADIUS-Total-Proxy-Acct-Unknown-Types'
+
+_FreeRADIUS_Total_Proxy_Accounting = [
+    (_FreeRADIUS_Total_Proxy_Acct_Dropped_Requests, _Dropped),
+    (_FreeRADIUS_Total_Proxy_Acct_Duplicate_Requests, _Duplicate),
+    (_FreeRADIUS_Total_Proxy_Acct_Invalid_Requests, _Invalid),
+    (_FreeRADIUS_Total_Proxy_Acct_Malformed_Requests, _Malformed),
+    (_FreeRADIUS_Total_Proxy_Accounting_Requests, _Requests),
+    (_FreeRADIUS_Total_Proxy_Accounting_Responses, _Responses),
+    (_FreeRADIUS_Total_Proxy_Acct_Unknown_Types, _Unknown_Types),
+]
+
+
+def _parameter_valuespec_freeradius_total_proxy_accounting():
+    return Dictionary(
+        title=_('FreeRADIUS proxy accounting'),
+        optional_keys=True,
+        elements=[
+            _list_attributes,
+            _attributes(_FreeRADIUS_Total_Proxy_Accounting, 'Proxy Accounting'),
+        ],
+        required_keys=['attributes']
+    )
+
+
+rulespec_registry.register(
+    CheckParameterRulespecWithoutItem(
+        title=lambda: _('FreeRADIUS proxy accounting'),
+        check_group_name='freeradius_total_proxy_accounting',
+        group=RulespecGroupCheckParametersApplications,
+        parameter_valuespec=_parameter_valuespec_freeradius_total_proxy_accounting,
+        match_type='dict',
+    )
+)
diff --git a/source/lib/python3/cmk/special_agents/agent_freeradius.py b/source/lib/python3/cmk/special_agents/agent_freeradius.py
index cfdda6f..3540153 100644
--- a/source/lib/python3/cmk/special_agents/agent_freeradius.py
+++ b/source/lib/python3/cmk/special_agents/agent_freeradius.py
@@ -32,13 +32,10 @@
 
 import socket
 import pyrad.client
-from argparse import (
-    Namespace,
-)
+from argparse import Namespace
 from collections.abc import Mapping, Sequence
 from json import dumps as json_dumps
 from os import environ
-from time import time_ns
 from sys import (
     exit as sys_exit,
     stdout as sys_stdout,
diff --git a/source/packages/freeradius b/source/packages/freeradius
index debc22d..9a34140 100644
--- a/source/packages/freeradius
+++ b/source/packages/freeradius
@@ -13,14 +13,15 @@
  'files': {'agent_based': ['freeradius.py'],
            'agents': ['special/agent_freeradius'],
            'checks': ['agent_freeradius'],
-           'gui': ['metrics/freeradius.py'],
+           'gui': ['metrics/freeradius.py',
+                   'wato/check_parameters/freeradius.py'],
            'lib': ['python3/cmk/special_agents/agent_freeradius.py',
                    'python3/cmk/special_agents/dictionary',
                    'python3/cmk/special_agents/dictionary.freeradius'],
            'web': ['plugins/wato/agent_freeradiusi.py']},
  'name': 'freeradius',
  'title': 'FreeRADIUS special agent',
- 'version': '0.1.1-20240430',
+ 'version': '0.1.2-20240501',
  'version.min_required': '2.2.0b1',
  'version.packaged': '2.2.0p24',
  'version.usable_until': '2.3.0b1'}
-- 
GitLab