@@ -188,6 +188,9 @@ class InterfaceChoice(enum.Enum):
188
188
All = 2
189
189
190
190
191
+ InterfacesType = Union [List [Union [str , int ]], InterfaceChoice ]
192
+
193
+
191
194
@enum .unique
192
195
class ServiceStateChange (enum .Enum ):
193
196
Added = 1
@@ -1155,7 +1158,7 @@ class Engine(threading.Thread):
1155
1158
packets.
1156
1159
"""
1157
1160
1158
- def __init__ (self , zc ) :
1161
+ def __init__ (self , zc : 'Zeroconf' ) -> None :
1159
1162
threading .Thread .__init__ (self , name = 'zeroconf-Engine' )
1160
1163
self .daemon = True
1161
1164
self .zc = zc
@@ -1164,7 +1167,7 @@ def __init__(self, zc):
1164
1167
self .condition = threading .Condition ()
1165
1168
self .start ()
1166
1169
1167
- def run (self ):
1170
+ def run (self ) -> None :
1168
1171
while not self .zc .done :
1169
1172
with self .condition :
1170
1173
rs = self .readers .keys ()
@@ -1188,12 +1191,12 @@ def run(self):
1188
1191
if e .args [0 ] not in (errno .EBADF , errno .ENOTCONN ) or not self .zc .done :
1189
1192
raise
1190
1193
1191
- def add_reader (self , reader , socket_ ) :
1194
+ def add_reader (self , reader : 'Listener' , socket_ : socket . socket ) -> None :
1192
1195
with self .condition :
1193
1196
self .readers [socket_ ] = reader
1194
1197
self .condition .notify ()
1195
1198
1196
- def del_reader (self , socket_ ) :
1199
+ def del_reader (self , socket_ : socket . socket ) -> None :
1197
1200
with self .condition :
1198
1201
del self .readers [socket_ ]
1199
1202
self .condition .notify ()
@@ -1582,7 +1585,7 @@ def parsed_addresses(self, version: IPVersion = IPVersion.All) -> List[str]:
1582
1585
for addr in result
1583
1586
]
1584
1587
1585
- def _set_properties (self , properties : Union [bytes , ServicePropertiesType ]):
1588
+ def _set_properties (self , properties : Union [bytes , ServicePropertiesType ]) -> None :
1586
1589
"""Sets properties and text of this info from a dictionary"""
1587
1590
if isinstance (properties , dict ):
1588
1591
self ._properties = properties
@@ -1612,7 +1615,7 @@ def _set_properties(self, properties: Union[bytes, ServicePropertiesType]):
1612
1615
else :
1613
1616
self .text = properties
1614
1617
1615
- def _set_text (self , text ) :
1618
+ def _set_text (self , text : bytes ) -> None :
1616
1619
"""Sets properties and text given a text field"""
1617
1620
self .text = text
1618
1621
result = {} # type: ServicePropertiesType
@@ -1628,7 +1631,7 @@ def _set_text(self, text):
1628
1631
for s in strs :
1629
1632
parts = s .split (b'=' , 1 )
1630
1633
try :
1631
- key , value = parts
1634
+ key , value = parts # type: Tuple[bytes, Union[bool, bytes]]
1632
1635
except ValueError :
1633
1636
# No equals sign at all
1634
1637
key = s
@@ -1645,7 +1648,7 @@ def _set_text(self, text):
1645
1648
1646
1649
self ._properties = result
1647
1650
1648
- def get_name (self ):
1651
+ def get_name (self ) -> str :
1649
1652
"""Name accessor"""
1650
1653
if self .type is not None and self .name .endswith ("." + self .type ):
1651
1654
return self .name [: len (self .name ) - len (self .type ) - 1 ]
@@ -1760,17 +1763,23 @@ class ZeroconfServiceTypes(ServiceListener):
1760
1763
Return all of the advertised services on any local networks
1761
1764
"""
1762
1765
1763
- def __init__ (self ):
1766
+ def __init__ (self ) -> None :
1764
1767
self .found_services = set () # type: Set[str]
1765
1768
1766
- def add_service (self , zc , type_ , name ) :
1769
+ def add_service (self , zc : 'Zeroconf' , type_ : str , name : str ) -> None :
1767
1770
self .found_services .add (name )
1768
1771
1769
- def remove_service (self , zc , type_ , name ) :
1772
+ def remove_service (self , zc : 'Zeroconf' , type_ : str , name : str ) -> None :
1770
1773
pass
1771
1774
1772
1775
@classmethod
1773
- def find (cls , zc = None , timeout = 5 , interfaces = InterfaceChoice .All , ip_version = None ):
1776
+ def find (
1777
+ cls ,
1778
+ zc : Optional ['Zeroconf' ] = None ,
1779
+ timeout : Union [int , float ] = 5 ,
1780
+ interfaces : InterfacesType = InterfaceChoice .All ,
1781
+ ip_version : Optional [IPVersion ] = None ,
1782
+ ) -> Tuple [str , ...]:
1774
1783
"""
1775
1784
Return all of the advertised services on any local networks.
1776
1785
@@ -1860,7 +1869,7 @@ def ip6_addresses_to_indexes(interfaces: List[Union[str, int]]) -> List[int]:
1860
1869
1861
1870
1862
1871
def normalize_interface_choice (
1863
- choice : Union [ List [ Union [ str , int ]], InterfaceChoice ] , ip_version : IPVersion = IPVersion .V4Only
1872
+ choice : InterfacesType , ip_version : IPVersion = IPVersion .V4Only
1864
1873
) -> List [Union [str , int ]]:
1865
1874
"""Convert the interfaces choice into internal representation.
1866
1875
@@ -1946,17 +1955,17 @@ def new_socket(port: int = _MDNS_PORT, ip_version: IPVersion = IPVersion.V4Only)
1946
1955
return s
1947
1956
1948
1957
1949
- def add_multicast_member (listen_socket , interface ) :
1958
+ def add_multicast_member (listen_socket : socket . socket , interface : Union [ str , int ]) -> Optional [ socket . socket ] :
1950
1959
# This is based on assumptions in normalize_interface_choice
1951
1960
is_v6 = isinstance (interface , int )
1952
1961
log .debug ('Adding %r to multicast group' , interface )
1953
1962
try :
1954
1963
if is_v6 :
1955
- iface_bin = struct .pack ('@I' , interface )
1964
+ iface_bin = struct .pack ('@I' , cast ( int , interface ) )
1956
1965
_value = _MDNS_ADDR6_BYTES + iface_bin
1957
1966
listen_socket .setsockopt (_IPPROTO_IPV6 , socket .IPV6_JOIN_GROUP , _value )
1958
1967
else :
1959
- _value = _MDNS_ADDR_BYTES + socket .inet_aton (interface )
1968
+ _value = _MDNS_ADDR_BYTES + socket .inet_aton (cast ( str , interface ) )
1960
1969
listen_socket .setsockopt (socket .IPPROTO_IP , socket .IP_ADD_MEMBERSHIP , _value )
1961
1970
except socket .error as e :
1962
1971
_errno = get_errno (e )
@@ -1966,17 +1975,17 @@ def add_multicast_member(listen_socket, interface):
1966
1975
'it is expected to happen on some systems' ,
1967
1976
interface ,
1968
1977
)
1969
- return
1978
+ return None
1970
1979
elif _errno == errno .EADDRNOTAVAIL :
1971
1980
log .info (
1972
1981
'Address not available when adding %s to multicast '
1973
1982
'group, it is expected to happen on some systems' ,
1974
1983
interface ,
1975
1984
)
1976
- return
1985
+ return None
1977
1986
elif _errno == errno .EINVAL :
1978
1987
log .info ('Interface of %s does not support multicast, ' 'it is expected in WSL' , interface )
1979
- return
1988
+ return None
1980
1989
else :
1981
1990
raise
1982
1991
@@ -1985,15 +1994,17 @@ def add_multicast_member(listen_socket, interface):
1985
1994
if is_v6 :
1986
1995
respond_socket .setsockopt (_IPPROTO_IPV6 , socket .IPV6_MULTICAST_IF , iface_bin )
1987
1996
else :
1988
- respond_socket .setsockopt (socket .IPPROTO_IP , socket .IP_MULTICAST_IF , socket .inet_aton (interface ))
1997
+ respond_socket .setsockopt (
1998
+ socket .IPPROTO_IP , socket .IP_MULTICAST_IF , socket .inet_aton (cast (str , interface ))
1999
+ )
1989
2000
return respond_socket
1990
2001
1991
2002
1992
2003
def create_sockets (
1993
- interfaces : Union [ List [ Union [ str , int ]], InterfaceChoice ] = InterfaceChoice .All ,
2004
+ interfaces : InterfacesType = InterfaceChoice .All ,
1994
2005
unicast : bool = False ,
1995
2006
ip_version : IPVersion = IPVersion .V4Only ,
1996
- ):
2007
+ ) -> Tuple [ Optional [ socket . socket ], List [ socket . socket ]] :
1997
2008
if unicast :
1998
2009
listen_socket = None
1999
2010
else :
@@ -2005,7 +2016,7 @@ def create_sockets(
2005
2016
2006
2017
for i in interfaces :
2007
2018
if not unicast :
2008
- respond_socket = add_multicast_member (listen_socket , i )
2019
+ respond_socket = add_multicast_member (cast ( socket . socket , listen_socket ) , i )
2009
2020
else :
2010
2021
respond_socket = new_socket (port = 0 , ip_version = ip_version )
2011
2022
@@ -2020,9 +2031,9 @@ def get_errno(e: Exception) -> int:
2020
2031
return cast (int , e .args [0 ])
2021
2032
2022
2033
2023
- def can_send_to (sock , address : str ):
2034
+ def can_send_to (sock : socket . socket , address : str ) -> bool :
2024
2035
addr = ipaddress .ip_address (address )
2025
- return addr .version == 6 if sock .family == socket .AF_INET6 else addr .version == 4
2036
+ return cast ( bool , addr .version == 6 if sock .family == socket .AF_INET6 else addr .version == 4 )
2026
2037
2027
2038
2028
2039
class Zeroconf (QuietLogger ):
@@ -2034,7 +2045,7 @@ class Zeroconf(QuietLogger):
2034
2045
2035
2046
def __init__ (
2036
2047
self ,
2037
- interfaces : Union [ List [ Union [ str , int ]], InterfaceChoice ] = InterfaceChoice .All ,
2048
+ interfaces : InterfacesType = InterfaceChoice .All ,
2038
2049
unicast : bool = False ,
2039
2050
ip_version : Optional [IPVersion ] = None ,
2040
2051
) -> None :
@@ -2085,7 +2096,7 @@ def __init__(
2085
2096
self .engine = Engine (self )
2086
2097
self .listener = Listener (self )
2087
2098
if not unicast :
2088
- self .engine .add_reader (self .listener , self ._listen_socket )
2099
+ self .engine .add_reader (self .listener , cast ( socket . socket , self ._listen_socket ) )
2089
2100
else :
2090
2101
for s in self ._respond_sockets :
2091
2102
self .engine .add_reader (self .listener , s )
@@ -2544,8 +2555,8 @@ def close(self) -> None:
2544
2555
2545
2556
# shutdown recv socket and thread
2546
2557
if not self .unicast :
2547
- self .engine .del_reader (self ._listen_socket )
2548
- self ._listen_socket .close ()
2558
+ self .engine .del_reader (cast ( socket . socket , self ._listen_socket ) )
2559
+ cast ( socket . socket , self ._listen_socket ) .close ()
2549
2560
else :
2550
2561
for s in self ._respond_sockets :
2551
2562
self .engine .del_reader (s )
0 commit comments