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