| |
| """ |
| Simple network interface utilities |
| """ |
|
|
| import platform |
| import re |
| import subprocess |
|
|
|
|
| def get_network_interfaces(): |
| """Get network interfaces with their IP addresses""" |
| try: |
| result = subprocess.run( |
| ["/sbin/ip", "addr", "show"], capture_output=True, text=True, check=True |
| ) |
| return _parse_ip_output(result.stdout) |
| except (subprocess.CalledProcessError, FileNotFoundError): |
| try: |
| result = subprocess.run(["ifconfig"], capture_output=True, text=True, check=True) |
| return _parse_ifconfig_output(result.stdout) |
| except (subprocess.CalledProcessError, FileNotFoundError): |
| return {} |
|
|
|
|
| def _parse_ip_output(output): |
| """Parse 'ip addr' command output""" |
| interfaces = {} |
| current_interface = None |
|
|
| for line in output.split("\n"): |
| interface_match = re.match(r"^\d+:\s+(\w+):", line) |
| if interface_match: |
| current_interface = interface_match.group(1) |
| interfaces[current_interface] = [] |
|
|
| ip_match = re.search(r"inet\s+(\d+\.\d+\.\d+\.\d+)", line) |
| if ip_match and current_interface: |
| interfaces[current_interface].append(ip_match.group(1)) |
|
|
| return interfaces |
|
|
|
|
| def _parse_ifconfig_output(output): |
| """Parse 'ifconfig' command output""" |
| interfaces = {} |
| current_interface = None |
|
|
| for line in output.split("\n"): |
| interface_match = re.match(r"^(\w+):", line) |
| if interface_match: |
| current_interface = interface_match.group(1) |
| interfaces[current_interface] = [] |
|
|
| ip_match = re.search(r"inet\s+(\d+\.\d+\.\d+\.\d+)", line) |
| if ip_match and current_interface: |
| interfaces[current_interface].append(ip_match.group(1)) |
|
|
| return interfaces |
|
|
|
|
| def find_interface_by_ip(target_ip): |
| """Find interface name for given IP address""" |
| interfaces = get_network_interfaces() |
| for interface, ip_list in interfaces.items(): |
| if target_ip in ip_list: |
| return interface |
| return None |
|
|
|
|
| def resolve_interface(interface: str) -> tuple[str, str]: |
| """ |
| Resolve interface parameter to actual network interface name and environment type |
| |
| Args: |
| interface: "sim", "real", or direct interface name or IP address |
| |
| Returns: |
| tuple: (interface_name, env_type) where env_type is "sim" or "real" |
| """ |
| |
| if re.match(r"^\d+\.\d+\.\d+\.\d+$", interface): |
| if interface == "127.0.0.1": |
| return interface, "sim" |
| else: |
| return interface, "real" |
|
|
| if interface == "sim": |
| lo_interface = find_interface_by_ip("127.0.0.1") |
| if lo_interface: |
| |
| if platform.system() == "Darwin" and lo_interface == "lo": |
| return "lo0", "sim" |
| return lo_interface, "sim" |
| return ("lo0" if platform.system() == "Darwin" else "lo"), "sim" |
|
|
| elif interface == "real": |
| interfaces = get_network_interfaces() |
| for iface, ip_list in interfaces.items(): |
| for ip in ip_list: |
| if ip.startswith("192.168.123."): |
| return iface, "real" |
| return interface, "real" |
|
|
| else: |
| |
| interfaces = get_network_interfaces() |
| if interface in interfaces: |
| for ip in interfaces[interface]: |
| if ip == "127.0.0.1": |
| return interface, "sim" |
|
|
| |
| if platform.system() == "Darwin" and interface == "lo": |
| return "lo0", "sim" |
|
|
| |
| return interface, "real" |
|
|
|
|
| if __name__ == "__main__": |
| interfaces = get_network_interfaces() |
|
|
| if not interfaces: |
| print("No network interfaces found") |
| exit(1) |
|
|
| |
| print("Network interfaces:") |
| for interface, ip_list in interfaces.items(): |
| print(f" {interface}: {', '.join(ip_list)}") |
|
|
| |
| print("\nTesting resolve_interface:") |
| for test_interface in ["sim", "real", "lo", "127.0.0.1"]: |
| interface_name, env_type = resolve_interface(test_interface) |
| print(f" {test_interface} -> {interface_name} ({env_type})") |
|
|