From 7beba0b755451b31a80798f4878545108e2a307f Mon Sep 17 00:00:00 2001
From: "th.l" <thl-cmk@outlook.com>
Date: Sat, 1 Oct 2022 15:58:39 +0200
Subject: [PATCH] update project

---
 agent_based/cisco_cellular_lte.py           |  45 ++--
 agent_based/inv_cisco_cellular_lte.py       | 276 +++++++++++++++++++-
 cisco_cellular_lte.mkp                      | Bin 6832 -> 9995 bytes
 web/plugins/metrics/cisco_cellular_lte.py   |  33 +--
 web/plugins/views/inv_cisco_cellular_lte.py |   5 +-
 web/plugins/wato/cisco_cellular_lte.py      |  52 +++-
 6 files changed, 329 insertions(+), 82 deletions(-)

diff --git a/agent_based/cisco_cellular_lte.py b/agent_based/cisco_cellular_lte.py
index d4be481..f62f652 100644
--- a/agent_based/cisco_cellular_lte.py
+++ b/agent_based/cisco_cellular_lte.py
@@ -6,16 +6,18 @@
 # Author: thl-cmk[at]outlook[dot]com
 # URL   : https://thl-cmk.hopto.org
 # Date  : 2022-09-17
+# File  : cisco_cellular_lte.py
+
 #
 # Monitor status of Cisco cellular modems/connections/interfaces
 #
 # 2022-09-20: added WATO options
 #
-# snmpwalk sample
+# sample snmpwalk
 #
 
 #
-# sample info
+# sample string_table
 #
 
 #
@@ -59,7 +61,6 @@ from cmk.base.plugins.agent_based.agent_based_api.v1 import (
     get_rate,
     GetRateError,
     get_value_store,
-    IgnoreResultsError,
 )
 
 
@@ -197,7 +198,7 @@ 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_rsrq=int(current_rsrq)  # // 10,  # See Cisco bug ID CSCvt55347
             )
 
     for profile_oid_end, apn_type, apn in profile_table:
