
    BdoG                        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n	#  dZY nxY w ej                    at$                              d          rVej        r8ej        j        ,e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n6t$          dfdZ ej                                                    dk    rd ZneZd Zd Zd Z  G d de!          Z" G d dej#                  Z$de_%        d8dZ&	 e'Z'n# e($ r e)Z'Y nw xY wej*        j+        Z,d Z-e-ej*        _+        ej.        j/        Z0d Z1e1ej.        _/        d Z2d Z3d9d"Z4d# Z5d$ Z6ej        d%k    r e7 e8d&e9d'                     nd( Z:d) Z; ej8        d*ej<                  Z= ej8        d+ej<                  Z> ej8        d,ej<                  Z?d- Z@d. ZAd/ZB ej8        d0          ZC	 	 d:d3ZDerd4 ZEnd5 ZE G d6 d7e!          ZFdS );z<Cyril Jaquier, Arturo 'Buanzo' Busleiman, Yaroslav HalchenkoGPL    N)Lock   )MyTimezlibcap.so.2ANSI_c              #   B   K   | ]}t          j        |          d v V  dS ))N N)osgetenv.0vs     2/usr/lib/python3/dist-packages/fail2ban/helpers.py	<genexpr>r   0   s/      
Z
Z!29Q<<:%
Z
Z
Z
Z
Z
Z    )LANGUAGELC_ALLLC_CTYPELANGzUTF-8   c                    t          j                                                    }|dk    r|t                                          k    rt           }t	          |d          sD	 ddlm}  |dd          }n0# t          $ r# t          j	        t                      t           }Y nw xY wt	          |d          r|
                    |            d S d S d S d S )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11
4
$,
-
- ******E&%  TT   cTTT d()) &H%%%%% ^11& &s   !A4 4*B! B!strictc                     	 t          | t                    r|                     ||          S | S # t          t          f$ r  |dk    r |                     |d          cY S w xY wNr*   replace)
isinstancebytesdecodeUnicodeDecodeErrorUnicodeEncodeErrorxencerrorss      r   
uni_decoder7   Y   s{    #E !88C   
8
0	1 # # #	
((3	
"
""""#   */ / .A A c                     t          | t                    st          |           S |                     t          d          S Nr-   )r.   r/   strr0   r    r4   s    r   
uni_stringr=   b   s3    	Au		 
a&&=	
*i	(	((r   c                     	 t          | t                    r|                     ||          S | S # t          t          f$ r  |dk    r |                     |d          cY S w xY wr,   )r.   r;   encoder1   r2   r3   s      r   r7   r7   g   s{    #C !88C   
8
0	1 # # #	
((3	
"
""""#r8   c                     t          | t                    st          |           S |                     t          d          S r:   )r.   r;   r?   r    r<   s    r   r=   r=   q   s3    
Q

 q66M
((:y
)
))r   c                 v    t          | t                    st          |           n|                                 dv S )N)1ontrueyes)r.   r;   boollower)vals    r   _as_boolrI   y   s4    #C-- 	1S			
yy{{001r   c                  j    t          j                    dd         \  } }| j        t          |          fS )z+ Consistently format exception information N   )r   exc_info__name__r=   )claexcs     r   formatExceptionInforP   ~   s-    LNN2A2c	z#''r   c                 ,   t           j                            |           }|                    d          r
|dd         }|t	          ddg          v rBt           j                            t           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)srS   s     r   	mbasenamer\      s    
 	MM% 	crc$C$%%%%			"'//!,,	-	-	3d	:$r   c                        e Zd ZdZddZd ZdS )	TraceBackz7Customized traceback to be included in debug messages
	Fc                 "    d| _         || _        dS )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   rT   zTraceBack.__init__   s     $+$///r   c                 L   t          j        d          d d         }d |D             }d |D             }|d         g}|dd          D ]O}|d         |d         d         k    r |d         dxx         d	|d         z  z  cc<   :|                    |           Pd
                    d |D                       }| j        re|}t
          j                            | j        |f          }t          j
        dd|          }|dk    rd|t          |          d          z   }|| _        |S )Nd   )limitc                     g | ]P}t          |d                    t          j                            |d                    t	          |d                   gQS )r   r   )r\   r
   rV   rZ   r;   r   r4   s     r   
