
    =*f4                        S r SrSrSSKrSSKrSSKJr  \R                  " S5      r\R                  " S5      r	S	\R                  < S
3S\R                  < S
3SSSSS/rSrSrSrSrSrSrSrS\\   < S\\   < S3\\'   S\\   < S\\   < S
3\\'   S\\   < S\\   < S\\   < S3\\'   \\   \\   \\   \\   \\   \\   \\   \\   \\   \\   \\   \\   SSS.rSSS.r \R,                  " S S!5        \R                  " S"5      S#4rS% rS&rS'r\\4r\R                  " S(SR9                  \5      -   S)-   5      r " S* S+5      r " S, S-\5      r S.r!\!S/-   r" " S0 S1\5      r#g!   S$r N`= f)2zCyril Jaquierz Copyright (c) 2004 Cyril JaquierGPL    N   )IPAddrz</?[\w\-]+/?>z^(/?)F-([A-Z0-9_\-]+)$z(?:::f{4,6}:)?(?P<ip4>)z(?P<ip6>z(?P<dns>[\w\-.^_]*\w) z(?P<cidr>\d+)               z\[?(?:|z)\]?z(?:z)(?:/z)?\]?z(?P<fid>\S+)z(?P<fport>\w+))IP4zF-IP4/IP6zF-IP6/ADDRzF-ADDR/CIDRzF-CIDR/SUBNETz	F-SUBNET/DNSzF-DNS/zF-ID/zF-PORT/fidfport)idportz^re(?i:val)$reVALz(?<!\\)\((?:\?:)?(\(\?[a-z]+)\)z\1: c                 L    U R                  5       n [        R                  X 5      $ N)lowerR_MAPget)tags    ;/usr/lib/python3/dist-packages/fail2ban/server/failregex.py
mapTag2Optr!   d   s    
yy{		#    alt_tuple_z^(z)(.*?)(?:_\d+)?$c                       \ rS rSrSS jrS r\SS j5       rS r\S 5       r	SS jr
S	 rS
 rS rS rS rS rS rS rS rSrg)Regexx   c                 &   S U l         [        R                  " U40 UD6nUR                  5       S:X  a  [	        S5      e[
        (       a   [
        S   R                  [
        S   U5      n [        R                  " X(       a  [        R                  OS5      U l
        Xl        / U l        / U l        U R                  R                   Vs/ s H&  n[        U5      [        [         S   5      :  d  M$  UPM(     sn H  n["        R%                  U5      nU(       d  M!  UR'                  S5      [)        UR'                  S5      5      pVU[*        :X  a  U R                  R-                  XE45        Ms  U R                  R-                  XE45        M     U R                  R/                  5         U R                  R/                  5         [        U R                  5      (       a  U R                  OS U l        [        U R                  5      (       a  U R                  OS U l        U R                  (       d  U R                  (       a  U R2                  U l        g U R4                  U l        g s  snf ! [        R0                   a  n[	        SU< SU< 35      eS nAff = f)Nr   zCannot add empty regexr   r   r   z&Unable to compile regular expression 'z':
)_matchCacher&   _resolveHostTaglstripRegexExceptionR_GLOB2LOCFLAGSsubrecompile	MULTILINE	_regexObj_regex
_altValues_tupleValues
groupindexlenCOMPLNAME_PRECOMPLNAME_CREmatchgroupr!   ALTNAME_PREappendsorterror_getGroupsWithAlt
_getGroups	getGroups)selfregex	multilinekwargsknges           r    __init__Regex.__init__   s   $ 


0
0%
\\^r	0	11_1!!/!"4e<5JJuibllQG4>;4?411T11SVc-PQBR>S5SQ1TqAAqGGAJ
1771:.	[
ooaU#
u% U ??(+DOO(<(<T__$4?,/0A0A,B,Bt((4
 /3ooARAR4))$.Y]YhYh$.! U 
 	
 
 s8   *AI$ #I/I5 I$ D I$ I$ $J8JJc                 R    U R                   R                  < SU R                  < S3$ )N(r   )	__class____name__r3   rC   s    r    __str__Regex.__str__   s    ^^,,dkk	::r"   c                 ^   ^^^ [        5       mSS0mUUU4S jn[        R                  X 5      $ )Nnlr   c                   > U R                  5       nUSS nUS:X  a  [        TS;  a  [           $ [           $ US:X  a  TS   nUS-   TS'   SU4-  $  [        U   $ ! [
         a     Of = f[        R                  U5      n U (       aO  U R                  5       n U S   nU S   (       a  TR                  U5      (       a  g	U$ STU'   [        U5      nS
U< S3$ U$ )Nr   HOST)no	SKIPLINESrU   z!\n(?P<skiplines%i>(?:(?:.*\n)*?))r   r   z(?P<>)r;   R_HOSTRI_HOSTRI_ADDRRH4TAGKeyErrorFCUSTNAME_CREr:   groupsr   r!   )mr   tnrU   openTagspropsuseDnss       r    substTag'Regex._resolveHostTag.<locals>.substTag   s    	
3Ab	2FlV72'@@@@K	tBq&E$K/2%77	":
 		
 21	
A	
1BtRZHRL	BB :s   A 
A('A()dictFTAG_CREr.   )rD   rg   rh   re   rf   s    ` @@r    r*   Regex._resolveHostTag   s/     V(%$N 
h	&&r"   c                     U R                   $ r   )r3   rQ   s    r    getRegexRegex.getRegex   s    	r"   c                     SR                  U  Vs/ s H  nSR                  US S S2   5      PM     sn5      S-   $ s  snf )N
r   r   )join)
tupleLinesvs     r    _tupleLinesBufRegex._tupleLinesBuf   s8    	Z8ZBGGAccFOZ8	9D	@@8s   !;Nc                    Un[        U[        5      (       d  [        R                  U5      nU R                  R                  U5      U l        U R                  (       Ga  Uc  Un[        U5      S::  a  X l        / U l	        g  U R                  R                  R                  SSU R                  R                  5       S-   5      S-   n U R                  R                  R                  SU R                  R                  5       S-
  5      S-   nU R                  R                  R!                  SSU5      nU R                  R                  R!                  SSU5      nX&U U l        US U U l	        SnU R#                  5        H|  n	[%        U R                  US  5       H]  u  pSR'                  US S S2   5      U	:X  d  M"  U R                  R)                  U R                  R+                  X-   5      5        X-  n  Mz     M~     U R                  R-                  X'S  5        g g ! [         a    Sn GNff = f! [         a#    [        U R                  R                  5      n GNQf = f)Nr   rq   r   r   r   )
isinstancestrr&   ru   r2   searchr)   r7   _matchedTupleLines_unmatchedTupleLinesstringrindexstart
ValueErrorindexendcountgetSkippedLines	enumeraterr   r=   popextend)rC   rs   orgLinesbufmatchLineStartmatchLineEnd
lineCount1
lineCount2rH   skippedLinerc   matchedTupleLines               r    rz   Regex.search   s;   #	J	$	$			j	)3^^**3/$	:	(mq& "D&&--44
At%%'*-/01^
1$$++11
D  "Q&(*+,\
 !!((..	1nJ!!((..	1lJ&*=D (* 5D	A++- )
ab!!#		!#A#&	';	6  ''##AC(*vq!# . 	$$Xk%:;G   ^  1((//0\1s&   AH AH1 H.-H.1)IIc                 (    U R                   (       a  gg)NTF)r)   rQ   s    r    
hasMatchedRegex.hasMatched#  s    	

r"   c                 6    U R                   R                  5       $ r   )r)   	groupdictrQ   s    r    rA   Regex._getGroups-  s    				#	#	%%r"   c                    U R                   R                  5       nU R                  (       aK  U R                   H;  u  p#UR                  U5      nU(       d  M  UR                  U5      (       a  M7  XAU'   M=     U R                  (       aY  U R                   HI  u  p#UR                  U5      nUR                  U5      n[        U[        5      (       a  XT4-  nOXT4nXQU'   MK     U$ r   )r)   r   r4   r   r5   rx   tuple)rC   failrG   rH   rt   ts         r    r@   Regex._getGroupsWithAlt0  s    				#	#	%$ 
__oosqAq!!W 
 
sqAA!U$YQ
QG   
+r"   c                     g r   r   rQ   s    r    rB   Regex.getGroupsE  s    r"   c                 B   U R                   (       d  / $ SnSn  U R                   R                  SU-  5      b   XR                   R                  SU-  5      -  nUS-  nMG  ! [         a     O$[         a    S[        R
                  ;  a  e  Of = fUR                  S5      $ )Nr   r   zskiplines%ir   PyPyF)r)   r;   
IndexErrorr`   sysversion
splitlines)rC   skippedLinesrH   s      r    r   Regex.getSkippedLinesN  s    			
9,!

ma/0<%%++MA,=>>\FA	 	
  
	
 
S[[ 
	
 
	 	 	''s   AA   
B,BBc                 H    U R                  5       (       d  / $ U R                  $ r   )r   r|   rQ   s    r    getUnmatchedTupleLinesRegex.getUnmatchedTupleLinesg  s     			
9

#
##r"   c                     U R                  5       (       d  / $ U R                   Vs/ s H  nSR                  U5      PM     sn$ s  snf Nr   )r   r|   rr   rC   lines     r    getUnmatchedLinesRegex.getUnmatchedLinesm  s<    			
9%)%>%>
?%>T2774=%>
??
?   Ac                 H    U R                  5       (       d  / $ U R                  $ r   )r   r{   rQ   s    r    getMatchedTupleLinesRegex.getMatchedTupleLinesz  s     			
9

!
!!r"   c                     U R                  5       (       d  / $ U R                   Vs/ s H  nSR                  U5      PM     sn$ s  snf r   )r   r{   rr   r   s     r    getMatchedLinesRegex.getMatchedLines  s<    			
9%)%<%<
=%<T2774=%<
==
=r   )r4   r)   r{   r3   r2   r5   r|   rB   )F)yesr   )rP   
__module____qualname____firstlineno__rK   rR   staticmethodr*   rn   ru   rz   r   rA   r@   rB   r   r   r   r   r   __static_attributes__r   r"   r    r&   r&   x   sr     iD; .' .'l A A(<\&*(2$@">r"   r&   c                       \ rS rSrSrg)r,   i  r   N)rP   r   r   r   r   r   r"   r    r,   r,     s    r"   r,   )r   ip4ip6dns)mlfidc                   6    \ rS rSrSS jr\4S jrS rS rSr	g)		FailRegexi  Nc                 Z   [         R                  " X40 UD6  [         Vs/ s H   oDU R                  R                  ;   d  M  UPM"     sn(       dS  Ub7  [         Vs/ s H   oDUR                  R                  ;   d  M  UPM"     sn(       d  [        SU R                  -  5      eg g s  snf s  snf )NzNo failure-id group in '%s')r&   rK   FAILURE_ID_PRESENTSr2   r6   r,   r3   )rC   rD   	prefRegexrF   grps        r    rK   FailRegex.__init__  s    ..''-
R-38Q8Q1Q3-
R+U+i6I6I6T6T/T+U	5C	DD 	V S
RUs   B#B#B(;B(c                 $   S nU H$  n U R                   R                  U5      nUc  M$    O   Uc@  U R                   R                  nU R                   R
                  n[        SU< SU< S35      e[        U5      $ ! [        [        4 a     M  f = f)NzNo group found in 'z	' using '')r)   r;   r   r`   r}   r/   r,   ry   )rC   rb   r   r   srs         r    	getFailIDFailRegex.getFailID  s    #c



 
 
%C 
o	  	[11	q!D	EE	S/ x
  s   A;;BBc                 $    U R                  S5      $ )N)r   r   r   )r   rQ   s    r    getHostFailRegex.getHost  s    	-	..r"   c                     U R                  5       n[        U R                  S5      [        UR	                  S5      =(       d    [        R
                  5      5      $ )N)r   r   cidr)rB   r   r   intr   CIDR_UNSPEC)rC   r   s     r    getIPFailRegex.getIP  s=    		$	~.DHHV4D4ZHZHZ0[	\\r"   r   r   )
rP   r   r   r   rK   FAILURE_ID_GROPSr   r   r   r   r   r"   r    r   r     s    E  - ,/]r"   r   )$
__author____copyright____license__r/   r   ipdnsr   r0   rk   ra   IP_4_REIP_6_REr\   RI_IPV4RI_IPV6RI_DNSr^   r]   RI_CIDR	RI_SUBNETr_   r   rz   r-   r!   r<   TUPNAME_PREr8   rr   r9   r&   	Exceptionr,   r   r   r   r   r"   r    <module>r      s  ( 
2 	 
  ::&'

45 '-nn6(
  
	)/&/Kw#)'?F6NDw28/6'?TZ[bTcey  /7O
/7O '?7O'?7O9I
.6N"-
6 		>7#ZZ BCVM k*

5388M#::=PPQL> L>dY  0  '3 4] 4]{	s   ,'E- -E3