def handle(self): # Start by checking the prefix cache prefix_cache_age = datetime.now() - self.prefix_cache_update_time if prefix_cache_age > self.prefix_cache_max_age: yield self._update_prefix_cache() self._logger.debug("Collecting IP/MAC mappings") # Fetch standard MIBs ip_mib = IpMib(self.agent) mappings = yield ip_mib.get_ifindex_ip_mac_mappings() self._logger.debug("Found %d mappings in IP-MIB", len(mappings)) # Try IPV6-MIB if no IPv6 results were found in IP-MIB if not ipv6_address_in_mappings(mappings): ipv6_mib = Ipv6Mib(self.agent) ipv6_mappings = yield ipv6_mib.get_ifindex_ip_mac_mappings() self._logger.debug("Found %d mappings in IPV6-MIB", len(ipv6_mappings)) mappings.update(ipv6_mappings) # If we got no results, or no IPv6 results, try vendor specific MIBs if len(mappings) == 0 or not ipv6_address_in_mappings(mappings): cisco_ip_mib = CiscoIetfIpMib(self.agent) cisco_ip_mappings = yield cisco_ip_mib.get_ifindex_ip_mac_mappings( ) self._logger.debug("Found %d mappings in CISCO-IETF-IP-MIB", len(cisco_ip_mappings)) mappings.update(cisco_ip_mappings) yield self._process_data(mappings)
def handle(self): self._logger.debug("Collecting prefixes") netbox = self.containers.factory(None, shadows.Netbox) ipmib = IpMib(self.agent) ciscoip = CiscoIetfIpMib(self.agent) ipv6mib = Ipv6Mib(self.agent) # Retrieve interface names and keep those who match a VLAN # naming pattern vlan_interfaces = yield self.get_vlan_interfaces() ifc_aliases = yield self._get_ifc_aliases() # Traverse address tables from IP-MIB, IPV6-MIB and # CISCO-IETF-IP-MIB in that order. addresses = set() for mib in ipmib, ipv6mib, ciscoip: self._logger.debug("Trying address tables from %s", mib.mib['moduleName']) df = mib.get_interface_addresses() # Special case; some devices will time out while building a bulk # response outside our scope when it has no proprietary MIB support if mib != ipmib: df.addErrback(self._ignore_timeout, set()) df.addErrback(self._ignore_index_exceptions, mib) new_addresses = yield df self._logger.debug( "Found %d addresses in %s: %r", len(new_addresses), mib.mib['moduleName'], new_addresses, ) addresses.update(new_addresses) adminup_ifcs = yield self._get_adminup_ifcs() for ifindex, ip, prefix in addresses: if ifindex not in adminup_ifcs: self._logger.debug( "ignoring collected address %s on admDown ifindex %s", ip, ifindex) continue if self._prefix_should_be_ignored(prefix): self._logger.debug("ignoring prefix %s as configured", prefix) continue self.create_containers(netbox, ifindex, prefix, ip, vlan_interfaces, ifc_aliases)
def test_ipv6mib_index(self): ip_tuple = (32L, 1L, 13L, 184L, 18L, 52L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L) expected = IP('2001:db8:1234::1') ip = Ipv6Mib.ipv6address_to_ip(ip_tuple) self.assertEquals(ip, expected)
def test_ipv6mib_index(self): ip_tuple = (32, 1, 13, 184, 18, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1) expected = IP('2001:db8:1234::1') ip = Ipv6Mib.ipv6address_to_ip(ip_tuple) assert ip == expected