From 123c642cd0e1e3ac2e9ab63136e57c758f2f3784 Mon Sep 17 00:00:00 2001
From: "th.l" <thl-cmk@outlook.com>
Date: Thu, 10 Nov 2022 21:29:22 +0100
Subject: [PATCH] update project

---
 agent_based/cisco_cellular_lte.py         |  92 +++++++++++++++++-----
 cisco_cellular_lte.mkp                    | Bin 10810 -> 11604 bytes
 packages/cisco_cellular_lte               |   2 +-
 web/plugins/metrics/cisco_cellular_lte.py |  20 ++++-
 web/plugins/wato/cisco_cellular_lte.py    |  11 +--
 5 files changed, 94 insertions(+), 31 deletions(-)

diff --git a/agent_based/cisco_cellular_lte.py b/agent_based/cisco_cellular_lte.py
index 449c72d..a53be97 100644
--- a/agent_based/cisco_cellular_lte.py
+++ b/agent_based/cisco_cellular_lte.py
@@ -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,
diff --git a/cisco_cellular_lte.mkp b/cisco_cellular_lte.mkp
index 8856b2e231159e3f9908b6007de6cf5a07aa4eeb..4ba640e57dc1f03ba4d8165c9196cd9c6f93d6e2 100644
GIT binary patch
literal 11604
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
Sd5XUPfj7Z1LVyW_gZ&pGdYP2~

literal 10810
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
EFTVRJTL1t6

diff --git a/packages/cisco_cellular_lte b/packages/cisco_cellular_lte
index b197fed..86e04f1 100644
--- a/packages/cisco_cellular_lte
+++ b/packages/cisco_cellular_lte
@@ -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
diff --git a/web/plugins/metrics/cisco_cellular_lte.py b/web/plugins/metrics/cisco_cellular_lte.py
index 0164494..495c52e 100644
--- a/web/plugins/metrics/cisco_cellular_lte.py
+++ b/web/plugins/metrics/cisco_cellular_lte.py
@@ -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)
 }
diff --git a/web/plugins/wato/cisco_cellular_lte.py b/web/plugins/wato/cisco_cellular_lte.py
index 66d8698..46a86f0 100644
--- a/web/plugins/wato/cisco_cellular_lte.py
+++ b/web/plugins/wato/cisco_cellular_lte.py
@@ -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'),
-- 
GitLab