From 7bc78a44ddedacda2bbbf853d4e83d0de70db809 Mon Sep 17 00:00:00 2001 From: "Th.L" <thl-cmk@outlook.com> Date: Wed, 24 Mar 2021 21:51:05 +0100 Subject: [PATCH] update project --- agent_based/cisco_asyncos_bandwidth.py | 87 +++++++++++++++++++++++ agent_based/cisco_asyncos_cache.py | 92 +++++++++++++++++++++++++ checks/cisco_asyncos_bandwidth | 64 ----------------- checks/cisco_asyncos_cache | 69 ------------------- cisco_asyncos.mkp | Bin 11910 -> 12111 bytes packages/cisco_asyncos | 11 +-- web/plugins/metrics/cisco_asyncos.py | 32 ++++----- 7 files changed, 201 insertions(+), 154 deletions(-) create mode 100644 agent_based/cisco_asyncos_bandwidth.py create mode 100644 agent_based/cisco_asyncos_cache.py delete mode 100644 checks/cisco_asyncos_bandwidth delete mode 100644 checks/cisco_asyncos_cache diff --git a/agent_based/cisco_asyncos_bandwidth.py b/agent_based/cisco_asyncos_bandwidth.py new file mode 100644 index 0000000..99483a0 --- /dev/null +++ b/agent_based/cisco_asyncos_bandwidth.py @@ -0,0 +1,87 @@ +#!/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 : 2021-03-24 +# +# only use full for Cisco WSA appliances +# + +from typing import Mapping, List, NamedTuple + +from cmk.base.plugins.agent_based.agent_based_api.v1.type_defs import ( + DiscoveryResult, + CheckResult, + StringTable, +) + +from cmk.base.plugins.agent_based.agent_based_api.v1 import ( + register, + Service, + check_levels, + Result, + SNMPTree, + contains, + State, +) + + +class CiscoAsyncosBandwidth(NamedTuple): + bandwidth_now: int + bandwidth_hour: int + bandwidth_day: int + + +# [[['0', '0', '247']]] +def parse_cisco_asyncos_bandwidth(string_table: List[StringTable]) -> CiscoAsyncosBandwidth: + return CiscoAsyncosBandwidth( + bandwidth_now=int(string_table[0][0][0]), + bandwidth_hour=int(string_table[0][0][1]), + bandwidth_day = int(string_table[0][0][2]), + ) + + +def discovery_cisco_asyncos_bandwidth(section: CiscoAsyncosBandwidth) -> DiscoveryResult: + yield Service() + + +def check_cisco_asyncos_bandwidth(params, section: CiscoAsyncosBandwidth) -> CheckResult: + yield from check_levels( + section.bandwidth_now, + label='Current bandwidth', + levels_upper=params.get('upper', None), + levels_lower=params.get('lower', None), + metric_name='bandwith_now', + # render_func= + ) + + yield Result(state=State.OK, + summary='last hour: %s, last day: %s' % (section.bandwidth_hour, section.bandwidth_day)) + + +register.snmp_section( + name='cisco_asyncos_bandwidth', + parse_function=parse_cisco_asyncos_bandwidth, + fetch=[ + SNMPTree( + base='.1.3.6.1.4.1.15497.1.2.3.7.4', # ASYNCOSWEBSECURITYAPPLIANCE-MIB::proxyRecentBandWTotPerf + oids=[ + '1', # cacheBwidthTotalNow + '3', # cacheBwidthTotal1hrMean + '5', # cacheBwidthTotal1dayMean + ] + ), + ], + detect=contains('.1.3.6.1.2.1.1.1.0', 'AsyncOS'), +) + +register.check_plugin( + name='cisco_asyncos_bandwidth', + service_name='Bandwidth', + discovery_function=discovery_cisco_asyncos_bandwidth, + check_function=check_cisco_asyncos_bandwidth, + check_default_parameters={}, +) diff --git a/agent_based/cisco_asyncos_cache.py b/agent_based/cisco_asyncos_cache.py new file mode 100644 index 0000000..dda48c6 --- /dev/null +++ b/agent_based/cisco_asyncos_cache.py @@ -0,0 +1,92 @@ +#!/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 : 2021-03-24 +# +# only use full for Cisco WSA appliances +# + +from typing import Mapping, List, NamedTuple + +from cmk.base.plugins.agent_based.agent_based_api.v1.type_defs import ( + DiscoveryResult, + CheckResult, + StringTable, +) + +from cmk.base.plugins.agent_based.agent_based_api.v1 import ( + register, + Service, + check_levels, + Result, + Metric, + SNMPTree, + contains, + State, +) + + +class CiscoAsyncosCache(NamedTuple): + cache_hits_now: int + cache_misses_now: int + cache_hit_resptime_now: int + cache_miss_resptime_now: int + cache_total_resptime: int + + +# [[['0', '0', '0', '0', '0']]] +def parse_cisco_asyncos_cache(string_table: List[StringTable]) -> CiscoAsyncosCache: + return CiscoAsyncosCache( + cache_hits_now=int(string_table[0][0][0]), + cache_misses_now=int(string_table[0][0][1]), + cache_hit_resptime_now=int(string_table[0][0][2]), + cache_miss_resptime_now=int(string_table[0][0][3]), + cache_total_resptime=int(string_table[0][0][4]), + ) + + +def discovery_cisco_asyncos_cache(section: CiscoAsyncosCache) -> DiscoveryResult: + yield Service() + + +def check_cisco_asyncos_cache(params, section: CiscoAsyncosCache) -> CheckResult: + yield Result(state=State.OK, + summary='Cache Stats current %s Hits (%sms response time), %s Misses (%sms response time) and %sms total response time' % ( + section.cache_hits_now, section.cache_hit_resptime_now, section.cache_misses_now, + section.cache_miss_resptime_now, section.cache_total_resptime)) + + yield Metric(name='cache_hits_now', value=section.cache_hits_now) + yield Metric(name='cache_misses_now', value=section.cache_misses_now) + yield Metric(name='cache_hit_resptime_now', value=section.cache_hit_resptime_now) + yield Metric(name='cache_miss_resptime_now', value=section.cache_miss_resptime_now) + yield Metric(name='cache_total_resptime', value=section.cache_total_resptime) + +register.snmp_section( + name='cisco_asyncos_cache', + parse_function=parse_cisco_asyncos_cache, + fetch=[ + SNMPTree( + base='.1.3.6.1.4.1.15497.1.2.3.7', # ASYNCOSWEBSECURITYAPPLIANCE-MIB::proxyRecentPerf + oids=[ + '5.1', # cacheHitsNow + '6.1', # cacheMissesNow + '7.1', # cacheHitRespTimeNow + '8.1', # cacheMissRespTimeNow + '9.1', # cacheTotalRespTimeNow + ] + ), + ], + detect=contains('.1.3.6.1.2.1.1.1.0', 'AsyncOS'), +) + +register.check_plugin( + name='cisco_asyncos_cache', + service_name='Cache Stats', + discovery_function=discovery_cisco_asyncos_cache, + check_function=check_cisco_asyncos_cache, + check_default_parameters={}, +) diff --git a/checks/cisco_asyncos_bandwidth b/checks/cisco_asyncos_bandwidth deleted file mode 100644 index 5829e7b..0000000 --- a/checks/cisco_asyncos_bandwidth +++ /dev/null @@ -1,64 +0,0 @@ -#!/usr/bin/python -# -*- encoding: utf-8; py-indent-offset: 4 -*- -# +------------------------------------------------------------------+ -# | ____ _ _ __ __ _ __ | -# | / ___| |__ ___ ___| | __ | \/ | |/ / | -# | | | | '_ \ / _ \/ __| |/ / | |\/| | ' / | -# | | |___| | | | __/ (__| < | | | | . \ | -# | \____|_| |_|\___|\___|_|\_\___|_| |_|_|\_\ | -# | | -# | Copyright Mathias Kettner 2013 mk@mathias-kettner.de | -# +------------------------------------------------------------------+ -# -# This file is part of Check_MK. -# The official homepage is at http://mathias-kettner.de/check_mk. -# -# check_mk is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by -# the Free Software Foundation in version 2. check_mk is distributed -# in the hope that it will be useful, but WITHOUT ANY WARRANTY; with- -# out even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. See the GNU General Public License for more de- -# ails. You should have received a copy of the GNU General Public -# License along with GNU Make; see the file COPYING. If not, write -# to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, -# Boston, MA 02110-1301 USA. -# -# only use full for Cisco WSA appliances -# - -cisco_asyncos_bandwidth_default_levels = {} - - -def inventory_cisco_asyncos_bandwidth(info): - if len(info) > 0: - return [(None, 'cisco_asyncos_bandwidth_default_levels')] - - -def check_cisco_asyncos_bandwidth(item, params, info): - state = 0 - perfdata = [] - warn, crit = None, None - now, onehour, oneday = info[0] - perfdata.append( ('now', now, warn, crit, 0, 1000000) ) - perfdata.append( ('onehour', onehour, warn, crit, 0, 1000000) ) - perfdata.append( ('oneday', oneday, warn, crit, 0, 1000000) ) - - infotext = 'Bandbreitennutzung aktuell %skBits - 1h Durchschnitt %skBits - 1d Durchschnitt %skBits' % (now, onehour, oneday) - return state, infotext, perfdata - - -check_info['cisco_asyncos_bandwidth'] = { - 'check_function': check_cisco_asyncos_bandwidth, - 'inventory_function': inventory_cisco_asyncos_bandwidth, - 'service_description': 'Bandwidth total', - 'has_perfdata': True, - 'snmp_info': ('.1.3.6.1.4.1.15497.1.2.3.7.4', [ # ASYNCOSWEBSECURITYAPPLIANCE-MIB::proxyRecentBandWTotPerf - '1', # cacheBwidthTotalNow - '3', # cacheBwidthTotal1hrMean - '5', # cacheBwidthTotal1dayMean - ]), - 'snmp_scan_function': lambda oid: oid('.1.3.6.1.2.1.1.1.0').find('AsyncOS') != -1, - # 'snmp_scan_function': scan_cisco_asyncos, - # 'includes': ['cisco_asyncos.include'], -} diff --git a/checks/cisco_asyncos_cache b/checks/cisco_asyncos_cache deleted file mode 100644 index a52a3b9..0000000 --- a/checks/cisco_asyncos_cache +++ /dev/null @@ -1,69 +0,0 @@ -#!/usr/bin/python -# -*- encoding: utf-8; py-indent-offset: 4 -*- -# +------------------------------------------------------------------+ -# | ____ _ _ __ __ _ __ | -# | / ___| |__ ___ ___| | __ | \/ | |/ / | -# | | | | '_ \ / _ \/ __| |/ / | |\/| | ' / | -# | | |___| | | | __/ (__| < | | | | . \ | -# | \____|_| |_|\___|\___|_|\_\___|_| |_|_|\_\ | -# | | -# | Copyright Mathias Kettner 2013 mk@mathias-kettner.de | -# +------------------------------------------------------------------+ -# -# This file is part of Check_MK. -# The official homepage is at http://mathias-kettner.de/check_mk. -# -# check_mk is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by -# the Free Software Foundation in version 2. check_mk is distributed -# in the hope that it will be useful, but WITHOUT ANY WARRANTY; with- -# out even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. See the GNU General Public License for more de- -# ails. You should have received a copy of the GNU General Public -# License along with GNU Make; see the file COPYING. If not, write -# to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, -# Boston, MA 02110-1301 USA. -# -# only use full for Cisco WSA appliances -# - - -cisco_asyncos_cache_default_levels = {} - - -def inventory_cisco_asyncos_cache(info): - if len(info) > 0: - return [(None, 'cisco_asyncos_cache_default_levels')] - - -def check_cisco_asyncos_cache(item, params, info): - state = 0 - perfdata = [] - warn, crit = None, None - hits, misses, hitresp, missresp, totalresp = info[0] - perfdata.append( ('hits', int(hits) ) ) - perfdata.append( ('misses', int(misses) ) ) - perfdata.append( ('hitresp', int(hitresp) ) ) - perfdata.append( ('missresp', int(missresp) ) ) - perfdata.append( ('totalresp', int(totalresp) ) ) - - infotext = 'Cache Stats aktuell %s Hits (%sms Antwortzeit), %s Misses (%sms Antwortzeit) und %sms gesamt Antwortzeit' % (hits, hitresp, misses, missresp, totalresp) - return state, infotext, perfdata - - -check_info['cisco_asyncos_cache'] = { - 'check_function': check_cisco_asyncos_cache, - 'inventory_function': inventory_cisco_asyncos_cache, - 'service_description': 'Cache Stats', - 'has_perfdata': True, - 'snmp_info': ('.1.3.6.1.4.1.15497.1.2.3.7', [ # ASYNCOSWEBSECURITYAPPLIANCE-MIB::proxyRecentPerf - '5.1', # cacheHitsNow - '6.1', # cacheMissesNow - '7.1', # cacheHitRespTimeNow - '8.1', # cacheMissRespTimeNow - '9.1', # cacheTotalRespTimeNow - ]), - 'snmp_scan_function': lambda oid: oid('.1.3.6.1.2.1.1.1.0').find('AsyncOS') != -1, - # 'snmp_scan_function': scan_cisco_asyncos, - # 'includes': ['cisco_asyncos.include'], -} diff --git a/cisco_asyncos.mkp b/cisco_asyncos.mkp index ba5d874055af624ee806e377b40b58afb5b5c37b..be691ccdddc54f9082d6cd64f3b2730339bad591 100644 GIT binary patch literal 12111 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 F{s*T3?}Y#W literal 11910 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 diff --git a/packages/cisco_asyncos b/packages/cisco_asyncos index c319a77..d5850fb 100644 --- a/packages/cisco_asyncos +++ b/packages/cisco_asyncos @@ -20,17 +20,18 @@ '\n' '- 2021-03-21: rewrite cisco_asyncos_cpu, cisco_asyncos_mem, ' 'cisco_asyncos_temp for CMK 2.0\n' - '- 2021-03-24: rewrite cisco_asyncos_raid\n', + '- 2021-03-24: rewrite cisco_asyncos_raid, ' + 'cisco_asyncos_bandwidth, cisco_asyncos_cache\n', 'download_url': 'https://thl-cmk.hopto.org', 'files': {'agent_based': ['cisco_asyncos_cpu.py', 'cisco_asyncos_mem.py', 'cisco_asyncos_temp.py', 'cisco_asyncos_fan.py', 'cisco_asyncos_power.py', - 'cisco_asyncos_raid.py'], - 'checks': ['cisco_asyncos_bandwidth', - 'cisco_asyncos_cache', - 'cisco_asyncos_conn', + 'cisco_asyncos_raid.py', + 'cisco_asyncos_bandwidth.py', + 'cisco_asyncos_cache.py'], + 'checks': ['cisco_asyncos_conn', 'cisco_asyncos_license', 'cisco_asyncos_queue', 'cisco_asyncos_update', diff --git a/web/plugins/metrics/cisco_asyncos.py b/web/plugins/metrics/cisco_asyncos.py index ee23130..6159bc9 100644 --- a/web/plugins/metrics/cisco_asyncos.py +++ b/web/plugins/metrics/cisco_asyncos.py @@ -63,22 +63,22 @@ metric_info['cisco_asyncos_mem_mem_used'] = { # ###################################################################################################################### -check_metrics['check_mk-cisco_asyncos_dns'] = { - 'outstandingdnsrequests': {'name': 'cisco_asyncos_dns_outstandingdnsrequests', }, - 'pendingdnsrequests': {'name': 'cisco_asyncos_dns_pendingdnsrequests', }, -} - -check_metrics['check_mk-cisco_asyncos_messageage'] = { - 'oldestmessageage': {'name': 'cisco_asyncos_messageage_oldestmessageage', }, -} - -check_metrics['check_mk-cisco_asyncos_queue'] = { - 'queue': {'name': 'cisco_asyncos_queue_work_queue', }, -} - -check_metrics['check_mk-cisco_asyncos_mem'] = { - 'mem_used': {'name': 'cisco_asyncos_mem_mem_used', }, -} +# check_metrics['check_mk-cisco_asyncos_dns'] = { +# 'outstandingdnsrequests': {'name': 'cisco_asyncos_dns_outstandingdnsrequests', }, +# 'pendingdnsrequests': {'name': 'cisco_asyncos_dns_pendingdnsrequests', }, +# } +# +# check_metrics['check_mk-cisco_asyncos_messageage'] = { +# 'oldestmessageage': {'name': 'cisco_asyncos_messageage_oldestmessageage', }, +# } +# +# check_metrics['check_mk-cisco_asyncos_queue'] = { +# 'queue': {'name': 'cisco_asyncos_queue_work_queue', }, +# } +# +# check_metrics['check_mk-cisco_asyncos_mem'] = { +# 'mem_used': {'name': 'cisco_asyncos_mem_mem_used', }, +# } ###################################################################################################################### -- GitLab