<listcomp>z&TraceBack.__call__.<locals>.<listcomp>   sX     E E E;<IadOORW__QqT**C!II6E E Er   c                 x    g | ]7}|d          dv |d                              d          '|d          |d         g8S )r   )unittestzlogging.__init__r   z	/unittestrK   )rX   )r   es     r   rj   z&TraceBack.__call__.<locals>.<listcomp>   sU     ' ' 'qqT555
A$--
$
$ 6 tQqTl555r   r   r   z,%s>c                 N    g | ]"}t          |d                    d|d         #S )r   :r   )r\   ri   s     r   rj   z&TraceBack.__call__.<locals>.<listcomp>   sD     % % % (!oooo	
1 % % %r   z>[^>]*$r	   z...)	tracebackextract_stackappendjoinra   r
   rV   commonprefixr`   resublen)	rb   ftbentriesentries_outentrysftb	prev_nextcommon_prefixcommon_prefix2s	            r   __call__zTraceBack.__call__   s~   c***3B3/#E E@CE E E'' 'G ' ' ''
 +qrr{  eAh+b/!$$$OA%%(**u	 % %#% % % 
& 
&$	_ 97''d(;<<=F9b-88>4N++,,--D4;	+r   N)F)rM   
__module____qualname____doc__rT   r    r   r   r^   r^      sA         
 
 
 
    r   r^   c                       e Zd ZdZd Zd ZdS )FormatterWithTraceBackz}Custom formatter which expands %(tb) and %(tbc) with tracebacks

	TODO: might need locking in case of compressed tracebacks
	c                 p    t          j        j        | g|R d|i| d|v }t          |          | _        d S )Nfmtz%(tbc)s)rc   )logging	FormatterrT   r^   _tb)rb   r   argskwargsrc   s        r   rT   zFormatterWithTraceBack.__init__   sK    	T<T<<<s<V<<<#()))$(((r   c                     |                                  x|_        |_        t          j                            | |          S N)r   tbctbr   r   format)rb   records     r   r   zFormatterWithTraceBack.format   s1    88::%&*vy			!	!$	/	//r   N)rM   r   r   r   rT   r   r   r   r   r   r      s<         * * *
0 0 0 0 0r   r   Fc                 <   | r4t          | j                  r |                     | j        d                    |rd |_        d t          j        _        t          j        r=	 t          j	                                         n#  Y nxY wt          j
        d           d S d S )Nr   c                      d S r   r   r   r   r   <lambda>z!__stopOnIOError.<locals>.<lambda>   s    4 r   c                     d S r   r   rb   s    r   r   z!__stopOnIOError.<locals>.<lambda>   s    D r   )ry   handlersremoveHandlercloser   StreamHandlerflushexitOnIOErrorr   stderrexit)logSyslogHndlrs     r   __stopOnIOErrorr      s    
 +s6?## +vq)***  <(.00 :4(1+++++ s    A? ?Bc                 J   	 t          | |||fi | dS # t          t          f$ r }|j        dk    rt	          |             d}~wt
          $ rU}	 d|t          |          ffdd |D             fffD ]}	 t          | |g|R   #  Y xY wn#  Y n	xY wY d}~dS Y d}~dS 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: %rc                 ,    g | ]}t          |          S r   )r=   )r   as     r   rj   z__safeLog.<locals>.<listcomp>   s    111qZ]]111r   )	__origLogBrokenPipeErrorIOErrorerrnor   	Exceptionr=   )rb   levelmsgr   r   rm   s         r   	__safeLogr      s0   D%d--f-----	'"   W]]4   
!Z__!5611D11134 
 
t
tU"T"""""
	T
4
 
 
 
 
 
 44444sJ    B"A  B"$B
3BB
BB
	B
BBB"c                     	 t          |            dS # 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   )rb   rm   s     r   __safeLogFlushr   
  s]    	'"   W]]4s    AA  Ac                 n    d| v rd|                      d          d         z  } t          j        |           S )zBGet logging.Logger instance with Fail2Ban logger name convention
	rU   zfail2ban.%srn   )
rpartitionr   	getLoggernames    r   r   r     s9     4KK	--b1	1$$r   c                 
   	 t          | t                    s|                                 rt          |           }n't          t          |                                           }n # t          $ r t          d| z            w xY w|S )NzInvalid log level %r)r.   intisdigitgetattrr   r   AttributeError
ValueError)valuells     r   str2LogLevelr     s    3s (u}} (E

22''2 3 3 3)E12223
s   A A# #B  %(message)sTc                     | dk    r$| dk    rd|z   }| dk    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 |rK   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                     dS )Nr[   r   )ms    r   r   z$getVerbosityFormat.<locals>.<lambda>8  s    S r   )rw   rx   )	verbosityr   addtimepaddings       r   getVerbosityFormatr   &  s     MM]]	AC	G3]]	MPS	S33	(3	.3 "
c
!C3c9# 	#	3 ?
)==#>>#r   c                 v    t          d                              dd           t          j        | ||          S )z>Except hook used to log unhandled exceptions to Fail2Ban log
	fail2banz Unhandled exception in Fail2Ban:T)rL   )r   criticalr   __excepthook__)exctyper   rr   s      r   
excepthookr   <  sC     :$t   5 5 57E9555r   c           
          | sg S t          t          t          d t          j        d|           D                                 S )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
	c                 6    g | ]}|                                 S r   )stripr   s     r   rj   zsplitwords.<locals>.<listcomp>K  s     EEE17799EEEr   z[ ,
]+)listfilterrF   rw   split)r[   s    r   
splitwordsr   C  sD     	
 	)VDEEbhy!.D.DEEEFFGGGr   )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                 `    | }|r)|                                  }|                    |           |S )zHelper to merge dicts.
		copyupdater4   yrs      r   _merge_dictsr   \  s2     ! vvxx188A;;;	
