Collection of CheckMK checks (see https://checkmk.com/). All checks and plugins are provided as is. Absolutely no warranty. Send any comments to thl-cmk[at]outlook[dot]com

Skip to content
Snippets Groups Projects
Commit 123c642c authored by thl-cmk's avatar thl-cmk :flag_na:
Browse files

update project

parent 8fd814d8
No related branches found
No related tags found
No related merge requests found
...@@ -12,6 +12,7 @@ ...@@ -12,6 +12,7 @@
# Monitor status of Cisco cellular modems/connections/interfaces # Monitor status of Cisco cellular modems/connections/interfaces
# #
# 2022-09-20: added WATO options # 2022-09-20: added WATO options
# 2022-11-10: added upper_levels to perfdata for scalars in metrics
# #
# sample snmpwalk # sample snmpwalk
# #
...@@ -83,14 +84,14 @@ class CiscoCellular3g: ...@@ -83,14 +84,14 @@ class CiscoCellular3g:
modem_status: str modem_status: str
network: str network: str
channel: int channel: int
rssi: int
band: str band: str
rssi: Optional[int]
@dataclass @dataclass
class CiscoCellularRadio: class CiscoCellularRadio:
lte_rsrp: int lte_rsrp: Optional[int]
lte_rsrq: int lte_rsrq: Optional[int]
@dataclass @dataclass
...@@ -141,6 +142,7 @@ _cisco_gsm_service_type = { ...@@ -141,6 +142,7 @@ _cisco_gsm_service_type = {
} }
_cisco_gsm_band = { _cisco_gsm_band = {
'0': 'UMTS', # not part of the Cisco MIB
'1': 'unknown', '1': 'unknown',
'2': 'invalid', '2': 'invalid',
'3': 'none', '3': 'none',
...@@ -152,7 +154,7 @@ _cisco_gsm_band = { ...@@ -152,7 +154,7 @@ _cisco_gsm_band = {
'9': 'WCDMA-850', '9': 'WCDMA-850',
'10': 'WCDMA-1900', '10': 'WCDMA-1900',
'11': 'WCDMA-2100', '11': 'WCDMA-2100',
'12': 'LTE Band', '12': 'LTE',
} }
_cisco_roaming_status = { _cisco_roaming_status = {
...@@ -198,8 +200,8 @@ def parse_cisco_cellular_lte(string_table: List[StringByteTable]) -> Optional[Di ...@@ -198,8 +200,8 @@ def parse_cisco_cellular_lte(string_table: List[StringByteTable]) -> Optional[Di
for radio_oid_end, current_rsrp, current_rsrq in radio_table: for radio_oid_end, current_rsrp, current_rsrq in radio_table:
radios[radio_oid_end] = CiscoCellularRadio( radios[radio_oid_end] = CiscoCellularRadio(
lte_rsrp=int(current_rsrp), lte_rsrp=int(current_rsrp) if current_rsrp.lstrip('-').isdigit() else None,
lte_rsrq=int(current_rsrq) # // 10, # See Cisco bug ID CSCvt55347 lte_rsrq=int(current_rsrq) if current_rsrq.lstrip('-').isdigit() else None, # // 10, # See Cisco bug ID CSCvt55347
) )
for profile_oid_end, apn_type, apn in profile_table: for profile_oid_end, apn_type, apn in profile_table:
...@@ -213,6 +215,12 @@ def parse_cisco_cellular_lte(string_table: List[StringByteTable]) -> Optional[Di ...@@ -213,6 +215,12 @@ def parse_cisco_cellular_lte(string_table: List[StringByteTable]) -> Optional[Di
for modem_oid_end, modem_state, service_type, roaming_status, modem_time, conn_status,\ for modem_oid_end, modem_state, service_type, roaming_status, modem_time, conn_status,\
modem_status, network, totyl_bytes_tx, total_bytes_rx, rssi, channel, band in modem_table: modem_status, network, totyl_bytes_tx, total_bytes_rx, rssi, channel, band in modem_table:
if band == 1:
if channel in ['2938', '2961', '2963', '3011', '3027', '3087']:
band = '0'
elif channel in ['6200']:
band = '12'
modems[modem_oid_end] = CiscoCellular3g( modems[modem_oid_end] = CiscoCellular3g(
modem_state=modem_state, modem_state=modem_state,
service_type=str(service_type[0]*256 + service_type[1]), service_type=str(service_type[0]*256 + service_type[1]),
...@@ -223,7 +231,7 @@ def parse_cisco_cellular_lte(string_table: List[StringByteTable]) -> Optional[Di ...@@ -223,7 +231,7 @@ def parse_cisco_cellular_lte(string_table: List[StringByteTable]) -> Optional[Di
total_bytes_rx=int(total_bytes_rx), total_bytes_rx=int(total_bytes_rx),
modem_status=modem_status, modem_status=modem_status,
network=network, network=network,
rssi=int(rssi), rssi=int(rssi) if rssi.lstrip('-').isdigit() else None,
channel=int(channel), channel=int(channel),
band=band, band=band,
) )
...@@ -317,19 +325,59 @@ def check_cisco_cellular_lte(item, params, section: Dict[str, CiscoCellularInter ...@@ -317,19 +325,59 @@ def check_cisco_cellular_lte(item, params, section: Dict[str, CiscoCellularInter
else: else:
yield Result(state=State(params['roaming_state']), notice=text) yield Result(state=State(params['roaming_state']), notice=text)
for value, label, render_func, levels_lower, metric in [ if not params['CSCvt55347_fixed'] and interface.radio.lte_rsrq:
(interface.radio.lte_rsrp, 'RSRP', lambda v: f'{v} dBm', params['rsrp_levels_lower'], 'rsrp'), interface.radio.lte_rsrq = interface.radio.lte_rsrq / 10 # handle Cisco BugID CSCvt55347
(interface.radio.lte_rsrq if params['CSCvt55347_fixed'] else interface.radio.lte_rsrq // 10, # handle Cisco BugID CSCvt55347
'RSRQ', lambda v: f'{v} dB', params['rsrp_levels_lower'], 'rsrq',), if interface.radio.lte_rsrp < -111:
(interface.modem.rssi, 'RSSI', lambda v: f'{v} dBm', params['rssi_levels_lower'], 'rssi'), lte_rsrp_quality = 'Poor'
elif interface.radio.lte_rsrp <= -103:
lte_rsrp_quality = 'Fair'
elif interface.radio.lte_rsrp <= -85:
lte_rsrp_quality = 'Good'
elif interface.radio.lte_rsrp >= -84:
lte_rsrp_quality = 'Excellent'
if interface.radio.lte_rsrq < -12:
lte_rsrq_quality = 'Poor'
elif interface.radio.lte_rsrq <= -9:
lte_rsrq_quality = 'Fair'
elif interface.radio.lte_rsrq <= -5:
lte_rsrq_quality = 'Good'
elif interface.radio.lte_rsrq > -5:
lte_rsrq_quality = 'Excellent'
if interface.modem.rssi < -85:
rssi_quality = 'Poor'
elif interface.modem.rssi <= -75:
rssi_quality = 'Fair'
elif interface.modem.rssi <= -65:
rssi_quality = 'Good'
elif interface.modem.rssi >= -65:
rssi_quality = 'Excellent'
for value, label, render_func, levels_lower, metric, in [
(interface.radio.lte_rsrp, 'RSRP', lambda v: f'{v} dBm ({lte_rsrp_quality})', params['rsrp_levels_lower'], 'rsrp'),
(interface.radio.lte_rsrq, 'RSRQ', lambda v: f'{v} dB ({lte_rsrq_quality})', params['rsrp_levels_lower'], 'rsrq'),
(interface.modem.rssi, 'RSSI', lambda v: f'{v} dBm ({rssi_quality})', params['rssi_levels_lower'], 'rssi'),
]: ]:
yield from check_levels( if value:
value=value, warn, crit = levels_lower
label=label, if warn:
render_func=render_func, warn = warn * -1
levels_lower=levels_lower, if crit:
metric_name=f'{metric_prefix}{metric}', crit = crit * -1
) yield from check_levels(
value=value,
label=label,
render_func=render_func,
levels_upper=(warn, crit), # used for scalars in metrics
levels_lower=levels_lower,
metric_name=f'{metric_prefix}{metric}',
)
if interface.radio.lte_rsrp or interface.radio.lte_rsrq:
if not interface.radio.lte_rsrq or not interface.radio.lte_rsrp:
yield Result(state=State.OK, notice='Channel changed while polling')
now_time = time.time() now_time = time.time()
value_store = get_value_store() value_store = get_value_store()
...@@ -355,6 +403,7 @@ def check_cisco_cellular_lte(item, params, section: Dict[str, CiscoCellularInter ...@@ -355,6 +403,7 @@ def check_cisco_cellular_lte(item, params, section: Dict[str, CiscoCellularInter
yield Result(state=State.OK, notice=f'IPv6 Address: {interface.ipv6_addr}') yield Result(state=State.OK, notice=f'IPv6 Address: {interface.ipv6_addr}')
yield Result(state=State.OK, notice=f'Networkcode: {interface.modem.network}') yield Result(state=State.OK, notice=f'Networkcode: {interface.modem.network}')
expected_band = params['expected_band'] expected_band = params['expected_band']
if interface.modem.band == expected_band: if interface.modem.band == expected_band:
yield Result(state=State.OK, summary=f'Band: {_cisco_gsm_band.get(interface.modem.band)}') yield Result(state=State.OK, summary=f'Band: {_cisco_gsm_band.get(interface.modem.band)}')
...@@ -363,6 +412,7 @@ def check_cisco_cellular_lte(item, params, section: Dict[str, CiscoCellularInter ...@@ -363,6 +412,7 @@ def check_cisco_cellular_lte(item, params, section: Dict[str, CiscoCellularInter
state=State(params['state_not_expected_band']), state=State(params['state_not_expected_band']),
summary=f'Band: {_cisco_gsm_band.get(interface.modem.band)} (expected: {_cisco_gsm_band.get(expected_band)})' summary=f'Band: {_cisco_gsm_band.get(interface.modem.band)} (expected: {_cisco_gsm_band.get(expected_band)})'
) )
yield Result(state=State.OK, notice=f'Channel: {interface.modem.channel}') yield Result(state=State.OK, notice=f'Channel: {interface.modem.channel}')
yield Result(state=State.OK, notice=f'Service type: {_cisco_gsm_service_type.get(interface.modem.service_type)}') yield Result(state=State.OK, notice=f'Service type: {_cisco_gsm_service_type.get(interface.modem.service_type)}')
yield Result(state=State.OK, notice=f'Provider Time: {interface.modem.current_system_time}') yield Result(state=State.OK, notice=f'Provider Time: {interface.modem.current_system_time}')
...@@ -448,8 +498,8 @@ register.check_plugin( ...@@ -448,8 +498,8 @@ register.check_plugin(
}, },
check_function=check_cisco_cellular_lte, check_function=check_cisco_cellular_lte,
check_default_parameters={ check_default_parameters={
'rsrp_levels_lower': (-100, -115), 'rsrp_levels_lower': (-103, -112),
'rsrq_levels_lower': (-8, -15), 'rsrq_levels_lower': (-9, -13),
'rssi_levels_lower': (-75, -85), 'rssi_levels_lower': (-75, -85),
'roaming_state': 1, 'roaming_state': 1,
'no_profile_state': 1, 'no_profile_state': 1,
......
No preview for this file type
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
'name': 'cisco_cellular_lte', 'name': 'cisco_cellular_lte',
'num_files': 6, 'num_files': 6,
'title': 'Cisco cellular LTE', 'title': 'Cisco cellular LTE',
'version': '20220920.v0.0.1', 'version': '20221110.v0.0.1a',
'version.min_required': '2.0.0', 'version.min_required': '2.0.0',
'version.packaged': '2021.09.20', 'version.packaged': '2021.09.20',
'version.usable_until': None} 'version.usable_until': None}
\ No newline at end of file
...@@ -10,6 +10,9 @@ ...@@ -10,6 +10,9 @@
# #
# Cisco Cellular LTE metrics plugin # Cisco Cellular LTE metrics plugin
# #
# 2022-11-10: fixed range for RSRP and RSRQ
# added range for RSSI
# added scalars for all
# #
from cmk.gui.i18n import _ from cmk.gui.i18n import _
...@@ -40,7 +43,11 @@ graph_info['cisco_cellular.rsrp'] = { ...@@ -40,7 +43,11 @@ graph_info['cisco_cellular.rsrp'] = {
'metrics': [ 'metrics': [
('cisco_cellular_rsrp', 'area'), ('cisco_cellular_rsrp', 'area'),
], ],
'range': (0, 'cisco_cellular_rsrp:max'), 'scalars': [
('cisco_cellular_rsrp:crit,-1,*', 'Critical'),
('cisco_cellular_rsrp:warn,-1,*', 'Warning'),
],
'range': ('cisco_cellular_rsrp:max,-', 1),
} }
graph_info['cisco_cellular.rsrq'] = { graph_info['cisco_cellular.rsrq'] = {
...@@ -49,10 +56,10 @@ graph_info['cisco_cellular.rsrq'] = { ...@@ -49,10 +56,10 @@ graph_info['cisco_cellular.rsrq'] = {
('cisco_cellular_rsrq', 'area'), ('cisco_cellular_rsrq', 'area'),
], ],
'scalars': [ 'scalars': [
('cisco_cellular_rsrq:crit', _('crit')), ('cisco_cellular_rsrq:crit,-1,*', 'Critical'),
('cisco_cellular_rsrq:warn', _('warn')), ('cisco_cellular_rsrq:warn,-1,*', 'Critical'),
], ],
'range': (0, 'cisco_cellular_rsrq:max'), 'range': ('cisco_cellular_rsrq:max,-', 1),
} }
graph_info['cisco_cellular.rssi'] = { graph_info['cisco_cellular.rssi'] = {
...@@ -60,4 +67,9 @@ graph_info['cisco_cellular.rssi'] = { ...@@ -60,4 +67,9 @@ graph_info['cisco_cellular.rssi'] = {
'metrics': [ 'metrics': [
('cisco_cellular_rssi', 'area'), ('cisco_cellular_rssi', 'area'),
], ],
'scalars': [
('cisco_cellular_rssi:crit,-1,*', 'Critical'),
('cisco_cellular_rsrq:warn,-1,*', 'Critical'),
],
'range': ('cisco_cellular_rssi:max,-', 1)
} }
...@@ -37,16 +37,16 @@ def _parameter_valuespec_cisco_cellular_lte(): ...@@ -37,16 +37,16 @@ def _parameter_valuespec_cisco_cellular_lte():
title=_('Lower levels for RSRP'), title=_('Lower levels for RSRP'),
help=_('Lower levels for RSRP (Reference Signal Received Power) in dBm'), help=_('Lower levels for RSRP (Reference Signal Received Power) in dBm'),
elements=[ elements=[
Integer(title=_('Warning below'), default_value=-100, unit=_('dBm')), Integer(title=_('Warning below'), default_value=-103, unit=_('dBm')),
Integer(title=_('Critical below'), default_value=-115, unit=_('dBm')), Integer(title=_('Critical below'), default_value=-112, unit=_('dBm')),
])), ])),
('rsrq_levels_lower', ('rsrq_levels_lower',
Tuple( Tuple(
title=_('Lower levels for RSRQ'), title=_('Lower levels for RSRQ'),
help=_('Lower levels for RSRQ (Reference Signal Received Quality) in dB'), help=_('Lower levels for RSRQ (Reference Signal Received Quality) in dB'),
elements=[ elements=[
Integer(title=_('Warning below'), default_value=-8, unit=_('dB')), Integer(title=_('Warning below'), default_value=-9, unit=_('dB')),
Integer(title=_('Critical below'), default_value=-15, unit=_('dB')), Integer(title=_('Critical below'), default_value=-13, unit=_('dB')),
])), ])),
('rssi_levels_lower', ('rssi_levels_lower',
Tuple( Tuple(
...@@ -62,7 +62,8 @@ def _parameter_valuespec_cisco_cellular_lte(): ...@@ -62,7 +62,8 @@ def _parameter_valuespec_cisco_cellular_lte():
help=_('The expected cellular band.'), help=_('The expected cellular band.'),
default_value='12', default_value='12',
choices=[ choices=[
('12', 'LTE Band'), ('12', 'LTE'),
('0', 'UMTS'),
('11', 'WCDMA-2100'), ('11', 'WCDMA-2100'),
('10', 'WCDMA-1900'), ('10', 'WCDMA-1900'),
('9', 'WCDMA-850'), ('9', 'WCDMA-850'),
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment