
    =*f[                         S r SrSrSSKrSSKrSSKrSSKJr  SSKJ	r	  \	" \
5      rS	 rSS
 jr " S S5      r " S S\5      r\" SS5      \l         " S S\5      rSS jr\" \5      \l        g)zJFail2Ban Developers, Alexander Koeppe, Serg G. Brester, Yaroslav Halchenkoz+Copyright (c) 2004-2016 Fail2ban DevelopersGPL    N   )Utils   )	getLoggerc                 F    [        U [        5      (       a  U $ [        U 5      $ )z8A little helper to guarantee ip being an IPAddr instance
isinstanceIPAddr)ips    7/usr/lib/python3/dist-packages/fail2ban/server/ipdns.pyasipr   '   s    r6	)r
    c           	          U =(       d    [         R                  " 5       n S [         R                  " U SS[         R                  S[         R                  5       5       nU(       a7  U S-   nSnU H(  nUR                  U5      (       a  Us  $ U(       a  M&  UnM*     U$  [         R                  " U 5      $ ! [         R                   a     N,f = f)zGet fully-qualified hostname of given host, thereby resolve of an external
IPs and name will be preferred before the local domain (or a loopback), see gh-2438
c              3   D   #    U  H  nUS    (       d  M  US    v   M     g7f)   N ).0ais     r   	<genexpr>getfqdn.<locals>.<genexpr>3   s(      R
1 	2a5 s     Nr   .)socketgethostnamegetaddrinfo
SOCK_DGRAMAI_CANONNAME
startswitherrorgetfqdn)namenamespreffirstr   s        r   r    r    -   s    		%##%$%%$6$$a)<)<%
 
s(45r	}}TY5"% 
 <  	t 	 s   BB3 B3 B3 3C
	C
c                      \ rS rSr\R
                  " SSS9r\R
                  " SSS9r\S 5       r	\S 5       r
\S 5       r\SS j5       rS	r\S
 5       rSr\S 5       rSr\S 5       rSr\S 5       r\S 5       rSr\S 5       rSrg)DNSUtilsM   i  ,  maxCountmaxTimec                    [         R                  R                  U 5      nUb  U$ [        5       nSn[         R	                  5       (       a   [
        R                  [
        R                  4O[
        R                  4 H  n [
        R                  " U SUS[
        R                  5       Hy  n[        U5      S:  d  [        US   5      (       d  M'  [        [        US   S   5      [        R                  U5      5      nUR                  (       d  Mh  UR                  U5        M{     M     U(       d  U(       a  ["        R%                  SX5        [         R                  R                  X5        U$ ! [          a  nUn SnAGM  SnAff = f)zYConvert a DNS into an IP address using the Python socket module.
Thanks to Kevin Drapel.
Nr      z4Unable to find a corresponding IP address for %s: %s)r&   CACHE_nameToIpgetsetIPv6IsAllowedr   AF_INETAF_INET6r   IPPROTO_TCPlenr   str_AF2FAMisValidadd	ExceptionlogSyswarning)dnsipssaveerrfamresultr   es          r   dnsToIpDNSUtils.dnsToIpS   s%    	##C(#_
:#'2:2H2H2J2Jv~~foo.QWQ_Q_Paac
$$S$Q8J8JKFas6!9~~x VAYq\"FNN3$7
8R



	ggbk L b 
	>>H#W
c'	*  Gs   ?BE-E--
F7F  Fc                 :   [         R                  R                  U S5      nUS:w  a  U$  [        R                  " U 5      S   n[         R                  R                  X5        U$ ! [        R
                   a"  n[        R                  SX5        S n S nANRS nAff = f)Nr   r   z'Unable to find a name for the IP %s: %s)	r&   CACHE_ipToNamer/   r   gethostbyaddrr   r;   debugr0   )r   vrB   s      r   ipToNameDNSUtils.ipToNameq   s     !!"b)!"W
8B"1 b$	
(	 
 	<<92A1s   A$ $B8BBc                 P   [        5       n[        R                  U 5      nUb-  [        U5      nUR                  (       a  UR	                  U5        US;   aP  U(       dI  [
        R                  U 5      nUR                  U5        U(       a  US:X  a  [        R                  SX5        U$ )z<Return the IP of DNS found in a given text.
                )yeswarnrN   z'Determined IP using DNS Lookup: %s = %s)
r0   r   searchIPr8   r9   r&   rC   updater;   r<   )textuseDnsipListplainIPr   s        r   textToIpDNSUtils.textToIp   s     5&OOD!'w2jj
JJrN v2	==Vv
NN<	 
-r   c                 z   SSU 4n[         R                  R                  U5      nUb  U$ SnU (       a  [        [        R
                  4O[        R
                  [        4 H  n U" 5       n  O   [         R                  R                  X5        U$ ! [         a!  n[        R                  SU5         SnAMV  SnAff = f)z;Get short hostname or fully-qualified hostname of host selfselfhostnameN z#Retrieving own hostnames failed: %s)
r&   rF   r/   r    r   r   r:   r;   r<   r0   )fqdnkeyr!   rY   rB   s        r   getHostnameDNSUtils.getHostname   s     

D!#		 	 	$	$S	)$	
;	$$(GV v/A/A7.KK =:D		 L c(	+	  =
NN8!<<=s   #B
B:B55B:)rX   r=   c                  H   [         R                  R                  [         R                  5      n U b  U $ [	        S[         R                  S5      [         R                  S5      /5      [	        S/5      -
  n [         R                  R	                  [         R                  U 5        U $ )zGet own host names of self	localhostFTrZ   )r&   rF   r/   _getSelfNames_keyr0   r]   )r"   s    r   getSelfNamesDNSUtils.getSelfNames   s     
!
!
%
%h&@&@
A%

<
$$U+X-A-A$-G 
B4y% h88%@	,r   )netintrfr>   c                  Z   [         R                  R                  [         R                  5      n U b  U $  [	        [         R                  5        VVs/ s H  u  pUPM	     snn5      n [         R                  R                  [         R                  U 5        U $ s  snnf !   [	        5       n  ND= f)Get own IP addresses of self)r&   r.   r/   _getNetIntrfIPs_key	IPAddrSet_NetworkInterfacesAddrsr0   )r>   nias      r   getNetIntrfIPsDNSUtils.getNetIntrfIPs   s     	##H$@$@A#_
:	8#C#C#EF#E%"A#EF	G3 h::C@	* G	3s   B B
B B B*)rX   r>   c                     [         R                  R                  [         R                  5      n U b  U $ [	        [         R                  5       5      n [         R                  5        H%  n U [	        [         R                  U5      5      -  n M'     [         R                  R                  [         R                  U 5        U $ ! [         a!  n[        R                  SX5         SnAM  SnAff = f)rf   Nz#Retrieving own IPs of %s failed: %s)r&   r.   r/   _getSelfIPs_keyrh   rl   rb   rC   r:   r;   r<   r0   )r>   rY   rB   s      r   
getSelfIPsDNSUtils.getSelfIPs   s     	##H$<$<=#_
:())+,#'')hG9X%%h/00C * h66<	*	  G
NN8(FFGs   (!B==
C(C##C(Nc                  x   [         R                  (       d  g [        SS5       n [        U R	                  5       5      (       + sS S S 5        $ ! , (       d  f       O
= f!    O= fS n [         R                   " [         R
                  [         R                  5      nUR                  S5         U(       a  UR                  5         gg! [         a  n[        US5      (       a  SS KnUR                  S:  d&  UR                  UR                  UR                  4;   a   S nAU(       a  UR                  5         ggUR                  UR                  UR                  4;   a   S nAU(       a  UR                  5         gg S nAOS nAff = fU(       a  UR                  5         g ! U(       a  UR                  5         f f = f)NFz(/proc/sys/net/ipv6/conf/all/disable_ipv6rb)rZ   r   Terrnor   )r   has_ipv6openintreadr3   SOCK_STREAMbindcloser:   hasattrrt   EADDRNOTAVAILEAFNOSUPPORT
EADDRINUSEEACCES)fsrB   rt   s       r   _IPv6IsSupportedBySystem!DNSUtils._IPv6IsSupportedBySystem   s.   	
7>!1668} 	?>>
!}}V__f&8&89166'?
 a 
 aww{agg%"5"5u7I7I!JJ
 a 	ww5##U\\22a 	 asf   A A	A 
AA A A!'AC 
FAE?F 7&E?F :F ?FF F9c                 |    U [         l        [        R                  SU b  U (       a  S5        U $ S5        U $ S5        U $ )Nz
IPv6 is %sonoffauto)r&   _IPv6IsAllowedr;   rH   )values    r   setIPv6IsAllowedDNSUtils.setIPv6IsAllowed
  s@    !(,,|5;LedY	, 27Y	, SYY	,r   )rX   zipv6-allowedc                     [         R                  b  [         R                  $ [         R                  R                  [         R                  5      n U b  U $ [         R                  5       n U cX  [         R                  5       nU(       d+  S[         l         [         R                  5       nS [         l        [        S U 5       5      n [         R                  R                  [         R                  U 5        U $ ! S [         l        f = f)NTc              3   @   #    U  H  nS UR                   ;   v   M     g7f):N)ntoa)r   r   s     r   r   )DNSUtils.IPv6IsAllowed.<locals>.<genexpr>$  s     
*cC277Ncs   )
r&   r   r.   r/   _IPv6IsAllowed_keyr   rl   rp   anyr0   )rI   r>   s     r   r1   DNSUtils.IPv6IsAllowed  s    (

!
!!!!("="=>!]
8'')!Y		 	 	"3
"H$ S#X

*c
**1
h991=	
(  $Xs   C3 3D r   )T)__name__
__module____qualname____firstlineno__r   Cacher.   rF   staticmethodrC   rJ   rU   r]   ra   rb   rg   rl   ro   rp   r   r   r   r   r1   __static_attributes__r   r   r   r&   r&   M   s    ++tT:++tT: :    ,  , $  *   " $  >   . r   r&   c                     ^  \ rS rSrSrSrSr\R                  " S\< S\< S35      r	\R                  " S\< S	\< S
\< S	\< S3	5      r
SrSr\R                  " SSS9rSrSr\\R&                  -
  r\\R*                  -
  r\S 5       r\4U 4S jjr\S 5       r\4S jrS rS rS r\S 5       r \S 5       r!\R&                  S\R*                  S0r"\S 5       r#\S 5       r$\S  5       r%\S! 5       r&\S" 5       r'S# r(S$ r)S% r*S& r+S' r,S( r-\S) 5       r.\S* 5       r/S7S+ jr0S, r1\S- 5       r2\S. 5       r3S/ r4S0 r5S1 r6S2 r7\7" 5       r8\S3 5       r9\S4 5       r:\S5 5       r;S6r<U =r=$ )8r   i.  z>Encapsulate functionality for IPv4 and IPv6 addresses
        z(?:\d{1,3}\.){3}\d{1,3}z:(?:[0-9a-fA-F]{1,4}::?|:){1,7}(?:[0-9a-fA-F]{1,4}|(?<=:):)z^(?:(?P<IPv4>z)|\[?(?P<IPv6>z)\]?)$z^(|z)/(?:(\d+)|(z))$N)_family_addr_plen	_maskplen_rawi'  r(   r)   c                 (    [         R                  U -
  $ N)r   CIDR_RAW)rI   s    r   r7   IPAddr._AF2FAME  s    	1	r   c                   > U[         R                  :X  a+  [        U[        [        45      (       a  [         R
                  nU[         R
                  :X  a&  [        [         U ]  U 5      nUR                  X5        U$ X4n[         R                  R                  U5      nUb  U$ U[         R                  :X  aR  [         R                  U5      u  pX4nU[         R                  :w  a$  [         R                  R                  U5      nUb  U$ [        [         U ]  U 5      nUR                  X5        UR                  [         R
                  :w  a  [         R                  R                  XC5        U$ r   )r   CIDR_UNSPECr
   tuplelistr   super__new___IPAddr__init	CACHE_OBJr/   _IPAddr__wrap_ipstrr   r0   )clsipstrcidrr   args	__class__s        r   r   IPAddr.__new__I  s   	VJuudm$D$D
//4	V__fc"3'299U
9
$D!"^
9	V$$U+;5-4
f   					d	#B	~YVS!#&"))EZZ6??"	!	)r   c                    [        U 5      S:  a  U S   S:X  a  U S   S:X  a  U SS n SU ;  a  U [        R                  4$ [        R                  R	                  U 5      nUc  U [        R                  4$ [        UR                  5       5      nUS   (       a  [        R                  US   5      US'   US	  [        US   5      US'   U$ ! [         a    U [        R                  4s $ f = f)Nr   r   [r   ]r   /)
r5   r   r   IP_W_CIDR_CREmatchr   groups
masktoplenrw   
ValueError)r   r   s     r   __wrap_ipstrIPAddr.__wrap_ipstrd  s     	Z!^aCE"I,<2;5
##
##  '!Y
##
##
188:!qT


AaD
!1Q4d$
ad)1Q4 
( 
 $
##
##$s   5C C'&C'c                 :   [         R                  U l        SU l        SU l        SU l        Xl        U[        R                  :w  Ga  Ub)  U[        R                  :  a  [        R                  U-
  /nO [         R                  [         R                  /nU H   n [         R                  " X15      nX0l          O   U R                  [         R                  :X  aR  [        R                  " SW5      u  U l        SU l        Ub)  US:  a"  SU-	  ) nU =R                  U-  sl        X l        gggU R                  [         R                  :X  a  [        R                  " SW5      u  pgUS-  U-  U l        SU l        Ub(  US:  a"  S	U-	  ) nU =R                  U-  sl        X l        gU R                  [        R                   5      (       a'  US-  U l        [         R                  U l        SU l        ggg[        R                  U l        g! [         R                   a     GM  f = f)
zJinitialize IP object by converting IP address string
to binary to integer
r   N!L        !QQ@      	    )r   	AF_UNSPECr   r   r   r   r   r   r   r2   r3   	inet_ptonr   structunpackisInNetIP6_4COMPAT)rX   r   r   familybinarymaskhilos           r   __initIPAddr.__initz  s    !!$,$*$*$.)	V__
4&//1oo$%Fnnfoo.Fvv-V\
	  llfnn$--f-KDJDJ DAID !T	ZZ4ZZ &
 	']]5&)FB(bDJDJ DAI0D89T	ZZ4ZZ 
f((	)	)z/TZNNT\TZ 
* 	($ //4<A << s   HHHc                 ,    [        U R                  5      $ r   )reprr   rX   s    r   __repr__IPAddr.__repr__  s    	diir   c                     [        U R                  [        5      (       a  U R                  $ [        U R                  5      $ r   )r
   r   r6   r   s    r   __str__IPAddr.__str__  s)     C00Dc$))nDr   c                 (    [         U R                  44$ )zIPAddr pickle-handler, that simply wraps IPAddr to the str

Returns a string as instance to be pickled, because fail2ban-client can't
unserialize IPAddr objects
)r6   r   r   s    r   
__reduce__IPAddr.__reduce__  s     		|	r   c                     U R                   $ r   )r   r   s    r   addrIPAddr.addr      	r   c                     U R                   $ r   )r   r   s    r   r   IPAddr.family  s    	r   inet4inet6c                 T    [         R                  R                  U R                  5      $ r   )r   FAM2STRr/   r   r   s    r   	familyStrIPAddr.familyStr  s    			DLL	))r   c                     U R                   $ r   )r   r   s    r   plenIPAddr.plen  r   r   c                     U R                   $ )zfThe raw address

Should only be set to a non-empty string if prior address
conversion wasn't possible
)r   r   s    r   raw
IPAddr.raw  s     
r   c                 <    U R                   [        R                  :g  $ )zDEither the object corresponds to a valid IP address
                )r   r   r   r   s    r   r8   IPAddr.isValid  s     
))	))r   c                     U R                   [        R                  S[        R                  S0R	                  U R
                  S5      :H  $ )zWReturns whether the object is a single IP address (not DNS and subnet)
                r   r   i)r   r   r2   r3   r/   r   r   s    r   isSingleIPAddr.isSingle  s6     
FOOSAEEdllTYZ	ZZr   c                    U R                   [        R                  :X  a$  [        U[        5      (       d  U R                  U:H  $ [        U[        5      (       d  Uc  g[        U5      nU R                   UR                   :w  a  gU R                   [
        R                  :X  a  U R                  UR                  :H  $ U R                  UR                  :H  =(       a    U R                  UR                  :H  $ NF)	r   r   r   r
   r   r   r   r   r   rX   others     r   __eq__IPAddr.__eq__  s    	\\V__$Zv-F-F
))u
	E6	"	"mE%=5	\\U]]"5	\\V%%%
))uzz
!!JJ%++ JJ%++r   c                     X:X  + $ r   r   r   s     r   __ne__IPAddr.__ne__  s    	r   c                 @   U R                   [        R                  :X  a$  [        U[        5      (       d  U R                  U:  $ [        U[        5      (       d  Uc  g[        U5      nU R                   UR                   :  =(       d    U R
                  UR
                  :  $ r   )r   r   r   r
   r   r   r   s     r   __lt__IPAddr.__lt__  so    	\\V__$Zv-F-F
))e
	E6	"	"mE%=5		%	Aekk)AAr   c                 R    [        U[        5      (       d  [        U5      nU < U< 3$ r   r	   r   s     r   __add__IPAddr.__add__  s#    	E6	"	"%=5	r   c                 R    [        U[        5      (       d  [        U5      nU< U < 3$ r   r	   r   s     r   __radd__IPAddr.__radd__  s#    	E6	"	"%=5$	r   c                 ,    [        U R                  5      $ r   )hashr   r   s    r   __hash__IPAddr.__hash__  s    	diir   c                     U R                   [        R                  :X  a  SU R                  -  $ U R                   [        R                  :X  a  SU R                  -  $ g)zJHex representation of the IP address (for debug purposes)
                z%08xz%032xrZ   )r   r   r2   r   r3   r   s    r   hexdumpIPAddr.hexdump  sE     
\\V^^#
4::
||v&
DJJ

r   c                    SnU R                   (       aR  [        R                  " SU R                  5      nU R                  (       a  U R                  S:  a  SU R                  -  nOU R
                  (       af  U R                  S-	  nU R                  S-  n[        R                  " SX45      nU R                  (       a  U R                  S:  a  SU R                  -  nOU R                  $ [        R                  " U R                  U5      U-   $ )	zcrepresent IP object as text like the deprecated
C pendant inet.ntoa but address family independent
rZ   r   r   z/%dr   l    r   r   )
isIPv4r   packr   r   isIPv6r   r   	inet_ntopr   )rX   r9   r   r   r   s        r   r   IPAddr.ntoa  s    
 	#	[[KKdjj)6
jjTZZ"_
$**
C{{

b2

''2KKr&6
jjTZZ#%
$**
C
))			$,,	/#	55r   c                     U R                   (       a!  U R                  R                  S5      nUc  SnO$U R                  (       a  U R                  nUc  SnOgSR                  [        U5      5      < SU< 3$ )a  return the DNS PTR string of the provided IP address object

If "suffix" is provided it will be appended as the second and top
level reverse domain.
If omitted it is implicitly set to the second and top level reverse
domain of the according IP address family
r   zin-addr.arpa.z	ip6.arpa.rZ   )r  r   splitr  r  joinreversed)rX   suffixexploded_ips      r   getPTRIPAddr.getPTR0  s_     
[[%;nF{{;nF
HHXk23V	<<r   c                 @    [         R                  U R                  5      $ )zMReturn the host name (DNS) of the provided IP address object
                )r&   rJ   r   r   s    r   getHostIPAddr.getHostE  s     
		499	%%r   c                 <    U R                   [        R                  :H  $ )zBEither the IP object is of address family AF_INET
                )r   r   r2   r   s    r   r  IPAddr.isIPv4J  s     
	&&r   c                 <    U R                   [        R                  :H  $ )zCEither the IP object is of address family AF_INET6
                )r   r   r3   r   s    r   r  IPAddr.isIPv6P  s     
	''r   c                    UR                   (       d2  UR                  S:w  a"  U [        R                  UR                  5      ;   $ U R                  UR                  :w  a  gU R
                  (       a  SUR                  -	  ) nO#U R                  (       a  SUR                  -	  ) nOgU R                  U-  UR                  :H  $ )zGReturn either the IP object is in the provided network
                rZ   Fr   r   )	r8   r   r&   rC   r   r  r   r  r   )rX   netr   s      r   r   IPAddr.isInNetV  s     
B
(""377+
++	[[CJJ
	[[#(("
#4{{.#((:
;4

))d
sxx	''r   c                 h    [        U[        5      =(       a    X:H  =(       d    UR                  U 5      $ )zIReturn whether the object (as network) contains given IP
                )r
   r   r   rX   r   s     r   containsIPAddr.containsi  s&     
B		DRZ%C2::d3CDr   c                 $    U R                  U5      $ r   r-  r,  s     r   __contains__IPAddr.__contains__n  s    	r	r   c                      SS-  S-
  n SnU SUSSS0nSn[        SS5       H%  nUSU-  -  nUS:  a
  SU-
  X#U-  '   SU-
  X#U -  '   M'     U$ )Nr   r   r   r   r         )range)m6m4mmapmis        r   __getMaskMapIPAddr.__getMaskMapr  st    	S!|""
c2r1a	 $!C=aQ;1"f6DRL'4B<	 
 
+r   c                     SnU R                   b  U R                   $ [        R                  R                  U R                  5      nUc  [        S[        U 5      < S35      eXl         U$ )Nr   zinvalid mask z, no plen representation)r   r   MAP_ADDR2MASKPLENr/   r   r   r6   )rX   mplens     r   maskplenIPAddr.maskplen  sV    
%	^^
..

"
"
&
&tzz
2%
]	TL	MM.	,r   c                 ,    [        U 5      R                  $ )zEConvert mask string to prefix length

To be used only for IPv4 masks
)r   rA  )r   s    r   r   IPAddr.masktoplen  s     
		r   c                     [         R                  R                  U 5      nU(       d  gUR                  S5      nUb  US:w  a  U$ UR                  S5      $ )zPSearch if text is an IP address, and return it if so, else None
                NIPv4rZ   IPv6)r   
IP_4_6_CREr   group)rQ   r   r   s      r   rO   IPAddr.searchIP  sN     


!
!$
'%	

++f
%
5B;
<	V	r   )r   r   r   r   r   r   )>r   r   r   r   __doc__IP_4_REIP_6_RErecompilerH  r   r   	__slots__r   r   r   r   r   r   r2   FAM_IPv4r3   FAM_IPv6r   r7   r   r   r   r   r   r   propertyr   r   r   r   r   r   r8   r   r   r  r  r  r
  r  r  r   r  r"  r  r  r   r-  r1  _IPAddr__getMaskMapr?  rA  r   rO   r   __classcell__)r   s   @r   r   r   .  sM    *Ljj3:GDF)0'7GLN  : [[%6v~~%v&  * 6  * * 5"nE     NNGV__g>
* *     * *
 [ [
B 
 

   6 6,=*&
 ' '
 ( (
(&E

 "^
    	 	r   r   z
::ffff:0:0`   c                   0    \ rS rSrSr/ 4S jrS rS rSrg)rh   i  Fc                     [        5       nU HX  n[        U[        5      (       d  [        U5      nUR                  U5        U =R                  UR
                  (       + -  sl        MZ     [         R                  X5        g r   )r0   r
   r   r9   	hasSubNetr   __init__)rX   r>   ips2r   s       r   rZ  IPAddrSet.__init__  sU    	$b
R
 
 vbz"88B<>>_$>  ,,tr   c                     [        U[        5      (       d  [        U5      nU =R                  UR                  (       + -  sl        [        R                  X5        g r   )r
   r   rY  r   r0   r9   r,  s     r   r9   IPAddrSet.add  s7    	B		fRj..O#.''$r   c                    ^ [        T[        5      (       d  [        T5      m[        R                  U T5      =(       d(    U R                  =(       a    [        U4S jU  5       5      $ )Nc              3   D   >#    U  H  oR                  T5      v   M     g 7fr   r0  )r   nr   s     r   r   )IPAddrSet.__contains__.<locals>.<genexpr>  s     >\W[RSzz"~~W[s    )r
   r   r0   r1  rY  r   r,  s    `r   r1  IPAddrSet.__contains__  sE    	B		fRj			$	#	](\3>\W[>\;\]r   r   N)	r   r   r   r   rY  rZ  r9   r1  r   r   r   r   rh   rh     s     
^r   rh   c                   ^^^^^^^^^^^^^^^^  SSK JnJnJmJmJmJmJmJmJ	nJ
nJnJnJmJm  SS KnSS K n " UU4S jSU5      m " UUU4S jSU5      m " UUUU4S jSU5      m " UU4S	 jS
U5      n " S SU5      mST" T5      4SU4SU4ST" T5      4ST" T5      4SU4SU4/Tl        UR#                  UR$                  R'                  S5      =(       d    S5      mTR(                  (       d  [+        S5      eS mSUUUUU4S jjmSUUUUUUU4S jjn	[/        U	5      [0        l        U	" U 5      $ ! [,         a  n
[+        U
5      mU4S jn	 S n
A
N<S n
A
ff = f)Nr   )	StructureUnionPOINTERpointer	get_errnocastc_ushortc_bytec_void_pc_char_pc_uintc_intc_uint16c_uint32c                   0   > \ rS rSrS Y4S Y S-  4/rSrg)0_NetworkInterfacesAddrs.<locals>.struct_sockaddri  	sa_familysa_data   r   Nr   r   r   r   _fields_r   )rl  rk  s   r   struct_sockaddrrt    s    (8r   rz  c                   8   > \ rS rSrS Y4S Y4S Y S-  4/rSrg)3_NetworkInterfacesAddrs.<locals>.struct_sockaddr_ini  
sin_familysin_portsin_addrr-   r   Nrx  )rl  rq  rk  s   r   struct_sockaddr_inr|    s&    8!8r   r  c                   H   > \ rS rSrS Y4S Y4S Y4S Y S-  4S Y4/rSrg	)
4_NetworkInterfacesAddrs.<locals>.struct_sockaddr_in6i  sin6_family	sin6_portsin6_flowinfo	sin6_addr   sin6_scope_idr   Nrx  )rl  rq  rr  rk  s   r   struct_sockaddr_in6r    s6    H(h&2+h!8r   r  c                   F   > \ rS rSrS Y "  Y5      4S Y "  Y5      4/rSrg)._NetworkInterfacesAddrs.<locals>.union_ifa_ifui  ifu_broadaddrifu_dstaddrr   Nrx  )rg  rz  s   r   union_ifa_ifur    s$    go./GO,-08r   r  c                       \ rS rSrSrg)/_NetworkInterfacesAddrs.<locals>.struct_ifaddrsi  r   N)r   r   r   r   r   r   r   r   struct_ifaddrsr    s    r   r  ifa_nextifa_name	ifa_flagsifa_addrifa_netmaskifa_ifuifa_datacrZ   z libc.getifaddrs is not availablec              3      #    U R                   n Uv   UR                  (       d  g UR                  R                   nM.  7fr   )contentsr  )ifapifas     r   	ifap_iter*_NetworkInterfacesAddrs.<locals>.ifap_iter  s4     	3	
I<<

,,

C	 
s   <>c                   > U R                   R                  nUR                  nU[        R                  :X  a  T" T" U5      T" T	5      5      R                  n[        R
                  " X2R                  5      nU(       a|  U R                  R                  nUbc  UR                  [        R                  :X  aE  T" T" U5      T" T	5      5      R                  nUS[        R
                  " X5R                  5      -   -  n[        U5      $ U[        R                  :X  a  T" T" U5      T" T
5      5      R                  n[        R
                  " X2R                  5      nU(       a|  U R                  R                  nUbc  UR                  [        R                  :X  aE  T" T" U5      T" T
5      5      R                  nUS[        R
                  " X5R                  5      -   -  n[        U5      $ g )Nr   )r  r  ru  r   r2   r  r  r  r   r3   r  )r  withMasksar@   r   nmrg  rj  rh  r  r  s         r   
getfamaddr+_NetworkInterfacesAddrs.<locals>.getfamaddr  sj   2	3	V^^	gbk7#56	7	@	@BC-D
//
"
"R
2<<6>>9W%789BBb
c&""3444d$<v	gbk7#67	8	A	ABC.D
//
"
"R
2<<6??:W%89:CCb
c&""3555d$<
r   c              3   T  >#    T" T5      " 5       nT
R                  T" U5      5      nUS:w  a  [        T" 5       5      eA T	" U5       H4  nUR                  R                  S5      nT" X05      nU(       d  M/  XE4v   M6     T
R	                  U5        g ! T
R	                  U5        f = f7f)Nr   zUTF-8)
getifaddrsOSErrorr  decodefreeifaddrs)r  r  rA   r  r!   r   rg  ri  r  r  libcrh  r  s         r   ri   8_NetworkInterfacesAddrs.<locals>._NetworkInterfacesAddrs  s     
.
!
#4OOGDM*6k
)+
LL(Ts%TJ	  	TDTs#   <B( 3B 7	B  B(B%%B(c                     > T er   r   )_init_errors   r   ri   r    s	    	r   F)ctypesre  rf  rg  rh  ri  rj  rk  rl  rm  rn  ro  rp  rq  rr  ctypes.utilry  CDLLutilfind_libraryr  NotImplementedErrorr:   r   r&   ri   )r  re  rf  rm  rn  ro  rp  r  r  ri   rB   rg  r  rl  rq  rr  rk  rj  ri  r  r  r  rh  r  rz  r  r  s              @@@@@@@@@@@@@@@@r   ri   ri     sZ   a   
  	 
 9 ! !I !0 0e 0
y  '(()7?+,}. 
V[[--c28b	9$		?	@@  . ( %11H$I!)) 	 #A&+ s   DD: :
EEE)rZ   r  )
__author____copyright____license__r   r   rN  utilsr   helpersr   r   r;   r   r    r&   objectr   r   r0   rh   ri   r   r   r   r   <module>r     s   ( Z
=   	   
8	@Y YBoV of L"- ^ ^.h*T $00G#H  r   