(r   c                 \    |                                  }|r|                    |           |S )zCHelper to merge dicts to guarantee a copy result (r is never x).
		r   r   s      r   _merge_copy_dictsr   d  s-     ffhh! 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           	      B   t                               |           }|st          d          |                                \  }}t	                      }|rIt
                              |          D ]-}|                    d          rVt          d|                    d          |                    d          |                    d          dd         fz            |                    d          rBt          d|                    d          |                    d          dd         fz            |                    d          }|sd	 |                    d
dd          D             d         }|	                                ||	                                <   /||fS )Nzunexpected option syntaxwrngAz+unexpected syntax at %d after option %r: %sr   r      wrngBz'expected option, wrong syntax at %d: %sc                     g | ]}||S r   r   )r   rH   s     r   rj   z"extractOptions.<locals>.<listcomp>  s      = = =COCOOOr   rK   r      )

OPTION_CREmatchr   groupsdictOPTION_EXTRACT_CREfinditergroupstartr   )optionr   option_nameoptstroption_optsoptmatchoptr   s           r   extractOptionsr   |  s   			&	!	! /-...||~~fvv
 ,$--f55 , ,hnnW Q
B^^GhnnQ//1H1H21NFP P Q Q QnnW >
>^^GhnnW55ad;B= = > > >			3
x= =>>!Aa((= = ==>@5#kkmm;syy{{[  r   c                 6    t                               |           S r   )OPTION_SPLIT_CREfindall)r   s    r   splitWithOptionsr     s      (((r   r   z<([^ <>]+)>r	   r   c                    t           j        }| }t          |          }t                      }t          |d          }i }	 d}	|                                D ].}
|
|v s|
|v r|r#t          |                    |
                    r1t          ||
                   x}} ||          }|                    |
