
    ogfoG                     `   d Z dZddlZddlZddlZddlZddlZddlZddlZddl	m
Z
 ddlmZ ddlZ	 ddlZ ej                  d      Z ej"                         at$        j'                  d      roej(                  rRej(                  j*                  <ej(                  j*                  j'                  d      sej(                  j*                  an ed	 d
D              rdaej.                  dk  rd Z et$               [ej.                  dk\  rt$        dfdZd Zn2t$        dfdZ ej6                         j9                         dk7  rd ZneZd Zd Zd Z  G d de!      Z" G d dejF                        Z$de_%        d4dZ&	 e'Z'ejT                  jV                  Z,d Z-e-ejT                  _+        ej\                  j^                  Z0d Z1e1ej\                  _/        d Z2d Z3d5d Z4d! Z5d" Z6ej.                  d#k\  r e7 e8d$e9d%             nd& Z:d' Z; ejp                  d(ejx                        Z= ejp                  d)ejx                        Z> ejp                  d*ejx                        Z?d+ Z@d, ZAd-ZB ejp                  d.      ZC	 	 d6d/ZDerd0 ZEnd1 ZE G d2 d3e!      ZFy#  dZY WxY w# e($ r e)Z'Y *w xY w)7z<Cyril Jaquier, Arturo 'Buanzo' Busleiman, Yaroslav HalchenkoGPL    N)Lock   )MyTimezlibcap.so.2ANSI_c              #   J   K   | ]  }t        j                  |      d v   yw))N N)osgetenv).0vs     2/usr/lib/python3/dist-packages/fail2ban/helpers.py	<genexpr>r   0   s     
Z!299Q<:%
Zs   !#)LANGUAGELC_ALLLC_CTYPELANGzUTF-8   c                 `   t        j                         j                         }|dk(  rY|t        j                         k7  rAt         }t	        |d      s	 ddlm}  |dd      }t	        |d      r|j                  |        y y y y # t        $ r" t        j                  t                t         }Y Kw xY w)NASCIIsetdefaultencodingr   )load_dynamic_syssys)r   getdefaultencodingupper
PREFER_ENChasattrimpr   ImportError	importlibreloadr   )encodingoder   __ldms       r   __resetDefaultEncodingr'   8   s     &&(#G^z//11
4
$,
-*&% T d()H% * 2^  cTs   B (B-,B-strictc                     	 t        | t              r| j                  ||      S | S # t        t        f$ r |dk7  r | j                  |d      cY S w xY wNr(   replace)
isinstancebytesdecodeUnicodeDecodeErrorUnicodeEncodeErrorxencerrorss      r   
uni_decoder5   Y   sX    #E88C  
8
0	1 #	
((3	
""#   !& & 'AAc                 d    t        | t              st        |       S | j                  t        d      S Nr+   )r,   r-   strr.   r   r2   s    r   
uni_stringr;   b   s&    	Au	
a&=	
*i	((    c                     	 t        | t              r| j                  ||      S | S # t        t        f$ r |dk7  r | j                  |d      cY S w xY wr*   )r,   r9   encoder/   r0   r1   s      r   r5   r5   g   sX    #C88C  
8
0	1 #	
((3	
""#r6   c                 d    t        | t              st        |       S | j                  t        d      S r8   )r,   r9   r>   r   r:   s    r   r;   r;   q   s&    
Q
q6M
((:y
))r<   c                 \    t        | t              st        |       S | j                         dv S )N)1ontrueyes)r,   r9   boollower)vals    r   _as_boolrH   y   s+    #C-S	 1
yy{001r<   c                  d    t        j                         dd \  } }| j                  t        |      fS )z+ Consistently format exception information N   )r   exc_info__name__r;   )claexcs     r   formatExceptionInforO   ~   s+    LLN2Ac	z#''r<   c                    t         j                  j                  |       }|j                  d      r|dd }|t	        ddg      v rBt         j                  j                  t         j                  j                  |             dz   |z   }|S )zaCustom 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)srR   s     r   	mbasenamer[      sq    
 	MM%	cr$C$%%			"''//!,	-	3d	:$r<   c                       e Zd ZdZddZd Zy)	TraceBackz7Customized traceback to be included in debug messages
	c                      d| _         || _        y)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   rS   zTraceBack.__init__   s     $+$/r<   c           	         t        j                  d      d d }|D cg c]?  }t        |d         t        j                  j                  |d         t        |d         gA }}|D cg c]'  }|d   dv s|d   j                  d      s
