diff --git a/netty_snmp/_types.py b/netty_snmp/_types.py index 15763c7..c07fc5e 100644 --- a/netty_snmp/_types.py +++ b/netty_snmp/_types.py @@ -104,6 +104,7 @@ class SnmpDiscoveryData(TypedDict, total=False): stack: list[dict] vlans: list[dict] mac_address_table: dict[int, list[str]] | None + arp_table: dict[str, str] | None prefixes: list[dict] | None routes: list[dict] | None exceptions: list[DiscoveryException] diff --git a/netty_snmp/factory/consts.py b/netty_snmp/factory/consts.py index 61c251e..5ef1479 100644 --- a/netty_snmp/factory/consts.py +++ b/netty_snmp/factory/consts.py @@ -4,7 +4,7 @@ SNMP_DEFAULT_PORT = 161 SNMP_DEFAULT_COMMUNITY = "public" -SNMP_MAX_repetitions = 50 +SNMP_MAX_REPETITIONS = 50 UNKNOWN_MANUFACTURER = "Unknown" UNKNOWN_PLATFORM = "Unknown" UNKNOWN_MODEL = "Unknown" @@ -578,8 +578,17 @@ class StackRole(IntEnum): dot1dBasePortIfIndex = SnmpItem( name="dot1dBasePortIfIndex", - oid=".1.3.6.1.2.1.2.2.1.1", + oid=".1.3.6.1.2.1.17.1.4.1.2", description="The ifIndex of the port.", value_type="int", value_mapping=None, ) + +ipNetToMediaPhysAddress = SnmpItem( + name="ipNetToMediaPhysAddress", + oid=".1.3.6.1.2.1.4.22.1.2", + description="The MAC address of the port.", + value_type="str", + value_mapping=None, + to_hex=True, +) diff --git a/netty_snmp/factory/dispatch.py b/netty_snmp/factory/dispatch.py index 5384b86..b37249f 100644 --- a/netty_snmp/factory/dispatch.py +++ b/netty_snmp/factory/dispatch.py @@ -59,7 +59,7 @@ def __init__( version: consts.SnmpVersion = consts.SnmpVersion.v2c, community: str | None = consts.SNMP_DEFAULT_COMMUNITY, v3_params: SnmpV3Params | None = None, - snmp_max_repetitions: int = 20, + snmp_max_repetitions: int = consts.SNMP_MAX_REPETITIONS, max_workers: int = 16, ) -> None: self.prefix = self.str_to_prefix(prefix) diff --git a/netty_snmp/factory/manufactures/arista.py b/netty_snmp/factory/manufactures/arista.py index 895c6f1..dd6be6d 100644 --- a/netty_snmp/factory/manufactures/arista.py +++ b/netty_snmp/factory/manufactures/arista.py @@ -10,6 +10,6 @@ def __init__( version: consts.SnmpVersion = consts.SnmpVersion.v2c, community: str | None = consts.SNMP_DEFAULT_COMMUNITY, v3_params: SnmpV3Params | None = None, - snmp_max_repetitions: int = consts.SNMP_MAX_repetitions, + snmp_max_repetitions: int = consts.SNMP_MAX_REPETITIONS, ) -> None: super().__init__(ip, port, version, community, v3_params, snmp_max_repetitions) diff --git a/netty_snmp/factory/manufactures/aruba.py b/netty_snmp/factory/manufactures/aruba.py index 48a75ca..9f1b96d 100644 --- a/netty_snmp/factory/manufactures/aruba.py +++ b/netty_snmp/factory/manufactures/aruba.py @@ -10,6 +10,6 @@ def __init__( version: consts.SnmpVersion = consts.SnmpVersion.v2c, community: str | None = consts.SNMP_DEFAULT_COMMUNITY, v3_params: SnmpV3Params | None = None, - snmp_max_repetitions: int = consts.SNMP_MAX_repetitions, + snmp_max_repetitions: int = consts.SNMP_MAX_REPETITIONS, ) -> None: super().__init__(ip, port, version, community, v3_params, snmp_max_repetitions) diff --git a/netty_snmp/factory/manufactures/cisco.py b/netty_snmp/factory/manufactures/cisco.py index 67d54d3..a86f5cc 100644 --- a/netty_snmp/factory/manufactures/cisco.py +++ b/netty_snmp/factory/manufactures/cisco.py @@ -10,10 +10,14 @@ def __init__( version: consts.SnmpVersion = consts.SnmpVersion.v2c, community: str | None = consts.SNMP_DEFAULT_COMMUNITY, v3_params: SnmpV3Params | None = None, - snmp_max_repetitions: int = consts.SNMP_MAX_repetitions, + snmp_max_repetitions: int = consts.SNMP_MAX_REPETITIONS, ) -> None: super().__init__(ip, port, version, community, v3_params, snmp_max_repetitions) @property def stack(self) -> dict: """CISCO-STACK-MIB""" + + @property + def mac_address_table(self) -> dict[int, list[str]]: + """CISCO-DOT1D-MIB, per-vlan mac-address table, cisco needs specific implementation""" diff --git a/netty_snmp/factory/manufactures/fortinet.py b/netty_snmp/factory/manufactures/fortinet.py index 7f8b5ee..55d4363 100644 --- a/netty_snmp/factory/manufactures/fortinet.py +++ b/netty_snmp/factory/manufactures/fortinet.py @@ -10,6 +10,6 @@ def __init__( version: consts.SnmpVersion = consts.SnmpVersion.v2c, community: str | None = consts.SNMP_DEFAULT_COMMUNITY, v3_params: SnmpV3Params | None = None, - snmp_max_repetitions: int = consts.SNMP_MAX_repetitions, + snmp_max_repetitions: int = consts.SNMP_MAX_REPETITIONS, ) -> None: super().__init__(ip, port, version, community, v3_params, snmp_max_repetitions) diff --git a/netty_snmp/factory/manufactures/h3c.py b/netty_snmp/factory/manufactures/h3c.py index 3d7f778..e339219 100644 --- a/netty_snmp/factory/manufactures/h3c.py +++ b/netty_snmp/factory/manufactures/h3c.py @@ -10,7 +10,7 @@ def __init__( version: consts.SnmpVersion = consts.SnmpVersion.v2c, community: str | None = consts.SNMP_DEFAULT_COMMUNITY, v3_params: SnmpV3Params | None = None, - snmp_max_repetitions: int = consts.SNMP_MAX_repetitions, + snmp_max_repetitions: int = consts.SNMP_MAX_REPETITIONS, ) -> None: super().__init__(ip, port, version, community, v3_params, snmp_max_repetitions) diff --git a/netty_snmp/factory/manufactures/huawei.py b/netty_snmp/factory/manufactures/huawei.py index 76ec373..5f5f794 100644 --- a/netty_snmp/factory/manufactures/huawei.py +++ b/netty_snmp/factory/manufactures/huawei.py @@ -14,7 +14,7 @@ def __init__( version: consts.SnmpVersion = consts.SnmpVersion.v2c, community: str | None = consts.SNMP_DEFAULT_COMMUNITY, v3_params: SnmpV3Params | None = None, - snmp_max_repetitions: int = consts.SNMP_MAX_repetitions, + snmp_max_repetitions: int = consts.SNMP_MAX_REPETITIONS, ) -> None: super().__init__(ip, port, version, community, v3_params, snmp_max_repetitions) @@ -25,16 +25,16 @@ def stack(self) -> list[StackMember]: return [] try: hw_stack_id = self.session.bulkwalk( - consts.hwMemberCurrentStackId.oid, max_repetitions=self.snmp_max_repetitions + consts.hwMemberCurrentStackId.oid, max_repetitions=self.SNMP_MAX_REPETITIONS ) hw_stack_priority = self.session.bulkwalk( - consts.hwMemberStackPriority.oid, max_repetitions=self.snmp_max_repetitions + consts.hwMemberStackPriority.oid, max_repetitions=self.SNMP_MAX_REPETITIONS ) hw_stack_role = self.session.bulkwalk( - consts.hwMemberStackRole.oid, max_repetitions=self.snmp_max_repetitions + consts.hwMemberStackRole.oid, max_repetitions=self.SNMP_MAX_REPETITIONS ) hw_stack_mac_address = self.session.bulkwalk( - consts.hwMemberStackMacAddress.oid, max_repetitions=self.snmp_max_repetitions + consts.hwMemberStackMacAddress.oid, max_repetitions=self.SNMP_MAX_REPETITIONS ) except EzSNMPError as e: diff --git a/netty_snmp/factory/manufactures/juniper.py b/netty_snmp/factory/manufactures/juniper.py index 50b44bf..9b48dd5 100644 --- a/netty_snmp/factory/manufactures/juniper.py +++ b/netty_snmp/factory/manufactures/juniper.py @@ -10,6 +10,6 @@ def __init__( version: consts.SnmpVersion = consts.SnmpVersion.v2c, community: str | None = consts.SNMP_DEFAULT_COMMUNITY, v3_params: SnmpV3Params | None = None, - snmp_max_repetitions: int = consts.SNMP_MAX_repetitions, + snmp_max_repetitions: int = consts.SNMP_MAX_REPETITIONS, ) -> None: super().__init__(ip, port, version, community, v3_params, snmp_max_repetitions) diff --git a/netty_snmp/factory/manufactures/paloalto.py b/netty_snmp/factory/manufactures/paloalto.py index 76ef6ef..b28bffc 100644 --- a/netty_snmp/factory/manufactures/paloalto.py +++ b/netty_snmp/factory/manufactures/paloalto.py @@ -10,6 +10,6 @@ def __init__( version: consts.SnmpVersion = consts.SnmpVersion.v2c, community: str | None = consts.SNMP_DEFAULT_COMMUNITY, v3_params: SnmpV3Params | None = None, - snmp_max_repetitions: int = consts.SNMP_MAX_repetitions, + snmp_max_repetitions: int = consts.SNMP_MAX_REPETITIONS, ) -> None: super().__init__(ip, port, version, community, v3_params, snmp_max_repetitions) diff --git a/netty_snmp/factory/manufactures/ruijie.py b/netty_snmp/factory/manufactures/ruijie.py index ad03448..8b548ba 100644 --- a/netty_snmp/factory/manufactures/ruijie.py +++ b/netty_snmp/factory/manufactures/ruijie.py @@ -10,6 +10,6 @@ def __init__( version: consts.SnmpVersion = consts.SnmpVersion.v2c, community: str | None = consts.SNMP_DEFAULT_COMMUNITY, v3_params: SnmpV3Params | None = None, - snmp_max_repetitions: int = consts.SNMP_MAX_repetitions, + snmp_max_repetitions: int = consts.SNMP_MAX_REPETITIONS, ) -> None: super().__init__(ip, port, version, community, v3_params, snmp_max_repetitions) diff --git a/netty_snmp/factory/snmp_factory.py b/netty_snmp/factory/snmp_factory.py index f1fdde4..e2fbd19 100644 --- a/netty_snmp/factory/snmp_factory.py +++ b/netty_snmp/factory/snmp_factory.py @@ -35,7 +35,7 @@ def __init__( version: consts.SnmpVersion = consts.SnmpVersion.v2c, community: str | None = consts.SNMP_DEFAULT_COMMUNITY, v3_params: SnmpV3Params | None = None, - snmp_max_repetitions: int = consts.SNMP_MAX_repetitions, + snmp_max_repetitions: int = consts.SNMP_MAX_REPETITIONS, ) -> None: """ :param ip: network device ip, ipv4 or ipv6 address @@ -324,7 +324,15 @@ def mac_address_table(self) -> dict[int, list[str]]: return results @property - def arp_table(self) -> Any: ... + def arp_table(self) -> dict[str, str]: + try: + arp_table = self.session.bulkwalk( + oids=consts.ipNetToMediaPhysAddress.oid, max_repetitions=self.snmp_max_repetitions + ) + except EzSNMPError as e: + self.exceptions.append(DiscoveryException(item="arp_table", exception=str(e))) + return {} + return {".".join(x.oid_index.split(".")[-4:]): mac_address_validator(x.value, True) for x in arp_table} def discovery(self, items: list[DiscoveryItem] | None = None) -> SnmpDiscoveryData: """ @@ -346,6 +354,7 @@ def discovery(self, items: list[DiscoveryItem] | None = None) -> SnmpDiscoveryDa vlans=self.vlans, prefixes=self.prefixes, mac_address_table=self.mac_address_table, + arp_table=self.arp_table, routes=self.routes, exceptions=self.exceptions, ) diff --git a/tests/test_dispatch.py b/tests/test_dispatch.py index 0a88e88..623d4fd 100644 --- a/tests/test_dispatch.py +++ b/tests/test_dispatch.py @@ -7,7 +7,7 @@ def test_dispatch(): port=161, version=consts.SnmpVersion.v2c, community="public", - snmp_max_repetitions=20, + snmp_max_repetitions=consts.SNMP_MAX_REPETITIONS, max_workers=64, )