From 04529dd7f7be3f875167fd7a69a4e2a43da5aee3 Mon Sep 17 00:00:00 2001
From: "th.l" <thl-cmk@outlook.com>
Date: Thu, 21 Dec 2023 20:00:51 +0100
Subject: [PATCH] update project

---
 README.md                         |   1 +
 agent_based/ospfv3_area.py        |  40 ++++++++++----------
 agent_based/ospfv3_general.py     |  32 ++++++++--------
 agent_based/ospfv3_interface.py   |  54 +++++++++++++--------------
 agent_based/ospfv3_neighbor.py    |  54 +++++++++++++--------------
 agent_based/ospfv3_virtuallink.py |  59 +++++++++++++++---------------
 mkp/ospfv3-0.4.0-20231221.mkp     | Bin 0 -> 13220 bytes
 packages/ospfv3                   |   6 +--
 8 files changed, 123 insertions(+), 123 deletions(-)
 create mode 100644 mkp/ospfv3-0.4.0-20231221.mkp

diff --git a/README.md b/README.md
index ab18330..d9336c2 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,4 @@
+[PACKAGE]: ../../raw/master/mkp/ospfv3-0.4.0-20231221.mkp "ospfv3-0.4.0-20231221.mkp"
 # OSPFv3
 
 Monitors status of OSPFv3 enabled devices
diff --git a/agent_based/ospfv3_area.py b/agent_based/ospfv3_area.py
index 2117ba0..5a42acd 100644
--- a/agent_based/ospfv3_area.py
+++ b/agent_based/ospfv3_area.py
@@ -102,26 +102,26 @@ class OspfV3Area:
 def parse_ospfv3_area(string_table: StringTable) -> Dict[str, OspfV3Area]:
     areas = {}
     for area in string_table:
-        AreaId, AreaImportAsExtern, AreaSpfRuns, AreaBdrRtrCount, AreaAsBdrRtrCount, AreaScopeLsaCount, \
-        AreaScopeLsaCksumSum, AreaSummary, AreaStubMetric, AreaNssaTranslatorRole, AreaNssaTranslatorState, \
-        AreaNssaTranslatorStabInterval, AreaNssaTranslatorEvents, AreaStubMetricType, AreaTEEnabled, = area
-
-        areas[AreaId] = OspfV3Area(
-            AreaImportAsExtern=ospf_area_impotasextern(AreaImportAsExtern),
-            AreaSummary=ospf_area_summary(AreaSummary),
-            AreaSpfRuns=int(AreaSpfRuns),
-            AreaBdrRtrCount=int(AreaBdrRtrCount),
-            AreaAsBdrRtrCount=int(AreaAsBdrRtrCount),
-            AreaScopeLsaCount=int(AreaScopeLsaCount),
-            AreaScopeLsaCksumSum=int(AreaScopeLsaCksumSum),
-            AreaStubMetric=int(AreaStubMetric),
-            AreaNssaTranslatorRole=ospf_area_translatorrole(AreaNssaTranslatorRole),
-            AreaNssaTranslatorState=ospf_area_translatorrolestate(AreaNssaTranslatorState),
-            AreaNssaTranslatorStabInterval=int(AreaNssaTranslatorStabInterval),
-            AreaNssaTranslatorEvents=int(AreaNssaTranslatorEvents),
-            AreaStubMetricType=ospf_area_submetrictype(AreaStubMetricType),
-            AreaTEEnabled=ospf_area_teeenabled(AreaTEEnabled),
-            AreaType=get_area_type(AreaImportAsExtern, AreaSummary)
+        area_id, import_as_extern, spf_runs, bdr_rtr_count, as_bdr_rtr_count, scope_lsa_count, scope_lsa_cksum_sum, \
+            summary, stub_metric, nssa_translator_role, nssa_translator_state, nssa_translator_stab_interval, \
+            nssa_translator_events, stub_metric_type, te_enabled, = area
+
+        areas[area_id] = OspfV3Area(
+            AreaImportAsExtern=ospf_area_impotasextern(import_as_extern),
+            AreaSummary=ospf_area_summary(summary),
+            AreaSpfRuns=int(spf_runs),
+            AreaBdrRtrCount=int(bdr_rtr_count),
+            AreaAsBdrRtrCount=int(as_bdr_rtr_count),
+            AreaScopeLsaCount=int(scope_lsa_count),
+            AreaScopeLsaCksumSum=int(scope_lsa_cksum_sum),
+            AreaStubMetric=int(stub_metric),
+            AreaNssaTranslatorRole=ospf_area_translatorrole(nssa_translator_role),
+            AreaNssaTranslatorState=ospf_area_translatorrolestate(nssa_translator_state),
+            AreaNssaTranslatorStabInterval=int(nssa_translator_stab_interval),
+            AreaNssaTranslatorEvents=int(nssa_translator_events),
+            AreaStubMetricType=ospf_area_submetrictype(stub_metric_type),
+            AreaTEEnabled=ospf_area_teeenabled(te_enabled),
+            AreaType=get_area_type(import_as_extern, summary)
         )
     return areas
 
diff --git a/agent_based/ospfv3_general.py b/agent_based/ospfv3_general.py
index 7e790d8..c329191 100644
--- a/agent_based/ospfv3_general.py
+++ b/agent_based/ospfv3_general.py
@@ -89,26 +89,26 @@ class OspfV3General:
 
 def parse_ospfv3_general(string_table: StringTable) -> Optional[OspfV3General]:
     try:
-        OID_END, RouterId, AdminStatus, VersionNumber, AreaBdrRtrStatus, ASBdrRtrStatus, AsScopeLsaCount, \
-        AsScopeLsaCksumSum, OriginateNewLsas, RxNewLsas, ExtLsaCount, ExtAreaLsdbLimit, \
-        ReferenceBandwidth, StubRouterSupport, StubRouterAdvertisement = string_table[0]
+        oid_end, router_id, admin_status, version_number, area_bdr_rtr_status, as_bdr_rtr_status, as_scope_lsa_count, \
+            as_scope_lsa_cksum_sum, originate_new_lsas, rx_new_lsas, ext_lsa_count, ext_area_lsdb_limit, \
+            reference_bandwidth, stub_router_support, stub_router_advertisement = string_table[0]
     except (ValueError, IndexError):
         return
 
     return OspfV3General(
-        RouterId=render_ipv4_neighbor_id(RouterId),
-        AdminStatus=ospf_admin_status(AdminStatus),
-        VersionNumber=int(VersionNumber),
-        AreaBdrRtrStatus=ospf_abr_asbr_status(AreaBdrRtrStatus),
-        ASBdrRtrStatus=ospf_abr_asbr_status(ASBdrRtrStatus),
-        AsScopeLsaCount=int(AsScopeLsaCount),
-        AsScopeLsaCksumSum=int(AsScopeLsaCksumSum),
-        RxNewLsas=int(RxNewLsas),
-        ExtLsaCount=int(ExtLsaCount),
-        ExtAreaLsdbLimit=int(ExtAreaLsdbLimit),
-        ReferenceBandwidth=int(ReferenceBandwidth),
-        StubRouterSupport=ospf_stub_router_support(StubRouterSupport),
-        StubRouterAdvertisement=ospf_stub_router_advertisement(StubRouterAdvertisement),
+        RouterId=render_ipv4_neighbor_id(router_id),
+        AdminStatus=ospf_admin_status(admin_status),
+        VersionNumber=int(version_number),
+        AreaBdrRtrStatus=ospf_abr_asbr_status(area_bdr_rtr_status),
+        ASBdrRtrStatus=ospf_abr_asbr_status(as_bdr_rtr_status),
+        AsScopeLsaCount=int(as_scope_lsa_count),
+        AsScopeLsaCksumSum=int(as_scope_lsa_cksum_sum),
+        RxNewLsas=int(rx_new_lsas),
+        ExtLsaCount=int(ext_lsa_count),
+        ExtAreaLsdbLimit=int(ext_area_lsdb_limit),
+        ReferenceBandwidth=int(reference_bandwidth),
+        StubRouterSupport=ospf_stub_router_support(stub_router_support),
+        StubRouterAdvertisement=ospf_stub_router_advertisement(stub_router_advertisement),
     )
 
 
diff --git a/agent_based/ospfv3_interface.py b/agent_based/ospfv3_interface.py
index 79b5d38..101ddc6 100644
--- a/agent_based/ospfv3_interface.py
+++ b/agent_based/ospfv3_interface.py
@@ -11,6 +11,8 @@
 #
 # 2021-09-17: rewritten for CMK 2.0
 # 2021-10-02: added WATO options
+# 2023-12-21: replaced ifDescr by ifName
+#             fixed handling if non-matching ifIndex
 #
 # sample snmpwalk
 #
@@ -140,34 +142,32 @@ def parse_ospfv3_interface(string_table: List[StringTable]) -> Optional[Dict[str
     ospf_interfaces = {}
     interfaceinfo, interfaces = string_table
 
+    interfaces_by_index = {if_index: if_name for if_index, if_name in interfaces}
+
     for ospf_interface in interfaceinfo:
-        OID_END, IfAreaId, IfType, IfAdminStatus, IfRtrPriority, IfHelloInterval, IfRtrDeadInterval, IfPollInterval, \
-        IfState, IfDesignatedRouter, IfBackupDesignatedRouter, IfEvents, IfMetricValue, IfLinkScopeLsaCount, \
-        IfLinkLsaCksumSum = ospf_interface
+        oid_end, area_id, if_type, admin_state, rtr_priority, hello_interval, rtr_dead_interval, poll_interval, \
+            if_state, designated_router, backup_designated_router, if_events, metric_value, link_scope_lsa_count, \
+            link_lsa_cksum_sum = ospf_interface
 
-        ospfIfIndex, ospfIfInstId = OID_END.split('.')
+        ospf_if_index, ospf_if_inst_id = oid_end.split('.')
 
-        LocalInterface = ''
-        for interface in interfaces:
-            ifIndex, ifName = interface
-            if ifIndex == ospfIfIndex:
-                LocalInterface = get_short_if_name(ifName)
+        local_interface = get_short_if_name(interfaces_by_index.get(ospf_if_index, ospf_if_index))
 
-        ospf_interfaces[LocalInterface] = OspfV3Interface(
-            IfAreaId=int(IfAreaId),
-            IfType=ospf_if_type(IfType),
-            IfAdminStatus=ospf_if_admin_status(IfAdminStatus),
-            IfRtrPriority=int(IfRtrPriority),
-            IfHelloInterval=int(IfHelloInterval),
-            IfRtrDeadInterval=int(IfRtrDeadInterval),
-            IfPollInterval=int(IfPollInterval),
-            IfState=ospf_if_state(IfState),
-            IfDesignatedRouter=render_ipv4_neighbor_id(IfDesignatedRouter),
-            IfBackupDesignatedRouter=render_ipv4_neighbor_id(IfBackupDesignatedRouter),
-            IfEvents=int(IfEvents),
-            IfMetricValue=int(IfMetricValue),
-            IfLinkScopeLsaCount=int(IfLinkScopeLsaCount),
-            IfLinkLsaCksumSum=int(IfLinkLsaCksumSum),
+        ospf_interfaces[local_interface] = OspfV3Interface(
+            IfAreaId=int(area_id),
+            IfType=ospf_if_type(if_type),
+            IfAdminStatus=ospf_if_admin_status(admin_state),
+            IfRtrPriority=int(rtr_priority),
+            IfHelloInterval=int(hello_interval),
+            IfRtrDeadInterval=int(rtr_dead_interval),
+            IfPollInterval=int(poll_interval),
+            IfState=ospf_if_state(if_state),
+            IfDesignatedRouter=render_ipv4_neighbor_id(designated_router),
+            IfBackupDesignatedRouter=render_ipv4_neighbor_id(backup_designated_router),
+            IfEvents=int(if_events),
+            IfMetricValue=int(metric_value),
+            IfLinkScopeLsaCount=int(link_scope_lsa_count),
+            IfLinkLsaCksumSum=int(link_lsa_cksum_sum),
         )
     return ospf_interfaces
 
@@ -235,10 +235,10 @@ register.snmp_section(
             ]
         ),
         SNMPTree(
-            base='.1.3.6.1.2.1.2.2.1',  # 
+            base='.1.3.6.1.2.1.31.1.1.1',  #
             oids=[
-                '1',  # ifIndex
-                '2',  # ifDescr
+                OIDEnd(),  # ifIndex
+                '1',  # ifName
             ]
         ),
     ],
diff --git a/agent_based/ospfv3_neighbor.py b/agent_based/ospfv3_neighbor.py
index 2f7c9b7..5aec8d9 100644
--- a/agent_based/ospfv3_neighbor.py
+++ b/agent_based/ospfv3_neighbor.py
@@ -11,6 +11,8 @@
 #
 # 2021-09-17: rewritten for CMK 2.0
 # 2021-10-02: added WATO options
+# 2023-12-21: replaced ifDescr by ifName
+#             fixed handling if non-matching ifIndex
 #
 # .1.3.6.1.2.1.191.1.9.1.4.1.0.50529054 = INTEGER: 2
 # .1.3.6.1.2.1.191.1.9.1.5.1.0.50529054 = Hex-STRING: FE 80 00 00 00 00 00 00 01 92 01 68 00 00 00 03
@@ -118,31 +120,29 @@ def parse_ospfv3_neighbor(string_table: List[StringTable]) -> Dict[str, OspfV3Ne
     neighbors = {}
     neighborinfo, interfaces = string_table
 
+    interfaces_by_index = {if_index: if_name for if_index, if_name in interfaces}
+
     for neighbor in neighborinfo:
-        OID_END, nbrAddressType, nbrAddress, nbrOptions, nbrPriority, nbrState, nbrEvents, nbrLsRetransQLen, \
-        nbrHelloSuppressed, nbrRestartHelperStatus, nbrRestartHelperAge, nbrRestartHelperExitReason = neighbor
-
-        if nbrAddressType == '2':  # IPv6 address
-            nbrAddress = render_ipv6_address(nbrAddress)
-            nbrIfIndex, nbrIfInstId, nbrRtrId = OID_END.split('.')
-
-            nbrLocalInterface = ''
-            for interface in interfaces:
-                ifIndex, ifName = interface
-                if ifIndex == nbrIfIndex:
-                    nbrLocalInterface = get_short_if_name(ifName)
-
-            neighbors[f'{nbrAddress} on {nbrLocalInterface}'] = OspfV3Neighbor(
-                nbrRtrId=render_ipv4_neighbor_id(nbrRtrId),
-                nbrOptions=nbrOptions,
-                nbrPriority=int(nbrPriority),
-                nbrState=int(nbrState),
-                nbrEvents=int(nbrEvents),
-                nbrLsRetransQLen=int(nbrLsRetransQLen),
-                nbrHelloSuppressed=ospf_nbr_hellosuppressed(nbrHelloSuppressed),
-                nbrRestartHelperStatus=ospf_nbr_helperstatus(nbrRestartHelperStatus),
-                nbrRestartHelperAge=int(nbrRestartHelperAge),
-                nbrRestartHelperExitReason=ospf_nbr_helperexitreason(nbrRestartHelperExitReason),
+        oid_end, address_type, address, options, priority, state, events, ls_retrans_q_len, hello_suppressed, \
+            restart_helper_status, restart_helper_age, restart_helper_exit_reason = neighbor
+
+        if address_type == '2':  # IPv6 address
+            address = render_ipv6_address(address)
+            nbr_if_index, nbr_if_inst_id, nbr_rtr_id = oid_end.split('.')
+
+            nbr_local_interface = get_short_if_name(interfaces_by_index.get(nbr_if_index, nbr_if_index))
+
+            neighbors[f'{address} on {nbr_local_interface}'] = OspfV3Neighbor(
+                nbrRtrId=render_ipv4_neighbor_id(nbr_rtr_id),
+                nbrOptions=options,
+                nbrPriority=int(priority),
+                nbrState=int(state),
+                nbrEvents=int(events),
+                nbrLsRetransQLen=int(ls_retrans_q_len),
+                nbrHelloSuppressed=ospf_nbr_hellosuppressed(hello_suppressed),
+                nbrRestartHelperStatus=ospf_nbr_helperstatus(restart_helper_status),
+                nbrRestartHelperAge=int(restart_helper_age),
+                nbrRestartHelperExitReason=ospf_nbr_helperexitreason(restart_helper_exit_reason),
             )
     if neighbors:
         return neighbors
@@ -224,10 +224,10 @@ register.snmp_section(
             ]
         ),
         SNMPTree(
-            base='.1.3.6.1.2.1.2.2.1',  # 
+            base='.1.3.6.1.2.1.31.1.1.1',  #
             oids=[
-                '1',  # ifIndex
-                '2',  # ifDescr
+                OIDEnd(),  # ifIndex
+                '1',  # ifName
             ]
         ),
     ],
diff --git a/agent_based/ospfv3_virtuallink.py b/agent_based/ospfv3_virtuallink.py
index ae87d87..f4335a7 100644
--- a/agent_based/ospfv3_virtuallink.py
+++ b/agent_based/ospfv3_virtuallink.py
@@ -11,6 +11,8 @@
 #
 # 2021-09-17: rewritten for CMK 2.0
 # 2021-10-02: added WATO options
+# 2023-12-21: replaced ifDescr by ifName
+#             fixed handling if non-matching ifIndex
 #
 # .1.3.6.1.2.1.191.1.11.1.3.3.50529054 = INTEGER: 0
 # .1.3.6.1.2.1.191.1.11.1.4.3.50529054 = Gauge32: 0
@@ -117,35 +119,32 @@ def parse_ospfv3_virtuallink(string_table: List[StringTable]) -> Dict[str, OspfV
     virtual_links = {}
     virtual_links_info, interfaces = string_table
 
+    interfaces_by_index = {if_index: if_name for if_index, if_name in interfaces}
+
     for virtual_link in virtual_links_info:
 
-        OID_END, VirtNbrIfIndex, VirtNbrIfInstId, VirtNbrAddressType, VirtNbrAddress, VirtNbrOptions, VirtNbrState, \
-        VirtNbrEvents, VirtNbrLsRetransQLen, VirtNbrHelloSuppressed, VirtNbrIfId, VirtNbrRestartHelperStatus, \
-        VirtNbrRestartHelperAge, VirtNbrRestartHelperExitReason, = virtual_link
-
-        if VirtNbrAddressType == '2':  # IPv6 address
-            VirtNbrAddress = render_ipv6_address(VirtNbrAddress)
-            VirtNbrArea, VirtNbrId = OID_END.split('.')
-
-            nbrLocalInterface = ''
-            for interface in interfaces:
-                ifIndex, ifName = interface
-                if ifIndex == VirtNbrIfIndex:
-                    nbrLocalInterface = get_short_if_name(ifName)
-
-            # virtual_links[f'{VirtNbrAddress} on {nbrLocalInterface}']= OspfV3VirtualLink(
-            virtual_links[VirtNbrAddress] = OspfV3VirtualLink(
-                VirtNbrId=render_ipv4_neighbor_id(VirtNbrId),
-                VirtNbrArea=int(VirtNbrArea),
-                VirtNbrOptions=VirtNbrOptions,
-                VirtNbrState=int(VirtNbrState),
-                VirtNbrEvents=int(VirtNbrEvents),
-                VirtNbrLsRetransQLen=int(VirtNbrLsRetransQLen),
-                VirtNbrHelloSuppressed=ospf_nbr_hellosuppressed(VirtNbrHelloSuppressed),
-                VirtNbrRestartHelperStatus=ospf_nbr_helperstatus(VirtNbrRestartHelperStatus),
-                VirtNbrRestartHelperAge=int(VirtNbrRestartHelperAge),
-                VirtNbrRestartHelperExitReason=ospf_nbr_helperexitreason(VirtNbrRestartHelperExitReason),
-                VitrNbrLocalInterface=nbrLocalInterface,
+        oid_end, if_index, if_inst_id, address_type, address, options, state, events, ls_retrans_q_len, \
+            hello_suppressed, if_id, restart_helper_status, restart_helper_age, \
+            restart_helper_exit_reason, = virtual_link
+
+        if address_type == '2':  # IPv6 address
+            address = render_ipv6_address(address)
+            area, nbr_id = oid_end.split('.')
+
+            nbr_local_interface = get_short_if_name(interfaces_by_index.get(if_index, if_index))
+
+            virtual_links[address] = OspfV3VirtualLink(
+                VirtNbrId=render_ipv4_neighbor_id(nbr_id),
+                VirtNbrArea=int(area),
+                VirtNbrOptions=options,
+                VirtNbrState=int(state),
+                VirtNbrEvents=int(events),
+                VirtNbrLsRetransQLen=int(ls_retrans_q_len),
+                VirtNbrHelloSuppressed=ospf_nbr_hellosuppressed(hello_suppressed),
+                VirtNbrRestartHelperStatus=ospf_nbr_helperstatus(restart_helper_status),
+                VirtNbrRestartHelperAge=int(restart_helper_age),
+                VirtNbrRestartHelperExitReason=ospf_nbr_helperexitreason(restart_helper_exit_reason),
+                VitrNbrLocalInterface=nbr_local_interface,
             )
     if virtual_links:
         return virtual_links
@@ -229,10 +228,10 @@ register.snmp_section(
             ]
         ),
         SNMPTree(
-            base='.1.3.6.1.2.1.2.2.1',  # 
+            base='.1.3.6.1.2.1.31.1.1.1',  #
             oids=[
-                '1',  # ifIndex
-                '2',  # ifDescr
+                OIDEnd(),  # ifIndex
+                '1',  # ifName
             ]
         ),
     ],
diff --git a/mkp/ospfv3-0.4.0-20231221.mkp b/mkp/ospfv3-0.4.0-20231221.mkp
new file mode 100644
index 0000000000000000000000000000000000000000..1367d5db1f99f564f170a7d0de7d422980dc1b08
GIT binary patch
literal 13220
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
P`Wg6@88HNw2oCl?mOlN8

literal 0
HcmV?d00001

diff --git a/packages/ospfv3 b/packages/ospfv3
index 8301b31..45f218f 100644
--- a/packages/ospfv3
+++ b/packages/ospfv3
@@ -17,7 +17,7 @@
            'gui': ['metrics/ospfv3.py', 'wato/ospfv3.py']},
  'name': 'ospfv3',
  'title': 'Collection of OSPFv3 checks',
- 'version': '0.4.0-20230603',
+ 'version': '0.4.0-20231221',
  'version.min_required': '2.1.0b1',
- 'version.packaged': '2.1.0p21',
- 'version.usable_until': None}
\ No newline at end of file
+ 'version.packaged': '2.2.0p14',
+ 'version.usable_until': None}
-- 
GitLab