def track_mac(keys, resultset, dns): """Groups results from Query for the mac_search page. keys - a tuple/list with strings that identifies the fields the result should be grouped by resultset - a QuerySet dns - should we lookup the hostname? """ if dns: ips_to_lookup = [row.ip for row in resultset] dns_lookups = asyncdns.reverse_lookup(ips_to_lookup) tracker = SortedDict() for row in resultset: if row.end_time > datetime.now(): row.still_active = "Still active" if dns: ip = row.ip if dns_lookups[ip] and not isinstance(dns_lookups[ip], Exception): row.dns_lookup = dns_lookups[ip].pop() else: row.dns_lookup = "" if not hasattr(row, 'module'): row.module = '' if not hasattr(row, 'port'): row.port = '' key = [] for k in keys: key.append(getattr(row, k)) key = tuple(key) if key not in tracker: tracker[key] = [] tracker[key].append(row) return tracker
def track_mac(keys, resultset, dns): """Groups results from Query for the mac_search page. keys - a tuple/list with strings that identifies the fields the result should be grouped by resultset - a QuerySet dns - should we lookup the hostname? """ if dns: ips_to_lookup = [row.ip for row in resultset] dns_lookups = asyncdns.reverse_lookup(ips_to_lookup) tracker = SortedDict() for row in resultset: if row.end_time > datetime.now(): row.still_active = "Still active" if dns: ip = row.ip if dns_lookups[ip] and not isinstance(dns_lookups[ip], Exception): row.dns_lookup = dns_lookups[ip].pop() else: row.dns_lookup = "" if not hasattr(row, 'module'): row.module = '' if not hasattr(row, 'port'): row.port = '' key = [] for k in keys: key.append(getattr(row, k)) key = tuple(key) if key not in tracker: tracker[key] = [] tracker[key].append(row) return tracker
def execute(self): super(AcctSearchQuery, self).execute() if self.ips_to_lookup: lookup_result = reverse_lookup(self.ips_to_lookup) self.result = [ self._replace_ip_with_hostname(result, lookup_result) for result in self.result ]
def reverse_lookup(addresses): """Do a reverse lookup on addresses""" reverses = asyncdns.reverse_lookup(addresses) for addr, response in sorted(reverses.items(), key=address_sorter): if isinstance(response, Exception): yield {'addr': addr, 'error': response.__class__.__name__} else: for name in response: yield {'addr': addr, 'name': name}
def execute(self): super(AcctSearchQuery, self).execute() if self.ips_to_lookup: lookup_result = reverse_lookup(self.ips_to_lookup) self.result = [ self._replace_ip_with_hostname(result, lookup_result) for result in self.result ]
def reverse_lookup(addresses): """Do a reverse lookup on addresses""" reverses = asyncdns.reverse_lookup(addresses) for addr, response in sorted(reverses.items(), key=address_sorter): if isinstance(response, Exception): yield {'addr': addr, 'error': response.__class__.__name__} else: for name in response: yield {'addr': addr, 'name': name}
def create_tracker(active, dns, inactive, ip_range, ip_result): """Creates a result tracker based on form data""" dns_lookups = None if dns: ips_to_lookup = [str(ip) for ip in ip_range] dns_lookups = asyncdns.reverse_lookup(ips_to_lookup) tracker = SortedDict() for ip_key in ip_range: if active and ip_key in ip_result: create_active_row(tracker, dns, dns_lookups, ip_key, ip_result) elif inactive and ip_key not in ip_result: create_inactive_row(tracker, dns, dns_lookups, ip_key) return tracker
def create_tracker(active, dns, inactive, ip_range, ip_result): """Creates a result tracker based on form data""" dns_lookups = None if dns: ips_to_lookup = {str(ip) for ip in ip_range} _logger.debug( "create_tracker: looking up PTR records for %d addresses)", len(ips_to_lookup)) dns_lookups = asyncdns.reverse_lookup(ips_to_lookup) _logger.debug("create_tracker: PTR lookup done") tracker = OrderedDict() for ip_key in ip_range: if active and ip_key in ip_result: create_active_row(tracker, dns, dns_lookups, ip_key, ip_result) elif inactive and ip_key not in ip_result: create_inactive_row(tracker, dns, dns_lookups, ip_key) return tracker
def _get_errors(self): """Fetches duplicate hostnames""" ip_addresses = [n.ip for n in Netbox.objects.all()] reverse_names = reverse_lookup(ip_addresses) flatten = list(itertools.chain(*reverse_names.values())) duplicates = set([x for x in flatten if flatten.count(x) > 1]) results = collections.defaultdict(list) for hostname in duplicates: for ip, hostlist in reverse_names.items(): if hostname in hostlist: results[hostname].append(ip) errors = [] for hostname, iplist in results.items(): error = 'The hostname {} is used by these IP addresses: {}'.format( hostname, ', '.join(iplist)) errors.append(TestResult(error)) return errors
def _get_errors(self): """Fetches duplicate hostnames""" ip_addresses = [n.ip for n in Netbox.objects.all()] reverse_names = reverse_lookup(ip_addresses) flatten = list(itertools.chain(*reverse_names.values())) duplicates = set([x for x in flatten if flatten.count(x) > 1]) results = collections.defaultdict(list) for hostname in duplicates: for ip, hostlist in reverse_names.items(): if hostname in hostlist: results[hostname].append(ip) errors = [] for hostname, iplist in results.items(): error = 'The hostname {} is used by these IP addresses: {}'.format( hostname, ', '.join(iplist)) errors.append(TestResult(error)) return errors
def _get_errors(self): """Fetches duplicate hostnames""" ip_addresses = Netbox.objects.values_list("ip", flat=True) reverse_names = { _key: _value for _key, _value in reverse_lookup(ip_addresses).items() if not isinstance(_value, Exception) # Ignore DNS lookup failures } flatten = list(itertools.chain(*reverse_names.values())) duplicates = {x for x in flatten if flatten.count(x) > 1} results = collections.defaultdict(list) for hostname in duplicates: for ip, hostlist in reverse_names.items(): if hostname in hostlist: results[hostname].append(ip) errors = [] for hostname, iplist in results.items(): error = 'The hostname {} is used by these IP addresses: {}'.format( hostname, ', '.join(iplist)) errors.append(TestResult(error)) return errors