From 8e75d919ef055a579c5fdf539d7cbac99aa32454 Mon Sep 17 00:00:00 2001
From: "th.l" <thl-cmk@outlook.com>
Date: Tue, 30 Jul 2024 06:19:31 +0200
Subject: [PATCH] update project

---
 README.md                                     |   2 +-
 mkp/vsphere_topo-0.0.6-20240729.mkp           | Bin 0 -> 8259 bytes
 .../{packages.py => vsphere_topo.py}          |  51 +++++++++++----
 .../vsphere_topo/constants.py                 |   6 +-
 .../graphing/{packages.py => vsphere_topo.py} |   0
 .../rulesets/{packages.py => vsphere_topo.py} |  59 +++++++++++++-----
 source/packages/vsphere_topo                  |  12 ++--
 7 files changed, 92 insertions(+), 38 deletions(-)
 create mode 100644 mkp/vsphere_topo-0.0.6-20240729.mkp
 rename source/cmk_addons_plugins/vsphere_topo/agent_based/{packages.py => vsphere_topo.py} (82%)
 rename source/cmk_addons_plugins/vsphere_topo/graphing/{packages.py => vsphere_topo.py} (100%)
 rename source/cmk_addons_plugins/vsphere_topo/rulesets/{packages.py => vsphere_topo.py} (76%)

diff --git a/README.md b/README.md
index 76338db..b5a342b 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-[PACKAGE]: ../../raw/master/mkp/vsphere_topo-0.0.5-20240717.mkp "vsphere_topo-0.0.5-20240717.mkp"
+[PACKAGE]: ../../raw/master/mkp/vsphere_topo-0.0.6-20240729.mkp "vsphere_topo-0.0.6-20240729.mkp"
 # vSphere Topology Visualization
 
 This plugin uses the data from the _VMware ESX via vSphere_ special agent to create a topology of the vSphere environment.\
diff --git a/mkp/vsphere_topo-0.0.6-20240729.mkp b/mkp/vsphere_topo-0.0.6-20240729.mkp
new file mode 100644
index 0000000000000000000000000000000000000000..04691eaa5f72279a5fdc38e49ce65eaecc02a435
GIT binary patch
literal 8259
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

literal 0
HcmV?d00001

diff --git a/source/cmk_addons_plugins/vsphere_topo/agent_based/packages.py b/source/cmk_addons_plugins/vsphere_topo/agent_based/vsphere_topo.py
similarity index 82%
rename from source/cmk_addons_plugins/vsphere_topo/agent_based/packages.py
rename to source/cmk_addons_plugins/vsphere_topo/agent_based/vsphere_topo.py
index f03291e..791db5f 100644
--- a/source/cmk_addons_plugins/vsphere_topo/agent_based/packages.py
+++ b/source/cmk_addons_plugins/vsphere_topo/agent_based/vsphere_topo.py
@@ -18,10 +18,15 @@
 # 2024-07-13: refactoring save topology/make default and add dummy's logic
 # 2024-07-16: moved add_host/add_service/add_connection to lib/utils/TopoObjects/TopoConnections
 #             moved ruleset name constants to utils/ruleset_names.py
+# 2024-07-25: fixed crash if VM has no data store
+# 2024-07-29: added option to ignore powered off VMs
+#             added option to ignore VMs by name (regex)
 
 from collections.abc import Mapping, Sequence
+from re import compile as re_compile
 from time import time_ns
 
