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 @@
# Monitor status of Cisco cellular modems/connections/interfaces
#
# 2022-09-20: added WATO options
# 2022-11-10: added upper_levels to perfdata for scalars in metrics
#
# sample snmpwalk
#
......@@ -83,14 +84,14 @@ class CiscoCellular3g:
modem_status: str
network: str
channel: int
rssi: int
band: str
rssi: Optional[int]
@dataclass
class CiscoCellularRadio:
lte_rsrp: int
lte_rsrq: int
lte_rsrp: Optional[int]
lte_rsrq: Optional[int]
@dataclass
......@@ -141,6 +142,7 @@ _cisco_gsm_service_type = {
}
_cisco_gsm_band = {
'0': 'UMTS', # not part of the Cisco MIB
'1': 'unknown',
'2': 'invalid',
'3': 'none',
......@@ -152,7 +154,7 @@ _cisco_gsm_band = {
'9': 'WCDMA-850',
'10': 'WCDMA-1900',
'11': 'WCDMA-2100',
'12': 'LTE Band',
'12': 'LTE',
}
_cisco_roaming_status = {
......@@ -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:
radios[radio_oid_end] = CiscoCellularRadio(
lte_rsrp=int(current_rsrp),
lte_rsrq=int(current_rsrq) # // 10, # See Cisco bug ID CSCvt55347
lte_rsrp=int(current_rsrp) if current_rsrp.lstrip('-').isdigit() else None,
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:
......@@ -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,\
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(
modem_state=modem_state,
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
total_bytes_rx=int(total_bytes_rx),
modem_status=modem_status,
network=network,
rssi=int(rssi),
rssi=int(rssi) if rssi.lstrip('-').isdigit() else None,
channel=int(channel),
band=band,
)
......@@ -317,19 +325,59 @@ def check_cisco_cellular_lte(item, params, section: Dict[str, CiscoCellularInter
else:
yield Result(state=State(params['roaming_state']), notice=text)
for value, label, render_func, levels_lower, metric in [
(interface.radio.lte_rsrp, 'RSRP', lambda v: f'{v} dBm', params['rsrp_levels_lower'], 'rsrp'),
(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',),
(interface.modem.rssi, 'RSSI', lambda v: f'{v} dBm', params['rssi_levels_lower'], 'rssi'),
if not params['CSCvt55347_fixed'] and interface.radio.lte_rsrq:
interface.radio.lte_rsrq = interface.radio.lte_rsrq / 10 # handle Cisco BugID CSCvt55347
if interface.radio.lte_rsrp < -111:
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(
value=value,
label=label,
render_func=render_func,
levels_lower=levels_lower,
metric_name=f'{metric_prefix}{metric}',
)
if value:
warn, crit = levels_lower
if warn:
warn = warn * -1
if crit:
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()
value_store = get_value_store()
......@@ -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'Networkcode: {interface.modem.network}')
expected_band = params['expected_band']
if interface.modem.band == expected_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
state=State(params['state_not_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'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}')
......@@ -448,8 +498,8 @@ register.check_plugin(
},
check_function=check_cisco_cellular_lte,
check_default_parameters={
'rsrp_levels_lower': (-100, -115),
'rsrq_levels_lower': (-8, -15),
'rsrp_levels_lower': (-103, -112),
'rsrq_levels_lower': (-9, -13),
'rssi_levels_lower': (-75, -85),
'roaming_state': 1,
'no_profile_state': 1,
......
No preview for this file type
......@@ -11,7 +11,7 @@
'name': 'cisco_cellular_lte',
'num_files': 6,
'title': 'Cisco cellular LTE',
'version': '20220920.v0.0.1',
'version': '20221110.v0.0.1a',
'version.min_required': '2.0.0',
'version.packaged': '2021.09.20',
'version.usable_until': None}
\ No newline at end of file
......@@ -10,6 +10,9 @@
#
# 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 _
......@@ -40,7 +43,11 @@ graph_info['cisco_cellular.rsrp'] = {
'metrics': [
('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'] = {
......@@ -49,10 +56,10 @@ graph_info['cisco_cellular.rsrq'] = {
('cisco_cellular_rsrq', 'area'),
],
'scalars': [
('cisco_cellular_rsrq:crit', _('crit')),
('cisco_cellular_rsrq:warn', _('warn')),
('cisco_cellular_rsrq:crit,-1,*', 'Critical'),
('cisco_cellular_rsrq:warn,-1,*', 'Critical'),
],
'range': (0, 'cisco_cellular_rsrq:max'),
'range': ('cisco_cellular_rsrq:max,-', 1),
}
graph_info['cisco_cellular.rssi'] = {
......@@ -60,4 +67,9 @@ graph_info['cisco_cellular.rssi'] = {
'metrics': [
('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():
title=_('Lower levels for RSRP'),
help=_('Lower levels for RSRP (Reference Signal Received Power) in dBm'),
elements=[
Integer(title=_('Warning below'), default_value=-100, unit=_('dBm')),
Integer(title=_('Critical below'), default_value=-115, unit=_('dBm')),
Integer(title=_('Warning below'), default_value=-103, unit=_('dBm')),
Integer(title=_('Critical below'), default_value=-112, unit=_('dBm')),
])),
('rsrq_levels_lower',
Tuple(
title=_('Lower levels for RSRQ'),
help=_('Lower levels for RSRQ (Reference Signal Received Quality) in dB'),
elements=[
Integer(title=_('Warning below'), default_value=-8, unit=_('dB')),
Integer(title=_('Critical below'), default_value=-15, unit=_('dB')),
Integer(title=_('Warning below'), default_value=-9, unit=_('dB')),
Integer(title=_('Critical below'), default_value=-13, unit=_('dB')),
])),
('rssi_levels_lower',
Tuple(
......@@ -62,7 +62,8 @@ def _parameter_valuespec_cisco_cellular_lte():
help=_('The expected cellular band.'),
default_value='12',
choices=[
('12', 'LTE Band'),
('12', 'LTE'),
('0', 'UMTS'),
('11', 'WCDMA-2100'),
('10', 'WCDMA-1900'),
('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