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
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
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