i           }|rX|	                    d          }||v r |||
                                          };||
k    s|                    |d          t          k    rt          d|
d|d|d|          d	}|r|                    |d
z   |z             }|$|                    |          }|| ||          }| |||
                                          }t          |t                    st          |          }|                    d|z  |          }|                    |d          dz   ||<    |||                                          }|X||k    rK ||          r|||
<   d}	t#          |          t#          |           k    r|                                 }|||
<   d|vr|                    |
           0|	snK|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searchrY   r!   keyscallabler   r=   getr   endMAX_TAG_REPLACE_COUNTr   r.   r;   r-   r   idr   add)inptagsconditionalignoreaddrepl
tre_searchtagsdone	noRecRepl	repCountsrepFlagtagr   orgvalr   rplcrtagrepls                    r   substituteRecursiveTagsr    s   , n
f++T<((A	'YY[[ ;& ;&c	Vmmsd{{H<HT__S1122<HtCy)))56z%1
--R
 
 4	
 $%771::Dv~~	E15577	#	#Qs{{dhhtQ''*??? : ssDDD$$$      D /HHTCZ+-..T|HHTNNT,WT]]d| 
E15577	#	#QdC  9D)9)9$MM&4-..E $""Q&DJ
5!''))$$AI 
 $%N ooz% Ys^W	$xx2g;;LLNNTDI		 	CA	D 	r   c                     	 t           j        dk    r|                                 } nt          |           } t                              d|            dS #  Y dS 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    sY    
	$;;==DD;;D
==T44s   AA Ac                     d S r   r   r   s    r   r  r    s    $r   c                   H     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                 z    | j         s-t          t          |                               |           | _         | j         S r   )	_instancesuperr"  __new__)cls	__class__s    r   r&  zBgService.__new__  s7    	 '	)S!!#&& =	r   c                     d| _         d| _        d| _        | j        | _        t	          t
          d          rt          j        d           d S d S )Ni     re   set_thresholdr   )_BgService__serviceTime_BgService__periodTime_BgService__threshold_BgService__countr!   gcr+  r   s    r   rT   zBgService.__init__$  sW    "$$$!$,R!! A r   Fc                 <   | xj         dz  c_         |s)| j         dk    st          j                    | j        k     rdS t          j                            |          sdS 	 t          j                    | j        k     r!	 t          j                                         dS t          j	                     t          j                    | j
        z   | _        | j        | _         	 t          j                                         dS # t          j                                         w xY w)Nr   r   FT)r/  r   timer,  r"  _mutexacquirereleaser0  collectr-  r.  )rb   forcewaits      r   servicezBgService.service/  s    ,,!,,	 DL1$$8J(J(J
%			!	!$	'	' 
%	kmmd(((  :<<<(994"4<
9s   C; ?C; ; D)FF)rM   r   r   r   r   r3  r$  r&  rT   r9  __classcell__)r(  s   @r   r"  r"    sw          $&&             r   r"  )NN)r   TT)r	   r   N)G
__author____license__r0  localer   r
   rw   r   rr   	threadingr   server.mytimer   r$   ctypesCDLLr  getpreferredencodingr    
startswithstdoutr&   allr  r)   r7   r=   r   r   r;   rI   rP   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>rN     s  ( L
 				   				 				 



           ! ! ! ! ! !    6;}%% )V(**
!! J 3:&23:;N;Y;YZa;b;b2z"**	c
Z
Z/Y
Z
Z
Z[[ *
 d& & &  
### t!( # # # #) ) ) )
 "( # # # # C""$$//* * * *
 *1 1 1
( ( (
 
 
+ + + + + + + +\0 0 0 0 0W. 0 0 0     "    N	  <   &,   -            ,6 6 6H H H ugg            RZ5ryAA

  RZjlnluw w  2:wy{  zCD D ! ! !*) ) )   "*^
$
$13` ` ` `F       , , , , , , , , , ,s   A A4E7 7F F