ogfCdZdZdZddlZddlZddlZddlmZddlm Z e e Z d Z dd Z Gd d ZGd deZedde_y)zJFail2Ban Developers, Alexander Koeppe, Serg G. Brester, Yaroslav Halchenkoz+Copyright (c) 2004-2016 Fail2ban DevelopersGPLN)Utils) getLoggerc<t|tr|St|S)z8A little helper to guarantee ip being an IPAddr instance isinstanceIPAddr)ips 7/usr/lib/python3/dist-packages/fail2ban/server/ipdns.pyasipr'sr6 )r c d |xstj}dtj|ddtjdtjD}|r*|dz}d}|D]}|j |r|cS|r|}|S tj|S#tj $rY*wxYw)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 c30K|]}|dr|dyw)N).0ais r zgetfqdn..3s#   1a5 sNr.)socket gethostname getaddrinfo SOCK_DGRAM AI_CANONNAME startswitherrorgetfqdn)namenamespreffirstrs r rr-s %##%$ %%$6$$a)<)< %  s(4 5 r }}T Y "% <  t  sA7B:B=BB/.B/ceZdZejddZejddZedZedZ edZ eddZ dZ ed Z d Zed Zd Zed ZdZedZy )DNSUtilsi,maxCountmaxTimectjj|}||St}d}tj t jftjt jffD]\}} t j|d|dtjD]X}t|dkst|ds t t|dd|}|jsH|j|Z|s|rt"j%d||tjj|||S#t $r }|}Yd}~d}~wwxYw)z_ Convert a DNS into an IP address using the Python socket module. Thanks to Kevin Drapel. Nrz4Unable to find a corresponding IP address for %s: %s)r%CACHE_nameToIpgetsetrAF_INETr FAM_IPv4AF_INET6FAM_IPv6r IPPROTO_TCPlenstrisValidadd ExceptionlogSyswarning)dnsipssaveerrfamipfamresultr es r dnsToIpzDNSUtils.dnsToIpSs ##C(#_ : # 'nnfoo6&//8Z[ jc5 $$S$Q8J8JK F as6!9~x VAYq\"E *R  ggbk   >>H#wW c3' * Gs7A.D8&D88 E EE c8tjj|d}|dk7r|S tj|d}tjj|||S#tj $r#}t jd||d}Yd}~Sd}~wwxYw)Nrrz'Unable to find a name for the IP %s: %s) r%CACHE_ipToNamer-r gethostbyaddrrr9debugr.)r vrAs r ipToNamezDNSUtils.ipToNameqs!!"b)!"W 8  B"1 b!$ (   <<92qA 1 sA##B6BBc,t}tj|}|(t|}|jr|j ||dvrF|sDt j |}|j||r|dk(rtjd|||S)z/ Return the IP of DNS found in a given text. )yeswarnrKz'Determined IP using DNS Lookup: %s = %s) r.r searchIPr6r7r%rBupdater9r:)textuseDnsipListplainIPr s r textToIpzDNSUtils.textToIps 5& OOD !' w2jj JJrN v2 ==Vv  NN< 6 -rcfdd|f}tjj|}|>d}|rttj fntj tfD] } |}ntjj|||S#t $r }tjd|Yd}~Td}~wwxYw)z;Get short hostname or fully-qualified hostname of host selfselfhostnameNz#Retrieving own hostnames failed: %s) r%rDr-rrrr8r9r:r.)fqdnkeyr rUrAs r getHostnamezDNSUtils.getHostnames  D!#  $ $S )$ \ 4%)Wf  !0B0BG/L>x> JT > c4( + > ^^91==>sB B0B++B0)rTr;cBtjjtj}|At dtj dtj dgt dgz }tjj tj||S)zGet own host names of self localhostFTrV)r%rDr-_getSelfNames_keyr.rY)r!s r getSelfNameszDNSUtils.getSelfNamess  ! ! % %h&@&@ A% ] %%e,h.B.B4.H  RD  5 h88%@ ,r)rTr<ctjjtj}|Ft }tj D]%} |t tj |dz}'tjj tj||S#t$r!}tjd||Yd}~}d}~wwxYw)zGet own IP addresses of selfNrJz#Retrieving own IPs of %s failed: %s) r%r,r-_getSelfIPs_keyr.r]rRr8r9r:)r<rUrAs r getSelfIPszDNSUtils.getSelfIPss ##H$<$<=#[ 3((*HxHC!!(E2 33SH  h66< * H ^^98QGGHs"B&& C/C  CNcp|t_tjd||rd|Sd|Sd|S)Nz IPv6 is %sonoffauto)r%_IPv6IsAllowedr9rF)values r setIPv6IsAllowedzDNSUtils.setIPv6IsAlloweds@!(,,|5;LedY ,27Y ,SYY ,r)rTz ipv6-allowedcLtjtjStjjtj}||St dtj D}tjjtj||S)Nc38K|]}d|jvyw):N)ntoa)rr s r rz)DNSUtils.IPv6IsAllowed..s ;r3"''> ;s)r%rer,r-_IPv6IsAllowed_keyanyr`r.)rGs r IPv6IsAllowedzDNSUtils.IPv6IsAllowedsz (  ! !!!!("="=>!] 8 ;X%8%8%: ;;! h991= (r)T)__name__ __module__ __qualname__rCacher,rD staticmethodrBrHrRrYr\r]r_r`rergrlrnrrr r%r%Ms%++tT:%++tT:  :    ,*$  "   .  rr%cfeZdZdZdZdZejdededZdZ dZ e jd d Z d Zd Zeej"z Zeej&z Zeffd ZedZefdZdZdZdZedZedZej"dej&diZedZ edZ!edZ"edZ#edZ$dZ%dZ&dZ'd Z(d!Z)d"Z*ed#Z+ed$Z,d/d%Z-d&Z.ed'Z/ed(Z0d)Z1d*Z2d+Z3e3Z4ed,Z5ed-Z6ed.Z7xZ8S)0r z7Encapsulate 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 ^(?:(?Pz)|\[?(?Pz)\]?)$N)_family_addr_plen _maskplen_rawi'r&r'c|tjk(r&t|ttfrtj }|tj k(r't t||}|j|||S||f}tjj|}||S|tjk(rRtj|\}}||f}|tjk7r#tjj|}||St t||}|j|||jtj k7r tjj|||SN)r CIDR_UNSPECr tuplelistCIDR_RAWsuper__new__ _IPAddr__init CACHE_OBJr-_IPAddr__wrap_ipstrrur.)clsipstrcidrr args __class__s r rzIPAddr.__new__s# V  Juudm$D //4 V__ fc"3'299UD 9 $ D!"^ 9 V  $$U+;5$ $-4 f       d #B ~ Y VS!#&"))E4ZZ6??" b! )rcJt|dkDr|ddk(r |ddk(r|dd}d|vr|tjfS|jdd}t|dkDrt d|d d |dvsd |dvrtj |d|d<t |d|d<|S) Nrr[r{]r/zinvalid ipstr z, too many plen representationrrj)r4r r~split ValueError masktoplenint)rss r __wrap_ipstrzIPAddr.__wrap_ipstrs Z!^aCE"I,< 2;5 ## ## kk#q!VaZ O PPAaD[C1Q4K   AaD !1Q4 QqT!A$ (rctj|_d|_d|_d|_||_|tjk7r|(|tjkrtj|z g}n tjtjg}|D]!} tj||}||_n|jtjk(rNtjd\|_d|_||dk\rd|z }|xj|zc_||_y|jtjk(rtjd\}}|dz|z|_d|_|(|dk\r#d |z }|xj|zc_||_y|jtj r'|dz|_tj|_d|_yyyyytj|_y#tj$rYywxYw) zP initialize IP object by converting IP address string to binary to integer rN!L !QQ@ )r AF_UNSPECrurvrwrxryr rr/r1 inet_ptonrstructunpackisInNet IP6_4COMPAT)rTrrfamilybinarymaskhilos r __initz IPAddr.__init0s!!$,$*$*$.$) V__ 4&//1oo$ %Fnnfoo .Fvvu-VT\  llfnn$--f-KDJDJ DAID !T ZZ4ZTZ ' ]]5& )FB(bDJDJ DAI0D8 9T ZZ4ZTZ f(( )z/TZNNT\TZ * ( &.//4s   rctjj|}|sy|jd}|dk7r|S|jdS)zBSearch if text is an IP address, and return it if so, else None NIPv4rVIPv6)r IP_4_6_CREmatchgroup)rNrrs r rLzIPAddr.searchIPFsI    ! !$ '%   ++f % b[ < V rr})9rorprq__doc__IP_4_REIP_6_RErecompilerr __slots__rrrrrr~rr/r0r1r2rrsrrrrrpropertyrrrrrrr6rrrrrrrrrkrrrrrr_IPAddr__getMaskMaprrrrL __classcell__)rs@r r r s * Mbjj3:GDF:U[[% 6  v~~ % v &) 6  "*5"nE     NNGV__g > * *     * *  [ [ B        6 6,=*&  ' '  ( ( (&E "^    rr z ::ffff:0:0`)rV) __author__ __copyright__ __license__rrrutilsrhelpersrror9rrr%objectr rrrr r sj(Z =   8  @X X @cVcN L"-r