From 23a9eb235a3f62b3cc58ac8aec4d30f0be9ffbe8 Mon Sep 17 00:00:00 2001
From: "th.l" <thl-cmk@outlook.com>
Date: Tue, 27 Jul 2021 08:36:54 +0200
Subject: [PATCH] update project

---
 agent_based/inv_cisco_bug.py      | 357 ++++++++++-----------------
 agent_based/inv_cisco_contract.py | 275 +++++++--------------
 agent_based/inv_cisco_eox.py      | 301 ++++++++---------------
 agent_based/inv_cisco_psirt.py    | 394 ++++++++++++------------------
 agent_based/utils/ciscoapi.py     |  87 +++----
 inv_cisco_support.mkp             | Bin 29638 -> 27295 bytes
 6 files changed, 505 insertions(+), 909 deletions(-)

diff --git a/agent_based/inv_cisco_bug.py b/agent_based/inv_cisco_bug.py
index 1119282..65d869b 100644
--- a/agent_based/inv_cisco_bug.py
+++ b/agent_based/inv_cisco_bug.py
@@ -11,12 +11,15 @@
 #                    #bug['known_fixed_releases'] = bug['known_fixed_releases'].split(' ')
 #                    #bug['known_affected_releases'] = bug['known_affected_releases'].split(' ')
 # 2021-07-24: rewritten for CMK 2.0
+# 2021-07-26: some cleanup
+#
 
 import os
 import json
 import logging
 import time