@@ -262,7 +263,7 @@ def parse_cisco_cellular_lte(string_table: List[StringByteTable]) -> Optional[Di
 
 def discovery_cisco_cellular_lte(params, section: Dict[str, CiscoCellularInterface]) -> DiscoveryResult:
     for item, interface in section.items():
-        if interface.profile is not None or params['not_configured']:
+        if not params['only_configured'] or interface.profile is not None:
             yield Service(item=item)
 
 ###########################################################################
@@ -281,7 +282,7 @@ def check_cisco_cellular_lte(item, params, section: Dict[str, CiscoCellularInter
         return
 
     if interface.profile is None:
-        yield Result(state=State(params['no_profile_state']), summary='No GSM/LTE profile configured')
+        yield Result(state=State(params['no_profile_state']), summary='No GSM/LTE SIM card associated')
         return
 
     metric_prefix = 'cisco_cellular_'
@@ -317,7 +318,8 @@ def check_cisco_cellular_lte(item, params, section: Dict[str, CiscoCellularInter
 
     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, 'RSRQ', lambda v: f'{v} dB', params['rsrp_levels_lower'], 'rsrq',),
+        (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'),
     ]:
         yield from check_levels(
@@ -347,21 +349,9 @@ def check_cisco_cellular_lte(item, params, section: Dict[str, CiscoCellularInter
         )
 
     if interface.ipv4_addr:
-        yield Result(state=State.OK, summary=f'IPv4 Addr: {interface.ipv4_addr}')
+        yield Result(state=State.OK, notice=f'IPv4 Address: {interface.ipv4_addr}')
     if interface.ipv6_addr:
-        yield Result(state=State.OK, summary=f'IPv6 Addr: {interface.ipv6_addr}')
-
-    # if interface.profile.apn_type == interface.pdn_type:
-    #     yield Result(
-    #         state=State.OK,
-    #         notice=f'Current APN type: {_cisco_wan_cell_ext_protocol_type.get(interface.pdn_type)}'
-    #     )
-    # else:
-    #     yield Result(
-    #         state=State.WARN,
-    #         summary=f'Current APN type: {_cisco_wan_cell_ext_protocol_type.get(interface.pdn_type)}  '
-    #                 f'(expected: {_cisco_wan_cell_ext_protocol_type.get(interface.profile.apn_type)})'
-    #     )
+        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']
@@ -375,11 +365,11 @@ def check_cisco_cellular_lte(item, params, section: Dict[str, CiscoCellularInter
     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}')
-
-    yield Result(state=State.OK, notice='\nInventory')
     yield Result(state=State.OK, notice=f'APN: {interface.profile.apn}')
-    yield Result(state=State.OK, notice=f'Configured APN type: {_cisco_wan_cell_ext_protocol_type.get(interface.pdn_type)}')
-    yield Result(state=State.OK, notice=f'Current APN type: {_cisco_wan_cell_ext_protocol_type.get(interface.profile.apn_type)}')
+    yield Result(
+        state=State.OK,
+        notice=f'APN type: {_cisco_wan_cell_ext_protocol_type.get(interface.pdn_type)}/'
+               f'{_cisco_wan_cell_ext_protocol_type.get(interface.pdn_type)} (configured/current)')
 
 ###########################################################################
 #
@@ -453,7 +443,7 @@ register.check_plugin(
     discovery_function=discovery_cisco_cellular_lte,
     discovery_ruleset_name='discovery_cisco_cellular_lte',
     discovery_default_parameters={
-        'not_configured': False,
+        'only_configured': True,
     },
     check_function=check_cisco_cellular_lte,
     check_default_parameters={
@@ -466,7 +456,8 @@ register.check_plugin(
         'modem_not_up_state': 2,
         'modem_not_online_state': 2,
         'expected_band': '12',
-        'state_not_expected_band': 0,
+        'state_not_expected_band': 1,
+        'CSCvt55347_fixed': False,
     },
     check_ruleset_name='cisco_cellular_lte',
 )
diff --git a/agent_based/inv_cisco_cellular_lte.py b/agent_based/inv_cisco_cellular_lte.py
index bd00724..1323225 100644
--- a/agent_based/inv_cisco_cellular_lte.py
+++ b/agent_based/inv_cisco_cellular_lte.py
@@ -6,7 +6,7 @@
 # Author: thl-cmk[at]outlook[dot]com
 # URL   : https://thl-cmk.hopto.org
 # Date  : 2022-09-26
-# File  : inv_cisco_cellular_lte
+# File  : inv_cisco_cellular_lte.py
 #
 # inventory of Cisco cellular interfaces (SIM cards)
 #
@@ -32,7 +32,6 @@ from cmk.base.plugins.agent_based.agent_based_api.v1.type_defs import (
 
 @dataclass
 class CiscoCellularProfile:
-    apn_type: str
     apn: str
 
 
@@ -52,7 +51,6 @@ _cisco_gsm_service_type = {
     '12': 'LTE FDD',
 }
 
-
 _cisco_gsm_band = {
     '1': 'unknown',
     '2': 'invalid',
@@ -76,6 +74,262 @@ _cisco_wan_cell_ext_protocol_type = {
     '5': 'IPv4v6',
 }
 
+# https://en.wikipedia.org/wiki/Mobile_country_code
+_mobile_country_code = {
+    "202": ("Greece", "GR"),
+    "204": ("Netherlands (Kingdom of the Netherlands)", "NL"),
+    "206": ("Belgium", "BE"),
+    "208": ("France", "FR"),
+    "212": ("Monaco", "MC"),
+    "213": ("Andorra", "AD"),
+    "214": ("Spain", "ES"),
+    "216": ("Hungary", "HU"),
+    "218": ("Bosnia and Herzegovina", "BA"),
+    "219": ("Croatia", "HR"),
+    "220": ("Serbia", "RS"),
+    "221": ("Kosovo", "XK"),
+    "222": ("Italy", "IT"),
+    "226": ("Romania", "RO"),
+    "228": ("Switzerland", "CH"),
+    "230": ("Czech Republic", "CZ"),
+    "231": ("Slovakia", "SK"),
+    "232": ("Austria", "AT"),
+   # "234": ("Guernsey (United Kingdom)", "GG"),
+   # "234": ("Jersey (United Kingdom)", "JE"),
+   # "234": ("Isle of Man (United Kingdom)", "IM"),
+    "234": ("United Kingdom", "GB"),
+    "235": ("United Kingdom", "GB"),
+    "238": ("Denmark (Kingdom of Denmark)", "DK"),
+    "240": ("Sweden", "SE"),
+    "242": ("Norway", "NO"),
+    "244": ("Finland", "FI"),
+    "246": ("Lithuania", "LT"),
+    "247": ("Latvia", "LV"),
+    "248": ("Estonia", "EE"),
+    "250": ("Russian Federation", "RU"),
+    "255": ("Ukraine", "UA"),
+    "257": ("Belarus", "BY"),
+    "259": ("Moldova", "MD"),
+    "260": ("Poland", "PL"),
+    "262": ("Germany", "DE"),
+    "266": ("Gibraltar (United Kingdom)", "GI"),
+    "268": ("Portugal", "PT"),
+    "270": ("Luxembourg", "LU"),
+    "272": ("Ireland", "IE"),
+    "274": ("Iceland", "IS"),
+    "276": ("Albania", "AL"),
+    "278": ("Malta", "MT"),
+    "280": ("Cyprus", "CY"),
+    "282": ("Georgia", "GE"),
+    "283": ("Armenia", "AM"),
+    "284": ("Bulgaria", "BG"),
+    "286": ("Turkey", "TR"),
+    "288": ("Faroe Islands (Kingdom of Denmark)", "FO"),
+    "289": ("Abkhazia", "GE-AB"),
+    "290": ("Greenland (Kingdom of Denmark)", "GL"),
+    "292": ("San Marino", "SM"),
+    "293": ("Slovenia", "SI"),
+    "294": ("North Macedonia", "MK"),
+    "295": ("Liechtenstein", "LI"),
+    "297": ("Montenegro", "ME"),
+    "302": ("Canada", "CA"),
+    "308": ("Saint Pierre and Miquelon", "PM"),
+   # "310": ("Guam (United States of America)", "GU"),
+   # "310": ("Northern Mariana Islands (United States of America)", "MP"),
+     "310": ("United States of America", "US"),
+   # "311": ("Guam (United States of America)", "GU"),
+    "311": ("United States of America", "US"),
+    "312": ("United States of America", "US"),
+    "313": ("United States of America", "US"),
+    "314": ("United States of America", "US"),
+    "315": ("United States of America", "US"),
+    "316": ("United States of America", "US"),
+    "330": ("Puerto Rico (United States of America)", "PR"),
+    "332": ("United States Virgin Islands", "VI"),
+    "334": ("Mexico", "MX"),
+    "338": ("Jamaica", "JM"),
+   # "340": ("Guadeloupe (France)", "GP"),
+   # "340": ("Martinique (France)", "MQ"),
+   # "340": ("Saint Barthélemy (France)", "BL"),
+    "340": ("Saint Martin (France)", "MF"),
+    "342": ("Barbados", "BB"),
+    "344": ("Antigua and Barbuda", "AG"),
+    "346": ("Cayman Islands (United Kingdom)", "KY"),
+    "348": ("British Virgin Islands (United Kingdom)", "VG"),
+    "350": ("Bermuda", "BM"),
+    "352": ("Grenada", "GD"),
+    "354": ("Montserrat (United Kingdom)", "MS"),
+    "356": ("Saint Kitts and Nevis", "KN"),
+    "358": ("Saint Lucia", "LC"),
+    "360": ("Saint Vincent and the Grenadines", "VC"),
+   # "362": ("Bonaire, Sint Eustatius and Saba", "BQ"),
+   # "362": ("Curaçao", "CW"),
+    "362": ("Sint Maarten", "SX"),
+    "363": ("Aruba", "AW"),
+    "364": ("Bahamas", "BS"),
+    "365": ("Anguilla (United Kingdom)", "AI"),
+    "366": ("Dominica", "DM"),
+    "368": ("Cuba", "CU"),
+    "370": ("Dominican Republic", "DO"),
+    "372": ("Haiti", "HT"),
+    "374": ("Trinidad and Tobago", "TT"),
+    "376": ("Turks and Caicos Islands", "TC"),
+    "400": ("Azerbaijan", "AZ"),
+    "401": ("Kazakhstan", "KZ"),
+    "402": ("Bhutan", "BT"),
+    "404": ("India", "IN"),
+    "405": ("India", "IN"),
+    "406": ("India", "IN"),
+    "410": ("Pakistan", "PK"),
+    "412": ("Afghanistan", "AF"),
+    "413": ("Sri Lanka", "LK"),
+    "414": ("Myanmar", "MM"),
+    "415": ("Lebanon", "LB"),
+    "416": ("Jordan", "JO"),
+    "417": ("Syria", "SY"),
+    "418": ("Iraq", "IQ"),
+    "419": ("Kuwait", "KW"),
+    "420": ("Saudi Arabia", "SA"),
+    "421": ("Yemen", "YE"),
+    "422": ("Oman", "OM"),
+    "424": ("United Arab Emirates", "AE"),
+   # "425": ("Israel", "IL"),
+    "425": ("Israel/Palestine", "IL/PS"),
+    "426": ("Bahrain", "BH"),
+    "427": ("Qatar", "QA"),
+    "428": ("Mongolia", "MN"),
+    "429": ("Nepal", "NP"),
+    "430": ("United Arab Emirates (Abu Dhabi)", "AE"),
+    "431": ("United Arab Emirates (Dubai)", "AE"),
+    "432": ("Iran", "IR"),
+    "434": ("Uzbekistan", "UZ"),
+    "436": ("Tajikistan", "TJ"),
+    "437": ("Kyrgyzstan", "KG"),
+    "438": ("Turkmenistan", "TM"),
+    "440": ("Japan", "JP"),
+    "441": ("Japan", "JP"),
+    "450": ("Korea, South", "KR"),
+    "452": ("Vietnam", "VN"),
+    "454": ("Hong Kong (People’s Republic of China)", "HK"),
+    "455": ("Macau (People’s Republic of China)", "MO"),
+    "456": ("Cambodia", "KH"),
+    "457": ("Laos", "LA"),
+    "460": ("China", "CN"),
+    "461": ("China", "CN"),
+    "466": ("Taiwan", "TW"),
+    "467": ("Korea, North", "KP"),
+    "470": ("Bangladesh", "BD"),
+    "472": ("Maldives", "MV"),
+    "502": ("Malaysia", "MY"),
+    "505": ("Australia", "AU"),
+   # "505": ("Norfolk Island", "NF"),
+    "510": ("Indonesia", "ID"),
+    "514": ("East Timor", "TL"),
+    "515": ("Philippines", "PH"),
+    "520": ("Thailand", "TH"),
+    "525": ("Singapore", "SG"),
+    "528": ("Brunei", "BN"),
+    "530": ("New Zealand", "NZ"),
+    "536": ("Nauru", "NR"),
+    "537": ("Papua New Guinea", "PG"),
+    "539": ("Tonga", "TO"),
+    "540": ("Solomon Islands", "SB"),
+    "541": ("Vanuatu", "VU"),
+    "542": ("Fiji", "FJ"),
+    "543": ("Wallis and Futuna", "WF"),
+    "544": ("American Samoa (United States of America)", "AS"),
+    "545": ("Kiribati", "KI"),
+    "546": ("New Caledonia", "NC"),
+    "547": ("French Polynesia (France)", "PF"),
+    "548": ("Cook Islands (Pacific Ocean)", "CK"),
+    "549": ("Samoa", "WS"),
+    "550": ("Micronesia, Federated States of", "FM"),
+    "551": ("Marshall Islands", "MH"),
+    "552": ("Palau", "PW"),
+    "553": ("Tuvalu", "TV"),
+    "554": ("Tokelau", "TK"),
+    "555": ("Niue", "NU"),
+    "602": ("Egypt", "EG"),
+    "603": ("Algeria", "DZ"),
+    "604": ("Morocco", "MA"),
+    "605": ("Tunisia", "TN"),
+    "606": ("Libya", "LY"),
+    "607": ("Gambia", "GM"),
+    "608": ("Senegal", "SN"),
+    "609": ("Mauritania", "MR"),
+    "610": ("Mali", "ML"),
+    "611": ("Guinea", "GN"),
+    "612": ("Ivory Coast", "CI"),
+    "613": ("Burkina Faso", "BF"),
+    "614": ("Niger", "NE"),
+    "615": ("Togo", "TG"),
+    "616": ("Benin", "BJ"),
+    "617": ("Mauritius", "MU"),
+    "618": ("Liberia", "LR"),
+    "619": ("Sierra Leone", "SL"),
+    "620": ("Ghana", "GH"),
+    "621": ("Nigeria", "NG"),
+    "622": ("Chad", "TD"),
+    "623": ("Central African Republic", "CF"),
+    "624": ("Cameroon", "CM"),
+    "625": ("Cape Verde", "CV"),
+    "626": ("São Tomé and Príncipe", "ST"),
+    "627": ("Equatorial Guinea", "GQ"),
+    "628": ("Gabon", "GA"),
+    "629": ("Congo", "CG"),
+    "630": ("Democratic Republic of the Congo", "CD"),
+    "631": ("Angola", "AO"),
+    "632": ("Guinea-Bissau", "GW"),
+    "633": ("Seychelles", "SC"),
+    "634": ("Sudan", "SD"),
+    "635": ("Rwanda", "RW"),
+    "636": ("Ethiopia", "ET"),
+    "637": ("Somalia", "SO"),
+    "638": ("Djibouti", "DJ"),
+    "639": ("Kenya", "KE"),
+    "640": ("Tanzania", "TZ"),
+    "641": ("Uganda", "UG"),
+    "642": ("Burundi", "BI"),
+    "643": ("Mozambique", "MZ"),
+    "645": ("Zambia", "ZM"),
+    "646": ("Madagascar", "MG"),
+    "647": ("French Indian Ocean Territories (France)", "RE/YT"),
+   # "647": ("French Indian Ocean Territories (France)", "YT"),
+    "648": ("Zimbabwe", "ZW"),
+    "649": ("Namibia", "NA"),
+    "650": ("Malawi", "MW"),
+    "651": ("Lesotho", "LS"),
+    "652": ("Botswana", "BW"),
+    "653": ("Swaziland", "SZ"),
+    "654": ("Comoros", "KM"),
+    "655": ("South Africa", "ZA"),
+    "657": ("Eritrea", "ER"),
+    "658": ("Saint Helena, Ascension and Tristan da Cunha", "SH"),
+    "659": ("South Sudan", "SS"),
+    "702": ("Belize", "BZ"),
+    "704": ("Guatemala", "GT"),
+    "706": ("El Salvador", "SV"),
+    "708": ("Honduras", "HN"),
+    "710": ("Nicaragua", "NI"),
+    "712": ("Costa Rica", "CR"),
+    "714": ("Panama", "PA"),
+    "716": ("Peru", "PE"),
+    "722": ("Argentina", "AR"),
+    "724": ("Brazil", "BR"),
+    "730": ("Chile", "CL"),
+    "732": ("Colombia", "CO"),
+    "734": ("Venezuela", "VE"),
+    "736": ("Bolivia", "BO"),
+    "738": ("Guyana", "GY"),
+    "740": ("Ecuador", "EC"),
+    "742": ("French Guiana (France)", "GF"),
+    "744": ("Paraguay", "PY"),
+    "746": ("Suriname", "SR"),
+    "748": ("Uruguay", "UY"),
+    "750": ("Falkland Islands (United Kingdom)", "FK"),
+    "995": ("British Indian Ocean Territory (United Kingdom)", "IO"),
+}
+
 
 def parse_inv_cisco_cellular_lte(string_table: List[StringByteTable]):
     section = []
@@ -83,14 +337,16 @@ def parse_inv_cisco_cellular_lte(string_table: List[StringByteTable]):
 
     modem_table, profile_table = string_table
 
-    for profile_oid_end, apn_type, apn in profile_table:
+    for profile_oid_end, apn in profile_table:
         radio_index, profile_index = profile_oid_end.split('.')
         profiles[radio_index] = CiscoCellularProfile(
             apn=apn,
-            apn_type=apn_type
         )
 
-    for oid_end, service_type, imsi, imei, iccid, msisdn, country, network, current_band in modem_table:
+    for oid_end, service_type, imsi, imei, iccid, msisdn, country, network, mcc, current_band in modem_table:
+        if not country and mcc:
+            country = _mobile_country_code.get(mcc, (None, None))[0]
+
         entry = {
             'key_columns': {
                 'iccid': iccid,
@@ -103,8 +359,7 @@ def parse_inv_cisco_cellular_lte(string_table: List[StringByteTable]):
                 'network': network if network else None,
                 'current_band': _cisco_gsm_band.get(current_band, f'Unknown {current_band}'),
                 'apn': profiles[oid_end].apn if profiles.get(oid_end) else None,
-                'apn_type': _cisco_wan_cell_ext_protocol_type.get(profiles[oid_end].apn_type) if profiles.get(oid_end) else None,
-                'service_type': _cisco_gsm_service_type.get(str(service_type[0]*256 + service_type[1]))
+                'service_type': _cisco_gsm_service_type.get(str(service_type[0] * 256 + service_type[1]))
             },
             'status_columns': {
 
@@ -147,13 +402,13 @@ register.snmp_section(
             '3.1.1.4',  # c3gMsisdn
             '3.2.1.8',  # c3gGsmCountry
             '3.2.1.9',  # c3gGsmNetwork
+            '3.2.1.10',  # c3gGsmMcc
             '3.4.1.1.3',  # c3gGsmCurrentBand
         ]),
         SNMPTree(
             base='.1.3.6.1.4.1.9.9.817.1.1.2.3.1',  # CISCO-WAN-CELL-EXT-MIB::cwceLteProfileEntry
             oids=[
                 OIDEnd(),
-                '2',  # cwceLteProfileType
                 '5',  # cwceLteProfileApn
             ])],
     detect=all_of(
@@ -164,7 +419,6 @@ register.snmp_section(
 register.inventory_plugin(
     name='inv_cisco_cellular_lte',
     inventory_function=inventory_cisco_cellular_lte,
-    inventory_default_parameters={
-    },
     inventory_ruleset_name='inv_cisco_cellular_lte',
+    inventory_default_parameters={},
 )
diff --git a/cisco_cellular_lte.mkp b/cisco_cellular_lte.mkp
index 243b86fe520023343700c1550021e122636e3146..dd38d7eb17bf06563a878350a36dd4d4dd1d8f0c 100644
GIT binary patch
literal 9995
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

literal 6832
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

diff --git a/web/plugins/metrics/cisco_cellular_lte.py b/web/plugins/metrics/cisco_cellular_lte.py
index ebef830..0164494 100644
--- a/web/plugins/metrics/cisco_cellular_lte.py
+++ b/web/plugins/metrics/cisco_cellular_lte.py
@@ -6,8 +6,9 @@
 # Author: thl-cmk[at]outlook[dot]com
 # URL   : https://thl-cmk.hopto.org
 # Date  : 2022-09-26
+# File  : metrics/cisco_cellular_lte.py
 #
-# Cisco Cellular Lte metrics plugin
+# Cisco Cellular LTE metrics plugin
 #
 #
 from cmk.gui.i18n import _
@@ -18,7 +19,6 @@ from cmk.gui.plugins.metrics import (
     perfometer_info
 )
 
-
 metric_info['cisco_cellular_rsrp'] = {
     'title': _('RSRP'),
     'unit': 'dbm',
@@ -35,12 +35,6 @@ metric_info['cisco_cellular_rssi'] = {
     'color': '42/a',
 }
 
-######################################################################################################################
-#
-# how to graph perdata for bgp peer
-#
-######################################################################################################################
-
 graph_info['cisco_cellular.rsrp'] = {
     'title': _('Reference Signal Received Power'),
     'metrics': [
@@ -67,26 +61,3 @@ graph_info['cisco_cellular.rssi'] = {
         ('cisco_cellular_rssi', 'area'),
     ],
 }
-
-
-# perfometer_info.append(('stacked', [
-#     {
-#         'type': 'logarithmic',
-#         'metric': 'bgp_peer_fsmestablishedtime',
-#         'half_value': 2592000.0,  # ome month
-#         'exponent': 2,
-#     },
-#     {
-#         'type': 'logarithmic',
-#         'metric': 'bgp_peer_acceptedprefixes',
-#         'half_value': 500000.0,
-#         'exponent': 2,
-#     }
-# ]))
-#
-# perfometer_info.append({
-#     'type': 'logarithmic',
-#     'metric': 'bgp_peer_fsmestablishedtime',
-#     'half_value': 2592000.0,  # ome month
-#     'exponent': 2,
-# })
\ No newline at end of file
diff --git a/web/plugins/views/inv_cisco_cellular_lte.py b/web/plugins/views/inv_cisco_cellular_lte.py
index 7554aaf..2d3604a 100644
--- a/web/plugins/views/inv_cisco_cellular_lte.py
+++ b/web/plugins/views/inv_cisco_cellular_lte.py
@@ -6,7 +6,7 @@
 # Author: thl-cmk[at]outlook[dot]com
 # URL   : https://thl-cmk.hopto.org
 # Date  : 2022-09-26
-# File  : view/inv_cisco_cellular_lte
+# File  : view/inv_cisco_cellular_lte.py
 #
 
 from cmk.gui.i18n import _
@@ -24,8 +24,8 @@ inventory_displayhints.update({
             'iccid',
             'imsi',
             'network',
+            'country',
             'apn',
-            'apn_type',
             'service_type'
         ],
         'view': 'invcellularlte_of_host',
@@ -42,7 +42,6 @@ inventory_displayhints.update({
     '.networking.cellular:*.network': {'title': _('Network'), },
     '.networking.cellular:*.current_band': {'title': _('Current band'), },
     '.networking.cellular:*.apn': {'short': _('APN'), 'title': _('Access Point Name (APN)')},
-    '.networking.cellular:*.apn_type': {'title': _('APN type'), },
     '.networking.cellular:*.service_type': {'title': _('Service type'), },
 })
 
diff --git a/web/plugins/wato/cisco_cellular_lte.py b/web/plugins/wato/cisco_cellular_lte.py
index a5c7785..66d8698 100644
--- a/web/plugins/wato/cisco_cellular_lte.py
+++ b/web/plugins/wato/cisco_cellular_lte.py
@@ -6,7 +6,7 @@
 # Author: thl-cmk[at]outlook[dot]com
 # URL   : https://thl-cmk.hopto.org
 # Date  : 2022-09-20
-# File  : wato/cisco_cellular_lte
+# File  : wato/cisco_cellular_lte.py
 #
 
 from cmk.gui.i18n import _
@@ -15,8 +15,6 @@ from cmk.gui.valuespec import (
     TextAscii,
     MonitoringState,
     FixedValue,
-    ListOfStrings,
-    ListOf,
     Integer,
     Tuple,
     DropdownChoice,
@@ -58,6 +56,32 @@ def _parameter_valuespec_cisco_cellular_lte():
                      Integer(title=_('Warning below'), default_value=-75, unit=_('dBm')),
                      Integer(title=_('Critical below'), default_value=-85, unit=_('dBm')),
                  ])),
+            ('expected_band',
+             DropdownChoice(
+                 title=_('Expected Band'),
+                 help=_('The expected cellular band.'),
+                 default_value='12',
+                 choices=[
+                     ('12', 'LTE Band'),
+                     ('11', 'WCDMA-2100'),
+                     ('10', 'WCDMA-1900'),
+                     ('9', 'WCDMA-850'),
+                     ('8', 'WCDMA-800'),
+                     ('7', 'GSM-1900'),
+                     ('6', 'GSM-1800'),
+                     ('5', 'GSM-900'),
+                     ('4', 'GSM-850'),
+                     ('3', 'none'),
+                     ('2', 'invalid'),
+                     ('1', 'unknown'),
+                 ]
+             )),
+            ('state_not_expected_band',
+             MonitoringState(
+                 title=_('Monitoring state if current band is not expected band '),
+                 help=_('Monitoring state if the current band is not the expected band. Default is WARN.'),
+                 default_value=1,
+             )),
             ('roaming_state',
              MonitoringState(
                  title=_('Monitoring state if the device is roaming'),
@@ -66,8 +90,8 @@ def _parameter_valuespec_cisco_cellular_lte():
              )),
             ('no_profile_state',
              MonitoringState(
-                 title=_('Monitoring state if no GSM/LTE profile configured'),
-                 help=_('Monitoring state if no GSM/LTE  profile is configured. Default is WARN.'),
+                 title=_('Monitoring state if no SIM card associated'),
+                 help=_('Monitoring state if no SIM card associated with the interface. Default is WARN.'),
                  default_value=1,
              )),
             ('connection_state',
@@ -88,6 +112,14 @@ def _parameter_valuespec_cisco_cellular_lte():
                  help=_('Monitoring state if the the modem is not online. Default is CRIT.'),
                  default_value=1,
              )),
+            ('CSCvt55347_fixed',
+             FixedValue(
+                 True,
+                 title=_('The device is not affected by Cisco Bug ID CSCvt55347.'),
+                 help=_('In the Cisco OS is a Bug that gives the wrong value for RSRQ. Enable this option if '
+                        'your device is not affected by this bug..'),
+                 totext=_('')
+             )),
         ],
     )
 
@@ -99,7 +131,7 @@ rulespec_registry.register(
         match_type='dict',
         parameter_valuespec=_parameter_valuespec_cisco_cellular_lte,
         title=lambda: _('Cisco cellular LTE'),
-        item_spec=lambda: TextAscii(title=_('Item'), ),
+        item_spec=lambda: TextAscii(title=_('Interface name'), ),
     ))
 
 
@@ -107,11 +139,11 @@ def _valuespec_discovery_cisco_cellular_lte():
     return Dictionary(
             title=_('Cisco cellular LTE'),
             elements=[
-                ('not_configured',
+                ('only_configured',
                  FixedValue(
-                     True,
-                     title=_('Discover not configured interfaces'),
-                     help=_('If enabled the plugin will also discover cellular interfaces without a profile attached.'),
+                     False,
+                     title=_('Discover interfaces without associated SIM card'),
+                     help=_('If enabled the plugin will discover cellular interfaces without a associated SIM card.'),
                      totext=_('')
                  )),
             ],
-- 
GitLab