| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231 | 
							- #!/usr/bin/env python3
 
- '''functions used by multiple parts of the plugin'''
 
- # -*- encoding: utf-8; py-indent-offset: 4 -*-
 
- # (c) Michael Honkoop <mhonkoop@comsolve.nl>
 
- # License: GNU General Public License v2
 
- import re
 
- import pytz
 
- import datetime
 
- from dateutil import tz
 
- from cmk.agent_based.v2 import (
 
-     DiscoveryResult,
 
-     Service,
 
- )
 
- ignored_items = [
 
-     "IDM jvm_stats",
 
- ]
 
- uptime_attributes = [
 
-     "Status_eDirectoryUpTime",
 
- ]
 
- time_attributes = [
 
-     "CheckPointThreadData_CheckPointThreadStartTime",
 
-     "Status_eDirectorySystemCurrTime",
 
- ]
 
- time_attributes_ignored = [
 
-     "BackGroundProcInterval",
 
-     "CheckPointThreadData_CheckPointThreadForceStartTime",
 
-     "CheckPointThreadData_CheckPointThreadStartTime",
 
- ]
 
- non_graphable_attributes = [
 
-     "Status_eDirectorySystemCurrTime",
 
-     "Status_eDirectoryUpTime",
 
-     "Status_eDirectoryAgentVersion",
 
-     "CheckPointThreadData_CheckPointThreadStartTime",
 
-     "CheckPointThreadData_CheckPointThreadForceStartTime",
 
-     "CheckPointThreadData_CheckPointThreadIsForced",
 
-     "Size_CurrentTransactionID",
 
-     "EngineVersion_EngineVersion",
 
-     "driverSet_Stats_driverSetDN",
 
-     "Driver_startOption",
 
-     "Driver_type",
 
-     "Driver_uptime",
 
-     "Driver_driver-state",
 
-     "Driver_DriverDN",
 
-     "Finalizer_lock",
 
-     "Finalizer_state",
 
-     "Dispatcher_state",
 
-     "DirXML_state",
 
-     "Scheduler_lock",
 
-     "Scheduler_state",
 
-     "Scheduler_Id",
 
-     "Handler_lock",
 
-     "Handler_state",
 
-     "IDM job_stats",
 
-     "system_properties",
 
- ]
 
- idm_nongraphable_attributes = [
 
-     "arch",
 
-     "average_load",
 
-     "comitted",
 
-     "configuration",
 
-     "containment",
 
-     "downTime",
 
-     "DriverDN",
 
-     "driver-state",
 
-     "id",
 
-     "initial",
 
-     "JobDN",
 
-     "lock",
 
-     "name",
 
-     "processors",
 
-     "startOption",
 
-     "state",
 
-     "status",
 
-     "total",
 
-     "type",
 
-     "uptime",
 
-     "upTime",
 
-     "used",
 
-     "version",
 
- ]
 
- total_counter_attributes = [
 
-     "Bindings_simpleAuthBinds",
 
-     "Bindings_unAuthBinds",
 
-     "Bindings_bindSecurityErrors",
 
-     "Bindings_strongAuthBinds",
 
-     "CacheFaultLooks_BlockCache",
 
-     "CacheFaultLooks_EntryCache",
 
-     "CacheFaultLooks_Total",
 
-     "Errors_errors",
 
-     "Errors_securityErrors",
 
-     "Hits_BlockCache",
 
-     "Hits_EntryCache",
 
-     "Hits_Total",
 
-     "HitLooks_BlockCache",
 
-     "HitLooks_EntryCache",
 
-     "HitLooks_Total",
 
-     "IncomingOperations_abandonOps",
 
-     "IncomingOperations_addEntryOps",
 
-     "IncomingOperations_compareOps",
 
-     "IncomingOperations_extendedOps",
 
-     "IncomingOperations_inOps",
 
-     "IncomingOperations_listOps",
 
-     "IncomingOperations_wholeSubtreeSearchOps",
 
-     "IncomingOperations_oneLevelSearchOps",
 
-     "IncomingOperations_searchOps",
 
-     "IncomingOperations_modifyRDNOps",
 
-     "IncomingOperations_modifyEntryOps",
 
-     "IncomingOperations_removeEntryOps",
 
-     "IncomingOperations_readOps",
 
-     "OutgoingOperations_chainings",
 
-     "OutBoundContext_ActiveOutBoundContextCount",
 
-     "OutBoundContext_TotalOutBoundContextCount",
 
-     "Thread_Stats_Total_Shared_Count",
 
-     "TrafficVolume_inBytes",
 
-     "TrafficVolume_outBytes",
 
- ]
 
