From 0e562e37f9424467504139859b9de43b09c1dce8 Mon Sep 17 00:00:00 2001 From: "th.l" <thl-cmk@outlook.com> Date: Mon, 3 Mar 2025 17:10:52 +0100 Subject: [PATCH] fixed per section cache -> removed appliance ports section --- README.md | 2 +- mkp/cisco_meraki-1.4.4-20250303.mkp | Bin 0 -> 44106 bytes .../agent_based/switch_ports_statuses.py | 29 ++-- .../wireless_device_ssid_status.py | 2 +- .../agent_based/wireless_ethernet_statuses.py | 15 +- source/cmk_addons_plugins/meraki/lib/agent.py | 161 ++++++++---------- source/cmk_addons_plugins/meraki/lib/utils.py | 3 +- .../meraki/rulesets/organisations_api.py | 9 +- source/packages/cisco_meraki | 2 +- 9 files changed, 98 insertions(+), 125 deletions(-) create mode 100644 mkp/cisco_meraki-1.4.4-20250303.mkp diff --git a/README.md b/README.md index 38083b3..32aef57 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -[PACKAGE]: ../../raw/master/mkp/cisco_meraki-1.4.2-20250104.mkp "cisco_meraki-1.4.2-20250104.mkp" +[PACKAGE]: ../../raw/master/mkp/cisco_meraki-1.4.4-20250303.mkp "cisco_meraki-1.4.4-20250303.mkp" [SDK]: ../../raw/master/mkp/MerakiSDK-1.52.0-20241116.mkp "MerakiSDK-1.52.0-20241116.mkp" # Cisco Meraki special agent diff --git a/mkp/cisco_meraki-1.4.4-20250303.mkp b/mkp/cisco_meraki-1.4.4-20250303.mkp new file mode 100644 index 0000000000000000000000000000000000000000..312ba9020b6e7c5d567f98c312ee95241074ab80 GIT binary patch literal 44106 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 literal 0 HcmV?d00001 diff --git a/source/cmk_addons_plugins/meraki/agent_based/switch_ports_statuses.py b/source/cmk_addons_plugins/meraki/agent_based/switch_ports_statuses.py index f210421..b7e3032 100644 --- a/source/cmk_addons_plugins/meraki/agent_based/switch_ports_statuses.py +++ b/source/cmk_addons_plugins/meraki/agent_based/switch_ports_statuses.py @@ -7,7 +7,6 @@ # URL : https://thl-cmk.hopto.org # Date : 2023-11-11 # File : switch_ports_statuses.py (check plugin) -from Cython.Shadow import returns # 2024-04-08: moved neighbour_name and neighbour_port to key columns # 2024-04-27: made data parsing more robust # 2024-05-12: added support for MerakiGetOrganizationSwitchPortsStatusesBySwitch (Early Access) @@ -27,6 +26,8 @@ from Cython.Shadow import returns # 2024-11-23 fixed crash on missing traffic data # incompatible removed "Port" from item -> use only interface index # 2024-12-14: reworked output of port status +# changed if_port_type to port_type and from str to int to match Checkmks interface inventory + # ToDo: create service label cmk/meraki/uplink:yes/no @@ -255,9 +256,9 @@ class SwitchPort: usage: SwitchPortUsage | None warnings: Sequence[str] # syntetic settings - alias: str | None - description: str | None - if_port_type: str | None + # alias: str | None + # description: str | None + port_type: int | None name: str | None @classmethod @@ -280,9 +281,9 @@ class SwitchPort: usage=SwitchPortUsage.parse(port.get('usageInKb')), warnings=port['warnings'] if port.get('warnings') is not None else None, # synthetic settings - alias=f'Port {port["portId"]}' if port.get('portId') is not None else None, - description=f'Port {port["portId"]}' if port.get('portId') is not None else None, - if_port_type='6 - ethernetCsmacd', + # alias=f'Port {port["portId"]}' if port.get('portId') is not None else None, + # description=f'Port {port["portId"]}' if port.get('portId') is not None else None, + port_type=6, name=f'Port {port["portId"]}' if port.get('portId') is not None else None, ) @@ -297,7 +298,7 @@ def host_label_meraki_switch_ports_statuses(section: Mapping[str, SwitchPort]) - if port.lldp: yield HostLabel(name="nvdct/has_lldp_neighbours", value="yes") break - # only set LLDP label, Merkai CDP data are not usefully for NVDCT + # only set LLDP label, Meraki CDP data are not usefully for NVDCT def parse_switch_ports_statuses(string_table: StringTable) -> Mapping[str, SwitchPort] | None: @@ -338,7 +339,7 @@ def discover_switch_ports_statuses(params: Mapping[str, object], section: Mappin ) -def render_network_bandwidth_bits(value: int) -> str: +def render_network_bandwidth_bits(value: float) -> str: return render.networkbandwidth(value/8) @@ -432,7 +433,7 @@ def check_switch_ports_statuses(item: str, params: Mapping[str, any], section: M yield Result(state=State.OK, notice=f'Clients: {port.client_count}') if port.is_up_link: - yield Result(state=State.OK, summary='UP-Link', details=f'UP-Link: {is_up_link[port.is_up_link]}') + yield Result(state=State.OK, summary='UP-Link', details=f'UP-Link: {is_up_link[bool(port.is_up_link)]}') else: yield Result(state=State.OK, notice=f'UP-Link: {is_up_link[port.is_up_link]}') @@ -483,13 +484,13 @@ def inventory_meraki_interfaces(section: Mapping[str, SwitchPort]) -> InventoryR "index": port.port_id, }, inventory_columns={ - **({'alias': port.alias} if port.alias else {}), - **({'description': port.description} if port.description else {}), + # **({'alias': port.alias} if port.alias else {}), + # **({'description': port.description} if port.description else {}), **({'name': port.name} if port.name else {}), **({'admin_status': port.admin_state} if port.admin_state else {}), **({'oper_status': port.operational_state} if port.operational_state else {}), **({'speed': port.speed} if port.speed else {}), - **({'if_port_type': port.if_port_type} if port.if_port_type else {}), + **({'port_type': port.port_type} if port.port_type else {}), }, ) @@ -539,7 +540,7 @@ def inventory_meraki_lldp_cache(section: Mapping[str, SwitchPort]) -> InventoryR for port in section.values(): if lldp := port.lldp: key_columns = { - 'local_port': port.port_id, + 'local_port': str(port.port_id), 'neighbour_name': lldp.system_name, 'neighbour_port': lldp.port_id, } diff --git a/source/cmk_addons_plugins/meraki/agent_based/wireless_device_ssid_status.py b/source/cmk_addons_plugins/meraki/agent_based/wireless_device_ssid_status.py index 2710ccc..a157ff4 100644 --- a/source/cmk_addons_plugins/meraki/agent_based/wireless_device_ssid_status.py +++ b/source/cmk_addons_plugins/meraki/agent_based/wireless_device_ssid_status.py @@ -66,7 +66,7 @@ class SSID: def parse_wireless_device_status(string_table: StringTable) -> Mapping[str, SSID] | None: json_data = load_json(string_table) if not (json_data := json_data[0]): - return + return None ssids = {} for row in json_data.get('basicServiceSets', []): diff --git a/source/cmk_addons_plugins/meraki/agent_based/wireless_ethernet_statuses.py b/source/cmk_addons_plugins/meraki/agent_based/wireless_ethernet_statuses.py index 88cc8fe..5b3abbf 100644 --- a/source/cmk_addons_plugins/meraki/agent_based/wireless_ethernet_statuses.py +++ b/source/cmk_addons_plugins/meraki/agent_based/wireless_ethernet_statuses.py @@ -15,6 +15,7 @@ # 2024-11-17: incompatible change item from "Port %s" to "Interface %s" -> rediscover your devices # added interface inventory # 2024-12-12: fixed crash if speed is None +# changed if_port_type to port_type and from str to int to match Checkmks interface inventory # ToDo: create ruleset cisco_meraki_wireless_ethernet_statuses @@ -108,10 +109,10 @@ class WirelessEthernetPort: ) -_is_connected = { - True: 'Yes', - False: 'No', -} +# _is_connected = { +# True: 'Yes', +# False: 'No', +# } def parse_wireless_ethernet_statuses(string_table: StringTable) -> Mapping[str, WirelessEthernetPort] | None: @@ -203,13 +204,13 @@ def inventory_meraki_wireless_ethernet(section: Mapping[str, WirelessEthernetPor "index": port.name.split(' ')[-1], }, inventory_columns={ - 'alias': port.name, - 'description': port.name, + # 'alias': port.name, + # 'description': port.name, 'name': port.name, 'admin_status': 1, 'oper_status': 1, **({'speed': render.nicspeed(port.speed)} if port.speed is not None else {}), - 'if_port_type': '6 - ethernetCsmacd', + 'port_type': 6, }, ) diff --git a/source/cmk_addons_plugins/meraki/lib/agent.py b/source/cmk_addons_plugins/meraki/lib/agent.py index b13c979..66600db 100644 --- a/source/cmk_addons_plugins/meraki/lib/agent.py +++ b/source/cmk_addons_plugins/meraki/lib/agent.py @@ -43,6 +43,8 @@ # 2024-11-23: added appliance port api call -> not yet active # 2024-12-13: fixed crash in SwitchPortStatus if response has no data (>Response [503}>) # 2025-01-04: added "use network as prefix" option +# 2025-03-03: completely removed APPLIANCE_PORT section -> fixed per section cache +# removed lldp_cdp section # Deprecation information # https://developer.cisco.com/meraki/api-v1/deprecated-operations/#deprecated-operations @@ -97,7 +99,6 @@ from cmk_addons.plugins.meraki.lib.utils import ( # parameter names SEC_NAME_APPLIANCE_UPLINKS, - SEC_NAME_APPLIANCE_PORTS, SEC_NAME_APPLIANCE_UPLINKS_USAGE, SEC_NAME_APPLIANCE_VPNS, SEC_NAME_APPLIANCE_PERFORMANCE, @@ -113,6 +114,7 @@ from cmk_addons.plugins.meraki.lib.utils import ( SEC_NAME_SWITCH_PORTS_STATUSES, SEC_NAME_WIRELESS_DEVICE_STATUS, SEC_NAME_WIRELESS_ETHERNET_STATUSES, + # SEC_NAME_DEVICE_LLDP_CDP, # Early Access SEC_NAME_ORG_SWITCH_PORTS_STATUSES, @@ -134,7 +136,6 @@ from cmk_addons.plugins.meraki.lib.utils import ( SEC_CACHE_SWITCH_PORTS_STATUSES, SEC_CACHE_WIRELESS_DEVICE_STATUS, SEC_CACHE_WIRELESS_ETHERNET_STATUSES, - SEC_CACHE_APPLIANCE_PORTS, ) MERAKI_SDK_MIN_VERSION: Final = '1.46.0' @@ -160,7 +161,6 @@ API_NAME_ORGANISATION_NAME: Final = 'name' SECTION_NAME_MAP = { SEC_NAME_APPLIANCE_UPLINKS: 'appliance_uplinks', SEC_NAME_APPLIANCE_UPLINKS_USAGE: 'appliance_uplinks_usage', - SEC_NAME_APPLIANCE_PORTS: 'appliance_ports', SEC_NAME_APPLIANCE_VPNS: 'appliance_vpns', SEC_NAME_APPLIANCE_PERFORMANCE: 'appliance_performance', SEC_NAME_CELLULAR_UPLINKS: 'cellular_uplinks', @@ -175,6 +175,7 @@ SECTION_NAME_MAP = { SEC_NAME_SWITCH_PORTS_STATUSES: 'switch_ports_statuses', SEC_NAME_WIRELESS_DEVICE_STATUS: 'wireless_device_status', SEC_NAME_WIRELESS_ETHERNET_STATUSES: 'wireless_ethernet_statuses', + # SEC_NAME_DEVICE_LLDP_CDP: 'device_lldp_cdp', # Early Access SEC_NAME_ORG_SWITCH_PORTS_STATUSES: 'org_switch_ports_statuses', } @@ -279,34 +280,35 @@ class _Organisation(TypedDict): # +--\ MerakiSectionOrg # | | - adds org_id parameter # | | -# | |--> MerakiGetOrganization -> default 86400 -# | |--> MerakiGetOrganizationApiRequestsOverviewResponseCodesByInterval -> Off, allways live data -# | |--> MerakiGetOrganizationLicensesOverview -> default 86400 -# | |--> MerakiGetOrganizationDevices -> default 86400 -# | |--> MerakiGetOrganizationNetworks -> default 86400 -# | |--> MerakiGetOrganizationDevicesStatuses -> ex. 60+ -# | |--> MerakiGetOrganizationDevicesUplinksAddressesByDevice -> ex. 60+ -# | |--> MerakiGetOrganizationApplianceUplinkStatuses -> ex. 60+ -# | |--> MerakiGetOrganizationApplianceUplinksUsageByNetwork -> no cache -# | |--> MerakiGetOrganizationApplianceVpnStatuses -> ex. 60+ -# | |--> MerakiGetOrganizationSensorReadingsLatest -> ex. 60+ -# | |--> MerakiGetOrganizationWirelessDevicesEthernetStatuses -> ex. 60+ -# | |--> MerakiGetOrganizationCellularGatewayUplinkStatuses -> ex. 60. -# | |--> MerakiGetOrganizationSwitchPortsStatusesBySwitch -> ex. 60+ +# | +--> MerakiGetOrganization -> default 86400 +# | +--> MerakiGetOrganizationApiRequestsOverviewResponseCodesByInterval -> Off, allways live data +# | +--> MerakiGetOrganizationLicensesOverview -> default 86400 +# | +--> MerakiGetOrganizationDevices -> default 86400 +# | +--> MerakiGetOrganizationNetworks -> default 86400 +# | +--> MerakiGetOrganizationDevicesStatuses -> ex. 60+ +# | +--> MerakiGetOrganizationDevicesUplinksAddressesByDevice -> ex. 60+ +# | +--> MerakiGetOrganizationApplianceUplinkStatuses -> ex. 60+ +# | +--> MerakiGetOrganizationApplianceUplinksUsageByNetwork -> no cache +# | +--> MerakiGetOrganizationApplianceVpnStatuses -> ex. 60+ +# | +--> MerakiGetOrganizationSensorReadingsLatest -> ex. 60+ +# | +--> MerakiGetOrganizationWirelessDevicesEthernetStatuses -> ex. 60+ +# | +--> MerakiGetOrganizationCellularGatewayUplinkStatuses -> ex. 60. +# | +--> MerakiGetOrganizationSwitchPortsStatusesBySwitch -> ex. 60+ # | # +--\ MerakiSectionSerial # | | - adds serial as parameter # | | - sets cache_interval = 60 # | | -# | |--> MerakiGetDeviceSwitchPortsStatuses -> default 60+ -# | |--> MerakiGetDeviceWirelessStatus -> default 60+ -# | |--> MerakiGetDeviceAppliancePerformance +# | +--> MerakiGetDeviceSwitchPortsStatuses -> default 60+ +# | +--> MerakiGetDeviceWirelessStatus -> default 60+ +# | +--> MerakiGetDeviceAppliancePerformance +# | +--> MerakiGetDeviceLldpCdp # | # +--\ MerakiSectionNetwork # | - adds network id as parameter # | - sets cache_interval = 60 # | -# |--> MerakiGetNetworkAppliancePorts +# +--> MerakiGetNetworkAppliancePorts # class MerakiSection(DataCache): @@ -632,6 +634,19 @@ class MerakiGetDeviceWirelessStatus(MerakiSectionSerial): return [] +# class MerakiGetDeviceLldpCdp(MerakiSectionSerial): +# @property +# def name(self): +# return f'getDeviceLldpCdp_{self._serial}' +# +# def get_live_data(self): +# try: +# return self._config.dashboard.devices.getDeviceLldpCdp(self._serial) +# except meraki.exceptions.APIError as e: +# LOGGER.debug('Serial: %r: Get LLDP/CDP data: %r', self._serial, e) +# return [] + + class MerakiGetOrganizationCellularGatewayUplinkStatuses(MerakiSectionOrg): @property def name(self): @@ -692,20 +707,20 @@ class MerakiGetOrganizationSwitchPortsStatusesBySwitch(MerakiSectionOrg): return [] -class MerakiGetNetworkAppliancePorts(MerakiSectionNetwork): - @property - def name(self): - return f'getNetworkAppliancePorts_{self._network_id}' - - def get_live_data(self): - try: - return self._config.dashboard.appliance.getNetworkAppliancePorts( - self._network_id, - # total_pages='all', - ) - except meraki.exceptions.APIError as e: - LOGGER.debug('Network ID: %r: Get appliance ports: %r', self._network_id, e) - return [] +# class MerakiGetNetworkAppliancePorts(MerakiSectionNetwork): +# @property +# def name(self): +# return f'getNetworkAppliancePorts_{self._network_id}' +# +# def get_live_data(self): +# try: +# return self._config.dashboard.appliance.getNetworkAppliancePorts( +# self._network_id, +# # total_pages='all', +# ) +# except meraki.exceptions.APIError as e: +# LOGGER.debug('Network ID: %r: Get appliance ports: %r', self._network_id, e) +# return [] # @@ -788,6 +803,21 @@ class MerakiOrganisation: data=device, piggyback=self._get_device_piggyback(device, devices_by_serial) ) + # if SEC_NAME_DEVICE_LLDP_CDP not in self.config.excluded_sections and device.get( + # 'productType') not in [ + # # 'appliance', # bad data (inconsistent with switch data) + # 'sensor', # no data + # 'camera', # no data + # ]: + # if device_lldp_cdp := MerakiGetDeviceLldpCdp( + # config=self.config, + # serial=str(device['serial']), + # ).get_data(use_cache=self.config.use_cache): + # yield self._make_section( + # name=SEC_NAME_DEVICE_LLDP_CDP, + # data=device_lldp_cdp, + # piggyback=self._get_device_piggyback(device, devices_by_serial) + # ) if SEC_NAME_DEVICE_STATUSES not in self.config.excluded_sections: for device_status in MerakiGetOrganizationDevicesStatuses( @@ -910,60 +940,6 @@ class MerakiOrganisation: piggyback=piggyback, ) - # if _SEC_NAME_APPLIANCE_PORTS not in self.config.excluded_sections and networks: - # for network in networks: - # appliance_ports_by_network = MerakiGetNetworkAppliancePorts( - # config=self.config, - # network_id=network.get('id'), - # cache_interval=30, - # ).get_data(use_cache=self.config.use_cache) - # __ports = [ - # { - # 'number': 5, - # 'enabled': True, - # 'type': 'trunk', - # 'dropUntaggedTraffic': True, - # 'allowedVlans': 'all' - # }, - # { - # 'number': 6, - # 'enabled': True, - # 'type': 'trunk', - # 'dropUntaggedTraffic': True, - # 'allowedVlans': 'all' - # }, - # { - # 'number': 7, - # 'enabled': True, - # 'type': 'trunk', - # 'dropUntaggedTraffic': False, - # 'vlan': 1, - # 'allowedVlans': 'all'}, - # { - # 'number': 8, - # 'enabled': True, - # 'type': 'trunk', - # 'dropUntaggedTraffic': True, - # 'allowedVlans': 'all' - # }, - # { - # 'number': 9, - # 'enabled': True, - # 'type': 'trunk', - # 'dropUntaggedTraffic': False, - # 'vlan': 10, - # 'allowedVlans': 'all' - # }, - # { - # 'number': 10, - # 'enabled': True, - # 'type': 'trunk', - # 'dropUntaggedTraffic': False, - # 'vlan': 10, - # 'allowedVlans': 'all' - # } - # ] - if devices_by_type.get(API_NAME_DEVICE_TYPE_SWITCH): if SEC_NAME_SWITCH_PORTS_STATUSES not in self.config.excluded_sections: for switch in devices_by_type[API_NAME_DEVICE_TYPE_SWITCH]: @@ -1102,7 +1078,7 @@ class MerakiOrganisation: def _get_device_piggyback( self, device: MerakiAPIData, devices_by_serial: Mapping[str, MerakiAPIData] ) -> str | None: - LOGGER.critical(device) + LOGGER.debug(device) prefix = '' if self.config.org_id_as_prefix: prefix=self.organisation_id +'-' @@ -1173,7 +1149,6 @@ def write_sections(sections: Iterable[Section]) -> None: @dataclass(frozen=True) class CachePerSection: appliance_performance: int - appliance_ports: int appliance_uplinks: int appliance_uplinks_usage: int appliance_vpns: int @@ -1278,7 +1253,6 @@ def parse_arguments(argv: Sequence[str] | None) -> Args: help='List of cache time per section in minutes', default=[ SEC_CACHE_APPLIANCE_PERFORMANCE, - SEC_CACHE_APPLIANCE_PORTS, SEC_CACHE_APPLIANCE_UPLINKS, SEC_CACHE_APPLIANCE_UPLINKS_USAGE, SEC_CACHE_APPLIANCE_VPNS, @@ -1401,3 +1375,6 @@ def agent_cisco_meraki_main(args: Args) -> int: def main() -> int: return special_agent_main(parse_arguments, agent_cisco_meraki_main) + + + diff --git a/source/cmk_addons_plugins/meraki/lib/utils.py b/source/cmk_addons_plugins/meraki/lib/utils.py index 941ef4c..201108e 100644 --- a/source/cmk_addons_plugins/meraki/lib/utils.py +++ b/source/cmk_addons_plugins/meraki/lib/utils.py @@ -29,7 +29,6 @@ SEC_NAME_NETWORKS: Final = '_networks' # internal use, runs always, needed for SEC_NAME_ORG_API_REQUESTS: Final = 'api-requests-by-organization' # internal use, runs always SEC_NAME_APPLIANCE_UPLINKS: Final = 'appliance-uplinks' -SEC_NAME_APPLIANCE_PORTS: Final = 'appliance-ports' SEC_NAME_APPLIANCE_UPLINKS_USAGE: Final = 'appliance-uplinks-usage' SEC_NAME_APPLIANCE_VPNS: Final = 'appliance-vpns' SEC_NAME_APPLIANCE_PERFORMANCE: Final = 'appliance-performance' @@ -41,6 +40,7 @@ SEC_NAME_SENSOR_READINGS: Final = 'sensor-readings' SEC_NAME_SWITCH_PORTS_STATUSES: Final = 'switch-ports-statuses' SEC_NAME_WIRELESS_DEVICE_STATUS: Final = 'wireless-device-status' SEC_NAME_WIRELESS_ETHERNET_STATUSES: Final = 'wireless-ethernet-statuses' +# SEC_NAME_DEVICE_LLDP_CDP: Final[str] = 'device-lldp-cdp' # api cache defaults per section SEC_CACHE_APPLIANCE_PERFORMANCE = 0 @@ -60,7 +60,6 @@ SEC_CACHE_SENSOR_READINGS = 0 SEC_CACHE_SWITCH_PORTS_STATUSES = 0 SEC_CACHE_WIRELESS_DEVICE_STATUS = 30 SEC_CACHE_WIRELESS_ETHERNET_STATUSES = 30 -SEC_CACHE_APPLIANCE_PORTS = 30 # Early Access SEC_NAME_ORG_SWITCH_PORTS_STATUSES: Final = 'org-switch-ports-statuses' diff --git a/source/cmk_addons_plugins/meraki/rulesets/organisations_api.py b/source/cmk_addons_plugins/meraki/rulesets/organisations_api.py index e76cc02..fdd5cdf 100644 --- a/source/cmk_addons_plugins/meraki/rulesets/organisations_api.py +++ b/source/cmk_addons_plugins/meraki/rulesets/organisations_api.py @@ -35,20 +35,15 @@ def _parameter_form() -> Dictionary: # params from discovery 'internal_item_name': DictElement( render_only=True, - parameter_form=ServiceState( + parameter_form=String( title=Title('Discovery internal item name') )), 'item_variant': DictElement( render_only=True, - parameter_form=ServiceState( + parameter_form=String( title=Title('Discovery item variant') )) }, - # ignored_keys=[ - # 'internal_item_name', - # 'old_item_name', - # 'item_variant', - # ], ) diff --git a/source/packages/cisco_meraki b/source/packages/cisco_meraki index 9704007..fe2751f 100644 --- a/source/packages/cisco_meraki +++ b/source/packages/cisco_meraki @@ -63,7 +63,7 @@ 'web': ['plugins/views/cisco_meraki.py']}, 'name': 'cisco_meraki', 'title': 'Cisco Meraki special agent', - 'version': '1.4.2-20250104', + 'version': '1.4.4-20250303', 'version.min_required': '2.3.0b1', 'version.packaged': 'cmk-mkp-tool 0.2.0', 'version.usable_until': '2.4.0b1'} -- GitLab