
    |;iJ              
         d Z ddlmZ ddlZddlZddlZddlZddlZddlZddl	Z	ddl
mZmZ ddlmZmZmZ ddlZddlmZ ddlmZmZmZmZ ej2                   G d	 d
ej4                               Zeeeeeeeeeef   ef   f      ef   Zej2                   G d dej4                               Z ej2                   G d dej4                               Z!d$dZ"d%dZ#d&dZ$d'dZ%d(dZ&d)dZ'd*dZ(d+dZ)	 	 	 	 d,dZ*e!jV                  f	 	 	 	 	 d-dZ,d.dZ-d.dZ.	 	 	 	 	 	 d/dZ/ee!jV                  df	 	 	 	 	 	 	 	 	 d0dZ0	 	 	 	 	 	 d1dZ1	 	 d2	 	 	 	 	 	 	 d3dZ2ejf                  de!jV                  df	 	 	 	 	 	 	 	 	 d4d Z4d5d!Z5d6d"Z6d7d#Z7y)8a  Multicast DNS Service Discovery for Python, v0.14-wmcbrine
Copyright 2003 Paul Scott-Murphy, 2014 William McBrine

This module provides a framework for the use of DNS Service Discovery
using IP multicast.

This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.

This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
USA
    )annotationsN)IterableSequence)AnyUnioncast   )log)_IPPROTO_IPV6
_MDNS_ADDR_MDNS_ADDR6
_MDNS_PORTc                      e Zd ZdZdZy)InterfaceChoice   r	   N)__name__
__module____qualname__DefaultAll     F/home/ubuntu/myenv/lib/python3.12/site-packages/zeroconf/_utils/net.pyr   r   )   s    G
Cr   r   c                      e Zd ZdZdZdZy)ServiceStateChanger   r	      N)r   r   r   AddedRemovedUpdatedr   r   r   r   r   2   s    EGGr   r   c                      e Zd ZdZdZdZy)	IPVersionr   r	   r   N)r   r   r   V4OnlyV6Onlyr   r   r   r   r!   r!   9   s    FF
Cr   r!   c                    t        |       dk(  S )N   )len)addrs    r   _is_v6_addressr(   C   s    t9?r   c                z    d| v }|rt         j                  nt         j                  }t        j                  ||       S )N:)socketAF_INET6AF_INET	inet_pton)addressis_ipv6address_familys      r   _encode_addressr2   G   s/    WnG(/V__V^^NNG44r   c                    t        | D ch c],  }|j                  D ]  }|j                  s|j                   . c}}      S c c}}w N)listipsis_IPv4ipadaptersifacer'   s      r   get_all_addresses_ipv4r<   M   s5    hUU599U4UUVVUs
    A
A
c           	         t        | D ch c]8  }|j                  D ]'  }|j                  s|j                  |j                  f) : c}}      S c c}}w r4   )r5   r6   is_IPv6r8   indexr9   s      r   get_all_addresses_ipv6r@   Q   sF     -5\E%))\$t||$''5;;	\	\ \s
    A
A
c                 t    t        j                  dt        d       t        t	        j
                               S )Nzget_all_addresses is deprecated, and will be removed in a future version. Use ifaddrdirectly instead to get a list of adapters.r	   
stacklevel)warningswarnDeprecationWarningr<   ifaddrget_adaptersr   r   r   get_all_addressesrI   Y   /    MM	6	 "&"5"5"788r   c                 t    t        j                  dt        d       t        t	        j
                               S )Nzget_all_addresses_v6 is deprecated, and will be removed in a future version. Use ifaddrdirectly instead to get a list of adapters.r	   rB   )rD   rE   rF   r@   rG   rH   r   r   r   get_all_addresses_v6rL   c   rJ   r   c                z   d|v r|d |j                  d       }t        j                  |      }| D ]|  }|j                  D ]k  }|j                   t	        |j
                  t              s+t        j                  |j
                  d         |k(  sQ|j
                  |j                   fc c S  ~ t        d|       )N%r   z No adapter found for IP address )r?   	ipaddress
ip_addressr6   
isinstancer8   tupleRuntimeError)r:   r8   ipaddradapter
adapter_ips        r   ip6_to_address_and_indexrW   m   s    
by"((3- !!"%F 6!++ 	6J )z}}e4((q)9:fD"w}}55	66 9">
??r   c                    | D ]M  }|j                   |k(  s|j                  D ],  }t        |j                  t              s|j                  c c S  O t        d|       )NzNo adapter found for index )r?   r6   rQ   r8   rR   rS   )r:   r?   rU   rV   s       r   interface_index_to_ip6_addressrY   ~   s]     )==E!%kk )
jmmU3%==()) 4UG<
==r   c                :   g }t        j                         }| D ]  }t        |t              r|j	                  t        ||      |f       1t        |t              sBt        j                  |      j                  dk(  se|j	                  t        ||              |S )zConvert IPv6 interface addresses to interface indexes.

    IPv4 addresses are ignored.

    :param interfaces: List of IP addresses and indexes.
    :returns: List of indexes.
       )rG   rH   rQ   intappendrY   strrO   rP   versionrW   )
interfacesresultr:   r;   s       r   ip6_addresses_to_indexesrb      s     F""$H EeS!MM9(EJERSs#	(<(<U(C(K(Kq(PMM28UCD	E Mr   c                4   g }| t         j                  u r}|t        j                  k7  rDd}t	        j
                  |       t        j                  |t        d       |j                  d       |t        j                  k7  r|j                  d       |S | t         j                  u rt        j                         }|t        j                  k7  r|j                  t        |             |t        j                  k7  r|j                  t!        |             |st#        d|       |S t%        | t&              rS| D cg c]8  }t%        |t(              st+        j,                  |      j.                  dk(  s7|: }}|t1        |       z  }|S t3        d|       c c}w )	a-  Convert the interfaces choice into internal representation.

    :param choice: `InterfaceChoice` or list of interface addresses or indexes (IPv6 only).
    :param ip_address: IP version to use (ignored if `choice` is a list).
    :returns: List of IP addresses (for IPv4) and indexes (for IPv6).
    zIPv6 multicast requests can't be sent using default interface. Use V4Only, InterfaceChoice.All or an explicit list of interfaces.r	   rB   ))z::r   r   r   z0.0.0.0zFNo interfaces to listen on, check that any interfaces have IP version    z.choice must be a list or InterfaceChoice, got )r   r   r!   r"   r
   errorrD   rE   rF   r]   r#   r   rG   rH   extendr@   r<   rS   rQ   r5   r^   rO   rP   r_   rb   	TypeError)choice
ip_versionra   messager:   is         r   normalize_interface_choicerl      sr    <>F((()))U  IIgMM'#5!DMM+,)))MM)$$ M# 
?&&	&&&()))MM0:;)))MM0:;XYcXde  M 
FD	!#cz!S'9i>R>RST>U>]>]ab>b!cc*622 M H
STT	 ds   8F"F1Fc                    	 | j                  t        t        j                  d       y# t        $ r t        j                  d        w xY w)z?Make V6 sockets work for both V4 and V6 (required for Windows).FzOSupport for dual V4-V6 sockets is not present, use IPVersion.V4 or IPVersion.V6N)
setsockoptr   r+   IPV6_V6ONLYOSErrorr
   re   )ss    r   disable_ipv6_only_or_raiserr      s<    	]F$6$6> 		cds	   %(  Ac                    t        t        d      sy	 | j                  t        j                  t        j                  d       y# t
        $ r(}|j                  t        j                  k7  r Y d}~yd}~ww xY w)z*Set SO_REUSEADDR on a socket if available.SO_REUSEPORTNr   )hasattrr+   rn   
SOL_SOCKETrt   rp   errnoENOPROTOOPT)rq   errs     r   set_so_reuseport_if_availablerz      s\     6>*	V&&(;(;Q? 99))) *s   /A 	A4A//A4c                   |t         j                  k(  rt        j                  dd      }t        j                  dd      }| j	                  t
        j                  t
        j                  |       | j	                  t
        j                  t
        j                  |       y|t         j                  k(  rK| j	                  t        t
        j                  d       | j	                  t        t
        j                  d       yt        d      )z.Set ttl/hops and loop for mDNS respond socket.   B   r   Tz)Dual-stack responder socket not supportedN)r!   r"   structpackrn   r+   
IPPROTO_IPIP_MULTICAST_TTLIP_MULTICAST_LOOPr#   r   IPV6_MULTICAST_HOPSIPV6_MULTICAST_LOOPrS   )rq   ri   ttlloops       r   $set_respond_socket_multicast_optionsr      s    
 Y%%% kk$${{4#	V&&(?(?E	V&&(@(@$G	y''	'	]F$>$>D	]F$>$>E FGGr   Fc                   t        j                  d||||        |t        j                  k(  rt        j
                  nt        j                  }t	        j                  |t        j                        }|t        j                  k(  rt        |       |j                  t        j                  t        j                  d       t        |       |r!|j                  t        j                  dd       | d   |g| dd  }	 |j                  |       t        j                  d