|d   |d   g) }}|d   g}|dd  D ]8  }|d   |d	   d   k(  r|d	   dxx   d
|d   z  z  cc<   (|j                  |       : dj                  |D cg c]  }t        |d         d|d    c}      }| j                  ra|}t        j                  j                  | j                  |f      }	t        j                  dd|	      }
|
dk7  rd|t        |
      d  z   }|| _        |S c c}w c c}w c c}w )Nd   )limitr   r   )unittestzlogging.__init__z	/unittestrJ   z,%s>:z>[^>]*$r	   z...)	tracebackextract_stackr[   r
   rU   rY   r9   rW   appendjoinr`   commonprefixr_   resublen)ra   ftbr2   entrieseentries_outentrysftb	prev_nextcommon_prefixcommon_prefix2s              r   __call__zTraceBack.__call__   s   c*3B/#@CE;<IadORWW__QqT*C!I6E' E$+ 'qqT55
A$--
$ tQqTl '' '
 +qr{ eAh+b/!$$OA%%(**u	
 
#% (!o	
1 % 
&$	__977''d(;<=FF9b-8>4N+,--D4;	+3E'%s   AE>(,F+FN)F)rL   
__module____qualname____doc__rS   r|    r<   r   r]   r]      s    
r<   r]   c                       e Zd ZdZd Zd Zy)FormatterWithTraceBackz}Custom formatter which expands %(tb) and %(tbc) with tracebacks

	TODO: might need locking in case of compressed tracebacks
	c                 x    t        j                  j                  | g|d|i| d|v }t        |      | _        y )Nfmtz%(tbc)s)rb   )logging	FormatterrS   r]   _tb)ra   r   argskwargsrb   s        r   rS   zFormatterWithTraceBack.__init__   s;    	T<T<s<V<#()$(r<   c                 z    | j                         x|_        |_        t        j                  j                  | |      S N)r   tbctbr   r   format)ra   records     r   r   zFormatterWithTraceBack.format   s/    88:%&*vy				!	!$	//r<   N)rL   r}   r~   r   rS   r   r   r<   r   r   r      s    *
0r<   r   Fc                 F   | r3t        | j                        r| j                  | j                  d          |rd |_        d t        j
                  _        t        j                  r5	 t        j                  j                          t        j                  d       y y #  Y xY w)Nr   c                       y r   r   r   r<   r   <lambda>z!__stopOnIOError.<locals>.<lambda>       r<   c                      y r   r   ra   s    r   r   z!__stopOnIOError.<locals>.<lambda>   r   r<   )rr   handlersremoveHandlercloser   StreamHandlerflushexitOnIOErrorr   stderrexit)logSyslogHndlrs     r   __stopOnIOErrorr      sy    
s6??#vq)*(.0:: ((1+ s   'B B c           	      \   	 t        | |||fi | y# t        t        f$ r }|j                  dk(  rt	        |         d}~wt
        $ rc}	 d|t        |      ffd|D cg c]  }t        |       nc c}w c}fffD ]  }	 t        | |g|  #  Y xY w n#  Y nxY wY d}~yY d}~yd}~ww xY w)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;   )ra   levelmsgr   r   ru   as          r   	__safeLogr      s    D%d-f-	'" WW]4 
!Z_!56D1qZ]1134 
t
tU"T"
	
4
sT    B+<B+	BA/
.B>BBBBB&BB&&B+c                     	 t        |        y# t        t        f$ r!}|j                  dk(  rt	        d|         d}~ww xY w)zQSafe flush inject stopping endless logging on closed streams (redirected pipe).
	r   N)__origLogFlushr   r   r   r   )ra   ru   s     r   __safeLogFlushr   
  s<    	'" WW]4s    >9>c                 b    d| v rd| j                  d      d   z  } t        j                  |       S )zBGet logging.Logger instance with Fail2Ban logger name convention
	rT   zfail2ban.%srh   )
rpartitionr   	getLoggernames    r   r   r     s4     4K	-b1	1$$r<   c                     	 t        | t              s| j                         rt        |       }|S t        t        | j                               }	 |S # t        $ r t        d| z        w xY w)NzInvalid log level %r)r,   intisdigitgetattrr   r   AttributeError
ValueError)valuells     r   str2LogLevelr     sf    3su}}E
2
 	 	'2 	 	 3)E1223s   +A A A(c                     | dkD  r"| dkD  rd|z   }| dkD  rd|z   }nd|z   }|rd|z   }nd|z   }|rd	|z   }|st        j                  d
d |      }|S )z(Custom log format for the verbose runs
	r   r   z6 | %(module)15.15s-%(levelno)-2d: %(funcName)-20.20s |rJ   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                      y)NrZ   r   )ms    r   r   z$getVerbosityFormat.<locals>.<lambda>8  r   r<   )rp   rq   )	verbosityr   addtimepaddings       r   getVerbosityFormatr   &  sw     M]	AC	G3]	MPS	S3	(3	.3
c
!C3c9#	#	3
)=#>#r<   c                 h    t        d      j                  dd       t        j                  | ||      S )z>Except hook used to log unhandled exceptions to Fail2Ban log
	fail2banz Unhandled exception in Fail2Ban:T)rK   )r   criticalr   __excepthook__)exctyper   rk   s      r   
excepthookr   <  s6     :$t   57E955r<   c           
          | sg S t        t        t        t        j                  d|       D cg c]  }|j                          c}            S c c}w )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[ ,
]+)listfilterrE   rp   splitstrip)rZ   r   s     r   
splitwordsr   C  s=     	
	)VDbhhy!.DE1779EFGGEs   A)r      zif 1:
	def _merge_dicts(x, y):
		"""Helper to merge dicts.
		"""
		if y:
			return {**x, **y}
		return x
	
	def _merge_copy_dicts(x, y):
		"""Helper to merge dicts to guarantee a copy result (r is never x).
		"""
		return {**x, **y}
	execc                 P    | }|r!| j                         }|j                  |       |S )zHelper to merge dicts.
		copyupdater2   yrs      r   _merge_dictsr   \  s'     !vvx188A;	
(r<   c                 L    | j                         }|r|j                  |       |S )zCHelper to merge dicts to guarantee a copy result (r is never x).
		r   r   s      r   _merge_copy_dictsr   d  s"     ffh!88A;	
(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           	         t         j                  |       }|st        d      |j                         \  }}t	               }|r
t
        j                  |      D ]  }|j                  d      rAt        d|j                  d      |j                  d      |j                  d      dd fz        |j                  d      r1t        d|j                  d      |j                  d      dd fz        |j                  d      }|s|j                  d	d
d      D cg c]  }||	 c}d   }|j                         ||j                         <    ||fS c c}w )Nzunexpected option syntaxwrngAz+unexpected syntax at %d after option %r: %sr   r      wrngBz'expected option, wrong syntax at %d: %srJ   r      )

OPTION_CREmatchr   groupsdictOPTION_EXTRACT_CREfinditergroupstartr   )	optionr   option_nameoptstroption_optsoptmatchoptrG   r   s	            r   extractOptionsr   |  sX   			&	!-..||~fv
$--f5 ,hnnW
B^^GhnnQ/1H21NFP P Q QnnW
>^^GhnnW5a;B= = > >		3
x>>!Aa(=COC==>@5#kkm;syy{, 	[  =s   E Ec                 ,    t         j                  |       S r   )OPTION_SPLIT_CREfindall)r   s    r   splitWithOptionsr     s      ((r<   r   z<([^ <>]+)>c                 4   t         j                  }| }t        |      }t               }t        |d      }i }	 d}	|j	                         D ]  }
|
|v s|
|v r|rt        |j                  |
            r*t        ||
         x}} ||      }|j                  |
i       }|r|j                  d      }||v r |||j                               }0||
k(  s|j                  |d      t        kD  rt        d|
d|d|d|      d	}|r|j                  |d
z   |z         }||j                  |      }|
| ||      }| |||j                               }t        |t              st        |      }|j                  d|z  |      }|j                  |d      dz   ||<    |||j!                               }|r||k7  r; ||      r|||
<   d}	t#        |      t#        |       k(  r| j%                         }|||
<   d|vs|j'                  |
        |	s	 |S )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searchrX   r   keyscallabler   r;   getr   endMAX_TAG_REPLACE_COUNTr   r,   r9   r+   r   idr   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	Vmsd{HHT__S12HtCy))56%1
--R
 4	
771:Dv~	E1557	#Qs{dhhtQ'*??  D$    DHHTCZ+-.T|HHTNT,T]d| 
E1557	#QdC D)9$MM&4-.E $"Q&DJ5!'')$AI 
N o%Ys^W	$x2g;LLNTDI	w;&z 
E r<   c                     	 t         j                  dk\  r| j                         } nt        |       } t        j                  d|        y#  Y yxY w)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)
		r      N)r   version_infor>   r-   _libcapprctlr   s    r   prctl_set_th_namer    sA    
	$;;=D;D
==Ts   AA Ac                      y r   r   r   s    r   r  r    s    r<   c                   B     e Zd ZdZ e       ZdZ fdZd ZddZ	 xZ
S )	BgServicez{Background servicing

	Prevents memory leak on some platforms/python versions, 
	using forced GC in periodical intervals.
	Nc                 d    | j                   st        t        |   |       | _         | j                   S r   )	_instancesuperr  __new__)cls	__class__s    r   r  zBgService.__new__  s*    		)S!#& =	r<   c                     d| _         d| _        d| _        | j                  | _        t	        t
        d      rt        j                  d       y y )Ni     rd   set_thresholdr   )_BgService__serviceTime_BgService__periodTime_BgService__threshold_BgService__countr   gcr"  r   s    r   rS   zBgService.__init__$  sD    "$$$!!$,R!A "r<   c                 r   | xj                   dz  c_         |s1| j                   dkD  s!t        j                         | j                  k  ryt        j
                  j                  |      sy	 t        j                         | j                  k  r 	 t        j
                  j                          yt        j                          t        j                         | j                  z   | _        | j                  | _         	 t        j
                  j                          y# t        j
                  j                          w xY w)Nr   r   FT)r&  r   timer#  r  _mutexacquirereleaser'  collectr$  r%  )ra   forcewaits      r   servicezBgService.service/  s    ,,!,	DLL1$8J8J(J
				!	!$	'
	kkmd(((  ::<(9(994""4<
9s   *!D +AD  D6)FF)rL   r}   r~   r   r   r*  r  r  rS   r0  __classcell__)r  s   @r   r  r    s%     &r<   r  )NN)z %(message)sTT)r	   r   N)G
__author____license__r'  localer   r
   rp   r   rk   	threadingr   server.mytimer   r"   ctypesCDLLr  getpreferredencodingr   
startswithstdoutr$   allr  r'   r5   r;   r   r   r9   rH   rO   r[   objectr]   r   r   r   r   r   	NameErrorr   Logger_logr   r   r   r   r   r   r   r   r   r   r   evalcompile__file__r   r   DOTALLr   r   r   r   r   r   r   r  r  r  r   r<   r   <module>rE     s  ( L
 	   	 	 
   ! 6;;}%
 )V((*
!JJ3::&&23::;N;N;Y;YZa;bzz""*	
Z/Y
Z[*
 d&  
# t!( #)
 "( # C""$/*
 *1
(
+ +\0W.. 0  " NN	<   &&,, -    ,6H ug    RZZ5ryyA

  RZZjlnluluw  2::wy{  zC  zCD !*)   "**^
$13`F , ,]z  s   J  J" J"J-,J-