
    Mh&                       U 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mZmZ ddl	m
Z
mZmZmZ ddlmZ g Zded<   g Zded	<   d
aded<   d2dZd3dZd4dZd4dZ G d de          Zd5dZ ej        dej                  Zd6dZd6d Z ej        d!ej                  Z d6d"Z!d6d#Z"d6d$Z#d6d%Z$d6d&Z%ed7d8d*            Z&ed9d,            Z'ed9d-            Z(ed:d.            Z)ed;d0            Z*ed;d1            Z+dS )<z-Utilities for identifying local IP addresses.    )annotationsN)PIPEPopen)AnyCallableIterableSequence)warnlist	LOCAL_IPS
PUBLIC_IPS str	LOCALHOSTelemsr   returnc                    t                      }g }| D ]0}||vr*|                    |           |                    |           1|S )zuniq_stable(elems) -> list

    Return from an iterable, a list of all the unique elements in the input,
    maintaining the order in which they first appear.
    )setappendadd)r   seenvaluexs       ^/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/jupyter_client/localinterfaces.py_uniq_stabler      sN     55DE  D==LLOOOHHQKKKL    cmdstr | Sequence[str]c                   d}t           j        dk    r-t          j                    }|xj        t          j        z  c_        t          | t          t          |          }|                                \  }}|j	        r9d
                    | |                    dd                    }t          |          |                    dd          S )z4Get output of a command, raising IOError if it failsNnt)stdoutstderrstartupinfozFailed to run {}: {}utf8replace)osname
subprocessSTARTUPINFOdwFlagsSTARTF_USESHOWWINDOWr   r   communicate
returncodeformatdecodeOSError)r   r#   pr!   r"   msgs         r   _get_outputr3   #   s    K	w$ ,..z>>c$tEEEA]]__NFF| $++Cvy1Q1QRRcll==+++r   fr   c                "     d _         d fd}|S )z%decorator to only run a function onceFkwargsr   r   c                 8    j         rd S  di | }d_         |S )NT called)r6   retr4   s     r   wrappedz_only_once.<locals>.wrapped5   s/    8 	Fakk&kk
r   )r6   r   r   r   r9   )r4   r<   s   ` r   
_only_oncer=   1   s/    AH      Nr   c                     d fd}|S )z2decorator to ensure load_ips has been run before fargsr   r6   r   c                 0    t                        | i |S )N)	_load_ips)r?   r6   r4   s     r   
ips_loadedz!_requires_ips.<locals>.ips_loadedB   s!    q$!&!!!r   )r?   r   r6   r   r   r   r8   )r4   rB   s   ` r   _requires_ipsrC   ?   s)    " " " " " " r   c                      e Zd ZdS )NoIPAddressesN)__name__
__module____qualname__r8   r   r   rE   rE   J   s        Dr   rE   addrsSequence[str] | NoneNonec                   | st           g }g }| D ]K}|                    |           |                    d          s|                    |           Bt          s|aLt          rt          dk    rda|                    dt                     |                    ddg           t          |          t          dd<   t          |          t          dd<   dS )z7populate local and public IPs from flat list of all IPs127.	127.0.0.1r   0.0.0.0r   N)	rE   r   
startswithr   insertextendr   r   r   )rI   
public_ips	local_ipsips       r   _populate_from_listrV   N   s      JI  }}V$$ 	b!!!! 	I '	[00	I&&&i_%%%	**IaaaL ,,JqqqMMMr   zinet\b.*?(\d+\.\d+\.\d+\.\d+)c                 f   	 t          d          } n# t          $ r t          d          } Y nw xY w|                                 }g }|D ]X}t                              |                                          }|r(|                    |                    d                     Yt          |           dS )z0load ip addresses from `ifconfig` output (posix)ifconfigz/sbin/ifconfig   N)	r3   r0   
splitlines_ifconfig_ipv4_patmatchstripr   grouprV   outlinesrI   linems        r   _load_ips_ifconfigrd   k   s    ,*%% , , ,*++, NNEE % %$$TZZ\\22 	%LL$$$s    ..c                 n   t          g d          } |                                 }g }|D ]{}|                                                                }t	          |          dk    r@|d         dk    r4|                    |d                             d          d                    |t          |           dS )z/load ip addresses from `ip addr` output (Linux))rU   z-finetaddr   r   rf   rY   /N)r3   rZ   lowersplitlenr   rV   )r`   ra   rI   rb   blockss        r   _load_ips_iprn   }   s    
222
3
3CNNEE 2 2##%%KK16!9#6#6LL--a0111r   zipv4.*?(\d+\.\d+\.\d+\.\d+)$c                 $   t          d          } |                                 }g }|D ]X}t                              |                                          }|r(|                    |                    d                     Yt          |           dS )z2load ip addresses from `ipconfig` output (Windows)ipconfigrY   N)r3   rZ   _ipconfig_ipv4_patr\   r]   r   r^   rV   r_   s        r   _load_ips_ipconfigrr      s    
j
!
!CNNEE % %$$TZZ\\22 	%LL$$$r   c                 F   ddl } g }g }|                                                                 D ]\  }}|D ]|}|j        t          j        k    re|j        }|                    d          s+|                    d          s|                    |           n	t          s|a	|                    |           }t          sda	|
                    dt                     |                    ddg           t          |          t          dd<   t          |          t          dd<   dS ) load ip addresses with netifacesr   NlorM   rN   rO   r   )psutilnet_if_addrsitemsfamilysocketAF_INETaddressrP   r   r   rQ   rR   r   r   r   )rv   rT   rS   ifaceifaddressesaddress_datarg   s          r   _load_ips_psutilr      s>   MMM IJ
 %113399;; ' '{' 	' 	'L"fn44#+((.. %$//&2I2I %%%d++++" % $I  &&&	'  '	I&&&i_%%%	**IaaaL ,,JqqqMMMr   c                 p   ddl } g }g }|                                 D ]}|                     |                              | j        g           }|D ]x}|                    d          }|s|                    d          s+|                    d          s|                    |           n	t          s|a|                    |           yt          sda|                    dt                     |	                    ddg           t          |          t          dd<   t          |          t          dd<   dS )	rt   r   Nrg   ru   rM   rN   rO   r   )	netifaces
interfacesr~   getr{   rP   r   r   rQ   rR   r   r   r   )r   rT   rS   r}   ipv4sentryrg   s          r   _load_ips_netifacesr      s\    IJ %%'' # #%%e,,001BBGG 	# 	#E99V$$D $$T** !doof.E.E !!!$'''' ! 	T""""	#  '	I&&&i_%%%	**IaaaL ,,JqqqMMMr   c                    	 t          j        d          d         t          dd<   n# t          $ r dgt          dd<   Y nw xY w	 t          j                    } t          j        |           d         t
          dd<   |                     d          sVt          d t
          D                       r8t          j        t          j                    dz             d         t
          dd<   n# t          $ r Y nw xY wt          t
                    t
          dd<   t          	                    t
                     nB# t          t
                    t
          dd<   t          	                    t
                     w xY wt          	                    ddg           t          t                    t          dd<   t          d	         a
dS )
zJload ip addresses with socket.gethostbyname_ex

    This can be slow.
    	localhostrh   NrN   z.localc              3  @   K   | ]}|                     d           V  dS )127N)rP   ).0rU   s     r   	<genexpr>z*_load_ips_gethostbyname.<locals>.<genexpr>   s.      2]2]B2==3G3G2]2]2]2]2]2]r   rO   r   r   )rz   gethostbyname_exr   r0   gethostnamer   endswithallr   rR   r   )hostnames    r   _load_ips_gethostbynamer      s   %.{;;A>	!!! % % %#}	!!!%
%%''/99!<
111  ** 	Xs2]2]R\2]2]2]/]/] 	X"3F4F4H4H84STTUVWJqqqM    %Z00
111$$$$ %Z00
111$$$$ i_%%%	**IaaaL!IIIs:   $' A AB"C( 'D6 (
C52D6 4C55D6 6?E5c                 J    da t           ddgt          dd<   g t          dd<   dS )z&Fallback in case of unexpected failurerN   rO   r   N)r   r   r   r8   r   r   _load_ips_dumbr      s.     Iy"-IaaaLJqqqMMMr   Tsuppress_exceptionsboolc                   	 	 t                      S # t          $ r Y nw xY w	 t                      S # t          $ r Y nw xY wt          j        dk    r&	 t                      S # t          t          f$ r Y nPw xY w	 t                      S # t          t          f$ r Y nw xY w	 t                      S # t          t          f$ r Y nw xY wt                      S # t          $ r!}| s t          d|z  d           Y d}~nd}~ww xY wt                       dS )a  load the IPs that point to this machine

    This function will only ever be called once.

    If will use psutil to do it quickly if available.
    If not, it will use netifaces to do it quickly if available.
    Then it will fallback on parsing the output of ifconfig / ip addr / ipconfig, as appropriate.
    Finally, it will fallback on socket.gethostbyname_ex, which can be slow.
    r    z9Unexpected error discovering local network interfaces: %srh   )
stacklevelN)r   ImportErrorr   r&   r'   rr   r0   rE   rn   rd   r   	Exceptionr
   r   )r   es     r   rA   rA      s   %\	#%%% 	 	 	D		&((( 	 	 	D	
 7d??)+++]+   #~~%]+   )+++]+   
 '((( \ \ \" 	H1LYZ[[[[[[[[[	\
 s    
C C 0 
=C =C A A30C 2A33C 7B BC BC B+ +B?<C >B??C 
C;C66C;	list[str]c                     t           S )z2return the IP addresses that point to this machiner   r8   r   r   rT   rT   2  
     r   c                     t           S )zKreturn the IP addresses for this machine that are visible to other machinesr   r8   r   r   rS   rS   8  s
     r   c                     t           S )z1return ip for localhost (almost always 127.0.0.1))r   r8   r   r   r   r   >  r   r   rU   c                    | t           v S )z does `ip` point to this machine?r   rU   s    r   is_local_ipr   D  s     ?r   c                    | t           v S )z#is `ip` a publicly visible address?r   r   s    r   is_public_ipr   J  s     r   )r   r   r   r   )r   r   r   r   )r4   r   r   r   )rI   rJ   r   rK   )r   rK   )T)r   r   r   rK   )r   r   )r   r   )rU   r   r   r   ),__doc__
__future__r   r&   rerz   r(   r   r   typingr   r   r   r	   warningsr
   r   __annotations__r   r   r   r3   r=   rC   r   rE   rV   compile
IGNORECASEr[   rd   rn   rq   rr   r   r   r   r   rA   rT   rS   r   r   r   r8   r   r   <module>r      s   3 3 3 # " " " " " 				 				      " " " " " " " " 4 4 4 4 4 4 4 4 4 4 4 4      	    
    	       , , , ,      	 	 	 	 	I 	 	 	- - - -4  RZ @"-PP    $
 
 
 
  RZ ?OO 
 
 
 
- - - -:- - - -<   @    1 1 1 1 1h    
    
    
    
      r   