Enhanced IP resolution for a single computer using multiple methods
(self, computer, test_connectivity=False)
| 74 | return False |
| 75 | |
| 76 | def resolve_single_computer(self, computer, test_connectivity=False): |
| 77 | """Enhanced IP resolution for a single computer using multiple methods""" |
| 78 | hostname = computer['dns_hostname'] if computer['dns_hostname'] else computer['computer_name'] |
| 79 | if not hostname: |
| 80 | return {'ips': [], 'methods': [], 'connectivity': 'Unknown', 'timestamp': datetime.now().strftime('%Y-%m-%d %H:%M:%S')} |
| 81 | |
| 82 | logger.debug(f"Resolving: {hostname}") |
| 83 | computer_ips = [] |
| 84 | resolution_methods = [] |
| 85 | |
| 86 | # Method 1: Standard socket resolution (primary IP) |
| 87 | try: |
| 88 | ip_address = socket.gethostbyname(hostname) |
| 89 | if ip_address not in computer_ips and self._is_valid_ip(ip_address): |
| 90 | computer_ips.append(ip_address) |
| 91 | resolution_methods.append("socket") |
| 92 | logger.debug(f"Socket resolved {hostname} -> {ip_address}") |
| 93 | except socket.gaierror as e: |
| 94 | logger.debug(f"Socket failed for {hostname}: {e}") |
| 95 | |
| 96 | # Method 2: nslookup with specific DNS server (authoritative) |
| 97 | if self.dns_server: |
| 98 | try: |
| 99 | nslookup_cmd = ['nslookup'] |
| 100 | # Add TCP flag if requested (some versions of nslookup support -vc for TCP) |
| 101 | if self.use_tcp: |
| 102 | nslookup_cmd.extend(['-vc']) # -vc = virtual circuit (TCP) |
| 103 | nslookup_cmd.extend([hostname, self.dns_server]) |
| 104 | |
| 105 | result = subprocess.run(nslookup_cmd, |
| 106 | capture_output=True, text=True, timeout=10) |
| 107 | if result.returncode == 0: |
| 108 | lines = result.stdout.split('\n') |
| 109 | for line in lines: |
| 110 | if 'Address:' in line and not line.startswith('Server:'): |
| 111 | ip_address = line.split('Address:')[1].strip() |
| 112 | if (ip_address and not ip_address.endswith('#53') and |
| 113 | ip_address not in computer_ips and self._is_valid_ip(ip_address)): |
| 114 | computer_ips.append(ip_address) |
| 115 | method_name = "nslookup-tcp" if self.use_tcp else "nslookup" |
| 116 | resolution_methods.append(method_name) |
| 117 | logger.debug(f"{method_name} found {hostname} -> {ip_address}") |
| 118 | except (subprocess.TimeoutExpired, subprocess.SubprocessError) as e: |
| 119 | logger.debug(f"nslookup failed for {hostname}: {e}") |
| 120 | |
| 121 | # Method 3: dnspython library (if available) |
| 122 | if DNS_AVAILABLE: |
| 123 | try: |
| 124 | import dns.resolver |
| 125 | import dns.query |
| 126 | import dns.message |
| 127 | import dns.rdatatype |
| 128 | |
| 129 | resolver = dns.resolver.Resolver() |
| 130 | if self.dns_server: |
| 131 | resolver.nameservers = [self.dns_server] |
| 132 | |
| 133 | # Configure TCP if requested |
no test coverage detected