
    =*f>                     n   S r SrSSKrSSKrSSKrSSKrSSKrSSKrSSKrSSK	J
r
  SSKJr  SSKr SSKr\R                  " S5      r\R"                  " 5       r\R'                  S5      (       a  \R(                  (       aX  \R(                  R*                  bA  \R(                  R*                  R'                  S5      (       d  \R(                  R*                  rO\" S	 S
 5       5      (       a  Sr\S4S jrS rS rS rS rS r " S S\5      r " S S\R>                  5      r S\l!        S.S jr"\RF                  RH                  r%S r&\&\RF                  l$        \RN                  RP                  r)S r*\*\RN                  l(        S r+S r,S/S jr-S r.S r/S  r0S! r1\Rd                  " S"\Rf                  5      r4\Rd                  " S#\Rf                  5      r5\Rd                  " S$\Rf                  5      r6S% r7S& r8S'r9\Rd                  " S(5      r:  S0S) jr;\(       a  S* r<OS+ r< " S, S-\5      r=g!   Sr GN= f)1z<Cyril Jaquier, Arturo 'Buanzo' Busleiman, Yaroslav HalchenkoGPL    N)Lock   )MyTimezlibcap.so.2ANSI_c              #   T   #    U  H  n[         R                  " U5      S ;   v   M      g7f))N N)osgetenv).0vs     2/usr/lib/python3/dist-packages/fail2ban/helpers.py	<genexpr>r   0   s     
Z/Y!299Q<:%/Ys   &()LANGUAGELC_ALLLC_CTYPELANGUTF-8strictc                      [        U [        5      (       a  U R                  X5      $ U $ ! [        [        4 a    US:w  a  e U R                  US5      s $ f = f)Nr   replace)
isinstancebytesdecodeUnicodeDecodeErrorUnicodeEncodeError)xencerrorss      r   
uni_decoder    @   sY    "5
((3
	
(	/0 "x	
#y	!!"s   %* * )AAc                 n    [        U [        5      (       d  [        U 5      $ U R                  [        S5      $ )Nr   )r   r   strr   
PREFER_ENCr   s    r   
uni_stringr%   I   s)    1e	Q-	Y''    c                     [        U S5      $ )Nr   )r   r$   s    r   	uni_bytesr(   M   s    ar&   c                 h    [        U [        5      (       d  [        U 5      $ U R                  5       S;   $ )N)1ontrueyes)r   r"   boollower)vals    r   _as_boolr1   P   s.    #C--S	 1
yy{001r&   c                  d    [         R                  " 5       SS u  pU R                  [        U5      4$ )z*Consistently format exception information N   )sysexc_info__name__r%   )claexcs     r   formatExceptionInfor9   U   s)    LLN2A	z#''r&   c                     [         R                  R                  U 5      nUR                  S5      (       a  USS nU[	        SS/5      ;   aB  [         R                  R                  [         R                  R                  U 5      5      S-   U-   nU$ )z_Custom function to include directory name if filename is too common

Also strip .py at the end
z.pyNbase__init__.)r
   pathbasenameendswithsetdirname)sr<   s     r   	mbasenamerE   a   st    
 	MM%	cr$C$%%			"''//!,	-	3d	:$r&   c                   (    \ rS rSrSrSS jrS rSrg)	TraceBackn   z>Customized traceback to be included in debug messages
        c                     SU l         Xl        g)zInitialize TrackBack metric

Parameters
----------
compress : bool
  if True then prefix common with previous invocation gets
  replaced with ...
r	   N)_TraceBack__prev_TraceBack__compress)selfcompresss     r   r=   TraceBack.__init__r   s     $+/r&   c           	      V   [         R                  " SS9S S nU Vs/ s H@  n[        US   5      [        R                  R                  US   5      [        US   5      /PMB     nnU Vs/ s H3  nUS   S;   a  M  US   R                  S5      (       a  M)  US   US   /PM5     nnUS   /nUSS   H;  nUS   US	   S   :X  a  US	   S==   S
US   -  -  ss'   M*  UR                  U5        M=     SR                  U Vs/ s H  n[        US   5      < SUS   < 3PM     sn5      nU R                  (       ab  Un[        R                  R                  U R                  U45      n	[        R                  " SSU	5      n
U
S:w  a  SU[        U
5      S  -   nXl        U$ s  snf s  snf s  snf )Nd   )limitr   r   )unittestzlogging.__init__z	/unittestr3   z,%s>:z>[^>]*$r	   z...)	tracebackextract_stackrE   r
   r?   rC   r"   rA   appendjoinrK   commonprefixrJ   resublen)rL   ftbr   entrieseentries_outentrysftb	prev_nextcommon_prefixcommon_prefix2s              r   __call__TraceBack.__call__~   s   c*3B/#@CE@C1IadORWW__QqT*C!I6 
 E$+ 'GqqT55 
A$--
$ qtQqTlG' '
 +qr{eAh+b/!$$OA%%(**u	 
 
#%#1 (!o	
1#% 
&$	__977''d(;<=FF9b-8>4N+,--D;	+3E'%s   AF)F!:F!F!>"F&)
__compress__prevN)F)r6   
__module____qualname____firstlineno____doc__r=   rh   __static_attributes__ r&   r   rG   rG   n   s    
r&   rG   c                   $    \ rS rSrSrS rS rSrg)FormatterWithTraceBack   z{Custom formatter which expands %(tb) and %(tbc) with tracebacks

TODO: might need locking in case of compressed tracebacks
c                 v    [         R                  R                  " U /UQ7SU0UD6  SU;   n[        US9U l        g )Nfmtz%(tbc)s)rM   )logging	Formatterr=   rG   _tb)rL   rv   argskwargsrM   s        r   r=   FormatterWithTraceBack.__init__   s;    	T<T<s<V<#()$(r&   c                 x    U R                  5       =Ul        Ul        [        R                  R                  X5      $ N)ry   tbctbrw   rx   format)rL   records     r   r   FormatterWithTraceBack.format   s-    88:%&*vy				!	!$	//r&   )ry   N)r6   rl   rm   rn   ro   r=   r   rp   rq   r&   r   rs   rs      s    *
0r&   rs   Fc                 p   U (       a8  [        U R                  5      (       a  U R                  U R                  S   5        U(       a  S Ul        S [        R
                  l        [        R                  (       a6   [        R                  R                  5         [        R                  " S5        g g !    N= f)Nr   c                      g r~   rq   rq   r&   r   <lambda>!__stopOnIOError.<locals>.<lambda>   s    4r&   c                     g r~   rq   rL   s    r   r   r      s    Dr&   )r^   handlersremoveHandlercloserw   StreamHandlerflushexitOnIOErrorr4   stderrexit)logSyslogHndlrs     r   __stopOnIOErrorr      s|    
s6??##vq)*(.0:: ((1+ s   ;B1 1B5c           	      d    [        XX#40 UD6  g! [        [        4 a!  nUR                  S:X  a  [	        U 5        e SnAf[
         af  n SU[        U5      44SU Vs/ s H  n[        U5      PM     Os  snf sn444 H  n [        X/UQ76   M  !    M  = f    SnAg!     SnAg= fSnAff = f)a  Safe log inject to avoid possible errors by unsafe log-handlers, 
concat, str. conversion, representation fails, etc.

Used to intrude exception-safe _log-method instead of _log-method 
of Logger class to be always safe by logging and to get more-info about.

See testSafeLogging test-case for more information. At least the errors
covered in phase 3 seems to affected in all known pypy/python versions 
until now.
    Nzlogging failed: %r on %sz
  args: %r)	__origLogBrokenPipeErrorIOErrorerrnor   	Exceptionr%   )rL   levelmsgrz   r{   ra   as          r   	__safeLogr      s    D-f-	'" WW]4 
!Z_!56D1DqZ]D134t
t"T"
	sT    B/<B/
BA3
2BBBBBB'!B*'B**B/c                      [        U 5        g! [        [        4 a"  nUR                  S:X  a  [	        SU 5        e SnAff = f)zXSafe flush inject stopping endless logging on closed streams (redirected pipe).
        r   N)__origLogFlushr   r   r   r   )rL   ra   s     r   __safeLogFlushr      s<    	'" WW]4s    A ;A c                 h    SU ;   a  SU R                  S5      S   -  n [        R                  " U 5      $ )zIGet logging.Logger instance with Fail2Ban logger name convention
        r>   zfail2ban.%srT   )
rpartitionrw   	getLoggernames    r   r   r      s4     4K	-b1	1$$r&   c                      [        U [        5      (       d  U R                  5       (       a  [        U 5      nU$ [        [        U R                  5       5      n U$ ! [         a    [        SU -  5      ef = f)NzInvalid log level %r)r   intisdigitgetattrrw   upperAttributeError
ValueError)valuells     r   str2LogLevelr      sk    3su}}E
2
 	 	'2 	 	 3)E1223s   5A A A3c                     U S:  a)  U S:  a  SU-   nU S:  a  SU-   nO#SU-   nU(       a  SU-   nOSU-   nU(       a  S	U-   nU(       d  [         R                  " S
S U5      nU$ )z/Custom log format for the verbose runs
        r      z6 | %(module)15.15s-%(levelno)-2d: %(funcName)-20.20s |r3   zB +%(relativeCreated)5d %(thread)X %(name)-25.25s %(levelname)-5.5sz %(thread)X %(levelname)-5.5sz %(asctime)-15sz)%(name)-24s[%(process)d]: %(levelname)-7sz%(asctime)s z(?<=\))-?\d+(?:\.\d+)?sc                     g)NrD   rq   )ms    r   r   $getVerbosityFormat.<locals>.<lambda>
  s    Sr&   )r\   r]   )	verbosityrv   addtimepaddings       r   getVerbosityFormatr      sx     M]	AC	G3]	MPS	S3	(3	.3
c
!C3c9#	#	3
)=#>#r&   c                 b    [        S5      R                  SSS9  [        R                  " XU5      $ )zEExcept hook used to log unhandled exceptions to Fail2Ban log
        fail2banz Unhandled exception in Fail2Ban:T)r5   )r   criticalr4   __excepthook__)exctyper   rW   s      r   
excepthookr     s4     :$t   57955r&   c           
          U (       d  / $ [        [        [        [        R                  " SU 5       Vs/ s H  oR                  5       PM     sn5      5      $ s  snf )zHelper to split words on any comma, space, or a new line

Returns empty list if input is empty (or None) and filters
out empty entries
z[\s,]+)listfilterr.   r\   splitstrip)rD   r   s     r   
splitwordsr     sA     	
	)VDbhhy!.DE.D779.DEFGGEs   Ac                      U(       a  0 U EUE$ U $ )zHelper to merge dicts.
        rq   r   ys     r   _merge_dictsr     s     	A	r&   c                     0 U EUE$ )zIHelper to merge dicts to guarantee a copy result (r is never x).
        rq   r   s     r   _merge_copy_dictsr   &  s     	1

r&   z^([^\[]+)(?:\[(.*)\])?\s*$zf\s*([\w\-_\.]+)=(?:"([^"]*)"|\'([^\']*)\'|([^,\]]*))(?:,|\]\s*\[|$|(?P<wrngA>.+))|,?\s*$|(?P<wrngB>.+)zs(?:[^\[\s]+(?:\s*\[\s*(?:[\w\-_\.]+=(?:"[^"]*"|\'[^\']*\'|[^,\]]*)\s*(?:,|\]\s*\[)?\s*)*\])?\s*|\S+)(?=\n\s*|\s+|$)c           	         [         R                  U 5      nU(       d  [        S5      eUR                  5       u  p#[	        5       nU(       Ga!  [
        R                  U5       GH  nUR                  S5      (       aA  [        SUR                  S5      UR                  S5      UR                  S5      SS 4-  5      eUR                  S5      (       a1  [        SUR                  S5      UR                  S5      SS 4-  5      eUR                  S5      nU(       d  M  UR                  S	S
S5       Vs/ s H	  owc  M  UPM     snS   nUR                  5       XFR                  5       '   GM
     X$4$ s  snf )Nzunexpected option syntaxwrngAz+unexpected syntax at %d after option %r: %sr   r      wrngBz'expected option, wrong syntax at %d: %sr3   r      )

OPTION_CREmatchr   groupsdictOPTION_EXTRACT_CREfinditergroupstartr   )	optionr   option_nameoptstroption_optsoptmatchoptr0   r   s	            r   extractOptionsr   ;  sT   			&	!-..||~v
$--f5hnnW
B^^GhnnQ/1H21NFP P Q QnnW
>^^GhnnW5a;B= = > >		3
x>>!Aa(=(CC(==>@5#kkm;yy{ 6 	  =s   2E0<E0c                 ,    [         R                  U 5      $ r~   )OPTION_SPLIT_CREfindall)r   s    r   splitWithOptionsr   P  s      ((r&   r   z<([^ <>]+)>c                    [         R                  nU n[        U5      n[        5       n[        US5      n0 n Sn	UR	                  5        GH  n
X;   d  X;   a  M  U(       a!  [        UR                  U
5      5      (       a  M8  [        XZ   5      =pU" U5      nUR                  U
0 5      nU(       Ga1  UR                  S5      nX;   a  U" XR                  5       5      nM6  X:X  d  UR                  US5      [        :  a  [        SU
< SU< SU< SU< 35      eS	nU(       a  UR                  US
-   U-   5      nUc  UR                  U5      nUc  Ub  U" U5      nUc  U" XR                  5       5      nM  [        U[        5      (       d  [        U5      nUR                  SU-  U5      nUR                  US5      S-   X'   U" XR!                  5       5      nU(       a  GM1  X:w  a?  U" U5      (       a  XU
'   Sn	[#        U5      [#        U 5      :X  a  U R%                  5       nXU
'   SU;  d  GM  UR'                  U
5        GM     U	(       d   U$ GM  )a  Sort out tag definitions within other tags.
Since v.0.9.2 supports embedded interpolation (see test cases for examples).

so:             becomes:
a = 3           a = 3
b = <a>_3       b = 3_3

Parameters
----------
inptags : dict
        Dictionary of tags(keys) and their values.

Returns
-------
dict
        Dictionary of tags(keys) and their values, with tags
        within the values recursively replaced.

getRawItemTFr   zRproperties contain self referencing definitions and cannot be resolved, fail tag: z	, found: z in z	, value: N?z<%s>r   <)TAG_CREsearchrB   hasattrkeyscallabler   r%   getr   endMAX_TAG_REPLACE_COUNTr   r   r"   r   r   idcopyadd)inptagsconditionalignoreaddrepl
tre_searchtagsdone	noRecRepl	repCountsrepFlagtagr   orgvalr   rplcrtagrepls                    r   substituteRecursiveTagsr  ^  s   , nn
f+T<('YY[c	ms{HHT__S122Hty))5%1
--R
 4	
771:D~	E557	#Q{dhhtQ'*??  D$    DHHTCZ+-.T|HHTNT,T]d| 
E557	#QdC  D)9$MM&4-.E $"Q&DJ5'')$AI 
N o%s^W	$x2g;LLNTI	w z 
E r&   c                 `     U R                  5       n [        R                  SU 5        g!    g= f)zHelper to set real thread name (used for identification and diagnostic purposes).

Side effect: name can be silently truncated to 15 bytes (16 bytes with NTS zero)
   N)encode_libcapprctlr   s    r   prctl_set_th_namer	    s*    

++-4
==Ts   &) -c                     g r~   rq   r   s    r   r	  r	    s    r&   c                   N   ^  \ rS rSrSr\" 5       rSrU 4S jrS r	SS jr
SrU =r$ )		BgServicei  zxBackground servicing

Prevents memory leak on some platforms/python versions, 
using forced GC in periodical intervals.
Nc                 n   > U R                   (       d  [        [        U ]  U 5      U l         U R                   $ r~   )	_instancesuperr  __new__)cls	__class__s    r   r  BgService.__new__  s*    		)S!#& =	r&   c                     SU l         SU l        SU l        U R                  U l        [	        [
        S5      (       a  [
        R                  " S5        g g )Ni     rP   set_thresholdr   )_BgService__serviceTime_BgService__periodTime_BgService__threshold_BgService__countr   gcr  r   s    r   r=   BgService.__init__  sG    "$$$!!$,R!!A "r&   c                    U =R                   S-  sl         U(       d4  U R                   S:  d#  [        R                  " 5       U R                  :  a  g[        R
                  R                  U5      (       d  g [        R                  " 5       U R                  :  a    [        R
                  R                  5         g[        R                  " 5         [        R                  " 5       U R                  -   U l        U R                  U l          [        R
                  R                  5         g! [        R
                  R                  5         f = f)Nr   r   FT)r  r   timer  r  _mutexacquirereleaser  collectr  r  )rL   forcewaits      r   serviceBgService.service  s    ,,!,	DLL1$8J8J(J
				!	!$	'	'
	kkmd(((  ::<(9(994""4<
9s   7#D' :AD' ' E)__count__periodTime__serviceTime__threshold)FF)r6   rl   rm   rn   ro   r   r  r  r  r=   r%  rp   __classcell__)r  s   @r   r  r    s*     & r&   r  )NN)z %(message)sTT)r	   rq   N)>
__author____license__r  localerw   r
   r\   r4   rW   	threadingr   server.mytimer   	importlibctypesCDLLr  getpreferredencodingr#   
startswithstdoutencodingallr    r%   r(   r1   r9   rE   objectrG   rx   rs   r   r   Logger_logr   r   r   r   r   r   r   r   r   r   r   r   r   compileDOTALLr   r   r   r   r   r   r   r  r	  r  rq   r&   r   <module>r>     s1  ( L
 	   	 	 
   ! ;;}%
 ((*
!!JJ3::&&23::;N;N;Y;YZa;b;bzz""*	
Z/Y
Z[[* ! "(1
(
+ +\0W.. 0   NN	<   &&,, -    ,6H
 ZZ5ryyA

 ZZjlnluluw  ::wy{  zC  zCD !*)   **^
$13`F 	, ,Us   H- -H4