-from typing import List
+from typing import List, Optional
+from dataclasses import dataclass
 from cmk.base.plugins.agent_based.agent_based_api.v1 import (
     register,
     SNMPTree,
@@ -33,187 +36,150 @@ from cmk.base.plugins.agent_based.agent_based_api.v1.type_defs import (
     InventoryResult,
 )
 
-# from cmk.base.plugins.agent_based.utils import ciscoapi as utils
 from cmk.base.plugins.agent_based.utils.ciscoapi import (
     set_loglevel,
     expand_path,
-    compact_info_by_serial,
-    check_bad_serial,
-    pid_on_black_list,
-    sn_on_black_list,
-    pid_on_bad_list,
-    set_PID_black_list,
-    set_PID_bad_list,
-    set_SN_black_list,
+    get_base_path,
 )
 
-def parse_inv_cisco_bug(string_table: List[StringTable]):
-    section = string_table
-    return section
-
-def inventory_cisco_bug(params, section) -> InventoryResult:
-
-    def get_OS_Version(cw_version, sysdescription, inventory):
-        version = None
-        pid = ''
-        # cw_version = None
-        sys_version = None
-        phy_version = None
-
-        if str(cw_version).find('CW_VERSION$') == 0:
-            cw_version = cw_version.split('$')[1]  # .upper()
-
-        sysdescription = sysdescription.split(',')
-        # sys description from N5K-C5672UP (has two version entrys :-( )
-        # Cisco NX-OS(tm) n6000, Software (n6000-uk9), Version 7.0(8)N1(1), RELEASE SOFTWARE Copyright (c) 2002-2012 \
-        # by Cisco Systems, Inc. Device Manager Version 6.0(2)N1(1), Compiled 2/20/2016 21:00:00
-        for entry in sysdescription:
-            if not sys_version and 'version' in entry.lower():  # get only the first 'version' entry
-                sys_version = entry[entry.lower().find('version') + 7:].strip()
-                if sys_version.startswith(':'):  # AsyncOS
-                    sys_version = sys_version[1:].strip()
-                sys_version = sys_version.split(' ')[0].strip()
-                sys_version = sys_version  # .upper()
-
-        low_index = 1000000
-        for phyentry in inventory:
-            phyindex, physoftwarerev, phymodelname, physicalclass = phyentry
-            if physicalclass == '3':  # chassis
-                if int(phyindex) <= low_index:
-                    if phymodelname != '':  # PID at all
-                        if phymodelname.find(' ') == -1:  # no spaces in PID
-                            low_index = int(phyindex)
-                            pid = phymodelname
-                            phy_version = physoftwarerev.split(',')[0]
-
-        version = cw_version
-        if version == '' and sys_version:
-            version = sys_version
-        if version == '' and phy_version:
-            version = phy_version
-
-        # remove leading '0' in IOSXE version numbers
-        if version and version[0] == '0':
-            version = version.replace('.0', '.')
-            version = version.lstrip('0')
-        version = version.rstrip(';')
-
-        # todo: cut intermediate for ASA version as option
-
-        return version, pid
-
-    def get_bug_status(bug_status):
-        _bug_status = {
-            'F': 'Fixed',
-            'O': 'Open',
-            'T': 'Terminated'
-        }
-        return _bug_status.get(bug_status, bug_status)
-
-    def get_bug_behavior_changed(behavior_changed):
-        _behavior_changed = {
-            'Y': 'yes',
-            'N': 'no',
-        }
-        return _behavior_changed.get(behavior_changed, behavior_changed)
 
+@dataclass
+class SnmpBug:
+    version: str
+    pid: str
+
+
+def _get_os_version(cw_version, sysdescription, inventory):
+    pid = ''
+    sys_version = None
+    phy_version = None
+
+    if str(cw_version).find('CW_VERSION$') == 0:
+        cw_version = cw_version.split('$')[1]  # .upper()
+
+    sysdescription = sysdescription.split(',')
+    # sys description from N5K-C5672UP (has two version entries :-( )
+    # Cisco NX-OS(tm) n6000, Software (n6000-uk9), Version 7.0(8)N1(1), RELEASE SOFTWARE Copyright (c) 2002-2012 \
+    # by Cisco Systems, Inc. Device Manager Version 6.0(2)N1(1), Compiled 2/20/2016 21:00:00
+    for entry in sysdescription:
+        if not sys_version and 'version' in entry.lower():  # get only the first 'version' entry
+            sys_version = entry[entry.lower().find('version') + 7:].strip()
+            if sys_version.startswith(':'):  # AsyncOS
+                sys_version = sys_version[1:].strip()
+            sys_version = sys_version.split(' ')[0].strip()
+            sys_version = sys_version  # .upper()
+
+    low_index = 1000000
+    for phyentry in inventory:
+        phyindex, physoftwarerev, phymodelname, physicalclass = phyentry
+        if physicalclass == '3':  # chassis
+            if int(phyindex) <= low_index:
+                if phymodelname != '':  # PID at all
+                    if phymodelname.find(' ') == -1:  # no spaces in PID
+                        low_index = int(phyindex)
+                        pid = phymodelname
+                        phy_version = physoftwarerev.split(',')[0]
+
+    version = cw_version
+    if version == '' and sys_version:
+        version = sys_version
+    if version == '' and phy_version:
+        version = phy_version
+
+    # remove leading '0' in IOSXE version numbers
+    if version and version[0] == '0':
+        version = version.replace('.0', '.')
+        version = version.lstrip('0')
+    version = version.rstrip(';')
+
+    # todo: cut intermediate for ASA version as option
+
+    return version, pid
+
+
+def _get_bug_status(bug_status):
+    _bug_status = {
+        'F': 'Fixed',
+        'O': 'Open',
+        'T': 'Terminated'
+    }
+    return _bug_status.get(bug_status, bug_status)
+
+
+def _get_bug_behavior_changed(behavior_changed):
+    _behavior_changed = {
+        'Y': 'yes',
+        'N': 'no',
+    }
+    return _behavior_changed.get(behavior_changed, behavior_changed)
+
+
+def parse_inv_cisco_bug(string_table: List[StringTable]) -> Optional[SnmpBug]:
+    cw_version, sysdescription = string_table[0][0]
+    pids = string_table[1]
+
+    # get OS version
+    version, pid = _get_os_version(cw_version, sysdescription, pids)
+
+    if version == '' or pid == '':
+        return
+    else:
+        return SnmpBug(
+            version=version,
+            pid=pid
+        )
+
+
+def inventory_cisco_bug(params, section: SnmpBug) -> InventoryResult:
     set_loglevel()
 
-    # disable_bug = False
     optionalcolumns = [
         'base_pid',
-        # 'bug_id',
-        # 'behavior_changed',
         'description',
-        # 'headline',
         'id',
         'known_affected_releases',
-        # 'known_fixed_releases',
-        # 'last_modified_date',
         'product',
-        # 'severity',
-        # 'status',
-        # 'support_case_count',
     ]
 
-    # version = ''
-    not_updated = 10000000
-    dont_show_older_then = '0000-00-00'
-    conf_file = '~/etc/ciscoapi/ciscoapi.json'
-    conf_file = os.path.expanduser(conf_file)
-    bug_status = {}
-    # prepare path variables (expand homedir and add '/')
-    base_path = '~/var/ciscoapi'
-    cw_version, sysdescription = section[0][0]
-    pids = section[1]
-
     # get parameters from wato
     if params:
         optionalcolumns = params.get('removecolumns', optionalcolumns)
 
-    # get OS version
-    version, pid = get_OS_Version(cw_version, sysdescription, pids)
-
-    if version == '' or pid == '':
-        return
-
-    # check for conf_file and read parameters
-    if os.path.isfile(conf_file):
-        with open(conf_file) as f:
-            try:
-                config = json.load(f)
-                base_path = config['global']['base_dir']
-            except ValueError as e:
-                logging.warning(f'snmp_cisco_eox:status:JSON load error: {e}')
-
+    base_path = get_base_path()
     bug_dir = base_path + '/bug'
     path_found = expand_path(bug_dir + '/found/')
     path_not_found = expand_path(bug_dir + '/not_found/')
     path_request = expand_path(bug_dir + '/request/')
-    status_path = expand_path(base_path + '/status')
 
-    # node = inv_tree_list('software.support.cisco_bug.')
-    path = ['software','support','cisco_bug']
-    yield Attributes(
-        path=path,
-        inventory_attributes={
-            'os_version': version,
-            'PID': pid,
-        })
+    path = ['software', 'support', 'cisco_bug']
+    attribute = {
+        'os_version': section.version,
+        'PID': section.pid,
+    }
 
-    pid = pid.replace('/', '_')
+    pid = section.pid.replace('/', '_')
 
     # bug report found
-    if os.path.isfile(path_found + pid + '/' + version):
-        logging.info('snmp_cisco_bug:report found: %s, %s' % (pid, version))
-        modifytime = os.path.getmtime(path_found + pid + '/' + version)
-        yield Attributes(
-        path=path,
-        inventory_attributes={
+    if os.path.isfile(path_found + pid + '/' + section.version):
+        modifytime = os.path.getmtime(path_found + pid + '/' + section.version)
+        attribute.update({
             'Last_checked': time.strftime('%Y-%m-%d', time.localtime(modifytime)),
             'status': 'found'
         })
 
         bug_record = ''
-        with open(path_found + pid + '/' + version) as f:
+        with open(path_found + pid + '/' + section.version) as f:
             try:
                 bug_record = json.load(f)
             except ValueError as e:
-                logging.warning(f'{host_name}:snmp_cisco_bug:bug_found:JSON load error: [e]')
+                logging.warning(f'inv_cisco_bug:bug_found:JSON load error: {e}')
+                exit()
         if bug_record != '':
-            yield Attributes(
-                path=path,
-                inventory_attributes={
-                    'Total_records': bug_record.get('total_records', 0),
-                })
+            attribute['Total_records'] = bug_record.get('total_records', 0)
 
             missing = bug_record.get('missing', {})
             if len(missing.keys()) != 0:
-                yield Attributes(
-                    path=path,
-                    inventory_attributes={
-                        'missing_records': len(missing.keys()) * 10,
-                    })
+                attribute['missing_records'] = len(missing.keys()) * 10
 
             bugs = bug_record.get('bugs')
             bug_ids = []
@@ -223,12 +189,10 @@ def inventory_cisco_bug(params, section) -> InventoryResult:
                     bug_ids.append(bug.get('bug_id'))
                     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)
+                    bug['status'] = _get_bug_status(bug['status'])
+                    bug['behavior_changed'] = _get_bug_behavior_changed(bug['behavior_changed'])
                     if optionalcolumns is not None:
                         for column in optionalcolumns:
-                            logging.info('remove column: %s' % column)
                             bug.pop(column, None)
                     clean_bugs.append(bug)
                     key_columns = {'bug_id': bug.get('bug_id')}
@@ -238,91 +202,31 @@ def inventory_cisco_bug(params, section) -> InventoryResult:
                         key_columns=key_columns,
                         inventory_columns=bug,
                     )
-            yield Attributes(
-                path=path,
-                inventory_attributes={
-                    'duplicate_records':len(bugs) - len(clean_bugs),
-                })
-
+            attribute['duplicate_records'] = len(bugs) - len(clean_bugs)
 
     # bug report not found
-    elif os.path.isfile(path_not_found + pid + '/' + version):
-        logging.info('snmp_cisco_bug:report not found: %s, %s' % (pid, version))
-        modifytime = os.path.getmtime(path_not_found + pid + '/' + version)
-        yield Attributes(
-            path=path,
-            inventory_attributes={
-                'Last_checked': time.strftime('%Y-%m-%d', time.localtime(modifytime)),
-                'status': 'Not found',
-            })
+    elif os.path.isfile(path_not_found + pid + '/' + section.version):
+        modifytime = os.path.getmtime(path_not_found + pid + '/' + section.version)
+        attribute.update({
+            'Last_checked': time.strftime('%Y-%m-%d', time.localtime(modifytime)),
+            'status': 'Not found',
+        })
     else:
         # create new request
         path_request = expand_path(path_request + pid)
-        if not os.path.isfile(path_request + '/' + version):
-            logging.info('snmp_cisco_bug:create request: %s, %s' % (pid, version))
-            with open(path_request + '/' + version, 'w+') as f:
+        if not os.path.isfile(path_request + '/' + section.version):
+            with open(path_request + '/' + section.version, 'w+') as f:  # only create file (touch)
                 pass
-        modifytime = os.path.getmtime(path_request + '/' + version)
-        yield Attributes(
-            path=path,
-            inventory_attributes={
-                'Last_checked': time.strftime('%Y-%m-%d', time.localtime(modifytime)),
-                'status': 'requested',
-            })
-
-    # # create and write back api status, will be used for active check cisco_api_status
-    # apistatus = {}
-    # lastrun = {}
-    # laststatus = {}
-    # thisrun = []
-    # apiname = 'bug'
-    # rewrite = False
-    # use_keys = ['sir', 'advisoryTitle', 'lastUpdated']
-    #
-    # if bug_status != {}:
-    #
-    #     # in CMK v1.5.x global variable g_hostname was replaced by API call host_name()
-    #     try:
-    #         host_name = host_name()
-    #     except NameError:
-    #         host_name = g_hostname
-    #
-    #     if os.path.isfile(status_path + host_name):
-    #         with open(status_path + host_name) as f:
-    #             try:
-    #                 apistatus = json.load(f)
-    #             except ValueError, e:
-    #                 logging.warning('snmp_cisco_bug:status:JSON load error: %s' % e)
-    #
-    #     if apistatus.get(apiname, None) is not None:
-    #         lastrun = apistatus.get(apiname).get('lastrun', {})
-    #         laststatus.update({'status': apistatus.get(apiname).get('status', '')})
-    #         laststatus.update({'product_family': apistatus.get(apiname).get('product_family', '')})
-    #         laststatus.update({'Last_checked': apistatus.get(apiname).get('Last_checked', '')})
-    #     else:
-    #         apistatus.update({apiname: {}})
-    #
-    #     if bug_status != laststatus:
-    #         apistatus.get(apiname).update(bug_status)
-    #         rewrite = True
-    #
-    #     if bug_status != node:
-    #         # cleanup bug infos for status
-    #         advisories = node.get('advisories', {})
-    #         if advisories != {}:
-    #             for entry in advisories:
-    #                 this_entry = {}
-    #                 for key in entry.keys():
-    #                     if key in use_keys:
-    #                         this_entry.update({key: entry.get(key)})
-    #                 thisrun.append(this_entry)
-    #
-    #         if lastrun != thisrun:
-    #             apistatus.get(apiname).update({'lastrun': thisrun})
-    #             rewrite = True
-    #     if rewrite:
-    #         with open(status_path + host_name, 'w') as f:
-    #             json.dump(apistatus, f)
+        modifytime = os.path.getmtime(path_request + '/' + section.version)
+        attribute.update({
+            'Last_checked': time.strftime('%Y-%m-%d', time.localtime(modifytime)),
+            'status': 'requested',
+        })
+
+    yield Attributes(
+        path=path,
+        inventory_attributes=attribute
+    )
 
 
 register.snmp_section(
@@ -354,7 +258,6 @@ register.snmp_section(
 register.inventory_plugin(
     name='inv_cisco_bug',
     inventory_function=inventory_cisco_bug,
-    inventory_default_parameters={
-    },
+    inventory_default_parameters={},
     inventory_ruleset_name='inv_cisco_bug',
 )
diff --git a/agent_based/inv_cisco_contract.py b/agent_based/inv_cisco_contract.py
index 1bff983..52d543f 100644
--- a/agent_based/inv_cisco_contract.py
+++ b/agent_based/inv_cisco_contract.py
@@ -18,12 +18,22 @@
 # 2020-08-04: moved node tree from hardware.system.support to hardware.system
 #             cleanup create_sn2info_record
 # 2021-07-24: rewritten for CMK 2.0
+# 2021-07-25: some cleanup
+#
+#  ToDo: parse function and SNMP section can be shared between inv_cisco_eox and inv_cisco_contract
+#        pro: only one section/parse function
+#        con: with only one pare function these plugins can not disabled separately
+#        solution: separate SNMP section, common parse function
+# ToDo: error handling for json.load -> in eox/contract pass, in psirt/bug -> exit
+# ToDo: exit codes ??
 #
-import logging
 import os
 import json
 import time
 
+from typing import Dict
+from dataclasses import dataclass
+
 from cmk.base.plugins.agent_based.agent_based_api.v1 import (
     register,
     SNMPTree,
@@ -37,20 +47,21 @@ from cmk.base.plugins.agent_based.agent_based_api.v1.type_defs import (
     InventoryResult,
 )
 
-# from cmk.base.plugins.agent_based.utils import ciscoapi as utils
 from cmk.base.plugins.agent_based.utils.ciscoapi import (
-    set_loglevel,
     expand_path,
-    compact_info_by_serial,
     check_bad_serial,
     pid_on_black_list,
-    sn_on_black_list,
-    pid_on_bad_list,
-    set_PID_black_list,
-    set_PID_bad_list,
-    set_SN_black_list,
+    set_pid_black_list,
+    get_base_path,
 )
 
+
+@dataclass
+class SnmpContractEntry:
+    phydescr: str
+    pid: str
+
+
 def _create_sn2info_record(sn2infofile, optional_columns):
     sn2info = {}
     if os.path.isfile(sn2infofile):
@@ -58,10 +69,9 @@ def _create_sn2info_record(sn2infofile, optional_columns):
             sn2inforecord = json.load(f)
 
         modifytime = os.path.getmtime(sn2infofile)
-        sn2info.update({'Last_checked': time.strftime('%Y-%m-%d', time.localtime(modifytime))
-                        })
+        sn2info.update({'Last_checked': time.strftime('%Y-%m-%d', time.localtime(modifytime))})
 
-        # add nonempty values to sn2inforecord
+        # add nonempty values to sn2info record
         for key, value in [
             ('serial_number', sn2inforecord.get('sr_no')),
             ('is_covered', sn2inforecord.get('is_covered')),
@@ -77,200 +87,93 @@ def _create_sn2info_record(sn2infofile, optional_columns):
             ('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)
-    # print(sn2info)
     return sn2info
 
-def parse_inv_cisco_contract(string_table: StringTable):
-    section = string_table
-    return section
-
-def inventory_cisco_contract(params, section) -> InventoryResult:
-    set_loglevel()
 
-    disable_contract = False
-    optionalcolumns = ['contract_site_state_province',
-                       'warranty_type_description',
-                       'warranty_end_date',
-                       'warranty_type',
-                       ]
-    base_path = '~/var/ciscoapi'
-    conf_file = '~/etc/ciscoapi/ciscoapi.json'
-    conf_file = os.path.expanduser(conf_file)
+def parse_inv_cisco_contract(string_table: StringTable) -> Dict[str, SnmpContractEntry]:
+    serials: Dict[str, SnmpContractEntry] = {}
+    for phydescr, physerialnum, phymodelname in string_table:
+        if not check_bad_serial(physerialnum):
+            if not pid_on_black_list(phymodelname):
+                phymodelname = phymodelname.strip()
+                physerialnum = physerialnum.strip()
+                if phymodelname == '':
+                    phymodelname = 'UNSPECIFIED'
+                pid = phymodelname.split()[0].upper()
+                serial = physerialnum.split()[0].upper()
+                if serial not in serials.keys():
+                    serials.update({serial: SnmpContractEntry(
+                        phydescr=phydescr,
+                        pid=pid
+                    )})
+                else:
+                    temp = serials[serial]
+                    temp.phydescr = ', '.join(list(set(temp.phydescr.split(', ') + [phydescr])))
+                    temp.pid = ', '.join(list(set(temp.pid.split(', )') + [pid])))
+                    serials[serial] = temp
+
+    return serials
+
+
+def inventory_cisco_contract(params, section: Dict[str, SnmpContractEntry]) -> InventoryResult:
+    optionalcolumns = [
+        'contract_site_state_province',
+        'warranty_type_description',
+        'warranty_end_date',
+        'warranty_type',
+    ]
 
     # get parameters from wato
     if params:
         optionalcolumns = params.get('removecolumns', optionalcolumns)
-        set_PID_black_list(params.get('PID_black_list'))
-
-    # check for conf_file and read parameters
-    if os.path.isfile(conf_file):
-        with open(conf_file) as f:
-            try:
-                config = json.load(f)
-                base_path = config['global']['base_dir']
-            except ValueError as e:
-                logging.warning(f'snmp_cisco_eox:status:JSON load error: {e}')
-                # exit()
+        set_pid_black_list(params.get('PID_black_list'))
 
+    base_path = get_base_path()
     sn2info_dir = base_path + '/sn2info'
     path_found = expand_path(sn2info_dir + '/found/')
     path_not_found = expand_path(sn2info_dir + '/not_found/')
     path_request = expand_path(sn2info_dir + '/request/')
-    status_path = expand_path(base_path + '/status')
 
     path = ['hardware', 'support', 'cisco_contract']
 
-    serials = []
-    serialscontract = []
-    nodes ={}
-
-    logging.info('raw info: %s' % section)
-
-    # if no serial or no PID no service ;-)
-    # remove all empty serials
-    info = [i for i in section if not check_bad_serial(i[1])]
-    # remove all empty PIDs
-    #info = [i for i in info if i[2] != '']
-
-    logging.info('info no empty pid/serail: %s' % info)
-
-    info = compact_info_by_serial(info)
-
-    for phydescr, physerialnum, phymodelname in info:
-
-        logging.info('raw pid  : %s' % phymodelname)
-        logging.info('raw sn   : %s' % physerialnum)
-        logging.info('raw desc : %s' % phydescr)
-
-        # 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, 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'
-
-            # create list of serial numbers to request contract info for
-            serials.append(physerialnum)
-            key_columns = {'serial_number': physerialnum}
+    for serial in section.keys():
+        if not pid_on_black_list(section[serial].pid):
+            key_columns = {'serial_number': serial}
+            serialscontract = ({
+                'pid': section[serial].pid,
+                'ProductIDDescription': section[serial].phydescr,
+                'is_covered': 'requested',
+            })
+            # find serial in SER-sn2info-covered
+            if os.path.isfile(path_found + serial):
+                serialscontract.update(_create_sn2info_record(path_found + serial, optionalcolumns))
+                serialscontract.pop('serial_number')
+            # find serial in SER-sn2info-notcovered
+            elif os.path.isfile(path_not_found + serial):
+                modifytime = os.path.getmtime(path_not_found + serial)
+                serialscontract.update({
+                    'is_covered': 'NO',
+                    'Last_checked': time.strftime('%Y-%m-%d', time.localtime(modifytime)),
+                })
+            else:
+                # create new request in SER-sn2info-request
+                if not os.path.isfile(path_request + serial):
+                    with open(path_request + serial, 'w+') as f:  # only create file (touch)
+                        pass
+                modifytime = os.path.getmtime(path_request + serial)
+                serialscontract.update({
+                    'Last_checked': time.strftime('%Y-%m-%d', time.localtime(modifytime)),
+                })
             yield TableRow(
                 path=path,
                 key_columns=key_columns,
-                inventory_columns={
-                    'pid': pid,
-                    'ProductIDDescription': phydescr,
-                }
+                inventory_columns=serialscontract
             )
-            nodes[physerialnum] = {
-                'pid': pid,
-                'ProductIDDescription': phydescr,
-            }
-
-
-    logging.info("serial numbers : %s" % serials)
-
-    for serial in serials:
-        logging.info("Serialnumber: %s " % serial)
-        # find serial in SER-sn2info-covered
-        # print(serial)
-        if os.path.isfile(path_found + serial):
-            logging.info("Serial number covered: %s" % serial)
-            # print(f'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):
-            logging.info("Serial number not covered: %s" % serial)
-            modifytime = os.path.getmtime(path_not_found + serial)
-            serialscontract.append({"serial_number": serial,
-                                    "is_covered": "NO",
-                                    "Last_checked": time.strftime('%Y-%m-%d', time.localtime(modifytime)),
-                                    })
-        else:
-            # create new request in SER-sn2info-request
-            logging.info("SER request: %s" % serial)
-            if not os.path.isfile(path_request + serial):
-                with open(path_request + serial, 'w+') as f:
-                    pass
-            modifytime = os.path.getmtime(path_request + serial)
-            serialscontract.append({"serial_number": serial,
-                                    "is_covered": "requested",
-                                    "Last_checked": time.strftime('%Y-%m-%d', time.localtime(modifytime)),
-                                    })
-
-    logging.info("Serials contract : %s" % serialscontract)
-    # print(serialscontract)
-    # update default entrys with data
-    for physerialnum in nodes.keys():
-        #print(f'serial from nodes: {physerialnum}')
-        for serial in serialscontract:
-            #print(f'serial from serialscontract {serial}')
-            if physerialnum == serial['serial_number']:
-                key_columns = {'serial_number': physerialnum}
-                # print(f'serial_number from serial {serial["serial_number"]}, serial from nodes: {physerialnum}')
-                temp_ser = serial.copy()
-                temp_ser.pop('serial_number')
-                # print(f'inventory_columns {temp_ser}, key_columns: {key_columns}, path: {path}')
-                yield TableRow(
-                    path=path,
-                    key_columns=key_columns,
-                    inventory_columns=temp_ser
-                )
-
-
-    # # create and write back api status, will be used for active check cisco_api_status
-    # apistatus = {}
-    # lastrun = {}
-    # apiname = 'sn2info'
-    # use_keys = ['serial_number',
-    #             'covered_product_line_end_date',
-    #             'service_contract_number',
-    #             'Last_checked',
-    #             'pid',
-    #             'ProductIDDescription',
-    #             'Last_checked',
-    #             'is_covered',
-    #             ]
-    # thisrun = []
-    #
-    # # add only used keys to status
-    # for entry in node:
-    #     this_entry = {}
-    #     for key in entry.keys():
-    #         if key in use_keys:
-    #             this_entry.update({key: entry.get(key)})
-    #     thisrun.append(this_entry)
-    #
-    # # in CMK v1.5.x global variable g_hostname was replaced by API call host_name()
-    # try:
-    #     _hostname = host_name()
-    # except NameError:
-    #     _hostname = g_hostname
-    #
-    # if os.path.isfile(status_path + _hostname):
-    #     with open(status_path + _hostname) as f:
-    #         try:
-    #             apistatus = json.load(f)
-    #         except ValueError as e:
-    #             logging.warning(f'snmp_cisco_contract:status:JSON load error: {e}')
-    #
-    # if apistatus.get(apiname, None) is not None:
-    #     lastrun = apistatus.get(apiname).get('lastrun', {})
-    #
-    # if lastrun != thisrun:
-    #     apistatus.update({apiname: {}})
-    #     apistatus.get(apiname).update({'lastrun': thisrun})
-    #     with open(status_path + _hostname, 'w') as f:
-    #         json.dump(apistatus, f)
 
 
 register.snmp_section(
@@ -284,7 +187,6 @@ register.snmp_section(
             '13',  # entPhysicalModelName
         ]
     ),
-
     detect=any_of(
         contains('.1.3.6.1.2.1.1.1.0', 'cisco'),
         startswith('.1.3.6.1.2.1.1.2.0', '.1.3.6.1.4.1.9.1')
@@ -294,9 +196,6 @@ register.snmp_section(
 register.inventory_plugin(
     name='inv_cisco_contract',
     inventory_function=inventory_cisco_contract,
-    inventory_default_parameters={
-    },
+    inventory_default_parameters={},
     inventory_ruleset_name='inv_cisco_contract',
 )
-
-
diff --git a/agent_based/inv_cisco_eox.py b/agent_based/inv_cisco_eox.py
index ee28772..6827dc1 100644
--- a/agent_based/inv_cisco_eox.py
+++ b/agent_based/inv_cisco_eox.py
@@ -18,12 +18,15 @@
 # 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
+# 2021-07-26: cleanup
 
 import os
 import json
-import logging
 import time
 
+from typing import Dict
+from dataclasses import dataclass
+
 from cmk.base.plugins.agent_based.agent_based_api.v1 import (
     register,
     SNMPTree,
@@ -39,19 +42,23 @@ from cmk.base.plugins.agent_based.agent_based_api.v1.type_defs import (
 
 # from cmk.base.plugins.agent_based.utils import ciscoapi as utils
 from cmk.base.plugins.agent_based.utils.ciscoapi import (
-    set_loglevel,
     expand_path,
-    compact_info_by_serial,
     check_bad_serial,
     pid_on_black_list,
     sn_on_black_list,
     pid_on_bad_list,
-    set_PID_black_list,
-    set_PID_bad_list,
-    set_SN_black_list,
+    set_pid_bad_list,
+    set_sn_black_list,
+    get_base_path,
 )
 
 
+@dataclass
+class SnmpContractEntry:
+    phydescr: str
+    pid: str
+
+
 def _create_eox_record(eoxfile, optional_columns):
     eox = {}
     if os.path.isfile(eoxfile):
@@ -64,7 +71,7 @@ def _create_eox_record(eoxfile, optional_columns):
         eox['pid'] = eoxrecord.get('EOLProductID')
 
         # Migration Info
-        EOXMigrationDetails = eoxrecord.get('EOXMigrationDetails')
+        eox_migration_details = eoxrecord.get('EOXMigrationDetails')
 
         for key, value in [
             ('ProductIDDescription', eoxrecord.get('ProductIDDescription', '')),
@@ -80,31 +87,49 @@ def _create_eox_record(eoxfile, optional_columns):
             ('EndOfRoutineFailureAnalysisDate', eoxrecord.get('EndOfRoutineFailureAnalysisDate').get('value', '')),
 
             # Migration Info
-            ('MigrationProductId', EOXMigrationDetails.get('MigrationProductId', '')),
-            ('MigrationInformation', EOXMigrationDetails.get('MigrationInformation', '')),
-            ('MigrationProductInfoURL', EOXMigrationDetails.get('MigrationProductInfoURL', '')),
-            ('MigrationProductName', EOXMigrationDetails.get('MigrationProductName', '')),
+            ('MigrationProductId', eox_migration_details.get('MigrationProductId', '')),
+            ('MigrationInformation', eox_migration_details.get('MigrationInformation', '')),
+            ('MigrationProductInfoURL', eox_migration_details.get('MigrationProductInfoURL', '')),
+            ('MigrationProductName', eox_migration_details.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_input_type = eoxrecord.get('EOXInputType')
+        if eox_input_type == 'ShowEOXBySerialNumber':
             eox['serial_number'] = eoxrecord.get('EOXInputValue')
 
     return eox
 
 
-def parse_inv_cisco_eox(string_table: StringTable):
-    section = string_table
-    return section
-
-
-def inventory_cisco_eox(params, section) -> InventoryResult:
-    set_loglevel()
-
+def parse_inv_cisco_eox(string_table: StringTable) -> Dict[str, SnmpContractEntry]:
+    serials: Dict[str, SnmpContractEntry] = {}
+    for phydescr, physerialnum, phymodelname in string_table:
+        if not check_bad_serial(physerialnum):
+            if not pid_on_black_list(phymodelname):
+                phymodelname = phymodelname.strip()
+                physerialnum = physerialnum.strip()
+                if phymodelname == '':
+                    phymodelname = 'UNSPECIFIED'
+                pid = phymodelname.split()[0].upper()
+                serial = physerialnum.split()[0].upper()
+                if serial not in serials.keys():
+                    serials.update({serial: SnmpContractEntry(
+                        phydescr=phydescr,
+                        pid=pid
+                    )})
+                else:
+                    temp = serials[serial]
+                    temp.phydescr = ', '.join(list(set(temp.phydescr.split(', ') + [phydescr])))
+                    temp.pid = ', '.join(list(set(temp.pid.split(', )') + [pid])))
+                    serials[serial] = temp
+
+    return serials
+
+
+def inventory_cisco_eox(params, section: Dict[str, SnmpContractEntry]) -> InventoryResult:
     always_use_serial = False
     optionalcolumns = ['EndOfSecurityVulSupportDate',
                        'EndOfSWMaintenanceReleases',
@@ -114,32 +139,15 @@ def inventory_cisco_eox(params, section) -> InventoryResult:
                        'MigrationProductName',
                        ]
 
-    base_path = '~/var/ciscoapi'
-    conf_file = '~/etc/ciscoapi/ciscoapi.json'
-    conf_file = os.path.expanduser(conf_file)
-
     # get parameters from wato
     if params:
         always_use_serial = params.get('always_use_serial', always_use_serial)
         optionalcolumns = params.get('removecolumns', optionalcolumns)
-        set_SN_black_list(params.get('SN_black_list'))
-        set_SN_black_list(params.get('PID_black_list'))
-        set_PID_bad_list(params.get('PID_bad_list'))
-
-
-
-
-    # check for conf_file and read parameters
-    if os.path.isfile(conf_file):
-        with open(conf_file) as f:
-            try:
-                config = json.load(f)
-                base_path = config['global']['base_dir']
-            except ValueError as e:
-                logging.warning(f'snmp_cisco_eox:status:JSON load error: {e}')
-                # exit()
-
+        set_sn_black_list(params.get('SN_black_list'))
+        set_sn_black_list(params.get('PID_black_list'))
+        set_pid_bad_list(params.get('PID_bad_list'))
 
+    base_path = get_base_path()
     eox_path = base_path + '/EoX'
     path_found = eox_path + '/found'
     path_not_found = eox_path + '/not_found'
@@ -153,209 +161,109 @@ def inventory_cisco_eox(params, section) -> InventoryResult:
     path_found_ser = expand_path(path_found + '/ser')
     path_not_found_ser = expand_path(path_not_found + '/ser')
 
-    status_path = expand_path(base_path + '/status')
-
     path = ['hardware', 'support', 'cisco_eox']
 
     pids = []
-    pidseox = []
+    pidseox = {}
     serials = []
-    serialseox = []
-    nodes ={}
-
-    logging.info('raw info: %s' % section)
-
-    # if no serial or no PID no service ;-)
-    # remove all empty serials
-    info = [i for i in section if not check_bad_serial(i[1])]
-    # remove all empty PIDs
-    # info = [i for i in info if i[2] != '']
-
-    logging.info('info no empty pid/serail: %s' % info)
-
-    # compact info will remove PIDs on black list and join entry's with identical serial number
-    info = compact_info_by_serial(info)
-
-    for phydescr, physerialnum, phymodelname in info:
-
-        logging.info('raw pid  : %s' % phymodelname)
-        logging.info('raw sn   : %s' % physerialnum)
-        logging.info('raw desc : %s' % phydescr)
-
-        # cut PID/SN at first space sign, change to all Uppercase
-        pid = phymodelname.split()[0].upper()
-        physerialnum = physerialnum.split()[0].upper()
+    serialseox = {}
+    nodes = {}
 
+    for serial in section.keys():
         # 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'
+        if not pid_on_black_list(section[serial].pid) and not sn_on_black_list(serial):
+            if section[serial].phydescr == '':
+                section[serial].phydescr = 'requested'
 
             # 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)
-                logging.info('use SN: %s' % physerialnum)
-                serials.append(physerialnum)
+            if pid_on_bad_list(section[serial].pid) or always_use_serial:
+                serials.append(serial)
             else:
-                pids.append(pid)
-                logging.info('PID not on bad list: %s' % pid)
+                pids.append(section[serial].pid)
 
             # create default node entry for PID/SN
-            key_columns = {'serial_number': physerialnum}
+            key_columns = {'serial_number': serial}
             yield TableRow(
                 path=path,
                 key_columns=key_columns,
                 inventory_columns={
-                    'pid': pid,
-                    'ProductIDDescription': phydescr,
+                    'pid': section[serial].pid,
+                    'ProductIDDescription': section[serial].phydescr,
                 }
             )
-            nodes[physerialnum] = {
-                'pid': pid,
-                'ProductIDDescription': phydescr,
+            nodes[serial] = {
+                'pid': section[serial].pid,
+                'ProductIDDescription': section[serial].phydescr,
             }
 
-    logging.info("PIDs : %s" % pids)
-
     # remove duplicates
     pids = list(set(pids))
-    logging.info("PIDs : %s" % pids)
-
     for pid in pids:
-        logging.info("PID: %s " % pid)
         pidfile = pid.replace('/', '_')
         # 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, optionalcolumns))
-            logging.info("EOX Record: %s" % pidseox)
+            pidseox.update({pid: _create_eox_record(path_found_pid + pidfile, optionalcolumns)})
         # find pid in PID-EOX-unknown
         elif os.path.isfile(path_not_found_pid + pidfile):
-            logging.info("PID unknown: %s" % pid)
             modifytime = os.path.getmtime(path_not_found_pid + pidfile)
-            logging.info("PID unknown modify time: %s" % time.strftime('%Y-%m-%d', time.localtime(modifytime)))
-            pidseox.append({"pid": pid,
-                            "EOXExternalAnnouncementDate": "None found",
-                            "Last_checked": time.strftime('%Y-%m-%d', time.localtime(modifytime)),
-                            })
+            pidseox.update({pid: {
+                'pid': pid,
+                'EOXExternalAnnouncementDate': 'None found',
+                'Last_checked': time.strftime('%Y-%m-%d', time.localtime(modifytime)),
+            }})
         else:
             # create new request in PID-EOX-request
-            logging.info("PID request: %s" % pid)
             if not os.path.isfile(path_request_pid + pidfile):
-                with open(path_request_pid + pidfile, 'w+') as f:
+                with open(path_request_pid + pidfile, 'w+') as f:  # only create file
                     # only create file
                     pass
             modifytime = os.path.getmtime(path_request_pid + pidfile)
-            pidseox.append({"pid": pid,
-                            "EOXExternalAnnouncementDate": 'requested',
-                            "Last_checked": time.strftime('%Y-%m-%d', time.localtime(modifytime)),
-                            })
+            pidseox.update({pid: {
+                'pid': pid,
+                'EOXExternalAnnouncementDate': 'requested',
+                'Last_checked': time.strftime('%Y-%m-%d', time.localtime(modifytime)),
+            }})
 
     for serial in serials:
-        logging.info("Serialnumber: %s " % serial)
         # 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, optionalcolumns))
-            logging.info("Serialnumber Record: %s" % serialseox)
+            serialseox.update({serial: _create_eox_record(path_found_ser + serial, optionalcolumns)})
         # find serial in SER-EOX-unknown
         elif os.path.isfile(path_not_found_ser + serial):
-            logging.info("Serialnumber unknown: %s" % serial)
             modifytime = os.path.getmtime(path_not_found_ser + serial)
-            serialseox.append({"serial_number": serial,
-                               "EOXExternalAnnouncementDate": "None found",
-                               "Last_checked": time.strftime('%Y-%m-%d', time.localtime(modifytime))
-                               })
+            serialseox.update({serial: {
+                'serial_number': serial,
+                'EOXExternalAnnouncementDate': 'None found',
+                'Last_checked': time.strftime('%Y-%m-%d', time.localtime(modifytime))
+            }})
         else:
             # create new request in SER-EOX-request
-            logging.info("SER request: %s" % serial)
             if not os.path.isfile(path_request_ser + serial):
-                with open(path_request_ser + serial, 'w+') as f:
-                    # only create file
+                with open(path_request_ser + serial, 'w+') as f:  # only create file
                     pass
             modifytime = os.path.getmtime(path_request_ser + serial)
-            serialseox.append({"serial_number": serial,
-                               "EOXExternalAnnouncementDate": 'requested',
-                               "Last_checked": time.strftime('%Y-%m-%d', time.localtime(modifytime)),
-                               })
-
-    logging.info("PID EoX : %s" % pidseox)
-    logging.info("Serials EoX : %s" % serialseox)
+            serialseox.update({serial: {
+                'serial_number': serial,
+                'EOXExternalAnnouncementDate': 'requested',
+                'Last_checked': time.strftime('%Y-%m-%d', time.localtime(modifytime)),
+            }})
 
     for physerialnum in nodes.keys():
         # create default node entry for PID/SN
         key_columns = {'serial_number': physerialnum}
-        for pid in pidseox:
-            if nodes[physerialnum]['pid'] == pid['pid']:
-                yield TableRow(
-                    path=path,
-                    key_columns=key_columns,
-                    inventory_columns=pid
-                )
-        for serial in serialseox:
-            if physerialnum == serial['serial_number']:
-                temp_ser = serial.copy()
-                temp_ser.pop('serial_number')
-                yield TableRow(
-                    path=path,
-                    key_columns=key_columns,
-                    inventory_columns=temp_ser
-                )
-
-
-    # create and write back api status, will be used for active check cisco_api_status
-    # apistatus = {}
-    # lastrun = {}
-    # apiname = 'eox'
-    # use_keys = ['EndOfSaleDate',
-    #             'ProductIDDescription',
-    #             'ProductBulletinNumber',
-    #             'pid',
-    #             'UpdatedTimeStamp',
-    #             'EOXExternalAnnouncementDate',
-    #             'Last_checked',
-    #             'EndOfSvcAttachDate',
-    #             'LastDateOfSupport',
-    #             ]
-    # thisrun = []
-    # unique_entrys = {}
-
-    # add only used keys to status
-    # for entry in node:
-    #     this_entry = {}
-    #     for key in entry.keys():
-    #         if key in use_keys:
-    #             this_entry.update({key: entry.get(key)})
-    #     # add only unique entries to status
-    #     unique_entrys.update({this_entry.get('pid'): this_entry})
-
-    # create list for unique entries by PID
-    # for key in unique_entrys.keys():
-    #     thisrun.append(unique_entrys.get(key))
-
-    # in CMK v1.5.x global variable g_hostname was replaced by API call host_name()
-    # try:
-    #     _hostname = host_name()
-    # except NameError:
-    #     _hostname = g_hostname
-
-    # if os.path.isfile(status_path + _hostname):
-    #     with open(status_path + _hostname) as f:
-    #         try:
-    #             apistatus = json.load(f)
-    #         except ValueError:
-    #             logging.warning(f'snmp_cisco_eox:status:JSON load error: {status_path + _hostname}')
-    #
-    # if apistatus.get(apiname, None) is not None:
-    #     lastrun = apistatus.get(apiname).get('lastrun', {})
-    #
-    # if lastrun != thisrun:
-    #     apistatus.update({apiname: {}})
-    #     apistatus.get(apiname).update({'lastrun': thisrun})
-    #     with open(status_path + _hostname, 'w') as f:
-    #         json.dump(apistatus, f)
+        if nodes[physerialnum]['pid'] in pidseox.keys():
+            yield TableRow(
+                path=path,
+                key_columns=key_columns,
+                inventory_columns=pidseox[nodes[physerialnum]['pid']]
+            )
+        if physerialnum in serialseox.keys():
+            serialseox[physerialnum].pop('serial_number')
+            yield TableRow(
+                path=path,
+                key_columns=key_columns,
+                inventory_columns=serialseox[physerialnum]
+            )
 
 
 register.snmp_section(
@@ -379,7 +287,6 @@ register.snmp_section(
 register.inventory_plugin(
     name='inv_cisco_eox',
     inventory_function=inventory_cisco_eox,
-    inventory_default_parameters={
-    },
+    inventory_default_parameters={},
     inventory_ruleset_name='inv_cisco_eox',
 )
diff --git a/agent_based/inv_cisco_psirt.py b/agent_based/inv_cisco_psirt.py
index f337914..26955bd 100644
--- a/agent_based/inv_cisco_psirt.py
+++ b/agent_based/inv_cisco_psirt.py
@@ -18,19 +18,22 @@
 #              node = inv_tree('software.support.cisco_psirt.')
 #             changed variable host_name to _hostname for cmk 1.5
 # 2021-07-24: rewritten for CMK 2.0
+# 2021-07-26: cleanup
+#
+# ToDo: add number of psirt records to status information
 #
 
 import os
 import json
-import logging
 import time
 from typing import List
+from dataclasses import dataclass
+
 from cmk.base.plugins.agent_based.agent_based_api.v1 import (
     register,
     SNMPTree,
     contains,
     any_of,
-    OIDEnd,
     startswith,
     TableRow,
     Attributes,
@@ -41,70 +44,90 @@ from cmk.base.plugins.agent_based.agent_based_api.v1.type_defs import (
     InventoryResult,
 )
 
-# from cmk.base.plugins.agent_based.utils import ciscoapi as utils
 from cmk.base.plugins.agent_based.utils.ciscoapi import (
-    set_loglevel,
     expand_path,
-    compact_info_by_serial,
-    check_bad_serial,
-    pid_on_black_list,
-    sn_on_black_list,
-    pid_on_bad_list,
-    set_PID_black_list,
-    set_PID_bad_list,
-    set_SN_black_list,
+    get_base_path,
 )
 
 
-def parse_inv_cisco_psirt(string_table: List[StringTable]):
-    section = string_table
-    return section
-
-
-def inventory_cisco_psirt(params, section) -> InventoryResult:
-    def create_psirt_record(filepath, filename, not_updated, dont_show_older_then, optionalcolumns):
-        psirtfile = filepath + filename
-        advisories = {}
-        if os.path.isfile(psirtfile):
-            with open(psirtfile) as f:
-                psirtrecord = json.load(f)
-            advisories = psirtrecord.get('advisories')
-            remove_advisories = []
-            for advisory in advisories:
-                lastUpdated = advisory.get('lastUpdated', 'T1980-01-01').split('T')[0]
-                if lastUpdated == '':
-                    lastUpdated = '1980-01-01'
-                if (not_updated > int(
-                        (time.time() - time.mktime(time.strptime(lastUpdated, '%Y-%m-%d'))) / 86400)) and (
-                        lastUpdated >= dont_show_older_then):
-                    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({'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)
-            # for index in remove_advisories:
-            #    advisories.pop(index)
-
-        logging.info('snmp_cisco_psirt:create_psirt_recort:advisories: %s' % advisories)
-        return advisories
-
-    def get_OS_Version(cw_version, sysdescription, pids):
+@dataclass
+class SnmpPsirt:
+    version: str
+    product_family: str
+
+
+def _create_psirt_record(filepath, filename, not_updated, dont_show_older_then, optionalcolumns):
+    psirtfile = filepath + filename
+    advisories = {}
+    if os.path.isfile(psirtfile):
+        with open(psirtfile) as f:
+            psirtrecord = json.load(f)
+        advisories = psirtrecord.get('advisories')
+        remove_advisories = []
+        for advisory in advisories:
+            last_updated = advisory.get('lastUpdated', 'T1980-01-01').split('T')[0]
+            if last_updated == '':
+                last_updated = '1980-01-01'
+            if (not_updated > int(
+                    (time.time() - time.mktime(time.strptime(last_updated, '%Y-%m-%d'))) / 86400)) and (
+                    last_updated >= dont_show_older_then):
+                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({'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)
+        # for index in remove_advisories:
+        #    advisories.pop(index)
+    return advisories
+
+
+def _get_profuct_family(sysdescription: str) -> str:
+    if ' IOS ' in sysdescription:
+        if ' IOS-XE ' in sysdescription or 'IOSXE' in sysdescription or 'IOS Software [' in sysdescription:
+            return 'IOS-XE'
+        else:
+            return 'IOS'
+    elif 'NX-OS' in sysdescription:
+        if ' aci' in sysdescription or 'APIC ' in sysdescription:
+            return 'APIC'
+        else:
+            return 'NEXUS'
+    elif 'APIC ' in sysdescription:
+        return 'APIC'
+    elif 'Cisco Controller' in sysdescription:
+        return 'WLC'
+    elif 'Cisco Adaptive Security Appliance Version' in sysdescription:
+        return 'ASA'
+    elif 'Cisco PIX Security Appliance Version' in sysdescription:
+        return 'PIX'
+    elif ' AsyncOS ' in sysdescription:
+        if 'Model C' in sysdescription:
+            return 'ESA'
+        elif 'Model M' in sysdescription:
+            return 'SMA'
+        elif 'Model S' in sysdescription:
+            return 'WSA'
+    elif 'Integrated Management Controller' in sysdescription:
+        return 'IMC'
+    else:
+        return 'no_family_found_or_set'
+
+
+def _get_os_version(cw_version, sysdescription, pids):
         version = None
 
         if str(cw_version).find('CW_VERSION$') == 0:
@@ -131,110 +154,63 @@ def inventory_cisco_psirt(params, section) -> InventoryResult:
 
         return version
 
-    set_loglevel()
-
-    # disable_psirt = False
-    optionalcolumns = ['publicationUrl',
-                       'summary',
-                       'cwe',
-                       'cves',
-                       'productNames',
-                       'iosRelease',
-                       'ipsSignatures',
-                       'cvrfUrl',
-                       'ovalUrl',
-                       ]
+
+def parse_inv_cisco_psirt(string_table: List[StringTable]) -> SnmpPsirt:
+
+    cw_version, sysdescription = string_table[0][0]
+
+    pids = string_table[1]
+
+    return SnmpPsirt(
+        version=_get_os_version(cw_version, sysdescription, pids),
+        product_family=_get_profuct_family(sysdescription)
+    )
+
+
+def inventory_cisco_psirt(params, section: SnmpPsirt) -> InventoryResult:
+    optionalcolumns = [
+        'publicationUrl',
+        'summary',
+        'cwe',
+        'cves',
+        'productNames',
+        'iosRelease',
+        'ipsSignatures',
+        'cvrfUrl',
+        'ovalUrl',
+    ]
     product_family = None
     psirt_type = None
-    # version = ''
     not_updated = 10000000
-    dont_show_older_then = '0000-00-00'
-    conf_file = '~/etc/ciscoapi/ciscoapi.json'
-    conf_file = os.path.expanduser(conf_file)
-    psirt_status = {}
-    # prepare path variables (expand homedir and add '/')
-    base_path = '~/var/ciscoapi'
-    cw_version, sysdescription = section[0][0]
-    pids = section[1]
+    dont_show_older_then = '2000-01-01'
 
     # get parameters from wato
     if params:
         optionalcolumns = params.get('removecolumns', optionalcolumns)
         psirt_type = params.get('psirt_type', psirt_type)
         if type(psirt_type) == dict:
-            product_family = psirt_type.get('product_family', product_family)  # .upper()
+            product_family = psirt_type.get('product_family')  # .upper()
             not_updated = psirt_type.get('not_updated', not_updated)
-            dont_show_older_then = psirt_type.get('dont_show_older_then', dont_show_older_then)
-
-    # get OS version
-    version = get_OS_Version(cw_version, sysdescription, pids)
-    logging.info('snmp_cisco_psirt:version: %s' % version)
+            dont_show_older_then = psirt_type.get('dont_show_older_then')
 
     if not product_family:
         # try to get product family form system description
-        if ' IOS ' in sysdescription:
-            if ' IOS-XE ' in sysdescription or 'IOSXE' in sysdescription or 'IOS Software [' in sysdescription:
-                product_family = 'IOS-XE'
-            else:
-                product_family = 'IOS'
-        elif 'NX-OS' in sysdescription:
-            if ' aci' in sysdescription or 'APIC ' in sysdescription:
-                product_family = 'APIC'
-            else:
-                product_family = 'NEXUS'
-        elif 'APIC ' in sysdescription:
-            product_family = 'APIC'
-        elif 'Cisco Controller' in sysdescription:
-            product_family = 'WLC'
-        elif 'Cisco Adaptive Security Appliance Version' in sysdescription:
-            product_family = 'ASA'
-        elif 'Cisco PIX Security Appliance Version' in sysdescription:
-            product_family = 'PIX'
-        elif ' AsyncOS ' in sysdescription:
-            if 'Model C' in sysdescription:
-                product_family = 'ESA'
-            elif 'Model M' in sysdescription:
-                product_family = 'SMA'
-            elif 'Model S' in sysdescription:
-                product_family = 'WSA'
-        elif 'Integrated Management Controller' in sysdescription:
-            product_family = 'IMC'
-        else:
-            product_family = 'no_family_found_or_set'
-            logging.info('snmp_cisco_psirt:no_family_found_or_set: %s' % sysdescription)
+        product_family = section.product_family
     elif psirt_type in ['IOS', 'IOS-XE']:
         product_family = psirt_type
 
-    logging.info('snmp_cisco_psirt:product_family: %s' % product_family)
-
-    # check for conf_file and read parameters
-    if os.path.isfile(conf_file):
-        with open(conf_file) as f:
-            try:
-                config = json.load(f)
-                base_path = config['global']['base_dir']
-            except ValueError as e:
-                logging.warning(f'snmp_cisco_eox:status:JSON load error: {e}')
-
+    # set paths
+    base_path = get_base_path()
     psirt_dir = base_path + '/psirt'
-    status_path = expand_path(base_path + '/status')
-
-    path = ['software', 'support', 'cisco_psirt']
-    yield Attributes(
-        path=path,
-        inventory_attributes={
-            'os_version': version,
-            'Product_family': product_family,
-        })
-
     path_found = psirt_dir + '/found/'
     path_not_found = psirt_dir + '/not_found/'
     path_request = psirt_dir + '/request/'
+
     if product_family in ['IOS', 'IOS-XE']:
         path_found = path_found + product_family
         path_not_found = path_not_found + product_family
         path_request = path_request + product_family
-        psirt = version
+        psirt = section.version
     else:
         path_found = path_found + 'family'
         path_not_found = path_not_found + 'family'
@@ -245,36 +221,31 @@ def inventory_cisco_psirt(params, section) -> InventoryResult:
     path_not_found = expand_path(path_not_found)
     path_request = expand_path(path_request)
 
+    # set defaults for inventory entries
+    path = ['software', 'support', 'cisco_psirt']
+    attribute = {
+        'os_version': section.version,
+        'Product_family': product_family,
+    }
+
     # psirt record found
     if os.path.isfile(path_found + psirt):
-        logging.info('PSIRT:found: %s' % psirt)
         modifytime = os.path.getmtime(path_found + psirt)
-        yield Attributes(
-            path=path,
-            inventory_attributes={
-                'status': 'found',
-                'Last_checked': time.strftime('%Y-%m-%d', time.localtime(modifytime)),
-            })
-
-        # psirt_status.update(node)
+        attribute.update({
+            'status': 'found',
+            'Last_checked': time.strftime('%Y-%m-%d', time.localtime(modifytime)),
+        })
 
         # 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', optionalcolumns)
+        if product_family in ['IOS', 'IOS-XE']:  # do not remove entry's from IOS(XE)
+            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, optionalcolumns)
+            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,
-                    inventory_attributes={
-                        'dont_show_older_than': dont_show_older_then,
-                    })
+                attribute['dont_show_older_than'] = dont_show_older_then
             if not_updated != 10000000:
-                yield Attributes(
-                    path=path,
-                    inventory_attributes={
-                        'dont_show_not_updated_since': not_updated,
-                    })
+                attribute['dont_show_not_updated_since'] = not_updated
+
         for advisory in advisories:
             key_columns = {'advisoryId': advisory.get('advisoryId')}
             advisory.pop('advisoryId')
@@ -283,92 +254,29 @@ def inventory_cisco_psirt(params, section) -> InventoryResult:
                 key_columns=key_columns,
                 inventory_columns=advisory,
             )
-        # if optionalcolumns is not None:
-        #     for advisory in node:
-        #         # remove optional columns
-        #         logging.info('remove columns: %s' % optionalcolumns)
-        #         for column in optionalcolumns:
-        #             logging.info('remove column: %s' % column)
-        #             advisory.pop(column, None)
+
     # psirt record not found exists
     elif os.path.isfile(path_not_found + psirt):
-        logging.info('PSIRT:notfound: %s' % psirt)
         modifytime = os.path.getmtime(path_not_found + psirt)
-        yield Attributes(
-            path=path,
-            inventory_attributes={
-                'status': 'not found',
-                'Last_checked': time.strftime('%Y-%m-%d', time.localtime(modifytime)),
-            })
-        # psirt_status.update(node)
+        attribute.update({
+            'status': 'not found',
+            'Last_checked': time.strftime('%Y-%m-%d', time.localtime(modifytime)),
+        })
     elif psirt != 'no_family_found_or_set':
         # create new request
-        logging.info('PSIRT:request: %s' % psirt)
         if not os.path.isfile(path_request + psirt):
-            with open(path_request + psirt, 'w+') as f:
+            with open(path_request + psirt, 'w+') as f:  # only create file (touch)
                 pass
         modifytime = os.path.getmtime(path_request + psirt)
-        yield Attributes(
-            path=path,
-            inventory_attributes={
-                'status': 'requested',
-                'Last_checked': time.strftime('%Y-%m-%d', time.localtime(modifytime)),
-            })
-        # psirt_status.update(node)
-
-    # # create and write back api status, will be used for active check cisco_api_status
-    # apistatus = {}
-    # lastrun = {}
-    # laststatus = {}
-    # thisrun = []
-    # apiname = 'psirt'
-    # rewrite = False
-    # use_keys = ['sir', 'advisoryTitle', 'lastUpdated']
-    #
-    # if psirt_status != {}:
-    #
-    #     # in CMK v1.5.x global variable g_hostname was replaced by API call host_name()
-    #     try:
-    #         _hostname = host_name()
-    #     except NameError:
-    #         _hostname = g_hostname
-    #
-    #     if os.path.isfile(status_path + _hostname):
-    #         with open(status_path + _hostname) as f:
-    #             try:
-    #                 apistatus = json.load(f)
-    #             except ValueError as e:
-    #                 logging.warning(f'{_hostname}:snmp_cisco_psirt:status:JSON load error: {e}')
-    #
-    #     if apistatus.get(apiname, None) is not None:
-    #         lastrun = apistatus.get(apiname).get('lastrun', {})
-    #         laststatus.update({'status': apistatus.get(apiname).get('status', '')})
-    #         laststatus.update({'product_family': apistatus.get(apiname).get('product_family', '')})
-    #         laststatus.update({'Last_checked': apistatus.get(apiname).get('Last_checked', '')})
-    #     else:
-    #         apistatus.update({apiname: {}})
-    #
-    #     if psirt_status != laststatus:
-    #         apistatus.get(apiname).update(psirt_status)
-    #         rewrite = True
-    #
-    #     if psirt_status != node:
-    #         # cleanup psirt infos for status
-    #         advisories = node.get('advisories', {})
-    #         if advisories != {}:
-    #             for entry in advisories:
-    #                 this_entry = {}
-    #                 for key in entry.keys():
-    #                     if key in use_keys:
-    #                         this_entry.update({key: entry.get(key)})
-    #                 thisrun.append(this_entry)
-    #
-    #         if lastrun != thisrun:
-    #             apistatus.get(apiname).update({'lastrun': thisrun})
-    #             rewrite = True
-    #     if rewrite:
-    #         with open(status_path + _hostname, 'w') as f:
-    #             json.dump(apistatus, f)
+        attribute.update({
+            'status': 'requested',
+            'Last_checked': time.strftime('%Y-%m-%d', time.localtime(modifytime)),
+        })
+
+    yield Attributes(
+        path=path,
+        inventory_attributes=attribute,
+    )
 
 
 register.snmp_section(
@@ -384,7 +292,6 @@ register.snmp_section(
         SNMPTree(
             base='.1.3.6.1.2.1.47.1.1.1.1',  # ENTITY-MIB::entPhysicalEntry
             oids=[
-                # OIDEnd(),  # index of entry
                 '10',  # entPhysicalSoftwareRev
                 '13',  # entPhysicalModelName
                 '5',  # entPhysicalClass
@@ -400,7 +307,6 @@ register.snmp_section(
 register.inventory_plugin(
     name='inv_cisco_psirt',
     inventory_function=inventory_cisco_psirt,
-    inventory_default_parameters={
-    },
+    inventory_default_parameters={},
     inventory_ruleset_name='inv_cisco_psirt',
 )
diff --git a/agent_based/utils/ciscoapi.py b/agent_based/utils/ciscoapi.py
index 4ae674c..8d879e4 100644
--- a/agent_based/utils/ciscoapi.py
+++ b/agent_based/utils/ciscoapi.py
@@ -17,35 +17,52 @@
 import os
 import logging
 import re
+import json
 from typing import List
+
 #
 # global variables
 #
 # 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 = []
 
 
-def set_PID_black_list(PID_black_list: List[str]):
+def get_base_path() -> str:
+    conf_file = os.path.expanduser('~/etc/ciscoapi/ciscoapi.json')
+    base_path = '~/var/ciscoapi'
+    # check for conf_file and read parameters
+    if os.path.isfile(conf_file):
+        with open(conf_file) as f:
+            try:
+                config = json.load(f)
+                base_path = config['global'].get('base_dir', base_path)
+            except ValueError as e:
+                logging.warning(f'inv_cisco_contract:status:JSON load error: {e}')
+    return base_path
+
+
+def set_pid_black_list(pid_black_list: List[str]):
     global g_PID_black_list
-    if PID_black_list:
-        g_PID_black_list = list(set(g_PID_black_list + PID_black_list))
-    logging.info(f'PID_black_list: {g_PID_black_list}')
+    if pid_black_list:
+        g_PID_black_list = list(set(g_PID_black_list + pid_black_list))
+
+
+def set_pid_bad_list(pid_bad_list: List[str]):
+    global g_PID_bad_list
+    if pid_bad_list:
+        g_PID_bad_list = list(set(g_PID_bad_list + pid_bad_list))
 
-def set_PID_bad_list(PID_bad_list: List[str]):
-    global  g_PID_bad_list
-    if PID_bad_list:
-        g_PID_bad_list = list(set(g_PID_bad_list + PID_bad_list))
-    logging.info(f'PID_bad_list: {g_PID_bad_list}')
 
-def set_SN_black_list(SN_black_list: List[str]):
+def set_sn_black_list(sn_black_list: List[str]):
     global g_SN_black_list
-    if SN_black_list:
-        SN_black_list = list(set(g_SN_black_list + SN_black_list))
-    logging.info((f'SN_black_list: {SN_black_list}'))
+    if sn_black_list:
+        g_SN_black_list = list(set(g_SN_black_list + sn_black_list))
+
 
 # check if dir exists, if not try to create it.
 # return True if dir exists or creation was ok.
@@ -73,9 +90,9 @@ def expand_path(path):
 
 
 # returns True if SN on black list
-def sn_on_black_list(SN):
+def sn_on_black_list(serial):
     global g_SN_black_list
-    if SN.upper() in g_SN_black_list:
+    if serial.upper() in g_SN_black_list:
         return True
     return False
 
@@ -117,7 +134,7 @@ def check_bad_serial(serial):
 
     # remove all chars from string, except allowedchars
     allowedchars = re.compile('[^a-zA-Z0-9_=\-\+\.\\\]')
-    cleanserial = allowedchars.sub('',serial).strip()
+    cleanserial = allowedchars.sub('', serial).strip()
 
     logging.info('Check_bad_serial:cleanserial: %s' % cleanserial)
 
@@ -136,39 +153,3 @@ def set_loglevel():
     logging.basicConfig(level=logging.WARNING)
     # has no effect as long previous command is active (is by design)
     logging.basicConfig(level=logging.INFO)
-
-
-
-# compact info will remove PIDs on black list and join entry's with identical serial number
-# PIDs will by all uppercase and cut at the first space sign
-def compact_info_by_serial(info):
-    # compress module list by serial
-    # (base found on http://stackoverflow.com/questions/19811418/finding-duplicates-in-a-list-of-lists,
-    # answer from Mark Reed (thanks) http://stackoverflow.com/users/797049/mark-reed, a 'little' bit extended for my needs ;-) )
-    # objective: join module info for modules with identical serial number, if PIDs different then join them as comma separated
-    # string
-    compact_info = {}                                                                                 # empty dictionary
-    for description, serial, pid in info:                                                    # for every module in list
-        if len(pid.split()) != 0:
-            logging.info('compact_info_by_serial:pid_not_empty: pid %s' % pid)
-            pid = pid.split()[0].upper()                                                     # cut PID at first space sign, change to all Uppercase
-        else:
-            pid = 'UNSPECIFIED'
-        if not pid_on_black_list(pid):                                                                # drop blacklisted PIDs
-            if compact_info.get(serial) != None:                                                      # if module already in compact list
-                compact_info[serial] = pid + ',' + compact_info.get(serial, '') + ', ' + description  # update module info, append new PID + already covered module info + new description (pid/description are comma separated)
-            else:                                                                                     # for not already covered modules
-                compact_info[serial] = pid + '|' + description                                        # add key : value 'serial' : 'pid|description', pid and description are '|' separated
-    compact_info = map(list, compact_info.items())                                                    # change dictionary to list of lists , every entry ['serial', 'pid(s)|description(s)']
-    info = []                                                                                         # empty module list
-    for serial, summary in compact_info:                                                              # for every entry in compact_modules (summary is 'pid(s)|description(s)')
-        summary = summary.split('|')                                                                  # split pid and description (summary becomes list ['pid(s)', 'description(s)']
-        pid = ','.join(set(summary[0].split(',')))                                                    # split pid(s), remove duplicates, join as comma separated string
-        description = summary[1]                                                                      # description is comma separated string of description(s)
-        entry = []                                                                                    # create entry per module
-        entry.append(description)                                                                     # 1. description
-        entry.append(serial)                                                                          # 2. serial
-        entry.append(pid)                                                                             # 3. pid
-        info.append(entry)                                                                            # recreate the list of modules
-
-    return info
diff --git a/inv_cisco_support.mkp b/inv_cisco_support.mkp
index 98beed0b82237bae5dcfe94088455d38b073dd97..cdf4854337fad3c970f66c317fac6bc40f6cca77 100644
GIT binary patch
literal 27295
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
Y7vA%~C|6!o1-^crCh?p>JVQbJKXXc{%K!iX

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

-- 
GitLab