From 869b4302910be4a2972cb625c50cfaf08e1464bf Mon Sep 17 00:00:00 2001 From: "th.l" <thl-cmk@outlook.com> Date: Sun, 25 Jul 2021 18:26:00 +0200 Subject: [PATCH] update project --- CHANGELOG | 55 +++ agent_based/inv_cisco_bug.py | 4 +- agent_based/inv_cisco_psirt.py | 15 +- agent_based/utils/ciscoapi.py | 2 +- inv_cisco_support.mkp | Bin 31953 -> 29638 bytes packages/inv_cisco_support | 10 +- web/htdocs/css/inv_cisco_support.css | 25 + web/plugins/views/inv_cisco_support.py | 648 ++++++++----------------- web/plugins/wato/inv_cisco_bug.py | 27 +- web/plugins/wato/inv_cisco_contract.py | 5 +- web/plugins/wato/inv_cisco_eox.py | 4 +- web/plugins/wato/inv_cisco_psirt.py | 4 +- 12 files changed, 314 insertions(+), 485 deletions(-) create mode 100644 CHANGELOG create mode 100644 web/htdocs/css/inv_cisco_support.css diff --git a/CHANGELOG b/CHANGELOG new file mode 100644 index 0000000..9868eef --- /dev/null +++ b/CHANGELOG @@ -0,0 +1,55 @@ +EoX +2017-03-20: initial version EoX +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 +2021-07-23: rewrite for CMK 2.0 + + +Contract +2017-03-20: initial version EoX +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 + + +PSIRT +2017-07-05: initial release +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-01-06: minor changes, added status info for removed advisories (not updated, older than, ...) +2019-08-13: changed for cmk 1.5 + #node = inv_tree_list('software.support.cisco_psirt.') + node = inv_tree('software.support.cisco_psirt.') + changed variable host_name to _hostname for cmk 1.5 + + +Suggestion +2017-07-13: initial release +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 : changes for cmk 1.5.x varianle host_name changed to _hotname + + +Bug +2018-12-26: initial release +2019-08-03: changes for cmk 1.5: inv_tree_list to inv_tree, comment out split for cmk 1.5 + #bug['known_fixed_releases'] = bug['known_fixed_releases'].split(' ') + #bug['known_affected_releases'] = bug['known_affected_releases'].split(' ') + + +All +2021-07-23: rewritten for CMK 2.0 +2021-07-25: removed sugestion and api_status plugins \ No newline at end of file diff --git a/agent_based/inv_cisco_bug.py b/agent_based/inv_cisco_bug.py index 7182d59..1119282 100644 --- a/agent_based/inv_cisco_bug.py +++ b/agent_based/inv_cisco_bug.py @@ -221,8 +221,8 @@ def inventory_cisco_bug(params, section) -> InventoryResult: for bug in bugs: if bug.get('bug_id') not in bug_ids: bug_ids.append(bug.get('bug_id')) - #bug['known_fixed_releases'] = bug['known_fixed_releases'].split(' ') - #bug['known_affected_releases'] = bug['known_affected_releases'].split(' ') + bug['known_fixed_releases'] = ', '.join(bug['known_fixed_releases'].split(' ')) + bug['known_affected_releases'] = ', '.join(bug['known_affected_releases'].split(' ')) bug['status'] = get_bug_status(bug['status']) bug['behavior_changed'] = get_bug_behavior_changed(bug['behavior_changed']) logging.info('remove columns: %s' % optionalcolumns) diff --git a/agent_based/inv_cisco_psirt.py b/agent_based/inv_cisco_psirt.py index ea74331..f337914 100644 --- a/agent_based/inv_cisco_psirt.py +++ b/agent_based/inv_cisco_psirt.py @@ -62,7 +62,7 @@ def parse_inv_cisco_psirt(string_table: List[StringTable]): def inventory_cisco_psirt(params, section) -> InventoryResult: - def create_psirt_record(filepath, filename, not_updated, dont_show_older_then): + def create_psirt_record(filepath, filename, not_updated, dont_show_older_then, optionalcolumns): psirtfile = filepath + filename advisories = {} if os.path.isfile(psirtfile): @@ -80,14 +80,21 @@ def inventory_cisco_psirt(params, section) -> InventoryResult: advisory.update({'installed_version': filename}) advisory.update({'lastUpdated': advisory.get('lastUpdated', 'T1980-01-01').split('T')[0]}) advisory.update({'firstPublished': advisory.get('firstPublished', 'T1980-01-01').split('T')[0]}) - advisory.update({'bugIDs': ' '.join(advisory.get('bugIDs', ''))}) + advisory.update({'bugIDs': ', '.join(advisory.get('bugIDs', ''))}) advisory.update({'firstFixed': ', '.join(advisory.get('firstFixed', ''))}) advisory.update({'cves': ', '.join(advisory.get('cves', ''))}) advisory.update({'cwe': ', '.join(advisory.get('cwe', ''))}) + + keys = advisory.keys() + for column in optionalcolumns: + if column in keys: + advisory.pop(column) else: # add old advisories to remove list remove_advisories.insert(0, advisories.index(advisory)) + + # remove advisories older then not_updated # if len(remove_advisories) > 0: # node['removed_advisories'] = len(remove_advisories) @@ -253,9 +260,9 @@ def inventory_cisco_psirt(params, section) -> InventoryResult: # create psirt advisory list if product_family in ['IOS', 'IOS-XE']: # do not remove entrys from IOS(XE) - advisories = create_psirt_record(path_found, psirt, 10000000, '2000-01-01') + advisories = create_psirt_record(path_found, psirt, 10000000, '2000-01-01', optionalcolumns) else: - advisories = create_psirt_record(path_found, psirt, not_updated, dont_show_older_then) + advisories = create_psirt_record(path_found, psirt, not_updated, dont_show_older_then, optionalcolumns) if dont_show_older_then != '0000-00-00': yield Attributes( path=path, diff --git a/agent_based/utils/ciscoapi.py b/agent_based/utils/ciscoapi.py index 86f322c..4ae674c 100644 --- a/agent_based/utils/ciscoapi.py +++ b/agent_based/utils/ciscoapi.py @@ -24,7 +24,7 @@ from typing import List # list of PIDs to drop g_PID_black_list = ['BUILT-IN', 'MICRON', 'C400-MTFDD'] # list of PIDs to try by serial number -g_PID_bad_list = ['UNSPECIFIED', 'FABRIC', 'ASA', 'C2611XM-2FE', 'FTLX8570D3BCL', 'FTLF8519P2BCL', 'FTLX8571D3BCL', 'FTRJ-8519-7D', 'PLRXPL-SC-S43'] +g_PID_bad_list = ['UNSPECIFIED', 'FABRIC', 'ASA', 'C2611XM-2FE', 'FTLX8570D3BCL', 'FTLF8519P2BCL', 'FTLX8571D3BCL', 'FTRJ-8519-7D', 'PLRXPL-SC-S43'] # # list of S/Ns to drop g_SN_black_list = [] diff --git a/inv_cisco_support.mkp b/inv_cisco_support.mkp index a35d91cf9c8c5856fa3fb242f70e1ef3309153fa..98beed0b82237bae5dcfe94088455d38b073dd97 100644 GIT binary patch literal 29638 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 literal 31953 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 aiabNtdE);)&bt+W;4un+)Il7<LH-M)vB}i{ diff --git a/packages/inv_cisco_support b/packages/inv_cisco_support index 5721f1f..d374c2a 100644 --- a/packages/inv_cisco_support +++ b/packages/inv_cisco_support @@ -12,7 +12,8 @@ 'detection in PSIRT (WLC, Nexus, APIC, ASA, ...)\n' 'v.0.0.11: fixes for CMK 1.5.x\n' '\n' - 'v0.1: rewrite for CMK 2.0\n', + 'v0.1: rewrite for CMK 2.0\n' + ' - suggestion and api_status removed\n', 'download_url': 'https://thl-cmk.hopto.org', 'files': {'agent_based': ['inv_cisco_eox.py', 'inv_cisco_contract.py', @@ -29,12 +30,13 @@ 'plugins/wato/inv_cisco_bug.py', 'plugins/wato/inv_cisco_eox.py', 'plugins/wato/inv_cisco_contract.py', - 'plugins/wato/inv_cisco_psirt.py']}, + 'plugins/wato/inv_cisco_psirt.py', + 'htdocs/css/inv_cisco_support.css']}, 'name': 'inv_cisco_support', - 'num_files': 16, + 'num_files': 17, 'title': 'Inventory for Cisco Bug, EoX, contract status, PSIRT advisories and ' 'suggested software', - 'version': '2021-07-23.v0.1', + 'version': '2021-07-25.v0.1a', 'version.min_required': '2.0.0', 'version.packaged': '2021.07.14', 'version.usable_until': None} \ No newline at end of file diff --git a/web/htdocs/css/inv_cisco_support.css b/web/htdocs/css/inv_cisco_support.css new file mode 100644 index 0000000..5d463b0 --- /dev/null +++ b/web/htdocs/css/inv_cisco_support.css @@ -0,0 +1,25 @@ +/* for cisco_support */ +td.date_default { + background-color: #00c020 !important; /* green */ + box-shadow: 0px 0px 3px #ccffcc inset; + color: #000000 !important; +} + +td.date_warn { + background-color: #ffff00 !important; /* yellow */ + box-shadow: 0px 0px 2px #000 inset; + color: #000000 !important; +} + +td.date_crit { + background-color: #ff0000 !important; /* red */ + box-shadow: 0px 0px 2px #000 inset; + +} + + +a.href_blue { + color: limegreen !important; + text-decoration: underline !important; +} + diff --git a/web/plugins/views/inv_cisco_support.py b/web/plugins/views/inv_cisco_support.py index 7f3b889..01cfe89 100644 --- a/web/plugins/views/inv_cisco_support.py +++ b/web/plugins/views/inv_cisco_support.py @@ -12,441 +12,168 @@ # 2021-07-23: rewrite for CMK 2.0 # suggestion removed --> table to complicated :-( # -# -# ToDo: add render_inv_bugids, needed to add html link to bug IDs, paint does not work (like suggestion) -# (https://bst.cloudapps.cisco.com/bugsearch/bug/CSCuh91645) -# +# 2021-07-25: removed inv_cisco_suggestion +# rework painter section -# import random # needed for quickinfo tables import time from cmk.gui.plugins.views.inventory import ( declare_invtable_view, decorate_inv_paint, ) -from cmk.gui.plugins.visuals.inventory import ( - FilterInvtableText, -) + from cmk.gui.i18n import _ from cmk.gui.plugins.views import ( inventory_displayhints, ) - - - +from cmk.gui.htmllib import HTML # # ToDo: move painters to local tree # painters are at the moment hard coded in lib/python/cmk/gui/plugins/views/inventory.py # - -# from cmk.gui.plugins.views.inventory import ( -# declare_invtable_view, -# decorate_inv_paint, -# ) -# -# import time -# -# from cmk.utils.regex import regex -# import cmk.utils.defines as defines -# import cmk.utils.render -# -# import cmk.gui.pages -# import cmk.gui.config as config -# import cmk.gui.sites as sites -# import cmk.gui.inventory as inventory -# from cmk.gui.i18n import _ -# from cmk.gui.globals import html, current_app -# from cmk.gui.htmllib import HTML -# from cmk.gui.valuespec import Dictionary, Checkbox, Hostname -# from cmk.gui.exceptions import MKUserError -# -# from cmk.gui.plugins.visuals import ( -# filter_registry, -# VisualInfo, -# visual_info_registry, -# ) -# from cmk.gui.plugins.visuals.inventory import ( -# FilterInvText, -# FilterInvBool, -# FilterInvFloat, -# FilterInvtableText, -# FilterInvtableIDRange, -# ) -# -# from cmk.gui.plugins.views import ( -# data_source_registry, -# DataSource, -# RowTable, -# painter_registry, -# Painter, -# register_painter, -# register_sorter, -# display_options, -# painter_option_registry, -# PainterOption, -# PainterOptions, -# inventory_displayhints, -# multisite_builtin_views, -# view_is_enabled, -# paint_age, -# declare_1to1_sorter, -# cmp_simple_number, -# render_labels, -# ) - -# @decorate_inv_paint -# 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 - - -# @decorate_inv_paint -# def inv_paint_last_checked_status(date_string): -# warn_days = 32 -# crit_days = 40 -# 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 <= warn_days: -# css_class = '' -# elif days >= crit_days: -# css_class = 'date_crit' -# else: -# css_class = 'date_warn' -# return css_class, ' %s' % date_string - - -# @decorate_inv_paint -# 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 - - -# @decorate_inv_paint -# 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 - - -# @decorate_inv_paint -# 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_bugid_url = '' -# return '', search_bugid_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 +# to enable painters you must add the painter functions to ~/lib/python/cmk/gui/plugins/views/inventory.py +# and set ENABLE_PAINTERS to True # -# # 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 = "" + +ENABLE_PAINTERS = False + +# ################################################################################# # -# 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) +# Painter functions START # -# # -# # 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) + + +@decorate_inv_paint() +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 + + +@decorate_inv_paint() +def inv_paint_last_checked_status(date_string): + warn_days = 32 + crit_days = 40 + 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 <= warn_days: + css_class = '' + elif days >= crit_days: + css_class = 'date_crit' + else: + css_class = 'date_warn' + return css_class, ' %s' % date_string + + +@decorate_inv_paint() +def inv_paint_psirt_advisoryid(advisoryId): + psirt_url = HTML( + f'<a class="href_blue" target="_blank" ' + f'href="https://tools.cisco.com/security/center/content/CiscoSecurityAdvisory/{advisoryId}">{advisoryId}</a>') + return '', psirt_url + + +@decorate_inv_paint() +def inv_paint_eox_eolid(eolid): + if eolid is not None: + search_eolid_url = HTML( + f'<a class="href_blue" target="_blank" ' + f'href="https://search.cisco.com/search?query={eolid}%s">{eolid}</a>') + else: + search_eolid_url = '' + return '', search_eolid_url + + +@decorate_inv_paint() +def inv_paint_bug_bugid(bugid): + if bugid is not None: + search_bugid_url = HTML( + f'<a class="href_blue" target="_blank" ' + f'href="https://bst.cloudapps.cisco.com/bugsearch/bug/{bugid}">{bugid}</a>') + else: + search_bugid_url = '' + return '', search_bugid_url + + +@decorate_inv_paint() +def inv_paint_psirt_bugid(bugids): + search_bugid_url = '' + bugids = bugids.split(',') + if bugids: + search_bugid_url = [] + for bugid in bugids: + bugid = bugid.strip(' ') + search_bugid_url.append(f'<a class="href_blue" target="_blank" href="https://bst.cloudapps.cisco.com/bugsearch/bug/{bugid}">{bugid}</a>') + search_bugid_url = HTML(', '.join(search_bugid_url)) + return '', search_bugid_url + # +# Painter functions END # -# def inv_paint_bug_behavior_changed(behavior_changed): -# _behavior_changed = { -# 'Y': 'yes', -# 'N': 'no', -# } -# return '', _behavior_changed.get(behavior_changed, behavior_changed) +# ################################################################################# + # EoX display hints inventory_displayhints.update({ - '.hardware.support.cisco_eox:': {'title': _('Cisco EoX'), - 'keyorder': ['pid', 'serial_number', 'ProductIDDescription', 'Last_checked', - 'EOXExternalAnnouncementDate', 'EndOfSaleDate', - 'LastDateOfSupport', 'EndOfSvcAttachDate', 'UpdatedTimeStamp', - 'ProductBulletinNumber', - ], - 'view': 'invciscoeox_of_host', - }, + '.hardware.support.cisco_eox:': { + 'title': _('Cisco EoX'), + 'keyorder': + [ + 'pid', 'serial_number', 'ProductIDDescription', 'Last_checked', 'ProductBulletinNumber', + 'EOXExternalAnnouncementDate', 'EndOfSaleDate', 'LastDateOfSupport', 'EndOfSvcAttachDate', + 'UpdatedTimeStamp', + ], + 'view': 'invciscoeox_of_host', + }, '.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'), 'filter': FilterInvtableText,}, # 'filter': FilterInvtableText, 'paint': 'date_status', - '.hardware.support.cisco_eox:*.EndOfSaleDate': {'title': _('End of sale'), }, # 'filter': FilterInvtableText, 'paint': 'date_status', - '.hardware.support.cisco_eox:*.EndOfSvcAttachDate': {'title': _('End of service attachment'), }, # 'filter': FilterInvtableText, 'paint': 'date_status', - '.hardware.support.cisco_eox:*.LastDateOfSupport': {'title': _('End of support'), }, # 'filter': FilterInvtableText, 'paint': 'date_status', - '.hardware.support.cisco_eox:*.ProductBulletinNumber': {'title': _('EOL bulletin ID'), }, # 'filter': FilterInvtableText, 'paint': 'eox_eolid', '.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'), }, # 'filter': FilterInvtableText, 'paint': 'date_status', - '.hardware.support.cisco_eox:*.EndOfSWMaintenanceReleases': {'title': _('End of software maintenace releases'), }, # 'filter': FilterInvtableText, 'paint': 'date_status', - '.hardware.support.cisco_eox:*.EndOfRoutineFailureAnalysisDate': {'title': _('End of routine failure analysis'), }, # 'filter': FilterInvtableText, 'paint': 'date_status', '.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'), }, # 'filter': FilterInvtableText, 'paint': 'last_checked_status', + '.hardware.support.cisco_eox:*.Last_checked': {'title': _('Last checked'), 'paint': 'last_checked_status'}, # }) # SN2Info (contract) display hints inventory_displayhints.update({ - '.hardware.support.cisco_contract:': {'title': _('Cisco contract status'), - 'keyorder': ['pid', 'serial_number', 'ProductIDDescription', - 'Last_checked', 'is_covered', 'service_contract_number', - 'covered_product_line_end_date', - ], - 'view': 'invciscocontract_of_host', - }, + '.hardware.support.cisco_contract:': { + 'title': _('Cisco contract status'), + 'keyorder': [ + 'pid', 'serial_number', 'ProductIDDescription', 'Last_checked', 'is_covered', 'service_contract_number', + 'covered_product_line_end_date', + ], + 'view': 'invciscocontract_of_host', + }, '.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'), }, # 'filter': FilterInvtableText,'paint': 'last_checked_status', '.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'), }, @@ -455,7 +182,6 @@ inventory_displayhints.update({ '.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'), }, # 'filter': FilterInvtableText, 'paint': 'date_status', '.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'), }, @@ -469,20 +195,22 @@ inventory_displayhints.update({ '.software.support.cisco_bug.missing_records': {'title': _('Records missing'), }, '.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'), - 'keyorder': ['bug_id', 'last_modified_date', 'headline', 'severity', 'status', 'support_case_count', 'behavior_changed', ], - 'view': 'invciscobugs_of_host', - }, - '.software.support.cisco_bug.bugs:*.status': {'title': _('Status'), }, # 'filter': FilterInvtableText, + '.software.support.cisco_bug.bugs:': { + 'title': _('Cisco BUG IDs'), + 'keyorder': [ + 'bug_id', 'severity', 'status', 'last_modified_date', 'headline', 'support_case_count', 'behavior_changed', + ], + 'view': 'invciscobugs_of_host', + }, + '.software.support.cisco_bug.bugs:*.status': {'title': _('Status'), }, '.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'), }, # 'filter': FilterInvtableText, - '.software.support.cisco_bug.bugs:*.bug_id': {'title': _('Bug ID'), }, # 'paint': 'bug_bugid', + '.software.support.cisco_bug.bugs:*.behavior_changed': {'title': _('Behavior changed'), }, '.software.support.cisco_bug.bugs:*.base_pid': {'title': _('Base PID'), }, - '.software.support.cisco_bug.bugs:*.known_fixed_releases': {'title': _('Known fixed releases'), }, # 'filter': FilterInvtableText, + '.software.support.cisco_bug.bugs:*.known_fixed_releases': {'title': _('Known fixed releases'), }, '.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'), }, @@ -491,16 +219,17 @@ inventory_displayhints.update({ # PSIRT display hints inventory_displayhints.update({ '.software.support.cisco_psirt.dont_show_older_than': {'title': _('Don\'t show advisories not updated since'), }, - '.software.support.cisco_psirt.dont_show_not_updated_since': {'title': _('Don\'t show advisories not updated for X days'), }, + '.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'), - 'keyorder': ['advisoryId', 'sir', 'cvssBaseScore', 'advisoryTitle', - ], - 'view': 'invciscopsirt_of_host', - }, - '.software.support.cisco_psirt.advisories:*.advisoryId': {'title': _('Advisory ID'), }, # 'filter': FilterInvtableText, , 'paint': 'psirt_advisoryId', + '.software.support.cisco_psirt.advisories:': { + 'title': _('Cisco PSIRT advisories'), + 'keyorder': [ + 'advisoryId', 'sir', 'cvssBaseScore', 'advisoryTitle', + ], + 'view': 'invciscopsirt_of_host', + }, '.software.support.cisco_psirt.advisories:*.advisoryTitle': {'title': _('Advisory Title'), }, - '.software.support.cisco_psirt.advisories:*.bugIDs': {'title': _('Bug IDs'), }, # 'filter': FilterInvtableText, , 'paint': 'psirt_bugid', '.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'), }, @@ -510,51 +239,68 @@ inventory_displayhints.update({ '.software.support.cisco_psirt.advisories:*.sir': {'title': _('Severity'), }, '.software.support.cisco_psirt.advisories:*.summary': {'title': _('Summary'), }, '.software.support.cisco_psirt.advisories:*.cwe': {'title': _('CWE'), }, - '.software.support.cisco_psirt.advisories:*.cves': {'title': _('CVEs'),}, + '.software.support.cisco_psirt.advisories:*.cves': {'title': _('CVEs'), }, '.software.support.cisco_psirt.advisories:*.productNames': {'title': _('Product names'), }, - '.software.support.cisco_psirt.advisories:*.ipsSignatures': {'title': _('IPS signatures'), }, - '.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'), }, # 'filter': FilterInvtableText,, 'paint': 'last_checked_status', - '.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'), }, + '.software.support.cisco_psirt.advisories:*.ipsSignatures': {'title': _('IPS signatures')}, + '.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.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 -# inventory_displayhints.update({ -# '.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'), 'filter': FilterInvtableText, 'paint': 'last_checked_status',}, # -# '.software.support.cisco_suggestion:*.suggestion': {'title': _('Suggestion(s)'), }, -# # '.software.support.cisco_suggestion:*.suggestion:': {'render': render_inv_dicttable_suggestion_noqf, 'keyorder': ['productName', 'softwareType']}, -# '.software.support.cisco_suggestion:*.suggestion:': {'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:': {'render': render_inv_dicttable_suggestion_noqf, 'keyorder': ['id', 'releaseFormat2', 'releaseDate']}, -# '.software.support.cisco_suggestion:*.suggestion:*.suggestion:': {'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'), }, -# '.software.support.cisco_suggestion:*.suggestion:*.suggestion:*.releaseLifeCycle': {'title': _('Life cycle'), }, -# '.software.support.cisco_suggestion:*.suggestion:*.suggestion:*.isSuggested': {'title': _('is suggested'), }, -# '.software.support.cisco_suggestion:*.suggestion:*.suggestion:*.majorRelease': {'title': _('major release'), }, -# '.software.support.cisco_suggestion:*.suggestion:*.suggestion:*.relDispName': {'title': _('release display name'), }, -# '.software.support.cisco_suggestion:*.suggestion:*.suggestion:*.releaseFormat1': {'title': _('release format1'), }, -# '.software.support.cisco_suggestion:*.suggestion:*.suggestion:*.releaseTrain': {'title': _('release train'), }, -# '.software.support.cisco_suggestion:*.suggestion:*.suggestion:*.trainDispName': {'title': _('train display name'), } -# }) + +if ENABLE_PAINTERS: + inventory_displayhints.update({ + # EoX + '.hardware.support.cisco_eox:*.EOXExternalAnnouncementDate': {'title': _('EOL Announcement'), 'paint': 'date_status'}, + '.hardware.support.cisco_eox:*.EndOfSvcAttachDate': {'title': _('End of service attachment'), 'paint': 'date_status'}, + '.hardware.support.cisco_eox:*.EndOfSecurityVulSupportDate': {'title': _('End of service vulnerability support'), 'paint': 'date_status'}, + '.hardware.support.cisco_eox:*.EndOfSWMaintenanceReleases': {'title': _('End of software maintenace releases'), 'paint': 'date_status'}, + '.hardware.support.cisco_eox:*.EndOfRoutineFailureAnalysisDate': {'title': _('End of routine failure analysis'), 'paint': 'date_status'}, + '.hardware.support.cisco_eox:*.EndOfSaleDate': {'title': _('End of sale'), 'paint': 'date_status'}, + '.hardware.support.cisco_eox:*.LastDateOfSupport': {'title': _('End of support'), 'paint': 'date_status'}, + '.hardware.support.cisco_eox:*.ProductBulletinNumber': {'title': _('EOL bulletin ID'), 'paint': 'eox_eolid'}, + + # SN2Info + '.hardware.support.cisco_contract:*.Last_checked': {'title': _('Last checked'), 'paint': 'last_checked_status'}, + '.hardware.support.cisco_contract:*.covered_product_line_end_date': {'title': _('Contract end date'), 'paint': 'date_status'}, + + # Bug + '.software.support.cisco_bug.bugs:*.bug_id': {'title': _('Bug ID'), 'paint': 'bug_bugid'}, + + # Psirt + '.software.support.cisco_psirt.advisories:*.advisoryId': {'title': _('Advisory ID'), 'paint': 'psirt_advisoryid'}, + '.software.support.cisco_psirt.advisories:*.bugIDs': {'title': _('Bug IDs'), 'paint': 'psirt_bugid'}, + '.software.support.cisco_psirt.Last_checked': {'title': _('Last checked'), 'paint': 'last_checked_status'}, + }) +else: + inventory_displayhints.update(({ + # EoX + '.hardware.support.cisco_eox:*.EOXExternalAnnouncementDate': {'title': _('EOL Announcement')}, + '.hardware.support.cisco_eox:*.EndOfSvcAttachDate': {'title': _('End of service attachment')}, + '.hardware.support.cisco_eox:*.EndOfSecurityVulSupportDate': {'title': _('End of service vulnerability support')}, + '.hardware.support.cisco_eox:*.EndOfSWMaintenanceReleases': {'title': _('End of software maintenace releases')}, + '.hardware.support.cisco_eox:*.EndOfRoutineFailureAnalysisDate': {'title': _('End of routine failure analysis')}, + '.hardware.support.cisco_eox:*.EndOfSaleDate': {'title': _('End of sale')}, + '.hardware.support.cisco_eox:*.LastDateOfSupport': {'title': _('End of support')}, + '.hardware.support.cisco_eox:*.ProductBulletinNumber': {'title': _('EOL bulletin ID')}, + + # SN2Info + '.hardware.support.cisco_contract:*.Last_checked': {'title': _('Last checked')}, + '.hardware.support.cisco_contract:*.covered_product_line_end_date': {'title': _('Contract end date')}, + + # Bug + '.software.support.cisco_bug.bugs:*.bug_id': {'title': _('Bug ID')}, + + # Psirt + '.software.support.cisco_psirt.advisories:*.advisoryId': {'title': _('Advisory ID')}, + '.software.support.cisco_psirt.advisories:*.bugIDs': {'title': _('Bug IDs')}, + '.software.support.cisco_psirt.Last_checked': {'title': _('Last checked')}, + })) + 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')) - diff --git a/web/plugins/wato/inv_cisco_bug.py b/web/plugins/wato/inv_cisco_bug.py index e9ce841..4d4a754 100644 --- a/web/plugins/wato/inv_cisco_bug.py +++ b/web/plugins/wato/inv_cisco_bug.py @@ -25,39 +25,32 @@ from cmk.gui.plugins.wato.inventory import ( RulespecGroupInventory, ) -_removecolumns = [ - # ('status', 'Status'), +_removecolumns_inv_cisco_bug = [ + # ('status', 'Status'), ('product', 'Product'), ('description', 'Description'), - ('headline', 'Headline'), - ('support_case_count', 'Support case count'), - ('last_modified_date', 'Last modified date'), - ('behavior_changed', 'Behavior changed'), - # ('bug_id', 'Bug ID'), + # ('headline', 'Headline'), + # ('support_case_count', 'Support case count'), + # ('last_modified_date', 'Last modified date'), + # ('behavior_changed', 'Behavior changed'), + # ('bug_id', 'Bug ID'), ('base_pid', 'Base PID'), ('known_fixed_releases', 'Known fixed releases'), ('id', 'ID'), ('known_affected_releases', 'known affected releases'), - ('severity', 'Severity'), + # ('severity', 'Severity'), ] def _valuespec_inv_cisco_bug(): return Dictionary( - title=_('Cisco bug advisories'), + title=_('Cisco bugs'), elements=[ - ('disable_bug', - FixedValue( - True, - title=_('disable Cisco bug information'), - help=_('if true, CMK will not request bug information from Cisco'), - default_value=False, - )), ('removecolumns', ListChoice( title=_('remove columns'), help=_('remove information from report'), - choices=_removecolumns, + choices=_removecolumns_inv_cisco_bug, default_value=[ 'base_pid', 'description', diff --git a/web/plugins/wato/inv_cisco_contract.py b/web/plugins/wato/inv_cisco_contract.py index 1627896..4c71f6e 100644 --- a/web/plugins/wato/inv_cisco_contract.py +++ b/web/plugins/wato/inv_cisco_contract.py @@ -18,13 +18,14 @@ from cmk.gui.plugins.wato import ( from cmk.gui.valuespec import ( Dictionary, ListChoice, + ListOfStrings, ) from cmk.gui.plugins.wato.inventory import ( RulespecGroupInventory, ) -_removecolumns = [ +_removecolumns_inv_cisco_contract = [ ('contract_site_address1', 'Address'), ('contract_site_city', 'City'), ('contract_site_country', 'Country'), @@ -46,7 +47,7 @@ def _valuespec_inv_cisco_contract(): ListChoice( title=_('remove columns'), help=_('remove information from report'), - choices=_removecolumns, + choices=_removecolumns_inv_cisco_contract, default_value=[ 'contract_site_state_province', 'warranty_type_description', diff --git a/web/plugins/wato/inv_cisco_eox.py b/web/plugins/wato/inv_cisco_eox.py index aae8828..b0f775a 100644 --- a/web/plugins/wato/inv_cisco_eox.py +++ b/web/plugins/wato/inv_cisco_eox.py @@ -26,7 +26,7 @@ from cmk.gui.plugins.wato.inventory import ( RulespecGroupInventory, ) -_removecolumns = [ +_removecolumns_inv_cisco_eox = [ # ('ProductIDDescription', 'PID Description'), ('LinkToProductBulletinURL', 'EOL bulletin URL'), ('EndOfSecurityVulSupportDate', 'End of service vulnerability support'), @@ -54,7 +54,7 @@ def _valuespec_inv_cisco_eox(): ListChoice( title=_('remove columns'), help=_('remove information from EoX report'), - choices=_removecolumns, + choices=_removecolumns_inv_cisco_eox, default_value=[ 'EndOfSecurityVulSupportDate', 'EndOfSWMaintenanceReleases', diff --git a/web/plugins/wato/inv_cisco_psirt.py b/web/plugins/wato/inv_cisco_psirt.py index 95772b2..5674516 100644 --- a/web/plugins/wato/inv_cisco_psirt.py +++ b/web/plugins/wato/inv_cisco_psirt.py @@ -28,7 +28,7 @@ from cmk.gui.plugins.wato.inventory import ( RulespecGroupInventory, ) -_removecolumns = [ +_removecolumns_inv_cisco_psirt = [ ('bugIDs', 'Cisco Bug IDs'), ('firstFixed', 'First fixed in'), ('firstPublished', 'First Published'), @@ -54,7 +54,7 @@ def _valuespec_inv_cisco_psirt(): ListChoice( title=_('remove columns'), help=_('remove information from report'), - choices=_removecolumns, + choices=_removecolumns_inv_cisco_psirt, default_value=[ 'publicationUrl', 'summary', -- GitLab