28
28
import socket
29
29
import struct
30
30
import sys
31
- from collections .abc import Sequence
31
+ from collections .abc import Iterable , Sequence
32
32
from typing import Any , Union , cast
33
33
34
34
import ifaddr
@@ -73,19 +73,27 @@ def _encode_address(address: str) -> bytes:
73
73
return socket .inet_pton (address_family , address )
74
74
75
75
76
- def get_all_addresses ( ) -> list [str ]:
77
- return list ({addr .ip for iface in ifaddr . get_adapters () for addr in iface .ips if addr .is_IPv4 }) # type: ignore[misc]
76
+ def get_all_addresses_ipv4 ( adapters : Iterable [ ifaddr . Adapter ] ) -> list [str ]:
77
+ return list ({addr .ip for iface in adapters for addr in iface .ips if addr .is_IPv4 }) # type: ignore[misc]
78
78
79
79
80
- def get_all_addresses_v6 ( ) -> list [tuple [tuple [str , int , int ], int ]]:
80
+ def get_all_addresses_ipv6 ( adapters : Iterable [ ifaddr . Adapter ] ) -> list [tuple [tuple [str , int , int ], int ]]:
81
81
# IPv6 multicast uses positive indexes for interfaces
82
82
# TODO: What about multi-address interfaces?
83
83
return list (
84
- {(addr .ip , iface .index ) for iface in ifaddr . get_adapters () for addr in iface .ips if addr .is_IPv6 } # type: ignore[misc]
84
+ {(addr .ip , iface .index ) for iface in adapters for addr in iface .ips if addr .is_IPv6 } # type: ignore[misc]
85
85
)
86
86
87
87
88
- def ip6_to_address_and_index (adapters : list [ifaddr .Adapter ], ip : str ) -> tuple [tuple [str , int , int ], int ]:
88
+ def get_all_addresses () -> list [str ]: # required for backwards compat
89
+ return get_all_addresses_ipv4 (ifaddr .get_adapters ())
90
+
91
+
92
+ def get_all_addresses_v6 () -> list [tuple [tuple [str , int , int ], int ]]: # required for backwards compat
93
+ return get_all_addresses_ipv6 (ifaddr .get_adapters ())
94
+
95
+
96
+ def ip6_to_address_and_index (adapters : Iterable [ifaddr .Adapter ], ip : str ) -> tuple [tuple [str , int , int ], int ]:
89
97
if "%" in ip :
90
98
ip = ip [: ip .index ("%" )] # Strip scope_id.
91
99
ipaddr = ipaddress .ip_address (ip )
@@ -102,7 +110,7 @@ def ip6_to_address_and_index(adapters: list[ifaddr.Adapter], ip: str) -> tuple[t
102
110
raise RuntimeError (f"No adapter found for IP address { ip } " )
103
111
104
112
105
- def interface_index_to_ip6_address (adapters : list [ifaddr .Adapter ], index : int ) -> tuple [str , int , int ]:
113
+ def interface_index_to_ip6_address (adapters : Iterable [ifaddr .Adapter ], index : int ) -> tuple [str , int , int ]:
106
114
for adapter in adapters :
107
115
if adapter .index == index :
108
116
for adapter_ip in adapter .ips :
@@ -152,10 +160,11 @@ def normalize_interface_choice(
152
160
if ip_version != IPVersion .V6Only :
153
161
result .append ("0.0.0.0" )
154
162
elif choice is InterfaceChoice .All :
163
+ adapters = ifaddr .get_adapters ()
155
164
if ip_version != IPVersion .V4Only :
156
- result .extend (get_all_addresses_v6 ( ))
165
+ result .extend (get_all_addresses_ipv6 ( adapters ))
157
166
if ip_version != IPVersion .V6Only :
158
- result .extend (get_all_addresses ( ))
167
+ result .extend (get_all_addresses_ipv4 ( adapters ))
159
168
if not result :
160
169
raise RuntimeError (
161
170
f"No interfaces to listen on, check that any interfaces have IP version { ip_version } "
0 commit comments