From a10cfb0c6cd7bbc4b985a3d11f9ec22cdd07334b Mon Sep 17 00:00:00 2001 From: "th.l" <thl-cmk@outlook.com> Date: Wed, 25 Aug 2021 22:35:08 +0200 Subject: [PATCH] update project --- agent_based/checkpoint_ia_adquery.py | 192 +++++++++++++++ agent_based/checkpoint_identity_awareness.py | 233 ++++++++++++++++++ checkpoint_identity_awareness.mkp | Bin 6073 -> 6260 bytes packages/checkpoint_identity_awareness | 19 +- web/plugins/metrics/checkpoint_ia_adquery.py | 75 +++--- .../metrics/checkpoint_identity_awareness.py | 99 ++++---- .../wato/checkpoint_identity_awareness.py | 71 ++++-- 7 files changed, 574 insertions(+), 115 deletions(-) create mode 100644 agent_based/checkpoint_ia_adquery.py create mode 100644 agent_based/checkpoint_identity_awareness.py diff --git a/agent_based/checkpoint_ia_adquery.py b/agent_based/checkpoint_ia_adquery.py new file mode 100644 index 0000000..c5d225b --- /dev/null +++ b/agent_based/checkpoint_ia_adquery.py @@ -0,0 +1,192 @@ +#!/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 : 2017-17-05 +# +# Check Point Identity Awareness status +# +# 2020-06-08: changed snmp-scan function +# +# snmpwalk sample +# .1.3.6.1.4.1.2620.1.38.25.1.1.1.0 = Counter32: 1 +# .1.3.6.1.4.1.2620.1.38.25.1.1.2.0 = Counter32: 2 +# .1.3.6.1.4.1.2620.1.38.25.1.1.3.0 = Counter32: 3 +# .1.3.6.1.4.1.2620.1.38.25.1.1.4.0 = Counter32: 4 +# .1.3.6.1.4.1.2620.1.38.25.1.1.5.0 = Counter32: 5 +# .1.3.6.1.4.1.2620.1.38.25.1.2.1.0 = Counter32: 0 +# .1.3.6.1.4.1.2620.1.38.25.1.2.2.0 = Counter32: 0 +# .1.3.6.1.4.1.2620.1.38.25.1.2.3.0 = Counter32: 0 +# .1.3.6.1.4.1.2620.1.38.25.1.2.4.0 = Counter32: 0 +# .1.3.6.1.4.1.2620.1.38.25.1.2.5.0 = Counter32: 0 +# .1.3.6.1.4.1.2620.1.38.25.1.3.1.0 = STRING: "doamin1.de" +# .1.3.6.1.4.1.2620.1.38.25.1.3.2.0 = STRING: "doamin1.de" +# .1.3.6.1.4.1.2620.1.38.25.1.3.3.0 = STRING: "domain1.de" +# .1.3.6.1.4.1.2620.1.38.25.1.3.4.0 = STRING: "domain2.de" +# .1.3.6.1.4.1.2620.1.38.25.1.3.5.0 = STRING: "domain2.de" +# .1.3.6.1.4.1.2620.1.38.25.1.4.1.0 = IpAddress: 10.1.1.13 +# .1.3.6.1.4.1.2620.1.38.25.1.4.2.0 = IpAddress: 10.1.1.14 +# .1.3.6.1.4.1.2620.1.38.25.1.4.3.0 = IpAddress: 10.1.1.31 +# .1.3.6.1.4.1.2620.1.38.25.1.4.4.0 = IpAddress: 10.1.1.16 +# .1.3.6.1.4.1.2620.1.38.25.1.4.5.0 = IpAddress: 10.1.1.17 +# .1.3.6.1.4.1.2620.1.38.25.1.5.1.0 = Counter32: 77462 +# .1.3.6.1.4.1.2620.1.38.25.1.5.2.0 = Counter32: 85917 +# .1.3.6.1.4.1.2620.1.38.25.1.5.3.0 = Counter32: 58378 +# .1.3.6.1.4.1.2620.1.38.25.1.5.4.0 = Counter32: 4810 +# .1.3.6.1.4.1.2620.1.38.25.1.5.5.0 = Counter32: 6256 +# +# sample info +# [[u'1', u'0', u'domain1.de', u'10.1.1.13', u'77462'], +# [u'2', u'0', u'domain1.de', u'10.1.1.14', u'85917'], +# [u'3', u'0', u'domain1.de', u'10.1.1.31', u'58378'], +# [u'4', u'0', u'domain2.de', u'10.1.1.16', u'4810'], +# [u'5', u'0', u'domain2.de', u'10.1.1.17', u'6256']] +# +import time +from dataclasses import dataclass +from typing import Optional, Dict + +from cmk.base.plugins.agent_based.agent_based_api.v1 import ( + register, + Service, + check_levels, + SNMPTree, + all_of, + startswith, + any_of, + equals, + get_rate, + GetRateError, + get_value_store, + Result, + State, +) +from cmk.base.plugins.agent_based.agent_based_api.v1.type_defs import ( + DiscoveryResult, + CheckResult, + StringTable, +) + + +@dataclass +class CheckpointIaDc: + status_code: int + status_str: str + events: int + + +_dcstatus = { + '0': 'Ok', + '1': 'Bad Credentials', + '2': 'Connectivity Error', + '3': 'Internal Error', + '4': 'Connection Time Out' +} + + +def parse_checkpoint_ia_adquery(string_table: StringTable) -> Optional[Dict[str, Dict[str, CheckpointIaDc]]]: + domains = {} + for entry in string_table: + try: + status, domain, ipaddr, events = entry + except ValueError: + return + + if len(ipaddr.split('.')) == 4: + if not domains.get(domain): + domains[domain] = {} + + domains[domain].update({ + ipaddr: CheckpointIaDc( + status_code=int(status), + status_str=_dcstatus.get(status, f'unknown: {status}'), + events=int(events) + ) + }) + return domains + + +def discovery_checkpoint_ia_adquery(section: Dict[str, Dict[str, CheckpointIaDc]]) -> DiscoveryResult: + for key in section.keys(): + yield Service(item=key) + + +def check_checkpoint_ia_adquery(item, params, section: Dict[str, Dict[str, CheckpointIaDc]]) -> CheckResult: + try: + dcs = section[item] + except KeyError: + return + + events_sum = 0 + now_time = time.time() + value_store = get_value_store() + + for key in dcs.keys(): + dc = dcs[key] + events_sum += dc.events + + dc_ip_address = key.replace('.', '_') + try: + value = get_rate(value_store, f'checkpoint_ia_adquery_{dc_ip_address}', now_time, dc.events, raise_overflow=True) + except GetRateError: + value = 0 + yield from check_levels( + value=value, + label=f'DC {key} Events', + metric_name=f'checkpoint_ia_adquery_{dc_ip_address}', + render_func=lambda v: f'{v:.2f}/s', + notice_only=True + ) + + if not dc.status_code == 0: + yield Result(state=State.CRIT, notice=f'DC {key} connection status: {dc.status_str}') + #else: + # yield Result(state=State.OK, notice=f'DC {key} connection status: {dc.status_str}') + + yield Result(state=State.OK, summary=f'# of DCs: {len(dcs)}', details=' ') + + try: + value = get_rate(value_store, f'checkpoint_ia_adquery_events_sum', now_time, events_sum, raise_overflow=True) + except GetRateError: + value = 0 + yield from check_levels( + value=value, + label='Events (sum)', + metric_name=f'checkpoint_ia_adquery_events_sum', + render_func=lambda v: f'{v:.2f}/s', + ) + + +register.snmp_section( + name='checkpoint_ia_adquery', + parse_function=parse_checkpoint_ia_adquery, + fetch=SNMPTree( + base='.1.3.6.1.4.1.2620.1.38.25.1', # CHECKPOINT-MIB::identityAwarenessADQueryStatusEntry + oids=[ + '2', # identityAwarenessADQueryStatusCurrStatus + '3', # identityAwarenessADQueryStatusDomainName + '4', # identityAwarenessADQueryStatusDomainIP + '5', # identityAwarenessADQueryStatusEvents + ] + ), + detect=any_of( + startswith('.1.3.6.1.2.1.1.2.0', '.1.3.6.1.4.1.2620'), + all_of( + equals('.1.3.6.1.2.1.1.2.0', '.1.3.6.1.4.1.8072.3.2.10'), + equals('.1.3.6.1.4.1.2620.1.6.1.0', 'SVN Foundation'), + ) + ) +) + +register.check_plugin( + name='checkpoint_ia_adquery', + service_name='Identity Awareness AD Domain %s', + discovery_function=discovery_checkpoint_ia_adquery, + check_function=check_checkpoint_ia_adquery, + check_default_parameters={ + }, + check_ruleset_name='checkpoint_ia_adquery', +) diff --git a/agent_based/checkpoint_identity_awareness.py b/agent_based/checkpoint_identity_awareness.py new file mode 100644 index 0000000..0c8c799 --- /dev/null +++ b/agent_based/checkpoint_identity_awareness.py @@ -0,0 +1,233 @@ +#!/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 : 2017-17-05 +# +# Check Point Identity Awareness status +# +# 2018-03-15 : code cleanup, added identity counters 39-44 +# 2020-06-08 : changed snmp-scan function +# +# snmpwalk sample +# +# .1.3.6.1.4.1.2620.1.38.1.0 = STRING: "Identity Awareness" +# .1.3.6.1.4.1.2620.1.38.2.0 = Gauge32: 149 +# .1.3.6.1.4.1.2620.1.38.3.0 = Gauge32: 0 +# .1.3.6.1.4.1.2620.1.38.4.0 = Gauge32: 0 +# .1.3.6.1.4.1.2620.1.38.5.0 = Gauge32: 0 +# .1.3.6.1.4.1.2620.1.38.6.0 = Gauge32: 0 +# .1.3.6.1.4.1.2620.1.38.7.0 = Gauge32: 149 +# .1.3.6.1.4.1.2620.1.38.8.0 = Gauge32: 188 +# .1.3.6.1.4.1.2620.1.38.9.0 = Gauge32: 0 +# .1.3.6.1.4.1.2620.1.38.10.0 = Gauge32: 0 +# .1.3.6.1.4.1.2620.1.38.11.0 = Gauge32: 337 +# .1.3.6.1.4.1.2620.1.38.12.0 = Gauge32: 0 +# .1.3.6.1.4.1.2620.1.38.13.0 = Gauge32: 0 +# .1.3.6.1.4.1.2620.1.38.14.0 = Gauge32: 0 +# .1.3.6.1.4.1.2620.1.38.15.0 = Gauge32: 0 +# .1.3.6.1.4.1.2620.1.38.16.0 = Gauge32: 221 +# .1.3.6.1.4.1.2620.1.38.17.0 = Gauge32: 44 +# .1.3.6.1.4.1.2620.1.38.18.0 = Gauge32: 0 +# .1.3.6.1.4.1.2620.1.38.19.0 = Gauge32: 0 +# .1.3.6.1.4.1.2620.1.38.20.0 = Gauge32: 0 +# .1.3.6.1.4.1.2620.1.38.21.0 = Gauge32: 2272 +# .1.3.6.1.4.1.2620.1.38.22.0 = Gauge32: 68786 +# .1.3.6.1.4.1.2620.1.38.23.0 = Gauge32: 0 +# .1.3.6.1.4.1.2620.1.38.39.0 = Gauge32: 0 +# .1.3.6.1.4.1.2620.1.38.40.0 = Gauge32: 0 +# .1.3.6.1.4.1.2620.1.38.41.0 = Gauge32: 0 +# .1.3.6.1.4.1.2620.1.38.42.0 = Gauge32: 0 +# .1.3.6.1.4.1.2620.1.38.43.0 = Gauge32: 0 +# .1.3.6.1.4.1.2620.1.38.44.0 = Gauge32: 0 +# .1.3.6.1.4.1.2620.1.38.101.0 = Gauge32: 0 +# .1.3.6.1.4.1.2620.1.38.102.0 = STRING: "OK" +# .1.3.6.1.4.1.2620.1.38.103.0 = STRING: "OK" +# +# sample info +# [[u'Identity Awareness', u'149', u'0', u'0', u'0', u'0', u'149', u'188', u'0', u'0', u'337', u'0', u'0', u'0', u'0', +# u'221', u'44', u'0', u'0', u'0', u'2272', u'68786', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'OK', u'OK']] +# + +import time +from dataclasses import dataclass +from typing import Optional, Dict + +from cmk.base.plugins.agent_based.agent_based_api.v1 import ( + register, + Service, + SNMPTree, + all_of, + startswith, + any_of, + equals, + get_rate, + GetRateError, + get_value_store, + Result, + State, + Metric, +) +from cmk.base.plugins.agent_based.agent_based_api.v1.type_defs import ( + DiscoveryResult, + CheckResult, + StringTable, +) + + +@dataclass +class CheckpointIaStatus: + iaStatus: int + iaStatusShortDesc: str + iaStatusLongDesc: str + metrics_count: Dict[str, int] + metrics_rate: Dict[str, int] + + +def parse_checkpoint_identity_awareness(string_table: StringTable) -> Optional[CheckpointIaStatus]: + try: + iaAuthUsers, iaUnAuthUsers, iaAuthUsersKerberos, iaAuthMachKerberos, iaAuthUsersPass, \ + iaAuthUsersADQuery, iaAuthMachADQuery, iaLoggedInAgent, iaLoggedInCaptivePortal, iaLoggedInADQuery, \ + iaAntiSpoffProtection, iaSuccUserLoginKerberos, iaSuccMachLoginKerberos, iaSuccUserLoginPass, \ + iaSuccUserLoginADQuery, iaSuccMachLoginADQuery, iaUnSuccUserLoginKerberos, iaUnSuccMachLoginKerberos, \ + iaUnSuccUserLoginPass, iaSuccUserLDAP, iaUnSuccUserLDAP, iaDataTrans, iaRADIUSAccounting, \ + iaIdentityCollectorActiveDirectory, iaIdentityCollectorCiscoISE, iaTerminalServer, iaRemoteAccess, \ + iaIdentityWebAPI, iaStatus, iaStatusShortDesc, iaStatusLongDesc = string_table[0] + except IndexError: + return + + return CheckpointIaStatus( + iaStatus=int(iaStatus), + iaStatusShortDesc=iaStatusShortDesc, + iaStatusLongDesc=iaStatusLongDesc, + metrics_count={ + 'iaAuthUsers': int(iaAuthUsers), + 'iaUnAuthUsers': int(iaUnAuthUsers), + 'iaAuthUsersKerberos': int(iaAuthUsersKerberos), + 'iaAuthMachKerberos': int(iaAuthMachKerberos), + 'iaAuthUsersPass': int(iaAuthUsersPass), + 'iaAuthUsersADQuery': int(iaAuthUsersADQuery), + 'iaAuthMachADQuery': int(iaAuthMachADQuery), + 'iaLoggedInAgent': int(iaLoggedInAgent), + 'iaLoggedInCaptivePortal': int(iaLoggedInCaptivePortal), + 'iaLoggedInADQuery': int(iaLoggedInADQuery), + 'iaAntiSpoffProtection': int(iaAntiSpoffProtection), + 'iaSuccUserLoginKerberos': int(iaSuccUserLoginKerberos), + 'iaSuccMachLoginKerberos': int(iaSuccMachLoginKerberos), + 'iaSuccUserLoginPass': int(iaSuccUserLoginPass), + 'iaSuccUserLoginADQuery': int(iaSuccUserLoginADQuery), + 'iaSuccMachLoginADQuery': int(iaSuccMachLoginADQuery), + 'iaUnSuccUserLoginKerberos': int(iaUnSuccUserLoginKerberos), + 'iaUnSuccMachLoginKerberos': int(iaUnSuccMachLoginKerberos), + 'iaUnSuccUserLoginPass': int(iaUnSuccUserLoginPass), + 'iaDataTrans': int(iaDataTrans), + 'iaRADIUSAccounting': int(iaRADIUSAccounting) if iaRADIUSAccounting.isdigit() else None, + 'iaIdentityCollectorActiveDirectory': int(iaIdentityCollectorActiveDirectory) if iaIdentityCollectorActiveDirectory.isdigit() else None, + 'iaIdentityCollectorCiscoISE': int(iaIdentityCollectorCiscoISE) if iaIdentityCollectorCiscoISE.isdigit() else None, + 'iaTerminalServer': int(iaTerminalServer) if iaTerminalServer.isdigit() else None, + 'iaRemoteAccess': int(iaRemoteAccess) if iaRemoteAccess.isdigit() else None, + 'iaIdentityWebAPI': int(iaIdentityWebAPI) if iaIdentityWebAPI.isdigit() else None, + }, + metrics_rate={ + 'iaSuccUserLDAP': int(iaSuccUserLDAP), + 'iaUnSuccUserLDAP':int(iaUnSuccUserLDAP), + }, + ) + + +def discovery_checkpoint_identity_awareness(section: CheckpointIaStatus) -> DiscoveryResult: + yield Service() + + +def check_checkpoint_identity_awareness(params, section: CheckpointIaStatus) -> CheckResult: + + yield Result(state=State.OK, summary=f'Authenticated users: {section.metrics_count["iaAuthUsers"]}') + yield Result(state=State.OK, summary=f'Unauthenticated users: {section.metrics_count["iaUnAuthUsers"]}') + + if not section.iaStatus == 0: + yield Result(state=State.WARN, notice=section.iaStatusLongDesc) + + for key, value in section.metrics_count.items(): + if value is not None and key not in params['ignore_counters']: + yield Metric( + value=value, + name=f'checkpoint_identity_awareness_{key}', + ) + + now_time = time.time() + value_store = get_value_store() + for key, value in section.metrics_rate.items(): + if value is not None and key not in params['ignore_counters']: + try: + value = get_rate(value_store, f'checkpoint_identity_awareness_{key}', now_time, value, raise_overflow=True) + except GetRateError: + value = 0 + yield Metric( + value=value, + name=f'checkpoint_identity_awareness_{key}', + ) + + +register.snmp_section( + name='checkpoint_identity_awareness', + parse_function=parse_checkpoint_identity_awareness, + fetch=SNMPTree( + base='.1.3.6.1.4.1.2620.1.38', # CHECKPOINT-MIB::identityAwareness + oids=[ + '2', # identityAwarenessAuthUsers + '3', # identityAwarenessUnAuthUsers + '4', # identityAwarenessAuthUsersKerberos + '5', # identityAwarenessAuthMachKerberos + '6', # identityAwarenessAuthUsersPass + '7', # identityAwarenessAuthUsersADQuery + '8', # identityAwarenessAuthMachADQuery + '9', # identityAwarenessLoggedInAgent + '10', # identityAwarenessLoggedInCaptivePortal + '11', # identityAwarenessLoggedInADQuery + '12', # identityAwarenessAntiSpoffProtection + '13', # identityAwarenessSuccUserLoginKerberos + '14', # identityAwarenessSuccMachLoginKerberos + '15', # identityAwarenessSuccUserLoginPass + '16', # identityAwarenessSuccUserLoginADQuery + '17', # identityAwarenessSuccMachLoginADQuery + '18', # identityAwarenessUnSuccUserLoginKerberos + '19', # identityAwarenessUnSuccMachLoginKerberos + '20', # identityAwarenessUnSuccUserLoginPass + '21', # identityAwarenessSuccUserLDAP + '22', # identityAwarenessUnSuccUserLDAP + '23', # identityAwarenessDataTrans + + '39', # identityAwarenessRADIUSAccounting + '40', # identityAwarenessIdentityCollectorActiveDirectory + '41', # identityAwarenessIdentityCollectorCiscoISE + '42', # identityAwarenessTerminalServer + '43', # identityAwarenessRemoteAccess + '44', # identityAwarenessIdentityWebAPI + + '101', # identityAwarenessStatus + '102', # identityAwarenessStatusShortDesc + '103', # identityAwarenessStatusLongDesc + ] + ), + detect=any_of( + startswith('.1.3.6.1.2.1.1.2.0', '.1.3.6.1.4.1.2620'), + all_of( + equals('.1.3.6.1.2.1.1.2.0', '.1.3.6.1.4.1.8072.3.2.10'), + equals('.1.3.6.1.4.1.2620.1.6.1.0', 'SVN Foundation'), + ) + ) +) + +register.check_plugin( + name='checkpoint_identity_awareness', + service_name='Identity Awareness status', + discovery_function=discovery_checkpoint_identity_awareness, + check_function=check_checkpoint_identity_awareness, + check_default_parameters={ + 'ignore_counters' : [], + }, + check_ruleset_name='checkpoint_identity_awareness', +) diff --git a/checkpoint_identity_awareness.mkp b/checkpoint_identity_awareness.mkp index c418891959721aec540ef31b364c218367a9e62a..8e50f8e104fdea023967752f890c35cbd86705fb 100644 GIT binary patch literal 6260 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 literal 6073 zcmb`{^*<aAz`$`E6Z`6(*ffVb-JF>`jOm!JsS{Ika?@?PJEq%VI;T6%X>J^*r-pl; zpPs+q`Q`n3eg1*Zn;3k2&hHy$&oS2aw$@H=t`07q<_<QtE}jmazUG!bmY;21Y&|@H zg8YK~{G$BgAa4*qNWcaJb#lY{Bje<;D<1zSp?62JR`T0s6A^C~=vmvShbVCsU94Lx z`FSnBgwl5Am~H0uWs}I%HQ02OO@wKY1GGNRHOcU(Ym%#B;eTVo|CZ?d6TVSJgG*&$ zm31Zd_8e~KxXLq`p<ZVFUStx@qo=c2ard&Kt{dAqWafelmZs5|`%iAG$_hH*H*F9< ztAFPy3ln?Sb++*ev}|5m<8}g-AGz!{sq1v>zFG>ft&d2dB2Me>B7jbp+MLQP6U)fH zEf{m7XF8?MUEf8~c%l(5ks$pQqCaN@xnN_kw>xR<6FTp1<)y$@2Q3hAQL|rs_PSVV z<Yxner+Zd?)0*BhqL1T#p0M~QpO{C^1wWra7($uH6^a1W$J<=JHXUiwkEuBgP8<uM zb@{eiT-@eb?B_}WW1a3PUV*oUV88uWIivI|e|a{ael9Ew3anmqEfM)P6~+Kt+YL*- zGR)jRNKy8eN3Mt?rI1ANuWM$cD);zT@mDo`tKAQf<6G=2CF`7fm#zx7wJpO64U6k# z8OXmZT4xz1SPXbN;}xP5lq9%?zP*8@i0q;&$y*99Q5bCnD|Be%bq&;Kdv~+7HNgPK zfF50pnB<LUYDhD${<+sJp)EG7es_JiN#T5kDK^KRe#Cz40cTP^^pwR*VK4y?m}j|J zcw7I7djWl?M<GfYXp3OtELedg-O@V4#50M{IJ)AX4Y_Zuj#pSY)RJ4i1Qsw-KZ5?S zHj&R2S@cXw;~a7|<{|`OFBp#L*gn}yZvxiPe)ib0TyX^Uj!jc7#}w$$Zts}5@!#I( zzWlkeCaOG(hZx`)9;SBc{sogDob0w&b_|n%-h6?ndoPK>JP!99XqdY^v;bb2U-(sb zsit8X@{TdOIzn&5vLqNayDx9+@}El$T6K2(ljUM~LfO;bDvP!HHT!;}nq1$MQW(H6 zupEQBQvYnoWxU=X{)CAW)s#oF=LH_DZ{UhcD{;u-_`kcDGP4rv9XZ%1$)BCB$G_d$ z;e(6Ccd4Hg;>jq1OP%%w$oVpHjxPC5EzCd1h913^lZ;RdXF^+O%iosA?}|F6A?(pn z?xQcowK-Y6ya{6xQT?!}=RRGpaMi{Y;U9e<`u((-YhRjk__*qq=<$-(SfMtt9ITDq z@3;h>*|}MY&W)U9Ka>|yc>ad2ll}`2jBSR|b*U6D&(kW>73U4}&Sm@+-es9=i&x@1 zdRtRI`*DUAXg@(MygMwcR2@>K*<<2=dzTUFLp@lyY9B^&=<t`(K8^)QP|W7={&fvV zS<2<T({M+}N=~glSlu8)$Wb^w7G`X!;IuSP_uN>%s$4|zkH(?H2+OJi<DWKZc$tnz z(eixi?`7u)<Fc+f2Kwn(bah_sv6Eevv8H~OBSnBT#9zRxFOp5**T~UPO%VXQSx@&~ zNXYA6poRH9$`O)Dg3tW?U02>rN&b&4+IPiiGm)W1Ff05?@<KCb_jj^niUOXyunxeZ zf^g}?zOE5`iM-WK^FPCOdBY`axj>JGe)!T70k$o%F{Yyj-g6W8u(BCKUvPkD2qB;c zxhD`RV7}!4rePg@zV%rqp*Ash-H|~3Ab80B6}Lrg+VXu)d$-97y@kfUf+y0#1quK4 zw?CBbiT!;N5xd9!9uDAT*MS8*-CFXcXguR}%J;cb3hCtU(dfZntIqX54;A11^UdL; zm#U)m2nP3Ri0aVlC94=Qn~}^6U(|T<zl}PyLIHQX1Y*C!Vp9^#Q~Ck{(5k-N9wQzc zKPcU{p+>KKh(vLYZ*2^7tS^)04E^Sf|Ld}688kL|?WA1<4eH_f`$d}9bj1nC4|i!Q zn)l>8oAL^jZ%jW+-w<1MPNsFW^*#L=ds(xhG*>Gm8WPp_BF5rpc#Naxq%pAYudbZq zJ2WgICK2D`+pjvZyV)a7pRgq#n8rMzLCU5C<1h&|N}FG~UQEz#Py<I;@yN(7tx5gG zGtuvixB*uNC4$14k#0@BJj*+XrJK5>rx2rOO-|5_x`IfX&NklZBJxA}%8S?r2~9=K z;8&>_$!#r~zlr%HFHLR%A7(UFjJS%;Ev>HF`Wu^srq4;g5=dLf#ws$Gg`RZPB)m)L zqO|D!=pGh<+#*b8nqnlT0Uxu%{L{tn0kn#9zXL{sjpc(9SJ#8fqn=%?DQ~Xkm~?fu z@d5<BE&KaqMiF@OsrlIc!c!)*w}#*Uo5ySSjT?PX?!vN`^wSa!_@~-HGO>Vb{o#KP zo?jR<UYHsxDEpO|#k6;m_3;`XEHtUmNG4oqRm)8HGDK8`aStE2j`M?gPsz#PHd|Ap zc)^|i#g&96o2#IzQn?#%xaG%Y%EB4nG(<#aX9Y#LoP;==1oE;eScn!+VQi2YwZgu} za`XX@P|a=zuOfK1kp}3Cqvsh)r%a8gK(ipMc+e`02Eg3&tP-1TmApQ8(}E;^{CbQ9 z-}yJ0*?3y6oSZ(iL^NU2ievxIM$z><ssjEp?^y8N#~h3GyA5w0X^<^(s&%vYt+6=& zOO5(3_5R2X_xeQsn5DVb?MIW}N`Qi?46Gx@o7KE~h$`!ako+yJ<iwAfb402^3WAoF zXZ8^{gwH9G2b39G8&u!;K6P)=cH#iDvMY3QPkfmV!|ErvCEXCi7exswz144j#@|Ff znsq;J^@T0^9QAXNr~dUgWNWS7qkk^LO@*YkM`!VBe+mlnxW2yF9g5H#xS<J>0&B!4 zX=jh|(YhSSLOfGX+=Kl@;F^P<L2Fb`rs1Wa0YQ%%L0+O)X-3Cv19K^#eBA*9ZoC7D zG;?ki8r8p%316OACHEgdcR}k5vF=Hj<zdM!hvWta?>h_#gIT}8tUCXolZUGB5W9xW z&h@4JTqk4-G~3oYe6z*zUjD_eFEYZDd&d?(G{O%FTO_4_s034y52MU<IkW-i(@WRH z^Fnx+UN0KIE7y*VWnTQS_FagQK5T}J*uB^@(#yMO=_Jis#WEP*rBl*N(wnDubK!R} z4*5Dy7n`F`D`{G%n(7obD^&IQVzv4!EfKD!EB}`c{o{>h!4@;xu2E;nDs_w)tz5Aj z%_Od=a0_l5QT4p@j$W2wd8LRPh#@z?-|s_|%h}9}Peir}4D8#J%j)6X4?^uE8$Ucr zazZlFUSsv<^N$pHJktqQs}`1g#&m4}h&|XJfsgW4V25fSul!~z9Axt;*xGeF`gzcy ztbMFi)FoS|+TyX|u5%()QjMCMY8`?|A(u)|Yg)(oHAIn1En^(nKyvl~VwHM1SI743 z{PliluI4}Le_|^)R&2$gR~yC~`|j%CVl|#fvSI(wFXNQk>TN`*4`mW5J{ycU8Z;+p zMndCI{#}+FqwJZ$-t@dT??NGD=9dx;aSksQzge0<nc~Bk@pq+dLerNo7QNfqa<TJT zvkj8V()l4Yz8T>epUU(mDXmdI1*yeylyfL~%PPfmh--hyHgR{WCzxIOc?QB>Wmj`s zr4;UsU>5}(CA+pqO&(pE3}2?13I9Iev+1W6+-dzgj=me(ubO8k+UW}$Qjd;cZcV-Y zD>UuSe-10(+at_Jf*&c548)EIrjISqrY2ocfMND%%@uQGEy~0a^X#9%YDwtze`X<t z-wwoQYr#~lPbB^xFkiCbhLEsatZ{oqXd!7!6llR%<cA2|2PdgIB{gj8VD#5lKT0jK zua>BsRR=s6c&$HGe0JODE9xz<_i!0woJd%RpomJVmoqH{o+r*~{aTvb>_F}?O-#ws zCP@DJcNf^VG}@=N#AB}w%<@lZTgFw1%Ak?bn$ZlrK2H!ILp_|!ndO;TPK*DNuzK<~ z_gv~be;$YW<*}ubq<j#gd9X5+m;WTC(B3D_O$=hZDHajerVrh_JOE5&@I)md>TmGK zJqQ1!IgIK_+<!rFHATAqa)(ey3uf<W0N;o*jW$@is<>}^MYWrahGcrH+KJu?kQs%_ zW0R7f&(13Eh03jIgU%qxG1Hoq6ndJ}+r1Oja~{V!x2|{Cp=$105Co;G?wB_GxWwd$ zG`l5<SJ&#AK#6_xAuCOA+`M+Lx7IfkH#0{2F<O66`%}?)Y8r#H0}uS;2(vyBH8iX~ zWHpp3ubPsOyYvN9yAD7`%n)^%bn&t?IBQyCSk`S|m*MA}sc)b(I$Dfp1bWo^N<xFF z&Mi&7VwS>LRN<k-lWir1^2^0v&>Ur)z%Q+iI9q4QXwK+{*c3YQIjb`*l%fQ3!C8c7 zvueSt!%J17#30mjXk9NwypUZiI$$3LHe<tMQSBl1OX^hiPv#AKuR`%zeQE&U&JaQ1 znDbUJ8dfs}VPLqFp?<ScMkNBiox@uzUYIsH>Gyr{cDym2yu1~~_fBbY%%Z4RsI;*; z?2;qcjvYjGH(0xXGA~(B>=;w*C=2@-(^mp1<uSTdWQ5#;OuPDR2ad5zob)SEkTh;| zG!?UycQV@mRGW{%=*ZUa{gKg7LkuC@2r5R;?+3I=Lw<r}R;c>w)sI12N(>#nc<DX$ z<`pNzpM_A$%MT{f_dyzjs|?egiv!ZE0RUU5QMO8hlORZ^0xY&IPT@|8v#hOdZXg5| z5%1szR2-ij82>qY>kJ%%q?5i+OLr?P`QFO4!pAGqFUMu4S+ew|@cO8cLwilc;RG_L z5MASDa)G7*nDx6`>HxHJCOW2+AXM#^OS)Q&b^dWRWrwNKbF4%Xc1r9`$14SC%Opns zA?5HGJ!k%pvrpm5{+Eq>LH>F-Pa_pZftX@R{qpsHZ+h^AVaul{yVJf;I=M;dG9%ML zbQFxWN2?0?-qS&WBwR8W#M$|DmpnQ`7U1|;oG+*uI7|}Akq~ewZ(6#Bmd}s5an&ki zFAmBHypLoV$7}q-z#PzciDP=ISgttKua0UqK|;)VQWt!<1G2z=&5U^K7T@Ys$7sSg z+~U4s@_u|y9)I{v@SR3`UP(0g=HQOU-lnd|UuTfBZ%a$4RG8(0vh=Mv*D`M+XLQ9b z6J@^bhl4)m@(((96Tn&*LC_FP9mQClLt(V%Qp-~$sSXZ^4YLv^ext;0LL4i4&0Psf zeojp9nL$;iO-v?gHS<b<O_h(wuw0K7AQ63_HC#|BQ1-mZh$n@VOf@{9g0$(|C)(X2 zrgwHLl$8Qi!fFCqv14d^<0Qbm)LSK-Y(@vO(!9^?y!XkToJCnOfT_+qAXi7q&WO8V z(R~khpchExgD+q_iIu%4p4>#I{^&NcikrRtl9CBjRc*&zY*==oWvK>4j9JOy`RcZJ zEUiiQ15<RtLd5iJ3DPs1n;l(Yy`eLN05abLhh#EAe?$=kb-KZ7?3#WP2_|oBG?<0I z>Xp2-mnlpvsDaK9GdA9B<RzRQV?980L*NBei8d7ku)gbX{YhZ;<S;W2l`uUax5naO zkF7F(jM*gonC%fY(EdKv>Q1vOOGozp1r2A*Bs(f3wML1gYFos}MzfZkduL3s6gyM0 z!-xOvr<>QIKV%RrJ<Zv~GfD8u(y!JBg({Kv-L|JwO)mA9&TA(PO@*wz{86eVvo)tR z4!yf~PUEIlj)SZvzZx|N&jYT!fRX;o_=k_1-*<t)eXh2M*|^q(n7`@8%Kjb;S5lVu zleX=bHAE9igcK`f31=O&b@t`Vznb)W`j?37l!&h2C1s>Jdp<aGdk}}C5R~)z=wFlQ zdUGB#_Iy>x`vU)=#}+EkDb4mgZax=J#zAUwS<kZV_>=#PXBIf<Njaa^?*8#jxW)#i z^yuv8IL7lXKkGsBVW$r9VKKZi&o+3lPucmm!$rBI77oJ=%ganWY3gr}!~rL)l?|HR zcce@9-a+3xTfYvX!}z6)x>A7E?pMqNjod@=bYStTDk-Y>QjJ?X@ZURW*WintVX5FW za(XB`=rrh1QDf7hAtZW4s;VunR|;UX?5!`j-n}%gc19MEJPB|%<J+BdQmgow8E)?} zkuKBI5`cR-Gx8@aO@#F8j8tZ1p-f04Pb?eXrAJm&W(Gv<h~rhb<iL~+lW~%o)XOh< zw|1NX(L+{x2oru8vg%A5BUmmU<!L9Dw}rZ+!cxy6l(50`ISZeygr5OtAwvJ%b*#Kn zZ#1EGZftUHv*B(q8%e~WNojY?Yx*d|)ROAtxiv^K6-cW<@sK|3Zd1~M^UvCs^(*Sv zKOi+g7!Qf5^z&Uc4zPrSxV5p7^;1TDMd;n`0FArU!{x8CZx_=5^Fh2+V!rG#Zs}=% zG9O*Px2w7jxSz`ScG?Fc>ZfOt=h}~B+M4?1Ty@%CeClb`sLgC?iWrRp=K6G-aQ@a% zB70*9Z^ijd_)%#IQsoum^ODPO(OZHx<^7N_1z5^)FUABMK*=aG=A1hhCJ`6}$)SlE zGO6w%WZ$qQ?+FXd|0}6vPDMVk(6b_M!huy70WT<*?nMRha`qk|gP|=cosO&Ar+YoE zi=X2Qy*?r4z3(<!UDEx=_%_Yy=37skwDGkNd0a8`C5zF51W~O%^Pd$(6q5tRmYNF= zLO1Ok+#pkhi*3Vtbd9D?s~YXEOFHBcE@cp&_Lu!*wJD86HCf;Pil9t=tA3Y2>oY3s zSB(pkbSi6>OnIpD#vB^YJGoQQOBpb!|9Ev9^yz)w{nkpDHM|^bBQB6@`apKC=F~rw zEH@lPsZ~<rKwBcz&I!jPWtD6d-S%l0(!Ngjy-9`QIdv@rnY!4fw+?cqUTw~#8rCPa z640BmXOd8y6YL^)x$>C<mRD!-s2`4s`{gJ-#hL?*5O%F14s+VI-bv$cTHjoeuQRi6 zx)^WVEij<}n~L9IB&z>)i020#_+d$EJkICLZseM-QZFOr@&Osn2+s!Ix&3RaQlIXP zfwv>|c*&|HGCVLw$C-Zh@FtOw?MqS@W8lwxg)PE}{UfjB<%84eRFnF}eil_ZOSRWS zwBC54v8Kd6=-Jx9F!(4UjHuAZVkUoc=Sv-WbG9*5>*Ie!XZ<PE&SPH}iPbBM()KOJ zakHSh`uMXS>$zMxjQIi30Pk(Bt__9@j(*F5%z9`xku2|I>Hw~e32D^u__*cT_`s(l zyW)Kx??Yqo70N3T93_{JJLXkMLnIi<AIUhqykJMEU9S1u)y*W0B&4M^UA-@m*J;4t zKq=5w0zRAk-%CKH-s1PMwV@tYX))Dj2eYUzAy?!VDC&b;ww#-Prcpsh_d!mUH7ZQ^ z3r~wAf~P?lwBdORnCz^=Zf!3wXV251TkAti(Ap`6!+cw2&a?d#1C~*CC-Xar3V!To zeYUg%KM0uU)%lW>J(a9jZ(3JVa&6s1`MsNYbL{Qwz_|K3gVX&n(VO-crB_HDIZ;FP zf`KixRo|#kfPG6!l1qz;{oy;I?VyW~Y^cRMG~#aLrmV6suPh!bsO0-*fYDd<wjfno z!v|Q+2bczzsXmtsMdeq+4pFm%{{l=n^?9iZ60XP!;E9zD>Porl#u^;*`W(e^>i6Pw zV4a$j!vQ^(RB-(8w5}~m5E-{cOZcA+MFNvWP9CRK+^E<`tk&knSn9E8ML|b}IS&>{ zLVjkHXU0P^;6i0+A}Xw6oF)E!#slzY&$B_Z(d8~me+`*rmaxRkjf_k)yR=C+BfD4s zTeBINeU`%$00(cv_nDTGR3(T~%6E23)^-pBv@}@ZnsLK0^5pc|*CF?@%$Ly+(R7Rs z1mrgHt%P1yi;qe#&ZqoMby?0Pr?=ga&@zynTkdkjK$?d%&WBg6$~{wCp9U~ZE7ZH* zSxD+#yDW<RoahgTZz)QZdu&oz>#YyRYMp0{0poaD=DAbin^OFmx1na9gS8coyjpPh aX+a3F<iY<BTO(gFc%3aZGgxO>SpNeWmHeat diff --git a/packages/checkpoint_identity_awareness b/packages/checkpoint_identity_awareness index 31f53e2..a6cd719 100644 --- a/packages/checkpoint_identity_awareness +++ b/packages/checkpoint_identity_awareness @@ -1,14 +1,17 @@ -{'author': u'Th.L. (thl-cmk[at]outlook[dot]com)', - 'description': u'Monitors status of Check Point Identity Awareness.\nCreates one check for the global IA status and one check for each AD Query (LDAP) domain.\n', +{'author': 'Th.L. (thl-cmk[at]outlook[dot]com)', + 'description': 'Monitors status of Check Point Identity Awareness.\n' + 'Creates one check for the global IA status and one check for ' + 'each AD Query (LDAP) domain.\n', 'download_url': 'https://thl-cmk.hopto.org', - 'files': {'checks': ['checkpoint_ia_adquery', - 'checkpoint_identity_awareness'], + 'files': {'agent_based': ['checkpoint_ia_adquery.py', + 'checkpoint_identity_awareness.py'], 'web': ['plugins/wato/checkpoint_identity_awareness.py', 'plugins/metrics/checkpoint_identity_awareness.py', 'plugins/metrics/checkpoint_ia_adquery.py']}, 'name': 'checkpoint_identity_awareness', 'num_files': 5, - 'title': u'Check Point Identity Awareness checks', - 'version': '20200608.v.0.1d', - 'version.min_required': '1.2.8b8', - 'version.packaged': '1.4.0p38'} \ No newline at end of file + 'title': 'Check Point Identity Awareness checks', + 'version': '20210825.v.0.2', + 'version.min_required': '2.0.0', + 'version.packaged': '2021.07.14', + 'version.usable_until': None} \ No newline at end of file diff --git a/web/plugins/metrics/checkpoint_ia_adquery.py b/web/plugins/metrics/checkpoint_ia_adquery.py index cc9811a..0aaf9e1 100644 --- a/web/plugins/metrics/checkpoint_ia_adquery.py +++ b/web/plugins/metrics/checkpoint_ia_adquery.py @@ -1,5 +1,5 @@ -#!/usr/bin/python -# -*- encoding: utf-8; py-indent-offset: 4 -*- +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- # # License: GNU General Public License v2 # @@ -10,6 +10,15 @@ # Check Point Identity Awareness AD Query metrics plugin # checkpoint_ia_query # + +from cmk.gui.i18n import _ + +from cmk.gui.plugins.metrics import ( + metric_info, + graph_info, + perfometer_info, +) + metric_info['checkpoint_ia_adquery_summary'] = { 'title': _('Events summary'), 'unit': '1/s', @@ -56,51 +65,45 @@ metric_info['checkpoint_ia_adquery_dc_10_250_1_113'] = { # # # -check_metrics['check_mk-checkpoint_ia_adquery'] = { - 'events_sum': {'name': 'checkpoint_ia_adquery_summary', }, - 'dc_10_140_110_1': {'name': 'checkpoint_ia_adquery_dc_10_140_110_1', }, - 'dc_10_140_110_2': {'name': 'checkpoint_ia_adquery_dc_10_140_110_2', }, - 'dc_10_215_2_252': {'name': 'checkpoint_ia_adquery_dc_10_215_2_252', }, - 'dc_10_215_2_253': {'name': 'checkpoint_ia_adquery_dc_10_215_2_253', }, - 'dc_10_225_110_240': {'name': 'checkpoint_ia_adquery_dc_10_225_110_240', }, - 'dc_10_250_1_112': {'name': 'checkpoint_ia_adquery_dc_10_250_1_112', }, - 'dc_10_250_1_113': {'name': 'checkpoint_ia_adquery_dc_10_250_1_113', }, -} -# igepa graph -graph_info.append({ + +graph_info['checkpoint_ia_adquery_dc'] = { 'title': _('Check Point Identity Awareness AD queries'), 'metrics': [ ('checkpoint_ia_adquery_summary', 'line'), ('checkpoint_ia_adquery_dc_10_250_1_112', 'stack'), ('checkpoint_ia_adquery_dc_10_250_1_113', 'stack'), ], -}) - -# hri graph -graph_info.append({ - 'title': _('Check Point Identity Awareness AD queries'), - 'metrics': [ - ('checkpoint_ia_adquery_summary', 'line'), - ('checkpoint_ia_adquery_dc_10_140_110_1', 'stack'), - ('checkpoint_ia_adquery_dc_10_140_110_2', 'stack'), + 'optional_metrics': [ + 'checkpoint_ia_adquery_dc_10_250_1_112', + 'checkpoint_ia_adquery_dc_10_250_1_113', ], -}) +} -# h&r graph -graph_info.append({ - 'title': _('Check Point Identity Awareness AD queries'), - 'metrics': [ - ('checkpoint_ia_adquery_summary', 'line'), - ('checkpoint_ia_adquery_dc_10_215_2_252', 'stack'), - ('checkpoint_ia_adquery_dc_10_215_2_253', 'stack'), - ('checkpoint_ia_adquery_dc_10_225_110_240', 'stack'), - ], -}) + +# graph_info.append({ +# 'title': _('Check Point Identity Awareness AD queries'), +# 'metrics': [ +# ('checkpoint_ia_adquery_summary', 'line'), +# ('checkpoint_ia_adquery_dc_10_140_110_1', 'stack'), +# ('checkpoint_ia_adquery_dc_10_140_110_2', 'stack'), +# ], +# }) + +# graph_info.append({ +# 'title': _('Check Point Identity Awareness AD queries'), +# 'metrics': [ +# ('checkpoint_ia_adquery_summary', 'line'), +# ('checkpoint_ia_adquery_dc_10_215_2_252', 'stack'), +# ('checkpoint_ia_adquery_dc_10_215_2_253', 'stack'), +# ('checkpoint_ia_adquery_dc_10_225_110_240', 'stack'), +# ], +# }) perfometer_info.append({ 'type': 'linear', - 'segments': ['checkpoint_ia_adquery_summary', - ], + 'segments': [ + 'checkpoint_ia_adquery_summary', + ], 'total': 100, }) diff --git a/web/plugins/metrics/checkpoint_identity_awareness.py b/web/plugins/metrics/checkpoint_identity_awareness.py index 3f37f85..e3cde3d 100644 --- a/web/plugins/metrics/checkpoint_identity_awareness.py +++ b/web/plugins/metrics/checkpoint_identity_awareness.py @@ -1,5 +1,5 @@ -#!/usr/bin/python -# -*- encoding: utf-8; py-indent-offset: 4 -*- +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- # # License: GNU General Public License v2 # @@ -11,6 +11,14 @@ # checkpoint_identity_awareness # +from cmk.gui.i18n import _ + +from cmk.gui.plugins.metrics import ( + metric_info, + graph_info, + perfometer_info, +) + metric_info['checkpoint_identity_awareness_iaSuccUserLoginADQuery'] = { 'title': _('Successfull ADQuery user login attempts'), 'unit': 'count', @@ -157,44 +165,7 @@ metric_info['checkpoint_identity_awareness_iaDataTrans'] = { 'color': '42/a', } - -check_metrics['check_mk-checkpoint_identity_awareness'] = { - 'iaSuccUserLoginADQuery': {'name': 'checkpoint_identity_awareness_iaSuccUserLoginADQuery', 'auto_graph': False }, - 'iaSuccMachLoginADQuery': {'name': 'checkpoint_identity_awareness_iaSuccMachLoginADQuery', 'auto_graph': False }, - 'iaSuccUserLoginKerberos': {'name': 'checkpoint_identity_awareness_iaSuccUserLoginKerberos', 'auto_graph': False }, - 'iaSuccMachLoginKerberos': {'name': 'checkpoint_identity_awareness_iaSuccMachLoginKerberos', 'auto_graph': False }, - 'iaSuccUserLoginPass': {'name': 'checkpoint_identity_awareness_iaSuccUserLoginPass', 'auto_graph': False }, - 'iaUnSuccUserLoginKerberos': {'name': 'checkpoint_identity_awareness_iaUnSuccUserLoginKerberos', 'auto_graph': False }, - 'iaUnSuccMachLoginKerberos': {'name': 'checkpoint_identity_awareness_iaUnSuccMachLoginKerberos', 'auto_graph': False }, - 'iaUnSuccUserLoginPass': {'name': 'checkpoint_identity_awareness_iaUnSuccUserLoginPass', 'auto_graph': False }, - - 'iaSuccUserLDAP': {'name': 'checkpoint_identity_awareness_iaSuccUserLDAP', 'auto_graph': False }, - 'iaUnSuccUserLDAP': {'name': 'checkpoint_identity_awareness_iaUnSuccUserLDAP', 'auto_graph': False }, - - 'iaAuthUsers': {'name': 'checkpoint_identity_awareness_iaAuthUsers', 'auto_graph': False }, - 'iaAuthUsersADQuery': {'name': 'checkpoint_identity_awareness_iaAuthUsersADQuery', 'auto_graph': False }, - 'iaAuthUsersKerberos': {'name': 'checkpoint_identity_awareness_iaAuthUsersKerberos', 'auto_graph': False }, - 'iaAuthMachADQuery': {'name': 'checkpoint_identity_awareness_iaAuthMachADQuery', 'auto_graph': False }, - 'iaAuthMachKerberos': {'name': 'checkpoint_identity_awareness_iaAuthMachKerberos', 'auto_graph': False }, - 'iaAuthUsersPass': {'name': 'checkpoint_identity_awareness_iaAuthUsersPass', 'auto_graph': False }, - 'iaUnAuthUsers': {'name': 'checkpoint_identity_awareness_iaUnAuthUsers', 'auto_graph': False }, - - 'iaLoggedInADQuery': {'name': 'checkpoint_identity_awareness_iaLoggedInADQuery', 'auto_graph': False }, - 'iaLoggedInAgent': {'name': 'checkpoint_identity_awareness_iaLoggedInAgent', 'auto_graph': False }, - 'iaTerminalServer': {'name': 'checkpoint_identity_awareness_iaTerminalServer', 'auto_graph': False}, - 'iaRemoteAccess': {'name': 'checkpoint_identity_awareness_iaRemoteAccess', 'auto_graph': False}, - 'iaLoggedInCaptivePortal': {'name': 'checkpoint_identity_awareness_iaLoggedInCaptivePortal', 'auto_graph': False }, - 'iaIdentityCollectorCiscoISE': {'name': 'checkpoint_identity_awareness_iaIdentityCollectorCiscoISE', 'auto_graph': False}, - 'iaIdentityWebAPI': {'name': 'checkpoint_identity_awareness_iaIdentityWebAPI', 'auto_graph': False}, - 'iaRADIUSAccounting': {'name': 'checkpoint_identity_awareness_iaRADIUSAccounting', 'auto_graph': False}, - 'iaIdentityCollectorActiveDirectory': {'name': 'checkpoint_identity_awareness_iaIdentityCollectorActiveDirectory', 'auto_graph': False}, - - 'iaAntiSpoffProtection': {'name': 'checkpoint_identity_awareness_iaAntiSpoffProtection', 'auto_graph': False}, - - 'iaDataTrans': {'name': 'checkpoint_identity_awareness_iaDataTrans', 'auto_graph': False}, -} - -graph_info.append({ +graph_info['checkpoint_identity_awareness_login_attempts'] = { 'title': _('Check Point Identity Awareness login attempts'), 'metrics': [ ('checkpoint_identity_awareness_iaUnSuccUserLoginPass', '-stack'), @@ -206,17 +177,31 @@ graph_info.append({ ('checkpoint_identity_awareness_iaSuccMachLoginADQuery', 'stack'), ('checkpoint_identity_awareness_iaSuccUserLoginADQuery', 'stack'), ], -}) + 'optional_metrics': [ + 'checkpoint_identity_awareness_iaUnSuccUserLoginPass', + 'checkpoint_identity_awareness_iaUnSuccMachLoginKerberos', + 'checkpoint_identity_awareness_iaUnSuccUserLoginKerberos', + 'checkpoint_identity_awareness_iaSuccUserLoginPass', + 'checkpoint_identity_awareness_iaSuccMachLoginKerberos', + 'checkpoint_identity_awareness_iaSuccUserLoginKerberos', + 'checkpoint_identity_awareness_iaSuccMachLoginADQuery', + 'checkpoint_identity_awareness_iaSuccUserLoginADQuery', + ], +} -graph_info.append({ +graph_info['checkpoint_identity_awareness_ldap_queries'] = { 'title': _('Check Point Identity Awareness LDAP queries'), 'metrics': [ ('checkpoint_identity_awareness_iaUnSuccUserLDAP', '-area'), ('checkpoint_identity_awareness_iaSuccUserLDAP', 'area'), ], -}) + 'optional_metrics': [ + 'checkpoint_identity_awareness_iaUnSuccUserLDAP', + 'checkpoint_identity_awareness_iaSuccUserLDAP', + ] +} -graph_info.append({ +graph_info['checkpoint_identity_awareness_auth_user_machine'] = { 'title': _('Check Point Identity Awareness authenticated/unauthenticated users/machines'), 'metrics': [ ('checkpoint_identity_awareness_iaUnAuthUsers', 'stack'), @@ -227,9 +212,18 @@ graph_info.append({ ('checkpoint_identity_awareness_iaAuthUsersADQuery', 'stack'), ('checkpoint_identity_awareness_iaAuthUsers', 'line'), ], -}) + 'optional_metrics': [ + 'checkpoint_identity_awareness_iaUnAuthUsers', + 'checkpoint_identity_awareness_iaAuthUsersPass', + 'checkpoint_identity_awareness_iaAuthMachKerberos', + 'checkpoint_identity_awareness_iaAuthMachADQuery', + 'checkpoint_identity_awareness_iaAuthUsersKerberos', + 'checkpoint_identity_awareness_iaAuthUsersADQuery', + 'checkpoint_identity_awareness_iaAuthUsers', + ] +} -graph_info.append({ +graph_info['checkpoint_identity_awareness_loggid_in_users'] = { 'title': _('Check Point Identity Awareness logged in users with'), 'metrics': [ ('checkpoint_identity_awareness_iaLoggedInCaptivePortal', 'stack'), @@ -242,7 +236,18 @@ graph_info.append({ ('checkpoint_identity_awareness_iaLoggedInAgent', 'stack'), ('checkpoint_identity_awareness_iaLoggedInADQuery', 'stack'), ], -}) + 'optional_metrics': [ + 'checkpoint_identity_awareness_iaLoggedInCaptivePortal', + 'checkpoint_identity_awareness_iaRADIUSAccounting', + 'checkpoint_identity_awareness_iaIdentityWebAPI', + 'checkpoint_identity_awareness_iaIdentityCollectorActiveDirectory', + 'checkpoint_identity_awareness_iaIdentityCollectorCiscoISE', + 'checkpoint_identity_awareness_iaRemoteAccess', + 'checkpoint_identity_awareness_iaTerminalServer', + 'checkpoint_identity_awareness_iaLoggedInAgent', + 'checkpoint_identity_awareness_iaLoggedInADQuery', + ], +} #graph_info.append({ # 'title': _('Check Point Identity Awareness users with an active Traffic Anti-Spoffing protection'), diff --git a/web/plugins/wato/checkpoint_identity_awareness.py b/web/plugins/wato/checkpoint_identity_awareness.py index f75fd95..1c3dc7c 100644 --- a/web/plugins/wato/checkpoint_identity_awareness.py +++ b/web/plugins/wato/checkpoint_identity_awareness.py @@ -1,5 +1,5 @@ -#!/usr/bin/python -# -*- encoding: utf-8; py-indent-offset: 4 -*- +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- # # License: GNU General Public License v2 # @@ -9,7 +9,27 @@ # # Check_MK checkpoint_identity_awareness WATO plugin # -ignorecounters = [ + +from cmk.gui.i18n import _ +from cmk.gui.valuespec import ( + Dictionary, + Integer, + TextAscii, + FixedValue, + ListChoice, + ListOf, + Tuple, + TextUnicode, + MonitoringState, +) + +from cmk.gui.plugins.wato import ( + CheckParameterRulespecWithItem, + rulespec_registry, + RulespecGroupCheckParametersNetworking, +) + +_ignorecounters = [ # ('iaAuthUsers', 'Authenticated users and machines'), # will be used in perf-o-meter ('iaAuthUsersPass', 'Authenticated users by name and password'), ('iaAuthUsersADQuery', 'Authenticated users by ADQuery'), @@ -42,24 +62,27 @@ ignorecounters = [ ('iaDataTrans', 'How much data did the gateway transmitted'), ] -register_check_parameters(subgroup_applications, - 'checkpoint_identity_awareness', - _('Check Point Identity Awareness'), - Dictionary( - title=_('Check Point Identity Awareness status'), - elements=[ - ('ignore_counters', - ListChoice( - title=_('list of counters to ignore'), - label=_('list of counters to ignore'), - help=_('Counters to remove from performance data. ' - 'Metrics file (~/local/share/check_mk/web/plugins/metrics/checkpoint_identity_awareness.py) ' - 'graph definition needs to be adjusted.'), - choices=ignorecounters, - default_value=[], - )), - ], - ), - None, - match_type='dict', - ) + +def _parameter_valuespec_checkpoint_identity_awareness(): + return Dictionary( + title=_('Check Point Identity Awareness status'), + elements=[ + ('ignore_counters', + ListChoice( + title=_('list of counters to ignore'), + help=_('Counters to remove from performance data.'), + choices=_ignorecounters, + default_value=[], + )), + ], + ) + + +rulespec_registry.register( + CheckParameterRulespecWithItem( + check_group_name='checkpoint_identity_awareness', + group=RulespecGroupCheckParametersNetworking, + match_type='dict', + parameter_valuespec=_parameter_valuespec_checkpoint_identity_awareness, + title=lambda: _('Check Point Identity Awareness'), + )) -- GitLab