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