- def print_sections(raw_result):
 
-     separator = 124 # '|';
 
-     lines = []
 
-     def process_item(item):
 
-         """Process an individual item in the raw result."""
 
-         if isinstance(item, list):
 
-             for sub_item in item:
 
-                 process_item(sub_item)
 
-         elif isinstance(item, dict):
 
-             for key, value in item.items():
 
-                 if isinstance(value, list):
 
-                     value_str = chr(separator).join(value)  # Preserve list information by joining elements
 
-                 else:
 
-                     value_str = value
 
-                 lines.append(f"{key}={value_str}")
 
-         else:
 
-             if "BackGroundProcInterval" not in str(item):  # Skip irrelevant sections
 
-                 lines.append(str(item))
 
-     
 
-     for each_item in raw_result:
 
-         if isinstance(each_item, list):
 
-             print_sections(each_item)  # Recursive call for nested lists
 
-         elif isinstance(each_item, tuple) and len(each_item) == 2:
 
-             dn, attributes = each_item
 
-             if "BackGroundProcInterval" in dn:
 
-                 continue  # Skip irrelevant DNs
 
-             lines.append(clean_key(dn))
 
-             for key, value in attributes.items():
 
-                 if key == "objectclass":
 
-                     continue  # Skip objectclass attribute
 
-                 if isinstance(value, list):  # Handle list values
 
-                     for item in value:
 
-                         try:
 
-                             decoded_value = item.decode("utf-8")
 
-                             if len(decoded_value) != 0:
 
-                                 lines.append(f"{key}={clean_value(decoded_value)}")
 
-                         except AttributeError:
 
-                             if len(item) != 0:
 
-                                 lines.append(f"{key}={clean_value(item)}")
 
-                 else:  # Handle scalar values
 
-                     try:
 
-                         decoded_value = value.decode("utf-8")
 
-                         if len(decoded_value) != 0:
 
-                             lines.append(f"{key}={clean_value(decoded_value)}")
 
-                     except AttributeError:
 
-                         if len(item) != 0:
 
-                             lines.append(f"{key}={clean_value(value)}")
 
-         else:
 
-             process_item(each_item)
 
-     
 
-     if lines:
 
-         print(chr(separator).join(lines))
 
- def clean_value(value):
 
-     """Clean and format the values by removing unwanted parts."""
 
-     cleaned_value = re.sub(' Bytes| KB| MB| ms', '', value)
 
-     return cleaned_value
 
- def clean_key(key):
 
-     """Clean and format the key by removing unwanted parts."""
 
-     cleaned_key = ' '.join(key.split(',')[::-1]).replace('cn=Monitor', '').replace('cn=', '').strip()
 
-     return cleaned_key
 
- def format_partition_agent(value):
 
-     """strip unwanted data from Agent Partition data"""
 
-     formatted = re.sub('CN=|OU=|O=|T=', '', value).replace("=", " ").replace(" ", "").split("#")
 
-     return formatted
 
- def format_partition_data(value):
 
-     """strip unwanted data from Agent Partition data"""
 
-     formatted = (re.sub('CN=|OU=|O=', '', value).replace(',', '.')).split("=")
 
-     return formatted
 
- def convert_timestamp(value):
 
-     """convert Zulu time to current time in local timezone"""
 
-     utc_dt = datetime.datetime.strptime(str(value), "%Y%m%d%H%M%SZ")
 
-     utc = pytz.utc
 
-     utc_dt = utc_dt.replace(tzinfo=tz.UTC)
 
-     local_tz = tz.tzlocal()
 
-     local_dt = utc_dt.astimezone(local_tz)
 
-     return local_dt
 
- def parse_ldap_data(string_table):
 
-     """parse one lines of data to dictionary"""
 
-     parsed = {}
 
-     for line in string_table:
 
-         item = line[0]
 
-         parsed.setdefault(item, {})
 
-         for _count, data in enumerate(line[1:]):
 
-             if item == "Agent Partition":
 
-                 key, value=format_partition_agent(data)
 
-             else:
 
-                 key, value=format_partition_data(data)
 
-             parsed[item].setdefault(key, value)
 
-     return parsed
 
- def discover_edirectory_items(section) -> DiscoveryResult:
 
-     '''discover one item per key'''
 
-     for key, data in section.items():
 
-         '''Yield a Service, unless the key is empty'''
 
-         if len(key) != 0:
 
-             if not key.startswith("IDM jvm_stats"):
 
-                 print(key)
 
-                 yield Service(item=key)
 
 
  |