|       |S # t        $ r}|j                   t         j"                  k(  rt        j$                  d|       Y d }~y |j                   t         j&                  k(  rkt(        j*                  j-                  d      st(        j*                  j-                  d      rt        j.                  d|        t        j.                  d	|        d }~ww xY w)NzNCreating new socket with port %s, ip_version %s, apple_p2p %s and bind_addr %rr   i  r   zRAddress not available when binding to %s, it is expected to happen on some systemsdarwinfreebsdzAddress in use when binding to %s; On BSD based systems sharing the same port with another stack may require processes to run with the same UID; When using avahi, make sure disallow-other-stacks is set to no in avahi-daemon.confzvAddress in use when binding to %s; When using avahi, make sure disallow-other-stacks is set to no in avahi-daemon.confzCreated socket %s)r
   debugr!   r"   r+   r-   r,   
SOCK_DGRAMr   rr   rn   rv   SO_REUSEADDRrz   bindrp   rw   EADDRNOTAVAILwarning
EADDRINUSEsysplatform
startswithre   )	bind_addrportri   	apple_p2psocket_familyrq   bind_tupexs           r   
new_socketr     s    IIX '1I4D4D&DFNN&//MmV%6%67AY]]""1%LL""F$7$7;!!$ 	
V&&2 !d3Yqr]3H	x8 II!1%H9  88u***KKd 88u'''||&&x0CLL4K4KI4V		2
 " 	 		2 	 	5s   :D# #	G2,3G-$B	G--G2c                   t        |t              }t        j                  h}t        j
                  dk(  r"|t        t        t              j                  hz  }t        j                  d|| j                                	 |r{	 t        j                  t        j                  t              }t%        j&                  dt        t(        |d               }||z   }| j+                  t,        t        j.                  |       yt        j0                  t2              t        j0                  t        t4        |            z   }| j+                  t        j6                  t        j8                  |       	 y# t         $ r t        j"                  d|       Y yw xY w# t         $ rP}t;        |      }|t        j<                  k(  rt        j"                  d|       Y d }~y|t        j>                  k(  rS|s6t        j
                  jA                  d      rt        jB                  d	|       nt        jB                  d
|       Y d }~y|t        jD                  k(  rt        j"                  d|       Y d }~y||v rt        j"                  d|       Y d }~y|t        jF                  k(  rt        j"                  d|       Y d }~y|r.|t        jH                  k(  rt        j"                  d|       Y d }~y d }~ww xY w)Nwin32z(Adding %r (socket %d) to multicast groupzuUnable to translate IPv6 address when adding %s to multicast group, this can happen if IPv6 is disabled on the systemF@Ir   zZAddress in use when adding %s to multicast group, it is expected to happen on some systemslinuxzNo buffer space available when adding %s to multicast group, try increasing `net.ipv4.igmp_max_memberships` to `1024` in sysctl.confz<No buffer space available when adding %s to multicast group.zaAddress not available when adding %s to multicast group, it is expected to happen on some systemszAInterface of %s does not support multicast, it is expected in WSLzdFailed to set socket option on %s, this can happen if the network adapter is in a disconnected statezmAddress in use when adding %s to multicast group, it is expected to happen when the device does not have ipv6T)%rQ   rR   rw   EINVALr   r   r   r   	WSAEINVALr
   r   filenor+   r.   r,   r   rp   infor~   r   r\   rn   r   IPV6_JOIN_GROUP	inet_atonr   r^   r   IP_ADD_MEMBERSHIP	get_errnor   ENOBUFSr   r   r   rx   ENODEV)	listen_socket	interfaceis_v6
err_einvalmdns_addr6_bytes	iface_bin_valuee_errnos	            r   add_multicast_memberr   C  sh   
 y%(E,,J
||wtC'1122
II8)]EYEYE[\B#)#3#3FOO[#Q  D$sIaL*ABI%	1F$$]F4J4JFSl i %%j1F4D4DT#yEY4ZZF$$V%6%68P8PRXYf   H
   11U%%%HHl U]]"S\\44W=^ R U(((HHB
 ZHHS U&&&HHA
 Vu||+HHN
 c1si   =F  (E( (AF :A,F (F
F 	F

F 
K'4K"A!K"6)K"$K")K"1+K"!K""K'c           
        t        | t              }t        |r2t        t        t        t        t
        t
        f   t
        f   |       d   nt        t        |       f|rdnt        |rt        j                  nt        j                  |      }|r|S |syt        j                  d||        |rMt        j                  dt        t
        | d               }|j                  t        t         j"                  |       nP|j                  t         j$                  t         j&                  t!        j(                  t        t        |                    t+        ||rt        j                         |S t        j                         |S )zECreate interface specific socket for responding to multicast queries.r   )r   r   ri   r   Nz1Configuring socket %s with multicast interface %sr   r   )rQ   rR   r   r   r^   r\   r   r!   r#   r"   r
   r   r~   r   rn   r   r+   IPV6_MULTICAST_IFr   IP_MULTICAST_IFr   r   )r   r   unicastr   respond_socketr   s         r   new_respond_socketr     s,    y%(E  JO$uU3S=1367CAFVZ[^`iVjUlQz(-I$$93C3C	N IIA>S\]KKd3	!&=>	!!-1I1I9U!!""T#y12	

 )U9I9Ii YbXhXhir   c                   |rd }nt        d||      }t        | |      }|s| t        j                  u r|t        j
                  k7  rl|D ]&  }t        t        t        j                  |      |       ( t        t        t        j                  |      |       |t        t        j                  |      gfS g }|D ]K  }|s%t        t        t        j                  |      |      s*t        |||      }|;|j                  |       M ||fS )N) )r   ri   r   )r   r   )r   rl   r   r   r!   r   r   r   r+   r   r   r]   )	r`   r   ri   r   r   normalized_interfacesr   respond_socketsr   s	            r   create_socketsr     s     "UzU^_6z:N z_%<%<<y}}A\. 	PI fmm]!CYO	P 	-T&---OQ[\tFMM=ABBBO* 3	3D4VXab+IT[\%"">23 /))r   c                <    t        t        | j                  d         S )Nr   )r   r\   args)r   s    r   r   r     s    QVVAYr   c                    | rd|v S d|vS )zCheck if the address type matches the socket type.

    This function does not validate if the address is a valid
    ipv6 or ipv4 address.
    r*   r   )ipv6_socketr/   s     r   can_send_tor     s     )3'>@c.@@r   c                    t        | t              rJt        d | D              }t        d | D              }|r|rt        j                  S |rt        j
                  S t        j                  S )z3Auto detect the IP version when it is not provided.c              3     K   | ]J  }t        |t              xs4 t        |t              xr" t        j                  |      j
                  d k(   L yw)r[   N)rQ   r\   r^   rO   rP   r_   .0rk   s     r   	<genexpr>z(autodetect_ip_version.<locals>.<genexpr>  sJ      
 q#_:a#5#^):N:Nq:Q:Y:Y]^:^_
s   AAc              3     K   | ]8  }t        |t              xr" t        j                  |      j                  d k(   : yw)rd   N)rQ   r^   rO   rP   r_   r   s     r   r   z(autodetect_ip_version.<locals>.<genexpr>  s6     eUVZ3'PI,@,@,C,K,Kq,PPes   >A )rQ   r5   anyr!   r   r#   r"   )r`   has_v6has_v4s      r   autodetect_ip_versionr     s`    *d# 

 
 eZdeef== ###r   )r'   bytesreturnbool)r/   r^   r   r   )r:   Iterable[ifaddr.Adapter]r   	list[str])r:   r   r   &list[tuple[tuple[str, int, int], int]])r   r   )r   r   )r:   r   r8   r^   r   z tuple[tuple[str, int, int], int])r:   r   r?   r\   r   ztuple[str, int, int])r`   z6Sequence[str | int | tuple[tuple[str, int, int], int]]r   r   )rh   InterfacesTyperi   r!   r   z,list[str | tuple[tuple[str, int, int], int]])rq   socket.socketr   None)rq   r   ri   r!   r   r   )
r   z!tuple[str] | tuple[str, int, int]r   r\   ri   r!   r   r   r   socket.socket | None)r   r   r   &str | tuple[tuple[str, int, int], int]r   r   )FF)r   r   r   r   r   r   r   r   )
r`   r   r   r   ri   r!   r   r   r   z0tuple[socket.socket | None, list[socket.socket]])r   rp   r   r\   )r   r   r/   r^   r   r   )r`   r   r   r!   )8__doc__
__future__r   enumrw   rO   r+   r~   r   rD   collections.abcr   r   typingr   r   r   rG   _loggerr
   constr   r   r   r   uniqueEnumr   r^   r\   rR   r   r   r!   r(   r2   r<   r@   rI   rL   rW   rY   rb   r"   rl   rr   rz   r   r   r   r   r   r   r   r   r   r   r   r   <module>r      sh  , #      
  . # #   F F dii  
 xc3eCcM6JC6O0P&P QRTccd    		  5W99@">F+. 5>4D4D**(1*1*Z&HHH 
H> %,,	;0;
; ; 	;
 ;|N N5N 
Nf #5## # 	#N "1!4!4%,,	"*"*"* "* 	"*
 6"*J Ar   