From 7ed0cf90ca7b307b85214cf1304b547c3c8dc714 Mon Sep 17 00:00:00 2001 From: Thl CMK <thl-cmk@outlook.com> Date: Tue, 4 Aug 2020 21:28:34 +0200 Subject: [PATCH] update project --- checks/cisco_api_status | 29 +- inv_cisco_support.mkp | Bin 36739 -> 39613 bytes inventory/snmp_cisco_contract | 109 +++---- inventory/snmp_cisco_eox | 129 +++----- inventory/snmp_cisco_suggestion | 16 +- lib/nagios/plugins/cisco_api_status | 240 ++++++++++---- packages/inv_cisco_support | 2 +- web/plugins/views/inv_cisco_support.py | 433 +++++++++++++++++++++---- 8 files changed, 670 insertions(+), 288 deletions(-) diff --git a/checks/cisco_api_status b/checks/cisco_api_status index aed0a8e..a2dc7fe 100644 --- a/checks/cisco_api_status +++ b/checks/cisco_api_status @@ -13,42 +13,41 @@ def cisco_api_status_arguments(params): # example # {'psirt': {'warn-severity': 3, 'warn-days': 31, 'crit-days': 7, 'crit-severity': 1}} - # print params if params: if params.get('psirt'): - if params.get('psirt').get('crit-days') is not None: + if params.get('psirt').get('crit-days'): args.append('--psirt-crit-days %s' % params.get('psirt').get('crit-days')) - if params.get('psirt').get('warn-days') is not None: + if params.get('psirt').get('warn-days'): args.append('--psirt-warn-days %s' % params.get('psirt').get('warn-days')) - if params.get('psirt').get('warn-severity') is not None: + if params.get('psirt').get('warn-severity'): args.append('--psirt-warn-severity %s' % params.get('psirt').get('warn-severity')) - if params.get('psirt').get('crit-severity') is not None: + if params.get('psirt').get('crit-severity'): args.append('--psirt-crit-severity %s' % params.get('psirt').get('crit-severity')) - if params.get('psirt').get('not-active') is not None: + if params.get('psirt').get('not-active'): args.append('--psirt-not-active %s' % params.get('psirt').get('not-active')) if params.get('eox'): - if params.get('eox').get('crit-new') is not None: + if params.get('eox').get('crit-new'): args.append('--eox-crit-new %s' % params.get('eox').get('crit-new')) - if params.get('eox').get('warn-new') is not None: + if params.get('eox').get('warn-new'): args.append('--eox-warn-new %s' % params.get('eox').get('warn-new')) - if params.get('eox').get('crit-change') is not None: + if params.get('eox').get('crit-change'): args.append('--eox-crit-change %s' % params.get('eox').get('crit-change')) - if params.get('eox').get('warn-change') is not None: + if params.get('eox').get('warn-change'): args.append('--eox-warn-change %s' % params.get('eox').get('warn-change')) - if params.get('eox').get('not-active') is not None: + if params.get('eox').get('not-active'): args.append('--eox-not-active %s' % params.get('eox').get('not-active')) if params.get('sn2info'): - if params.get('sn2info').get('crit-change') is not None: + if params.get('sn2info').get('crit-change'): args.append('--sn2info-crit-change %s' % params.get('sn2info').get('crit-change')) - if params.get('sn2info').get('warn-change') is not None : + if params.get('sn2info').get('warn-change'): args.append('--sn2info-warn-change %s' % params.get('sn2info').get('warn-change')) - if params.get('sn2info').get('not-active') is not None: + if params.get('sn2info').get('not-active'): args.append('--sn2info-not-active %s' % params.get('sn2info').get('not-active')) if params.get('suggestion'): - if params.get('suggestion').get('not-active') is not None: + if params.get('suggestion').get('not-active'): args.append('--suggestion-not-active %s' % params.get('suggestion').get('not-active')) # in CMK v1.5.x global variable g_hostname was replaced by API call host_name() diff --git a/inv_cisco_support.mkp b/inv_cisco_support.mkp index 18b622e7747df2acd05515c0c31216b1ef93c364..e5f4fe72bb72b04ea1a6170be4e9a0d6155b8d33 100644 GIT binary patch literal 39613 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≦9^ywPFb-fQ~?LR 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 ay_EW5--^=zTZUd=z*Kaa4RAk@;Qj|$6y>=9 literal 36739 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 WWhzsd%2cLJ)Bgdal=PhdU<3dv11bCf diff --git a/inventory/snmp_cisco_contract b/inventory/snmp_cisco_contract index 6700d37..26ebeab 100644 --- a/inventory/snmp_cisco_contract +++ b/inventory/snmp_cisco_contract @@ -1,14 +1,22 @@ #!/usr/bin/python # -*- encoding: utf-8; py-indent-offset: 4 -*- # -# 20.03.2017 : writen by Th.L. to collect/show Cisco hardware contract status +# License: GNU General Public License v2 # -# 29.05.2017 : fixed empty pid handling -# : added serial number cleanup -# 09-04.2018 : removed import -# 04.09.2018 : changes for CMK 1.5.x (inv_tree --> inv_tree_list) -# 05.09.2018 : changes for CMK 1.5.x (replaced global variable g_hostname with api call host_name()) -# 13.08.2019 : chaged variable host_anme to _hostname for cmk1.5 +# Author: thl-cmk[at]outlook[dot]com +# URL : https://thl-cmk.hopto.org +# Date : 2027-03-20 +# +# collect/show Cisco hardware contract status +# +# 2017-05-29 : fixed empty pid handling +# added serial number cleanup +# 2018-04-09 : removed import +# 2018-09-04 : changes for CMK 1.5.x (inv_tree --> inv_tree_list) +# 2018-09-05 : changes for CMK 1.5.x (replaced global variable g_hostname with api call host_name()) +# 2019-08-13 : chaged variable host_anme to _hostname for cmk1.5 +# 2020-08-04 : moved node tree from hardware.system.support to hardware.system +# cleanup create_sn2info_record # # import is done by Check_MK # import logging @@ -17,7 +25,7 @@ import json import ConfigParser -def create_sn2info_record(sn2infofile): +def create_sn2info_record(sn2infofile, optional_columns): sn2info = {} if os.path.isfile(sn2infofile): with open(sn2infofile) as f: @@ -27,52 +35,26 @@ def create_sn2info_record(sn2infofile): sn2info.update({'Last_checked': time.strftime('%Y-%m-%d', time.localtime(modifytime)) }) - # get info's from sn2info File - serial_number = sn2inforecord.get('sr_no') - is_covered = sn2inforecord.get('is_covered') - contract_site_customer_name = sn2inforecord.get('contract_site_customer_name') - contract_site_address1 = sn2inforecord.get('contract_site_address1') - contract_site_city = sn2inforecord.get('contract_site_city') - contract_site_state_province = sn2inforecord.get('contract_site_state_province') - contract_site_country = sn2inforecord.get('contract_site_country') - service_line_descr = sn2inforecord.get('service_line_descr') - service_contract_number = sn2inforecord.get('service_contract_number') - covered_product_line_end_date = sn2inforecord.get('covered_product_line_end_date') - parent_sr_no = sn2inforecord.get('parent_sr_no') - warranty_type = sn2inforecord.get('warranty_type') - warranty_type_description = sn2inforecord.get('warranty_type_description') - warranty_end_date = sn2inforecord.get('warranty_end_date') - - # add nonempty info's to sn2inforecord - - if (serial_number is not None) and (serial_number != ''): - sn2info.update({'serial_number': serial_number}) - if (is_covered is not None) and (is_covered != ''): - sn2info.update({'is_covered': is_covered}) - if (contract_site_customer_name is not None) and (contract_site_customer_name != ''): - sn2info.update({'contract_site_customer_name': contract_site_customer_name}) - if (contract_site_address1 is not None) and (contract_site_address1 != ''): - sn2info.update({'contract_site_address1': contract_site_address1}) - if (contract_site_city is not None) and (contract_site_city != ''): - sn2info.update({'contract_site_city': contract_site_city}) - if (contract_site_state_province is not None) and (contract_site_state_province != ''): - sn2info.update({'contract_site_state_province': contract_site_state_province}) - if (contract_site_country is not None) and (contract_site_country != ''): - sn2info.update({'contract_site_country': contract_site_country}) - if (service_line_descr is not None) and (service_line_descr != ''): - sn2info.update({'service_line_descr': service_line_descr}) - if (service_contract_number is not None) and (service_contract_number != ''): - sn2info.update({'service_contract_number': service_contract_number}) - if (covered_product_line_end_date is not None) and (covered_product_line_end_date != ''): - sn2info.update({'covered_product_line_end_date': covered_product_line_end_date}) - if (parent_sr_no is not None) and (parent_sr_no != ''): - sn2info.update({'parent_sr_no': parent_sr_no}) - if (warranty_type is not None) and (warranty_type != ''): - sn2info.update({'warranty_type': warranty_type}) - if (warranty_type_description is not None) and (warranty_type_description != ''): - sn2info.update({'warranty_type_description': warranty_type_description}) - if (warranty_end_date is not None) and (warranty_end_date != ''): - sn2info.update({'warranty_end_date': warranty_end_date}) + # add nonempty values to sn2inforecord + for key, value in [ + ('serial_number', sn2inforecord.get('sr_no')), + ('is_covered', sn2inforecord.get('is_covered')), + ('contract_site_customer_name', sn2inforecord.get('contract_site_customer_name')), + ('contract_site_address1', sn2inforecord.get('contract_site_address1')), + ('contract_site_city', sn2inforecord.get('contract_site_city')), + ('contract_site_state_province', sn2inforecord.get('contract_site_state_province')), + ('contract_site_country', sn2inforecord.get('contract_site_country')), + ('service_line_descr', sn2inforecord.get('service_line_descr')), + ('service_contract_number', sn2inforecord.get('service_contract_number')), + ('covered_product_line_end_date', sn2inforecord.get('covered_product_line_end_date')), + ('parent_sr_no', sn2inforecord.get('parent_sr_no')), + ('warranty_type', sn2inforecord.get('warranty_type')), + ('warranty_type_description', sn2inforecord.get('warranty_type_description')), + ('warranty_end_date', sn2inforecord.get('warranty_end_date')), + ]: + value = value.strip() + if value != '' and key not in optional_columns: + sn2info[key] = value logging.info('create_sn2info_record sn2info: %s' % sn2info) return sn2info @@ -119,7 +101,7 @@ def inv_cisco_contract(info, params): path_request = expand_path(sn2info_dir + '/request/') status_path = expand_path(base_path + '/status') - node = inv_tree_list('hardware.system.support.cisco_contract:') + node = inv_tree_list('hardware.support.cisco_contract:') serials = [] serialscontract = [] @@ -142,15 +124,17 @@ def inv_cisco_contract(info, params): logging.info('raw sn : %s' % physerialnum) logging.info('raw desc : %s' % phydescr) - pid = phymodelname.split()[0].upper() # cut PID at first space sign, change to all Uppercase + # cut PID/SN at first space sign, change to all Uppercase + pid = phymodelname.split()[0].upper() + physerialnum = physerialnum.split()[0].upper() - # drop all PIDs on Black List + # drop all PIDs on Black List, create default node entry for SN if not pid_on_black_list(pid): logging.info('PID not on blacklist: %s' % pid) if phydescr == "": phydescr = 'requested' - physerialnum = physerialnum.split()[0].upper() + # create list of serial numbers to request contract info for serials.append(physerialnum) @@ -167,7 +151,7 @@ def inv_cisco_contract(info, params): # find serial in SER-sn2info-covered if os.path.isfile(path_found + serial): logging.info("Serial number covered: %s" % serial) - serialscontract.append(create_sn2info_record(path_found + serial)) + serialscontract.append(create_sn2info_record(path_found + serial, optionalcolumns)) logging.info("Serial number Record: %s" % serialscontract) # find serial in SER-sn2info-notcovered elif os.path.isfile(path_not_found + serial): @@ -191,17 +175,12 @@ def inv_cisco_contract(info, params): logging.info("Serials contract : %s" % serialscontract) + # update default entrys with data for i in node: # add contract data by serial number for serial in serialscontract: if i.get('serial_number') == serial.get('serial_number'): i.update(serial) - # remove optional columns - logging.info('remove columns: %s' % optionalcolumns) - if optionalcolumns is not None: - for column in optionalcolumns: - logging.info('remove column: %s' % column) - i.pop(column, None) # create and write back api status, will be used for active check cisco_api_status apistatus = {} diff --git a/inventory/snmp_cisco_eox b/inventory/snmp_cisco_eox index d9bf001..ab1312f 100644 --- a/inventory/snmp_cisco_eox +++ b/inventory/snmp_cisco_eox @@ -1,14 +1,22 @@ #!/usr/bin/python # -*- encoding: utf-8; py-indent-offset: 4 -*- # -# 20.03.2017 : writen by Th.L. to collect/show Cisco hardware EoX status +# License: GNU General Public License v2 # -# 29.05.2017 : fixed empty pid handling -# : added serial number cleanup -# 09-04.2018 : removed import -# 04.09.2018 : changes for CMK 1.5.x (inv_tree --> inv_tree_list) -# 05.09.2018 : changes for CMK 1.5.x (replaced global variable g_hostname with api call host_name()) -# 13.08.2018 : changed variable host_name to _hostname for cmk 1.5 +# Author: thl-cmk[at]outlook[dot]com +# URL : https://thl-cmk.hopto.org +# Date : 2017-03-20 +# +# collect/show Cisco hardware EoX status +# +# 2017-05-29 : fixed empty pid handling +# added serial number cleanup +# 2018-04-09 : removed import +# 2018-09-04 : changes for CMK 1.5.x (inv_tree --> inv_tree_list) +# 2018-09-05 : changes for CMK 1.5.x (replaced global variable g_hostname with api call host_name()) +# 2018-08-13 : changed variable host_name to _hostname for cmk 1.5 +# 2020-08-04 : code cleanup (create_eox_record function) +# moved node tree from hardware.system.support to hardware.system # # import is done by Check_MK @@ -18,79 +26,52 @@ import json import ConfigParser -def create_eox_record(eoxfile): +def create_eox_record(eoxfile, optional_columns): eox = {} if os.path.isfile(eoxfile): with open(eoxfile) as f: eoxrecord = json.load(f) + modifytime = os.path.getmtime(eoxfile) - eox.update({'Last_checked': time.strftime('%Y-%m-%d', time.localtime(modifytime))}) - eox.update({'pid': eoxrecord.get('EOLProductID')}) - - # get infos from EOX File - ProductIDDescription = eoxrecord.get('ProductIDDescription') - EOXExternalAnnouncementDate = eoxrecord.get('EOXExternalAnnouncementDate').get('value') - EndOfSaleDate = eoxrecord.get('EndOfSaleDate').get('value') - EndOfSvcAttachDate = eoxrecord.get('EndOfSvcAttachDate').get('value') - LastDateOfSupport = eoxrecord.get('LastDateOfSupport').get('value') - ProductBulletinNumber = eoxrecord.get('ProductBulletinNumber') - LinkToProductBulletinURL = eoxrecord.get('LinkToProductBulletinURL') - UpdatedTimeStamp = eoxrecord.get('UpdatedTimeStamp').get('value') - EndOfSecurityVulSupportDate = eoxrecord.get('EndOfSecurityVulSupportDate').get('value') - EndOfSWMaintenanceReleases = eoxrecord.get('EndOfSWMaintenanceReleases').get('value') - EndOfRoutineFailureAnalysisDate = eoxrecord.get('EndOfRoutineFailureAnalysisDate').get('value') - EOXInputType = eoxrecord.get('EOXInputType') + + eox['Last_checked'] = time.strftime('%Y-%m-%d', time.localtime(modifytime)) + eox['pid'] = eoxrecord.get('EOLProductID') # Migration Info EOXMigrationDetails = eoxrecord.get('EOXMigrationDetails') - MigrationProductId = EOXMigrationDetails.get('MigrationProductId') - MigrationInformation = EOXMigrationDetails.get('MigrationInformation') - MigrationProductInfoURL = EOXMigrationDetails.get('MigrationProductInfoURL') - MigrationProductName = EOXMigrationDetails.get('MigrationProductName') - - # add nonempty infos to eoxrecord - if (ProductIDDescription is not None) and (ProductIDDescription != ' '): - eox.update({'ProductIDDescription': ProductIDDescription}) - if (EOXExternalAnnouncementDate is not None) and (EOXExternalAnnouncementDate != ' '): - eox.update({'EOXExternalAnnouncementDate': EOXExternalAnnouncementDate}) - if (EndOfSaleDate is not None) and (EndOfSaleDate != ' '): - eox.update({'EndOfSaleDate': EndOfSaleDate}) - if (EndOfSvcAttachDate is not None) and (EndOfSvcAttachDate != ' '): - eox.update({'EndOfSvcAttachDate': EndOfSvcAttachDate}) - if (LastDateOfSupport is not None) and (LastDateOfSupport != ' '): - eox.update({'LastDateOfSupport': LastDateOfSupport}) - if (ProductBulletinNumber is not None) and (ProductBulletinNumber != ' '): - eox.update({'ProductBulletinNumber': ProductBulletinNumber}) - if (LinkToProductBulletinURL is not None) and (LinkToProductBulletinURL != ' '): - eox.update({'LinkToProductBulletinURL': LinkToProductBulletinURL}) - if (UpdatedTimeStamp is not None) and (UpdatedTimeStamp != ' '): - eox.update({'UpdatedTimeStamp': UpdatedTimeStamp}) - if (EndOfSecurityVulSupportDate is not None) and (EndOfSecurityVulSupportDate != ' '): - eox.update({'EndOfSecurityVulSupportDate': EndOfSecurityVulSupportDate}) - if (EndOfSWMaintenanceReleases is not None) and (EndOfSWMaintenanceReleases != ' '): - eox.update({'EndOfSWMaintenanceReleases': EndOfSWMaintenanceReleases}) - if (EndOfRoutineFailureAnalysisDate is not None) and (EndOfRoutineFailureAnalysisDate != ' '): - eox.update({'EndOfRoutineFailureAnalysisDate' : EndOfRoutineFailureAnalysisDate}) - # Migration Info - if (MigrationProductId is not None) and (MigrationProductId != ' '): - eox.update({'MigrationProductId': MigrationProductId}) - if (MigrationInformation is not None) and (MigrationInformation != ' '): - eox.update({'MigrationInformation': MigrationInformation}) - if (MigrationProductInfoURL is not None) and (MigrationProductInfoURL != ' '): - eox.update({'MigrationProductInfoURL': MigrationProductInfoURL}) - if (MigrationProductName is not None) and (MigrationProductName != ' '): - eox.update({'MigrationProductName': MigrationProductName}) + for key, value in [ + ('ProductIDDescription', eoxrecord.get('ProductIDDescription', '')), + ('EOXExternalAnnouncementDate', eoxrecord.get('EOXExternalAnnouncementDate').get('value', '')), + ('EndOfSaleDate', eoxrecord.get('EndOfSaleDate').get('value', '')), + ('EndOfSvcAttachDate', eoxrecord.get('EndOfSvcAttachDate').get('value', '')), + ('LastDateOfSupport', eoxrecord.get('LastDateOfSupport').get('value', '')), + ('ProductBulletinNumber', eoxrecord.get('ProductBulletinNumber', '')), + ('LinkToProductBulletinURL', eoxrecord.get('LinkToProductBulletinURL', '')), + ('UpdatedTimeStamp', eoxrecord.get('UpdatedTimeStamp').get('value', '')), + ('EndOfSecurityVulSupportDate', eoxrecord.get('EndOfSecurityVulSupportDate').get('value', '')), + ('EndOfSWMaintenanceReleases', eoxrecord.get('EndOfSWMaintenanceReleases').get('value', '')), + ('EndOfRoutineFailureAnalysisDate', eoxrecord.get('EndOfRoutineFailureAnalysisDate').get('value', '')), + + # Migration Info + ('MigrationProductId', EOXMigrationDetails.get('MigrationProductId', '')), + ('MigrationInformation', EOXMigrationDetails.get('MigrationInformation', '')), + ('MigrationProductInfoURL', EOXMigrationDetails.get('MigrationProductInfoURL', '')), + ('MigrationProductName', EOXMigrationDetails.get('MigrationProductName', '')), + ]: + value = value.strip() + if value != '' and key not in optional_columns: + eox[key] = value # add serial if EoX from get_eox_by_serial + EOXInputType = eoxrecord.get('EOXInputType') if EOXInputType == 'ShowEOXBySerialNumber': - eox.update({'serial_number': eoxrecord.get('EOXInputValue')}) + eox['serial_number'] = eoxrecord.get('EOXInputValue') return eox def inv_cisco_eox(info, params): - set_loglevel() # list of PIDs to drop @@ -109,6 +90,7 @@ def inv_cisco_eox(info, params): 'MigrationProductInfoURL', 'MigrationProductName', ] + base_path = '~/var/ciscoapi' conf_file = '~/etc/ciscoapi/ciscoapi.conf' conf_file = os.path.expanduser(conf_file) @@ -151,7 +133,7 @@ def inv_cisco_eox(info, params): status_path = expand_path(base_path + '/status') - node = inv_tree_list('hardware.system.support.cisco_eox:') + node = inv_tree_list('hardware.support.cisco_eox:') pids = [] pidseox = [] @@ -177,18 +159,17 @@ def inv_cisco_eox(info, params): logging.info('raw sn : %s' % physerialnum) logging.info('raw desc : %s' % phydescr) - # cut PID at first space sign, change to all Uppercase + # cut PID/SN at first space sign, change to all Uppercase pid = phymodelname.split()[0].upper() + physerialnum = physerialnum.split()[0].upper() - # drop all PIDs on Black List + # drop all PIDs/SNs on Black List if not pid_on_black_list(pid) and not sn_on_black_list(physerialnum): logging.info('PID not on blacklist: %s' % pid) if phydescr == "": phydescr = 'requested' - physerialnum = physerialnum.split()[0].upper() - # check if PID on bad list, if so try serial number if pid_on_bad_list(pid) or always_use_serial: logging.info('PID on bad list: %s' % pid) @@ -198,6 +179,7 @@ def inv_cisco_eox(info, params): pids.append(pid) logging.info('PID not on bad list: %s' % pid) + # create default node entry for PID/SN node.append({ "serial_number" : physerialnum, "pid" : pid, @@ -216,7 +198,7 @@ def inv_cisco_eox(info, params): # find pid in PID-EOX-known if os.path.isfile(path_found_pid + pidfile): logging.info("PID known: %s" % pid) - pidseox.append(create_eox_record(path_found_pid + pidfile)) + pidseox.append(create_eox_record(path_found_pid + pidfile, optionalcolumns)) logging.info("EOX Record: %s" % pidseox) # find pid in PID-EOX-unknown elif os.path.isfile(path_not_found_pid + pidfile): @@ -244,7 +226,7 @@ def inv_cisco_eox(info, params): # find serial in SER-EOX-known if os.path.isfile(path_found_ser + serial): logging.info("Serialnumber known: %s" % serial) - serialseox.append(create_eox_record(path_found_ser + serial)) + serialseox.append(create_eox_record(path_found_ser + serial, optionalcolumns)) logging.info("Serialnumber Record: %s" % serialseox) # find serial in SER-EOX-unknown elif os.path.isfile(path_not_found_ser + serial): @@ -269,6 +251,7 @@ def inv_cisco_eox(info, params): logging.info("PID EoX : %s" % pidseox) logging.info("Serials EoX : %s" % serialseox) + # update default entrys with data for i in node: # add EoX data by pid for pid in pidseox: @@ -278,12 +261,6 @@ def inv_cisco_eox(info, params): for serial in serialseox: if i.get('serial_number') == serial.get('serial_number'): i.update(serial) - # remove optional columns - logging.info('remove columns: %s' % optionalcolumns) - if optionalcolumns is not None: - for column in optionalcolumns: - logging.info('remove column: %s' % column) - i.pop(column, None) # create and write back api status, will be used for active check cisco_api_status apistatus = {} diff --git a/inventory/snmp_cisco_suggestion b/inventory/snmp_cisco_suggestion index 88bcfba..45fd11b 100644 --- a/inventory/snmp_cisco_suggestion +++ b/inventory/snmp_cisco_suggestion @@ -69,8 +69,8 @@ def create_suggested_record(pidfile, optionalcolumns): for product in cleanrecord: for suggestion in product.get('suggestion'): for key in suggestion.keys(): - temp_value = suggestion.get(key) - if (temp_value is None) or (temp_value == '') or (key in optionalcolumns): + temp_value = suggestion.get(key, '') + if temp_value == '' or key in optionalcolumns: suggestion.pop(key) # move content from 'suggestion'.'product'.'suggestion' one stage up into 'suggestion'.'product' @@ -257,12 +257,12 @@ def inv_cisco_suggestion(info, params): for product in suggestions: if i.get('pid') == product.get('pid'): i.update(product) - # remove optional columns - logging.debug('remove columns: %s' % optionalcolumns) - if optionalcolumns is not None: - for column in optionalcolumns: - logging.debug('remove column: %s' % column) - i.pop(column, None) + # remove optional columns (already done by create_suggested_record) + #logging.debug('remove columns: %s' % optionalcolumns) + #if optionalcolumns is not None: + # for column in optionalcolumns: + # logging.debug('remove column: %s' % column) + # i.pop(column, None) # create and write back api status, will be used for active checks apistatus = {} diff --git a/lib/nagios/plugins/cisco_api_status b/lib/nagios/plugins/cisco_api_status index b5323bb..a95e1d6 100755 --- a/lib/nagios/plugins/cisco_api_status +++ b/lib/nagios/plugins/cisco_api_status @@ -1,14 +1,12 @@ #!/usr/bin/python # encoding: utf-8 -# Monitor Cisco API plugins for CheckMK -# Author: thl-cmk[al]outlook[dot]com -# -# -# 15.03.2020: changed getopt to argparse + + import os -import argparse +import sys +import getopt import ConfigParser import json from datetime import datetime @@ -16,6 +14,61 @@ import logging import sys +def bail_out(reason): + # set logg modul name <file>:<module>.<function> + logger = logging.getLogger(__file__ + ':' + __name__ + '.' + sys._getframe().f_code.co_name) + + sys.stderr.write("FATAL ERROR: %s\n" % reason) + sys.exit(3) + + +def usage(): + # set logg modul name <file>:<module>.<function> + logger = logging.getLogger(__file__ + ':' + __name__ + '.' + sys._getframe().f_code.co_name) + + print """cisco_api_atatus [options] TARGET + +Check status of Cisco APIs for TARGET. TARGET is the hostname used by Check_MK. + +Other options: + + PSIRT options + --psirt-crit-severity <severity> if new/updated advisory equal or above severity set outcome to critical + --psirt-crit-days <days> set outcome to critical is new/updated advisory not older then days + --psirt-warn-severity <severity> if new/updated advisory equal or above severity set outcome to warning + --psirt-warn-days <days> set outcome to warning is new/updated advisory not older then days + --psirt-not-active <status> set outcome to status if PSIRT API is not active + + --psirt-crit-days should be less then --psirt-warn-days + --psirt-warn-severity should be less then --psirt-crit-severity + + EoX options + --eox-crit-new <days> set outcome to critical if new announcement not older then days + --eox-warn-new <days> set outcome to warning if new announcement not older then days + --eox-crit-change <days> set outcome to critical if announcement is about to change in lees then days + --eox-warn-change <days> set outcome to warning if announcement is about to change in lees then days + --eox-not-active <status> set outcome to status if EoX API is not active + + sn2info (contract) options + --sn2info-crit-change <days> set outcome to critical if contract is about to change in lees then days + --sn2info-warn-change <days> set outcome to warning if contract is about to change in lees then days + --sn2info-not-active <status> set outcome to status if sn2info API is not active + + suggestion options + --suggestion-not-active <status> set outcome to status if suggestion API is not active + + + <severity> is one of : 1 (Critical), 2 (High), 3 (Medium), 4 (Low), 0 (All) + <days> : >= 1 + <status> is one of : 0 (Ok), 1 (Warning), 2 (Critical) + + + -h, --help show this help and exit + --debug show Python exceptions verbosely + +""" + + # check if dir exists, if not try to create it. # return True if dir exists or creation was ok. # return False if dir not exists and creation was not ok @@ -47,7 +100,7 @@ def expand_path(path): return path -def check_eox_status(apistatus, options, cmd_args): +def check_eox_status(apistatus, options): # set logg modul name <file>:<module>.<function> logger = logging.getLogger(__file__ + ':' + __name__ + '.' + sys._getframe().f_code.co_name) @@ -59,10 +112,10 @@ def check_eox_status(apistatus, options, cmd_args): lastrun = apistatus.get('lastrun') refresh_known = options.get('refresh_known', 31) refresh_unknown = options.get('refresh_unknown', 7) - crit_new = cmd_args.eox_crit_new - warn_new = cmd_args.eox_warn_new - crit_change = cmd_args.eox_crit_change - warn_change = cmd_args.eox_warn_change + crit_new = options.get('crit-new', 0) + warn_new = options.get('warn-new', 0) + crit_change = options.get('crit-change', 0) + warn_change = options.get('warn-change', 0) for entry in lastrun: last_checked = entry.get('Last_checked') @@ -89,7 +142,7 @@ def check_eox_status(apistatus, options, cmd_args): # check if date is about to change for key in entry.keys(): - if key in EoL_dates and entry.get(key) != '': + if key in EoL_dates: change_days = (datetime.strptime(entry.get(key), '%Y-%m-%d').date() - datetime.now().date()).days change_text = EoL_dates_desc.get(key, 'key not found') if ((change_days < crit_change) or (change_days < warn_change)) and (change_days >= 0): @@ -136,7 +189,7 @@ def check_eox_status(apistatus, options, cmd_args): return output, long_output, status -def check_psirt_status(apistatus, options, cmd_args): +def check_psirt_status(apistatus, options): # set logg modul name <file>:<module>.<function> logger = logging.getLogger(__file__ + ':' + __name__ + '.' + sys._getframe().f_code.co_name) @@ -159,10 +212,10 @@ def check_psirt_status(apistatus, options, cmd_args): refresh_found = options.get('refresh_found', 1) refresh_notfound = options.get('refresh_notfound', 1) - warn_days = cmd_args.psirt_warn_days - crit_days = cmd_args.psirt_crit_days - warn_severity = cmd_args.psirt_warn_severity - crit_severity = cmd_args.psirt_crit_severity + warn_days = options.get('warn-days') + crit_days = options.get('crit-days') + warn_severity = options.get('warn-severity', 0) + crit_severity = options.get('crit-severity', 0) if (psirt_status == 'found') and (last_refresh > refresh_found): max_refresh_known = last_refresh @@ -201,7 +254,7 @@ def check_psirt_status(apistatus, options, cmd_args): return output, long_output, status -def check_sn2info_status(apistatus, options, cmd_args): +def check_sn2info_status(apistatus, options): # set logg modul name <file>:<module>.<function> logger = logging.getLogger(__file__ + ':' + __name__ + '.' + sys._getframe().f_code.co_name) @@ -214,8 +267,8 @@ def check_sn2info_status(apistatus, options, cmd_args): refresh_covered = options.get('refresh_covered', 31) refresh_notcovered = options.get('refresh_notcovered', 7) - crit_change = cmd_args.sn2info_crit_change - warn_change = cmd_args.sn2info_warn_change + crit_change = options.get('crit-change', 0) + warn_change = options.get('warn-change', 0) for entry in lastrun: last_checked = entry.get('Last_checked') @@ -269,7 +322,7 @@ def check_sn2info_status(apistatus, options, cmd_args): return output, long_output, status -def check_suggestion_status(apistatus, options, cmd_args): +def check_suggestion_status(apistatus, options): # set logg modul name <file>:<module>.<function> logger = logging.getLogger(__file__ + ':' + __name__ + '.' + sys._getframe().f_code.co_name) @@ -324,6 +377,7 @@ def main(): output = '' long_output = '' apistatus = {} + target = '' loglevel = 'warning' @@ -367,29 +421,79 @@ def main(): os.unsetenv("LANG") - parser = argparse.ArgumentParser() - parser.add_argument('TARGET', type=str, help='Host to check (exact name form CheckMK)') - parser.add_argument('--psirt-crit-days', type=int, default=0, help='set check status to critical if new/updated advisory not older then days, should be less then --psirt-warn-days') - parser.add_argument('--psirt-warn-days', type=int, default=0, help='set check status to warning if new/updated advisory not older then days') - parser.add_argument('--psirt-crit-severity', type=int, default=0, choices=[0, 1, 2, 3, 4], help='if new/updated advisory equal or above severity {All, Critical, High, Medium, Low} set check status to critical') - parser.add_argument('--psirt-warn-severity', type=int, default=0, choices=[0, 1, 2, 3, 4], help='if new/updated advisory equal or above severity {All, Critical, High, Medium, Low} set check status to warning, should be less then --psirt-crit-severity') - parser.add_argument('--psirt-not-active', type=int, choices=[0, 1, 2], help='set check status to {Ok, Warn, Crit} if PSIRT API is not active') - parser.add_argument('--eox-crit-new', type=int, default=0, help='set check status to critical if new announcement not older then days') - parser.add_argument('--eox-warn-new', type=int, default=0, help='set check status to warning if new announcement not older then days') - parser.add_argument('--eox-crit-change', type=int, default=0, help='set check status to critical if announcement is about to change in lees then days') - parser.add_argument('--eox-warn-change', type=int, default=0, help='set check status to warning if announcement is about to change in lees then days') - parser.add_argument('--eox-not-active', type=int, choices=[0, 1, 2], help='set check status to {Ok, Warn, Crit} if EoX API is not active') - parser.add_argument('--sn2info-crit-change', type=int, default=0, help='set check status to critical if contract is about to change in lees then days') - parser.add_argument('--sn2info-warn-change', type=int, default=0, help='set check status to warning if contract is about to change in lees then days') - parser.add_argument('--sn2info-not-active', type=int, choices=[0, 1, 2], help='set check status to {Ok, Warn, Crit} if sn2info API is not active') - parser.add_argument('--suggestion-not-active', type=int, choices=[0, 1, 2], help='set check status to {Ok, Warn, Crit} if suggestion API is not active') - - parser.parse_args() - cmd_args = parser.parse_args() - # print 'cmd_args: {}'.format(cmd_args) - - target = cmd_args.TARGET - not_active = [] + # short_options = "hw:W:c:C:nTI" + short_options = 'h' + long_options = ['help', 'debug', + 'psirt-crit-severity=', 'psirt-crit-days=', 'psirt-warn-severity=', 'psirt-warn-days=', 'psirt-not-active=', + 'eox-not-active=', 'eox-crit-new=', 'eox-warn-new=', 'eox-crit-change=', 'eox-warn-change=', + 'sn2info-not-active=', 'sn2info-crit-change=', 'sn2info-warn-change=', + 'suggestion-not-active=', + ] + + try: + opts, args = getopt.getopt(sys.argv[1:], short_options, long_options) + + # first parse modifers + # for o, a in opts: + # if o in [ '-v', '--verbose' ]: + # opt_verbose += 1 + # elif o in [ '-d', '--debug' ]: + # opt_debug = True + # elif o in [ '-w', '-W', '-c', '-C' ]: + # routes.append((o[1], a)) + # elif o == '-n': + # opt_nodns = True + # elif o in [ '-T', '-I' ]: + # opt_method = o + + # now handle action options + for o, a in opts: + if o in ['--psirt-crit-severity']: + opt_psirt.update({'crit-severity': int(a)}) + if o in ['--psirt-warn-severity']: + opt_psirt.update({'warn-severity': int(a)}) + if o in ['--psirt-crit-days']: + if int(a) > 0: + opt_psirt.update({'crit-days': int(a)}) + if o in ['--psirt-warn-days']: + if int(a) > 0: + opt_psirt.update({'warn-days': int(a)}) + if o in ['--psirt-not-active']: + opt_psirt.update({'not-active': int(a)}) + + if o in ['--eox-not-active']: + opt_eox.update({'not-active': int(a)}) + if o in ['--eox-crit-new']: + opt_eox.update({'crit-new': int(a)}) + if o in ['--eox-warn-new']: + opt_eox.update({'warn-new': int(a)}) + if o in ['--eox-crit-change']: + opt_eox.update({'crit-change': int(a)}) + if o in ['--eox-warn-change']: + opt_eox.update({'warn-change': int(a)}) + + if o in ['--sn2info-not-active']: + opt_sn2info.update({'not-active': int(a)}) + if o in ['--sn2info-crit-change']: + opt_sn2info.update({'crit-change': int(a)}) + if o in ['--sn2info-warn-change']: + opt_sn2info.update({'warn-change': int(a)}) + + if o in ['--suggestion-not-active']: + opt_suggestion.update({'not-active': int(a)}) + + if o in ['-h', '--help']: + usage() + sys.exit(0) + + if len(args) < 1: + bail_out("Please specify the target.") + + target = args[0] + + + except Exception, e: + bail_out(e) eox_output = '' eox_long_output = '' @@ -411,16 +515,16 @@ def main(): output = 'Cisco API active.' with open(ciscoapistatus + target) as f: apistatus = json.load(f) - long_output = 'active API(s) found: ' + ', '.join(apistatus.keys()) + long_output = 'active APIs found: ' + ', '.join(apistatus.keys()) for key in apistatus.keys(): if key == 'eox': - eox_output, eox_long_output, eox_status = check_eox_status(apistatus.get(key), opt_eox, cmd_args) + eox_output, eox_long_output, eox_status = check_eox_status(apistatus.get(key), opt_eox) if key == 'psirt': - psirt_output, psirt_long_output, psirt_status = check_psirt_status(apistatus.get(key), opt_psirt, cmd_args) + psirt_output, psirt_long_output, psirt_status = check_psirt_status(apistatus.get(key), opt_psirt) if key == 'sn2info': - sn2info_output, sn2info_long_output, sn2info_status = check_sn2info_status(apistatus.get(key), opt_sn2info, cmd_args) + sn2info_output, sn2info_long_output, sn2info_status = check_sn2info_status(apistatus.get(key), opt_sn2info) if key == 'suggestion': - suggestion_output, suggestion_long_output, suggestion_status = check_suggestion_status(apistatus.get(key), opt_suggestion, cmd_args) + suggestion_output, suggestion_long_output, suggestion_status = check_suggestion_status(apistatus.get(key), opt_suggestion) long_output += eox_long_output + sn2info_long_output + psirt_long_output + suggestion_long_output + '\n' @@ -434,24 +538,26 @@ def main(): if status > 0: output += ' (see long output for details)' - if cmd_args.psirt_not_active is not None and ('psirt' not in apistatus.keys()): - status = max(status, cmd_args.psirt_not_active) - not_active.append('PSIRT') - - if cmd_args.eox_not_active is not None and ('eox' not in apistatus.keys()): - status = max(status, cmd_args.eox_not_active) - not_active.append('EoX') - - if cmd_args.sn2info_not_active is not None and ('sn2info' not in apistatus.keys()): - status = max(status, cmd_args.sn2info_not_active) - not_active.append('SN2INFO') - - if cmd_args.suggestion_not_active is not None and ('suggestion' not in apistatus.keys()): - status = max(status, cmd_args.suggestion_not_active) - not_active.append('SUGGESTION') - - if len(not_active) > 0: - output += ' Not active API(s): {}'.format(', '.join(not_active)) + if opt_psirt.get('not-active') and ('psirt' not in apistatus.keys()): + if status <= opt_psirt.get('not-active'): + status = opt_psirt.get('not-active') + output += ' PSIRT API not active.' + + if opt_eox.get('not-active') and ('eox' not in apistatus.keys()): + if status <= opt_eox.get('not-active'): + status = opt_eox.get('not-active') + output += ' EoX API not active.' + + if opt_sn2info.get('not-active') and ('sn2info' not in apistatus.keys()): + if status <= opt_sn2info.get('not-active'): + status = opt_sn2info.get('not-active') + output += ' SN2INFO API not active.' + + if opt_suggestion.get('not-active') and ('suggestion' not in apistatus.keys()): + if status <= opt_suggestion.get('not-active'): + status = opt_suggestion.get('not-active') + output += ' SUGGESTION API not active.' + else: output = 'Cisco API not active(!)' status = max(1, status) diff --git a/packages/inv_cisco_support b/packages/inv_cisco_support index 9ecfc02..64bf31c 100644 --- a/packages/inv_cisco_support +++ b/packages/inv_cisco_support @@ -30,4 +30,4 @@ 'title': u'Inventory for Cisco Bug, EoX, contract status, PSIRT advisories and suggested software', 'version': '20190830.v0.0.11', 'version.min_required': '1.4.0p1', - 'version.packaged': '1.6.0p8'} \ No newline at end of file + 'version.packaged': '1.4.0p38'} \ No newline at end of file diff --git a/web/plugins/views/inv_cisco_support.py b/web/plugins/views/inv_cisco_support.py index e078246..eca23a4 100644 --- a/web/plugins/views/inv_cisco_support.py +++ b/web/plugins/views/inv_cisco_support.py @@ -10,62 +10,380 @@ # (https://bst.cloudapps.cisco.com/bugsearch/bug/CSCuh91645) # +import random + + +def inv_paint_date_status(date_string): + + warn_days = -90 + crit_days = -30 + + # check if date_sting not None, if so return no CSS Class and None + if date_string is None: + return '', '' + + try: + days = int((time.time() - time.mktime(time.strptime(date_string, '%Y-%m-%d'))) / 86400) + except ValueError: + return '', date_string + + if days > crit_days: + css_class = 'date_crit' + elif days > warn_days: + css_class = 'date_warn' + else: + css_class = 'date_default' + + return css_class, '%s' % date_string + + +def inv_paint_last_checked_status(date_string): + + warn_days = 32 + crit_days = 40 + + # check if date_sting not None, if so return no CSS Class and None + if date_string is None: + return '', '' + + # check if _date_string in the right format, if not return CSS Class and date_string + try: + days = int((time.time() - time.mktime(time.strptime(date_string, '%Y-%m-%d'))) / 86400) + except ValueError: + return '', date_string + + # last_checked is ok + if days <= warn_days: + css_class = '' + # no refresh for far to long + elif days >= crit_days: + css_class = 'date_crit' + # no refresh for to long + else: + css_class = 'date_warn' + # css_class = '' + return css_class, ' %s' % date_string + + +def inv_paint_psirt_advisoryId(advisoryId): + psirt_url = '<a class="href_blue" target="_blank" href="https://tools.cisco.com/security/center/content/CiscoSecurityAdvisory/%s">%s</a>' % (advisoryId, advisoryId) + return '', psirt_url + + +def inv_paint_eox_eolid(eolid): + if eolid is not None: + search_eolid_url = '<a class="href_blue" target="_blank" href="https://search.cisco.com/search?query=%s">%s</a>' % (eolid, eolid) + else: + search_eolid_url = '' + return '', search_eolid_url + + +def render_inv_dicttable_suggestion_noqf(hostname, tree_id, invpath, node): + # In delta mode node is a pair of (old_items, new_items) + if type(node) == tuple: + html.write(_("Removed entries") + ":") + html.write("<span class=invold>") + render_inv_dicttable_suggestion_noqf(hostname, tree_id, invpath, node[0]) + html.write("</span>") + + html.write(_("New entries") + ":") + html.write("<span class=invnew>") + render_inv_dicttable_suggestion_noqf(hostname, tree_id, invpath, node[1]) + html.write("</span>") + return + + hint = inv_display_hint(invpath) + keyorder = hint.get("keyorder", []) # well known keys + + # Add titles for those keys + titles = [] + for key in keyorder: + invpath_sub = invpath + "0." + key + icon, title = inv_titleinfo(invpath_sub, None) + sub_hint = inv_display_hint(invpath_sub) + short_title = sub_hint.get("short", title) + titles.append((short_title, key)) + + # Determine *all* keys, in order to find unknown ones + keys = set([]) + for entry in node: + keys.update(entry.keys()) + + # Order not well-known keys alphabetically + extratitles = [] + for key in keys: + if key not in keyorder: + icon, title = inv_titleinfo(invpath + "0." + key, None) + extratitles.append((title, key)) + extratitles.sort() + titles += extratitles + + # Link to Multisite view with exactly this table + if "view" in hint: + url = html.makeuri_contextless([ + ("view_name", hint["view"] ), + ("host", hostname)], + filename="view.py") + html.write('<div class=invtablelink><a href="%s">%s</a></div>' % + (url, _("Open this table for filtering / sorting"))) + + # We cannot use table here, since html.plug() does not work recursively + html.write('<table class=data>') + html.write('<tr>') + for title, key in titles: + html.write('<th>%s</th>' % title) + html.write('</tr>') + + for nr, entry in enumerate(node): + html.write('<tr class=even0>') + for title, key in titles: + value = entry.get(key) + invpath_sub = invpath + "%d.%s" % (nr, key) + if type(value) == dict: + invpath_sub += "." + elif type(value) == list or (type(value) == tuple and type(value[0]) == list): + invpath_sub += ":" + + hint = inv_display_hint(invpath_sub) + if "paint_function" in hint: + td_class, text = hint["paint_function"](value) + classtext = ' class="%s"' % td_class + else: + classtext = "" + + html.write('<td%s>' % classtext) +# render_inv_subtree(hostname, tree_id, invpath_sub, value) + # render suggestions as not foldable + if key == 'suggestion' and type(value) == list: + render_inv_subtree_container(hostname, tree_id, invpath_sub, value) + else: + render_inv_subtree(hostname, tree_id, invpath_sub, value) + html.write('</td>') + html.write('</tr>') + html.write('</table>') + + +def render_inv_dicttable_suggestion(hostname, tree_id, invpath, node): + # In delta mode node is a pair of (old_items, new_items) + if type(node) == tuple: + html.write(_("Removed entries") + ":") + html.write("<span class=invold>") + render_inv_dicttable_suggestion(hostname, tree_id, invpath, node[0]) + html.write("</span>") + + html.write(_("New entries") + ":") + html.write("<span class=invnew>") + render_inv_dicttable_suggestion(hostname, tree_id, invpath, node[1]) + html.write("</span>") + return + + hint = inv_display_hint(invpath) + keyorder = hint.get("keyorder", []) # well known keys + + # Add titles for those keys + titles = [] + for key in keyorder: + invpath_sub = invpath + "0." + key + icon, title = inv_titleinfo(invpath_sub, None) + sub_hint = inv_display_hint(invpath_sub) + short_title = sub_hint.get("short", title) + titles.append((short_title, key)) + + # Determine *all* keys, in order to find unknown ones + keys = set([]) + for entry in node: + keys.update(entry.keys()) + + # Order not well-known keys alphabetically + extratitles = [] + for key in keys: + if key not in keyorder: + icon, title = inv_titleinfo(invpath + "0." + key, None) + extratitles.append((title, key)) + extratitles.sort() + titles += extratitles + + # Link to Multisite view with exactly this table + if "view" in hint: + url = html.makeuri_contextless([ + ("view_name", hint["view"] ), + ("host", hostname)], + filename="view.py") + html.write('<div class=invtablelink><a href="%s">%s</a></div>' % + (url, _("Open this table for filtering / sorting"))) + + # + # Th.L.: insert jscript for quickfilter + # + qfurl = html.makeuri([],filename="TableFilter/tablefilter.js", delvars=["host","selection","site","view_name"]) + html.write('<script language="javascript" type="text/javascript" src="%s"></script>' % qfurl) + + # Th.L.: create random table id + qf_table_id = "qf_id_" + "".join(random.SystemRandom().choice('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789') for _ in range(10)) + + # We cannot use table here, since html.plug() does not work recursively + # html.write('<table class=data>') + html.write('<table id=%s class=data>' % qf_table_id) + # html.write('<tr>') + html.write('<thead><tr>') # Th.L.: added thead for quickfilter (sort) + for title, key in titles: + html.write('<th>%s</th>' % title) + #html.write('</tr>') + html.write('</tr></thead><tbody>') # Th.L.: added thead and tbody for quickfilter (sort) + + for nr, entry in enumerate(node): + html.write('<tr class=even0>') + for title, key in titles: + value = entry.get(key) + invpath_sub = invpath + "%d.%s" % (nr, key) + if type(value) == dict: + invpath_sub += "." + elif type(value) == list or (type(value) == tuple and type(value[0]) == list): + invpath_sub += ":" + + hint = inv_display_hint(invpath_sub) + if "paint_function" in hint: + td_class, text = hint["paint_function"](value) + classtext = ' class="%s"' % td_class + else: + classtext = "" + + html.write('<td%s>' % classtext) +# render_inv_subtree(hostname, tree_id, invpath_sub, value) + # render suggestions as not foldable + if key == 'suggestion' and type(value) == list: + render_inv_subtree_container(hostname, tree_id, invpath_sub, value) + else: + render_inv_subtree(hostname, tree_id, invpath_sub, value) + html.write('</td>') + html.write('</tr>') + #html.write('</table>') + html.write('</tbody></table>') # Th.L.: added tbody for quickfilter (sort) + + # + # Th.L.: add jscript for quickfilter + # + html.write('<script data-config>\n') + html.write(' var filtersConfig = {\n') + html.write(' base_path: "TableFilter/",\n') + html.write(' alternate_rows: true,\n') + html.write(' rows_counter: true,\n') + html.write(' btn_reset: true,\n') + html.write(' bnt_reset_text: "Clear all",\n') + html.write(' loader: true,\n') + html.write(' status_bar: true,\n') + html.write(' status_bar_text : "status:",\n') + html.write(' loader : true,\n') + html.write(' mark_active_columns: true,\n') + html.write(' highlight_keywords: true,\n') + html.write(' auto_filter: true,\n') + html.write(' auto_filter_delay: 100,\n') + html.write(' paging: true,\n') + html.write(' mark_active_columns: true,\n') + html.write(' results_per_page: [" Results per page",[10,25,50,100,250,500,1000]],\n') + html.write(' no_results_message: true,\n') + html.write(' extensions:[{ name: "sort"},\n') + html.write(' { name: "colsVisibility",\n') + html.write(' tick_to_hide: false,\n') + html.write(' at_start: [11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65],\n') + html.write(' text: "Displayed columns: ",\n') + html.write(' enable_tick_all: true,\n') + html.write(' btn_html: "<button>Columns manager ▼</button>",\n') + html.write(' btn_close_html: "<button>Close</button>",\n') + html.write(' enable_hover: false,\n') + html.write(' },\n') +# html.write(' {name: "filtersVisibility"} + html.write(' ]\n') + html.write(' };\n') + html.write('\n') + html.write(' var tf = new TableFilter("%s", filtersConfig);\n' % qf_table_id) + html.write(' tf.init();\n') + html.write('\n') + html.write('</script>\n') + + +def inv_paint_bug_status(bug_status): + _bug_status = { + 'F': 'Fixed', + 'O': 'Open', + 'T': 'Terminated' + } + return '', _bug_status.get(bug_status, bug_status) + + +def inv_paint_bug_behavior_changed(behavior_changed): + _behavior_changed = { + 'Y': 'yes', + 'N': 'no', + } + return '', _behavior_changed.get(behavior_changed, behavior_changed) + + +def inv_paint_bug_bugid(bugid): + if bugid is not None: + search_bugid_url = '<a class="href_blue" target="_blank" href="https://bst.cloudapps.cisco.com/bugsearch/bug/%s">%s</a>' % (bugid, bugid) + else: + search_eolid_url = '' + return '', search_bugid_url + inventory_displayhints.update({ # EoX display hints - '.hardware.system.support.cisco_eox:': {'title': _('Cisco EoX status'), + '.hardware.support.cisco_eox:': {'title': _('Cisco EoX status'), + 'render': render_inv_dicttable, 'keyorder': ['pid', 'serial_number', 'ProductIDDescription', 'Last_checked', 'EOXExternalAnnouncementDate', 'EndOfSaleDate', 'LastDateOfSupport', 'EndOfSvcAttachDate', 'UpdatedTimeStamp', 'ProductBulletinNumber', ], -# 'view': 'invciscoeox_of_host', + 'view': 'invciscoeox_of_host', }, - '.hardware.system.support.cisco_eox:*.pid': {'title': _('PID (EoX)') }, - '.hardware.system.support.cisco_eox:*.serial_number': {'title': _('Serial number') }, - '.hardware.system.support.cisco_eox:*.ProductIDDescription': {'title': _('Description'), }, - '.hardware.system.support.cisco_eox:*.EOXExternalAnnouncementDate': {'title': _('EOL Announcement') }, - '.hardware.system.support.cisco_eox:*.EndOfSaleDate': {'title': _('End of sale') }, - '.hardware.system.support.cisco_eox:*.EndOfSvcAttachDate': {'title': _('End of service attachment') }, - '.hardware.system.support.cisco_eox:*.LastDateOfSupport': {'title': _('End of support') }, - '.hardware.system.support.cisco_eox:*.ProductBulletinNumber': {'title': _('EOL bulletin ID') }, - '.hardware.system.support.cisco_eox:*.LinkToProductBulletinURL': {'title': _('EOL bulletin URL') }, - '.hardware.system.support.cisco_eox:*.UpdatedTimeStamp': {'title': _('EOL bulletin last update') }, - '.hardware.system.support.cisco_eox:*.EndOfSecurityVulSupportDate': {'title': _('End of service vulnerability support') }, - '.hardware.system.support.cisco_eox:*.EndOfSWMaintenanceReleases': {'title': _('End of software maintenace releases') }, - '.hardware.system.support.cisco_eox:*.EndOfRoutineFailureAnalysisDate': {'title': _('End of routine failure analysis') }, - '.hardware.system.support.cisco_eox:*.MigrationProductId': {'title': _('Migration PID') }, - '.hardware.system.support.cisco_eox:*.MigrationInformation': {'title': _('Migration information') }, - '.hardware.system.support.cisco_eox:*.MigrationProductInfoURL': {'title': _('Migration PID URL') }, - '.hardware.system.support.cisco_eox:*.MigrationProductName': {'title': _('Migration product name') }, - '.hardware.system.support.cisco_eox:*.Last_checked': {'title': _('Last checked') }, + '.hardware.support.cisco_eox:*.pid': {'title': _('PID (EoX)'), }, + '.hardware.support.cisco_eox:*.serial_number': {'title': _('Serial number'), }, + '.hardware.support.cisco_eox:*.ProductIDDescription': {'title': _('Description'), }, + '.hardware.support.cisco_eox:*.EOXExternalAnnouncementDate': {'title': _('EOL Announcement'), 'paint': 'date_status', 'filter': visuals.FilterInvtableText, }, + '.hardware.support.cisco_eox:*.EndOfSaleDate': {'title': _('End of sale'), 'paint': 'date_status', 'filter': visuals.FilterInvtableText, }, + '.hardware.support.cisco_eox:*.EndOfSvcAttachDate': {'title': _('End of service attachment'), 'paint': 'date_status', 'filter': visuals.FilterInvtableText, }, + '.hardware.support.cisco_eox:*.LastDateOfSupport': {'title': _('End of support'), 'paint': 'date_status', 'filter': visuals.FilterInvtableText, }, + '.hardware.support.cisco_eox:*.ProductBulletinNumber': {'title': _('EOL bulletin ID'), 'paint': 'eox_eolid', 'filter': visuals.FilterInvtableText, }, + '.hardware.support.cisco_eox:*.LinkToProductBulletinURL': {'title': _('EOL bulletin URL'), }, + '.hardware.support.cisco_eox:*.UpdatedTimeStamp': {'title': _('EOL bulletin last update'), }, + '.hardware.support.cisco_eox:*.EndOfSecurityVulSupportDate': {'title': _('End of service vulnerability support'), 'paint': 'date_status', 'filter': visuals.FilterInvtableText, }, + '.hardware.support.cisco_eox:*.EndOfSWMaintenanceReleases': {'title': _('End of software maintenace releases'), 'paint': 'date_status', 'filter': visuals.FilterInvtableText, }, + '.hardware.support.cisco_eox:*.EndOfRoutineFailureAnalysisDate': {'title': _('End of routine failure analysis'), 'paint': 'date_status', 'filter': visuals.FilterInvtableText, }, + '.hardware.support.cisco_eox:*.MigrationProductId': {'title': _('Migration PID'), }, + '.hardware.support.cisco_eox:*.MigrationInformation': {'title': _('Migration information'), }, + '.hardware.support.cisco_eox:*.MigrationProductInfoURL': {'title': _('Migration PID URL'), }, + '.hardware.support.cisco_eox:*.MigrationProductName': {'title': _('Migration product name'), }, + '.hardware.support.cisco_eox:*.Last_checked': {'title': _('Last checked'), 'paint': 'last_checked_status', 'filter': visuals.FilterInvtableText, }, # SN2Info (contract) display hints - '.hardware.system.support.cisco_contract:': {'title': _('Cisco contract status'), + '.hardware.support.cisco_contract:': {'title': _('Cisco contract status'), + 'render': render_inv_dicttable, 'keyorder': ['pid', 'serial_number', 'ProductIDDescription', 'Last_checked', 'is_covered', 'service_contract_number', 'covered_product_line_end_date', ], -# 'view': 'invciscocontract_of_host', + 'view': 'invciscocontract_of_host', }, - '.hardware.system.support.cisco_contract:*.pid': {'title': _('PID (contract)'), }, - '.hardware.system.support.cisco_contract:*.serial_number': {'title': _('Serial number'), }, - '.hardware.system.support.cisco_contract:*.ProductIDDescription': {'title': _('Description'), }, - '.hardware.system.support.cisco_contract:*.Last_checked': {'title': _('Last checked'),}, - '.hardware.system.support.cisco_contract:*.is_covered': {'title': _('is covered'), }, - '.hardware.system.support.cisco_contract:*.contract_site_customer_name': {'title': _('Customer name'), }, - '.hardware.system.support.cisco_contract:*.contract_site_address1': {'title': _('Address'), }, - '.hardware.system.support.cisco_contract:*.contract_site_city': {'title': _('City'), }, - '.hardware.system.support.cisco_contract:*.contract_site_state_province': {'title': _('State/Province'), }, - '.hardware.system.support.cisco_contract:*.contract_site_country': {'title': _('Country'), }, - '.hardware.system.support.cisco_contract:*.service_line_descr': {'title': _('Service description'), }, - '.hardware.system.support.cisco_contract:*.service_contract_number': {'title': _('Contract number'), }, - '.hardware.system.support.cisco_contract:*.covered_product_line_end_date': {'title': _('Contract end date'),}, - '.hardware.system.support.cisco_contract:*.parent_sr_no': {'title': _('Parent S/N'), }, - '.hardware.system.support.cisco_contract:*.warranty_type': {'title': _('Warranty type'), }, - '.hardware.system.support.cisco_contract:*.warranty_type_description': {'title': _('Warranty Description'), }, - '.hardware.system.support.cisco_contract:*.warranty_end_date': {'title': _('Warranty end date'), }, + '.hardware.support.cisco_contract:*.pid': {'title': _('PID (contract)'), }, + '.hardware.support.cisco_contract:*.serial_number': {'title': _('Serial number'), }, + '.hardware.support.cisco_contract:*.ProductIDDescription': {'title': _('Description'), }, + '.hardware.support.cisco_contract:*.Last_checked': {'title': _('Last checked'), 'paint': 'last_checked_status', 'filter': visuals.FilterInvtableText,}, + '.hardware.support.cisco_contract:*.is_covered': {'title': _('is covered'), }, + '.hardware.support.cisco_contract:*.contract_site_customer_name': {'title': _('Customer name'), }, + '.hardware.support.cisco_contract:*.contract_site_address1': {'title': _('Address'), }, + '.hardware.support.cisco_contract:*.contract_site_city': {'title': _('City'), }, + '.hardware.support.cisco_contract:*.contract_site_state_province': {'title': _('State/Province'), }, + '.hardware.support.cisco_contract:*.contract_site_country': {'title': _('Country'), }, + '.hardware.support.cisco_contract:*.service_line_descr': {'title': _('Service description'), }, + '.hardware.support.cisco_contract:*.service_contract_number': {'title': _('Contract number'), }, + '.hardware.support.cisco_contract:*.covered_product_line_end_date': {'title': _('Contract end date'), 'paint': 'date_status', 'filter': visuals.FilterInvtableText,}, + '.hardware.support.cisco_contract:*.parent_sr_no': {'title': _('Parent S/N'), }, + '.hardware.support.cisco_contract:*.warranty_type': {'title': _('Warranty type'), }, + '.hardware.support.cisco_contract:*.warranty_type_description': {'title': _('Warranty Description'), }, + '.hardware.support.cisco_contract:*.warranty_end_date': {'title': _('Warranty end date'), }, # BUG display hints @@ -75,19 +393,20 @@ inventory_displayhints.update({ '.software.support.cisco_bug.PID': {'title': _('PID'), }, '.software.support.cisco_bug.os_version': {'title': _('OS version'), }, '.software.support.cisco_bug.bugs:': {'title': _('Cisco BUG IDs'), + 'render': render_inv_dicttable, 'keyorder': ['bug_id', 'last_modified_date', 'headline', 'severity', 'status', 'support_case_count', 'behavior_changed', ], -# 'view': 'invciscobugs_of_host', + 'view': 'invciscobugs_of_host', }, - '.software.support.cisco_bug.bugs:*.status': {'title': _('Status'), }, + '.software.support.cisco_bug.bugs:*.status': {'title': _('Status'), 'paint': 'bug_status', 'filter': visuals.FilterInvtableText, }, '.software.support.cisco_bug.bugs:*.product': {'title': _('Product'), }, '.software.support.cisco_bug.bugs:*.description': {'title': _('Description'), }, '.software.support.cisco_bug.bugs:*.headline': {'title': _('Headline'), }, '.software.support.cisco_bug.bugs:*.support_case_count': {'title': _('Support case count'), }, '.software.support.cisco_bug.bugs:*.last_modified_date': {'title': _('Last modified date'), }, - '.software.support.cisco_bug.bugs:*.behavior_changed': {'title': _('Behavior changed'), }, - '.software.support.cisco_bug.bugs:*.bug_id': {'title': _('Bug ID'), }, + '.software.support.cisco_bug.bugs:*.behavior_changed': {'title': _('Behavior changed'), 'paint': 'bug_behavior_changed', 'filter': visuals.FilterInvtableText, }, + '.software.support.cisco_bug.bugs:*.bug_id': {'title': _('Bug ID'), 'paint': 'bug_bugid', }, '.software.support.cisco_bug.bugs:*.base_pid': {'title': _('Base PID'), }, - '.software.support.cisco_bug.bugs:*.known_fixed_releases': {'title': _('Known fixed releases'), }, + '.software.support.cisco_bug.bugs:*.known_fixed_releases': {'title': _('Known fixed releases'), 'filter': visuals.FilterInvtableText, }, '.software.support.cisco_bug.bugs:*.id': {'title': _('ID'), }, '.software.support.cisco_bug.bugs:*.known_affected_releases': {'title': _('known affected releases'), }, '.software.support.cisco_bug.bugs:*.severity': {'title': _('Severity'), }, @@ -98,13 +417,14 @@ inventory_displayhints.update({ '.software.support.cisco_psirt.dont_show_not_updated_since': {'title': _('Don\'t show advisories not updated for X days'), }, '.software.support.cisco_psirt.removed_advisories': {'title': _('Advisories removed'), }, '.software.support.cisco_psirt.advisories:': {'title': _('Cisco PSIRT advisories'), + 'render': render_inv_dicttable, 'keyorder': ['advisoryId', 'sir', 'cvssBaseScore', 'advisoryTitle', ], -# 'view': 'invciscopsirt_of_host', + 'view': 'invciscopsirt_of_host', }, - '.software.support.cisco_psirt.advisories:*.advisoryId': {'title': _('Advisory ID'), }, + '.software.support.cisco_psirt.advisories:*.advisoryId': {'title': _('Advisory ID'), 'paint': 'psirt_advisoryId', 'filter': visuals.FilterInvtableText, }, '.software.support.cisco_psirt.advisories:*.advisoryTitle': {'title': _('Advisory Title'), }, - '.software.support.cisco_psirt.advisories:*.bugIDs': {'title': _('Bug IDs'), }, + '.software.support.cisco_psirt.advisories:*.bugIDs': {'title': _('Bug IDs'), }, # 'paint': 'psirt_bugid', 'filter': visuals.FilterInvtableText, '.software.support.cisco_psirt.advisories:*.cvssBaseScore': {'title': _('CVSS base Score'), }, '.software.support.cisco_psirt.advisories:*.firstFixed': {'title': _('First fixed in'), }, '.software.support.cisco_psirt.advisories:*.firstPublished': {'title': _('First Published'), }, @@ -120,25 +440,26 @@ inventory_displayhints.update({ '.software.support.cisco_psirt.advisories:*.cvrfUrl': {'title': _('CVRF URL'), }, '.software.support.cisco_psirt.advisories:*.ovalUrl': {'title': _('OVAL URL'), }, '.software.support.cisco_psirt.os_version': {'title': _('OS version'), }, - '.software.support.cisco_psirt.Last_checked': {'title': _('Last checked'), }, + '.software.support.cisco_psirt.Last_checked': {'title': _('Last checked'), 'paint': 'last_checked_status', 'filter': visuals.FilterInvtableText,}, '.software.support.cisco_psirt.not_updated_for_x_days': {'title': _('don\'t show advisories not updated for X days'), }, '.software.support.cisco_psirt.dont_show_older_then': {'title': _('don\'t show advisories not updated after'), }, # SUGGESTION display hints '.software.support.cisco_suggestion:': {'title': _('Cisco suggested software'), + 'render': render_inv_dicttable_suggestion, 'keyorder': ['pid', 'ProductIDDescription', 'Last_checked', ], # 'view' : 'invciscosuggestion_of_host', }, '.software.support.cisco_suggestion:*.pid': {'title': _('PID (suggestion)'), }, '.software.support.cisco_suggestion:*.ProductIDDescription': {'title': _('Description'), }, - '.software.support.cisco_suggestion:*.Last_checked': {'title': _('Last checked'), }, + '.software.support.cisco_suggestion:*.Last_checked': {'title': _('Last checked'), 'paint': 'last_checked_status', 'filter': visuals.FilterInvtableText,}, '.software.support.cisco_suggestion:*.suggestion': {'title': _('Suggestion(s)'), }, - '.software.support.cisco_suggestion:*.suggestion:': {'keyorder': ['productName', 'softwareType']}, + '.software.support.cisco_suggestion:*.suggestion:': {'render': render_inv_dicttable_suggestion_noqf, 'keyorder': ['productName', 'softwareType']}, '.software.support.cisco_suggestion:*.suggestion:*.productName': {'title': _('Product name'), }, '.software.support.cisco_suggestion:*.suggestion:*.softwareType': {'title': _('Software type'), }, '.software.support.cisco_suggestion:*.suggestion:*.suggestion': {'title': _('Suggestion(s)'), }, - '.software.support.cisco_suggestion:*.suggestion:*.suggestion:': {'keyorder': ['id', 'releaseFormat2', 'releaseDate']}, + '.software.support.cisco_suggestion:*.suggestion:*.suggestion:': {'render': render_inv_dicttable_suggestion_noqf, 'keyorder': ['id', 'releaseFormat2', 'releaseDate']}, '.software.support.cisco_suggestion:*.suggestion:*.suggestion:*.id': {'title': _('ID'), }, '.software.support.cisco_suggestion:*.suggestion:*.suggestion:*.releaseDate': {'title': _('Release date'), }, '.software.support.cisco_suggestion:*.suggestion:*.suggestion:*.releaseFormat2': {'title': _('Version'), }, @@ -152,8 +473,8 @@ inventory_displayhints.update({ }) -# declare_invtable_view('invciscoeox', '.hardware.system.support.cisco_eox:', _('Cisco EoX status'), _('Cisco EoX status')) -# declare_invtable_view('invciscocontract', '.hardware.system.support.cisco_contract:', _('Cisco contract status'), _('Cisco contract status')) -# declare_invtable_view('invciscopsirt', '.software.support.cisco_psirt.advisories:', _('Cisco PSIRT advisories'), _('Cisco PSIRT advisories')) -# declare_invtable_view('invciscobugs', '.software.support.cisco_bug.bugs:', _('Cisco BUG IDs'), _('Cisco Bug IDs')) -# declare_invtable_view('invciscosuggestion', '.software.support.cisco_suggestion:', _('Cisco suggested software'), _('Cisco suggested software')) +declare_invtable_view('invciscoeox', '.hardware.support.cisco_eox:', _('Cisco EoX status'), _('Cisco EoX status')) +declare_invtable_view('invciscocontract', '.hardware.support.cisco_contract:', _('Cisco contract status'), _('Cisco contract status')) +declare_invtable_view('invciscopsirt', '.software.support.cisco_psirt.advisories:', _('Cisco PSIRT advisories'), _('Cisco PSIRT advisories')) +declare_invtable_view('invciscobugs', '.software.support.cisco_bug.bugs:', _('Cisco BUG IDs'), _('Cisco Bug IDs')) +#declare_invtable_view('invciscosuggestion', '.software.support.cisco_suggestion:', _('Cisco suggested software'), _('Cisco suggested software')) -- GitLab