+
 from cmk.agent_based.v2 import (
     CheckPlugin,
     CheckResult,
@@ -43,6 +48,8 @@ from cmk_addons.plugins.vsphere_topo.constants import (
     PARAM_DATA_STORE,
     PARAM_DATA_STORE_AS_SERVICE,
     PARAM_HOST_SYSTEMS,
+    PARAM_IGNORE_POWERED_OFF_VMS,
+    PARAM_IGNORE_VM_NAME_REGEX,
     PARAM_MAKE_DEFAULT,
     PARAM_VCENTER,
     PARAM_VM_NAMES,
@@ -79,8 +86,14 @@ def check_vsphere_topo(
         section_esx_vsphere_datastores: Section | None,
 ) -> CheckResult:
     start_time = time_ns()
-    objects = TopoObjects()
-    connections = TopoConnections()
+    objects: TopoObjects = TopoObjects()
+    connections: TopoConnections = TopoConnections()
+    ignored_powered_off_vms: int = 0
+    ignored_by_name_vms: int = 0
+    if ignore_by_name_str := ')|('.join(params.get(PARAM_IGNORE_VM_NAME_REGEX, [])):
+        re_ignore_vms = re_compile(f'({ignore_by_name_str})')
+    else:
+        re_ignore_vms = None
 
     if section_esx_vsphere_clusters is not None:
         __clusters = {
@@ -161,10 +174,16 @@ def check_vsphere_topo(
             }
         ]
         for vm in section_esx_vsphere_virtual_machines:
-            vm_name: str = adjust_name(vm['vm_name'], params.get(PARAM_VM_NAMES, {}))
-            host_system: str = adjust_name(vm['hostsystem'], params.get(PARAM_HOST_SYSTEMS, {}))
-            objects.add_host(host=vm_name)
-            connections.add_connection(vm_name, host_system)
+            if params.get(PARAM_IGNORE_POWERED_OFF_VMS) is not True or vm.get('powerstate') != 'poweredOff':
+                vm_name: str = adjust_name(vm['vm_name'], params.get(PARAM_VM_NAMES, {}))
+                if re_ignore_vms is None or re_ignore_vms.match(vm_name) is None:
+                    host_system: str = adjust_name(vm['hostsystem'], params.get(PARAM_HOST_SYSTEMS, {}))
+                    objects.add_host(host=vm_name)
+                    connections.add_connection(vm_name, host_system)
+                else:
+                    ignored_by_name_vms += 1
+            else:
+                ignored_powered_off_vms += 1
 
     service_prefix: str = ''
     ds_services = None
@@ -217,13 +236,17 @@ def check_vsphere_topo(
             if vm_name in objects.topo_objects:
                 data_stores = data_stores.split(',')
                 for data_store in data_stores:
-                    ds_name = data_store.strip().split(' ')[2]
-                    if ds_services is not None:
-                        service_name = f'{service_prefix}{ds_name}'
-                        service_id = f'{service_name}@{vsphere_host}'
-                        connections.add_connection(service_id, vm_name)
+                    try:
+                        ds_name = data_store.strip().split(' ')[2]
+                    except IndexError:
+                        continue
                     else:
-                        connections.add_connection(ds_name, vm_name)
+                        if ds_services is not None:
+                            service_name = f'{service_prefix}{ds_name}'
+                            service_id = f'{service_name}@{vsphere_host}'
+                            connections.add_connection(service_id, vm_name)
+                        else:
+                            connections.add_connection(ds_name, vm_name)
 
     connections.topo_connections.sort()
     data_set = {
@@ -241,6 +264,10 @@ def check_vsphere_topo(
 
     yield Result(state=State.OK, summary=f'Objects: {len(objects.topo_objects)}')
     yield Result(state=State.OK, summary=f'Connections: {len(connections.topo_connections)}')
+    if params.get(PARAM_IGNORE_POWERED_OFF_VMS) is True:
+        yield Result(state=State.OK, summary=f'Ignored powered off VMs: {ignored_powered_off_vms}')
+    if re_ignore_vms is not None:
+        yield Result(state=State.OK, summary=f'Ignored VMs by name: {ignored_by_name_vms}')
     yield Result(
         state=State.OK,
         notice=f'Written to: {BASE_TOPO_PATH}/{raw_vsphere_host}/data_{TOPOLOGY_NAME.lower()}.json',
diff --git a/source/cmk_addons_plugins/vsphere_topo/constants.py b/source/cmk_addons_plugins/vsphere_topo/constants.py
index e58585f..2036aea 100644
--- a/source/cmk_addons_plugins/vsphere_topo/constants.py
+++ b/source/cmk_addons_plugins/vsphere_topo/constants.py
@@ -16,7 +16,8 @@ EMBLEM_DATA_STORE: Final[str] = 'icon_services_green'
 
 ICON_VCENTER: Final[str] = 'icon_topic_hosts'
 
-PARAM_ADD_DUMMY_TOPOLOGIES: Final[str] = 'add_dummy_topologies'
+# PARAM_ADD_DUMMY_TOPOLOGIES: Final[str] = 'add_dummy_topologies'
+# PARAM_DONT_ADD_VC_AS_VM: Final[str] = 'dont_add_vc_as_vm'
 PARAM_CHANGE_CASE: Final[str] = 'change_case'
 PARAM_CLUSTER: Final[str] = 'cluster'
 PARAM_CUSTOM_EMBLEM: Final[str] = 'custom_emblem'
@@ -24,8 +25,9 @@ PARAM_DATA_CENTER: Final[str] = 'data_center'
 PARAM_DATA_STORE: Final[str] = 'data_store'
 PARAM_DATA_STORE_AS_SERVICE: Final[str] = 'data_sore_as_service'
 PARAM_DEFAULT_EMBLEM: Final[str] = 'default_emblem'
-PARAM_DONT_ADD_VC_AS_VM: Final[str] = 'dont_add_vc_as_vm'
 PARAM_HOST_SYSTEMS: Final[str] = 'host_systems'
+PARAM_IGNORE_POWERED_OFF_VMS: Final[str] = 'ignore_powered_off_vms'
+PARAM_IGNORE_VM_NAME_REGEX: Final[str] = 'ignore_vms_by_name'
 PARAM_KEEP_DOMAIN: Final[str] = 'keep_domain'
 PARAM_LOWER: Final[str] = 'lower'
 PARAM_MAKE_DEFAULT: Final[str] = 'make_default'
diff --git a/source/cmk_addons_plugins/vsphere_topo/graphing/packages.py b/source/cmk_addons_plugins/vsphere_topo/graphing/vsphere_topo.py
similarity index 100%
rename from source/cmk_addons_plugins/vsphere_topo/graphing/packages.py
rename to source/cmk_addons_plugins/vsphere_topo/graphing/vsphere_topo.py
diff --git a/source/cmk_addons_plugins/vsphere_topo/rulesets/packages.py b/source/cmk_addons_plugins/vsphere_topo/rulesets/vsphere_topo.py
similarity index 76%
rename from source/cmk_addons_plugins/vsphere_topo/rulesets/packages.py
rename to source/cmk_addons_plugins/vsphere_topo/rulesets/vsphere_topo.py
index e541adb..4ce3367 100644
--- a/source/cmk_addons_plugins/vsphere_topo/rulesets/packages.py
+++ b/source/cmk_addons_plugins/vsphere_topo/rulesets/vsphere_topo.py
@@ -8,6 +8,8 @@
 # Date  : 2024-07-06
 # File  : vsphere_topo/rulesets/packages.py
 
+# removed PARAM_ADD_DUMMY_TOPOLOGIES and PARAM_DONT_ADD_VC_AS_VM
+
 from collections.abc import Mapping, Sequence
 
 from cmk.rulesets.v1 import Help, Label, Title
@@ -21,15 +23,17 @@ from cmk.rulesets.v1.form_specs import (
     SingleChoice,
     SingleChoiceElement,
     String,
+    List,
 )
 from cmk.rulesets.v1.form_specs.validators import LengthInRange
 from cmk.rulesets.v1.rule_specs import CheckParameters, HostCondition, Topic
 from cmk_addons.plugins.vsphere_topo.constants import (
+    # PARAM_ADD_DUMMY_TOPOLOGIES,
+    # PARAM_DONT_ADD_VC_AS_VM,
     EMBLEM_CLUSTER,
     EMBLEM_DATA_CENTER,
     EMBLEM_DATA_STORE,
     ICON_VCENTER,
-    PARAM_ADD_DUMMY_TOPOLOGIES,
     PARAM_CHANGE_CASE,
     PARAM_CLUSTER,
     PARAM_CUSTOM_EMBLEM,
@@ -37,8 +41,9 @@ from cmk_addons.plugins.vsphere_topo.constants import (
     PARAM_DATA_STORE,
     PARAM_DATA_STORE_AS_SERVICE,
     PARAM_DEFAULT_EMBLEM,
-    PARAM_DONT_ADD_VC_AS_VM,
     PARAM_HOST_SYSTEMS,
+    PARAM_IGNORE_POWERED_OFF_VMS,
+    PARAM_IGNORE_VM_NAME_REGEX,
     PARAM_KEEP_DOMAIN,
     PARAM_LOWER,
     PARAM_MAKE_DEFAULT,
@@ -177,28 +182,48 @@ def _parameter_form() -> Dictionary:
                     ),
                     value=True
                 )),
-            PARAM_DONT_ADD_VC_AS_VM: DictElement(
-                render_only=True,
+            PARAM_IGNORE_POWERED_OFF_VMS: DictElement(
                 parameter_form=FixedValue(
-                    title=Title('Don\'t add vCenter as VM'),
-                    label=Label('The vCenter will not be added as VM'),
+                    title=Title('Ignore powered off VMs'),
+                    label=Label('enabled'),
                     help_text=Help(
-                        'Use this option if the vCenter is also a VM within the managed datacenter.'
-                        'This will create a clearer topology, but you lose the info where the vCenter is running.'
+                        'Powered off VMs will not be added to the topology'
                     ),
-                    value=True
+                    value=True,
                 )),
-            PARAM_ADD_DUMMY_TOPOLOGIES: DictElement(
-                render_only=True,
-                parameter_form=FixedValue(
-                    title=Title('Add dummy topologies'),
-                    label=Label('Adds empty CDP, LLDP, L3v4 and STATIC topology'),
+            PARAM_IGNORE_VM_NAME_REGEX: DictElement(
+                parameter_form=List(
+                    title=Title('Ignore VMs by name (regex)'),
+                    element_template=String(
+                        title=Title('add regex string')
+                    ),
                     help_text=Help(
-                        'Use this option if you are also using the NVDCT. This is a workaround, as the backend '
-                        'only picks up layers that are present in the default topology folder.'
+                        'The regex strings will be applied after the upper/lower case and prefix '
+                        'change to the VM names. If there more than one regex string the will be "OR" connected.'
                     ),
-                    value=True
                 )),
+            # PARAM_DONT_ADD_VC_AS_VM: DictElement(
+            #     render_only=True,
+            #     parameter_form=FixedValue(
+            #         title=Title('Don\'t add vCenter as VM'),
+            #         label=Label('The vCenter will not be added as VM'),
+            #         help_text=Help(
+            #             'Use this option if the vCenter is also a VM within the managed datacenter.'
+            #             'This will create a clearer topology, but you lose the info where the vCenter is running.'
+            #         ),
+            #         value=True
+            #     )),
+            # PARAM_ADD_DUMMY_TOPOLOGIES: DictElement(
+            #     render_only=True,
+            #     parameter_form=FixedValue(
+            #         title=Title('Add dummy topologies'),
+            #         label=Label('Adds empty CDP, LLDP, L3v4 and STATIC topology'),
+            #         help_text=Help(
+            #             'Use this option if you are also using the NVDCT. This is a workaround, as the backend '
+            #             'only picks up layers that are present in the default topology folder.'
+            #         ),
+            #         value=True
+            #     )),
         }
     )
 
diff --git a/source/packages/vsphere_topo b/source/packages/vsphere_topo
index 2215409..8ec8c4e 100644
--- a/source/packages/vsphere_topo
+++ b/source/packages/vsphere_topo
@@ -6,14 +6,14 @@
                 'Topolgy is created by:  vCenter  -> data center(s) '
                 '->Cluster(s) -> ESX host(s) -> VM(s)\n',
  'download_url': 'https://thl-cmk.hopto.org/gitlab/checkmk/various/vsphere_topo',
- 'files': {'cmk_addons_plugins': ['vsphere_topo/agent_based/packages.py',
-                                  'vsphere_topo/rulesets/packages.py',
-                                  'vsphere_topo/lib/utils.py',
-                                  'vsphere_topo/graphing/packages.py',
-                                  'vsphere_topo/constants.py']},
+ 'files': {'cmk_addons_plugins': ['vsphere_topo/lib/utils.py',
+                                  'vsphere_topo/constants.py',
+                                  'vsphere_topo/agent_based/vsphere_topo.py',
+                                  'vsphere_topo/graphing/vsphere_topo.py',
+                                  'vsphere_topo/rulesets/vsphere_topo.py']},
  'name': 'vsphere_topo',
  'title': 'vSphere Topologie',
- 'version': '0.0.5-20240717',
+ 'version': '0.0.6-20240729',
  'version.min_required': '2.3.0b1',
  'version.packaged': 'cmk-mkp-tool 0.2.0',
  'version.usable_until': '2.4.0b1'}
-- 
GitLab