
    GkcL                     D   d Z dZdZddlZddlZddlmZ ddlmZm	Z	m
Z
mZmZmZ ddlmZ dd	lmZ d
dlmZ  ee          ZdZ ej        dej                  Z ej        dd          ZddZd fdZ G d de          Z G d de          Z  G d de          Z!dS )z'Cyril Jaquier and Fail2Ban Contributorsz Copyright (c) 2004 Cyril JaquierGPL    N)Lock   )reDateTemplateDatePatternRegex
DateTai64n	DateEpochRE_EPOCH_PATTERN)validateTimeZone)Utils   )	getLogger   z(?<!\\)\{DATE\}i  i  )maxCountmaxTimec                    || }d| vr|                                  }t                              |          }|sd|v rZt          j        |           rt          | d|v           }n2|dv rt          |dk              }n|dv rt          |dk    d	          }|,|d
v rt          |dk    rdnd          }nt          |           }t                              ||           |S )N%EPOCHLEPOCH)patternlongFrm)r   z{^LN-BEG}EPOCHz^EPOCH)lineBeginOnly)r   z{^LN-BEG}LEPOCHz^LEPOCHT)r   r   )TAI64Nz{^LN-BEG}TAI64Nz^TAI64Nr   startF)	wordBegin)	upperDD_patternCachegetr   searchr
   r	   r   set)r   keytemplates      >/usr/lib/python3/dist-packages/fail2ban/server/datedetector.py_getPatternTemplater%   ,   s   K#	3$$ )^^g&& H(c/BBBHH444w888HH777x$GGGH	555xWWULLLHH((HS(###    c                     d| z   S N	{^LN-BEG} )ss    r$   <lambda>r,   D   s
    +/ r&   c                 R    || j                   }t                              |          }|sz |t          | d| j                            }t          | d          rt                              |          }|s/t          | d          st          |          }nt          |          }|S )Nr   )namer   r   getattrregexhasattrr%   )r#   wrapr.   	template2r0   s        r$   _getAnchoredTemplater4   D   s    X]  && +
$wxHN;;
<
<%Xy!! *""5))9	 +
(I
&
& +#D))II#E**Ir&   c                   X    e Zd ZdZd Zed             Zd Zg dZed             Z	d Z
dS )	DateDetectorCachez7Implements the caching of the default templates list.
	c                 R    t                      | _        t                      | _        d S N)r   _DateDetectorCache__locklist_DateDetectorCache__templatesselfs    r$   __init__zDateDetectorCache.__init__\   s    $+VV$r&   c                     | j         r| j         S | j        5  | j         r| j         cddd           S |                                  | j         cddd           S # 1 swxY w Y   dS )6List of template instances managed by the detector.
		N)r;   r9   _addDefaultTemplater<   s    r$   	templateszDateDetectorCache.templates`   s     
 

{  
         

	                 s   AAAAc                 J   |j         }|                    d          sf|                    d          sQt          |d          rAt          |          }|j         |k    r'd|_        | j        d                             |           | j        d                             |           dS )z&Cache Fail2Ban's default template.

		r)   ^r0   g      Y@r   r   N)r.   
startswithr1   r4   weight_DateDetectorCache__tmpcacheappend)r=   r#   r.   r3   s       r$   _cacheTemplatez DateDetectorCache._cacheTemplatel   s     
$		%	% )dooc.B.B )wxY`GaGa )#H--9n IOAi(((/!H%%%%%r&   )zF%ExY(?P<_sep>[-/.])%m(?P=_sep)%d(?:T|  ?)%H:%M:%S(?:[.,]%f)?(?:\s*%z)?z)(?:%a )?%b %d %k:%M:%S(?:\.%f)?(?: %ExY)?z$(?:%a )?%b %d %ExY %k:%M:%S(?:\.%f)?z1%d(?P<_sep>[-/])%m(?P=_sep)(?:%ExY|%Exy) %k:%M:%Sz=%d(?P<_sep>[-/])%b(?P=_sep)%ExY[ :]?%H:%M:%S(?:\.%f)?(?: %z)?z%m/%d/%ExY:%H:%M:%Sz%m-%d-%ExY %k:%M:%S(?:\.%f)?r   z{^LN-BEG}%H:%M:%Sz^<%m/%d/%Exy@%H:%M:%S>z%Exy%Exm%Exd  ?%H:%M:%Sz%b %d, %ExY %I:%M:%S %pz^%b-%d-%Exy %k:%M:%Sz6%ExY%Exm%Exd(?:T|  ?)%ExH%ExM%ExS(?:[.,]%f)?(?:\s*%z)?z1(?:%Z )?(?:%a )?%b %d %k:%M:%S(?:\.%f)?(?: %ExY)?z1(?:%z )?(?:%a )?%b %d %k:%M:%S(?:\.%f)?(?: %ExY)?r   c                     t          t          j        d         t                    r=t	          t          j                  D ]#\  }}t          |          }|t          j        |<   $t          j        S )Nr   )
isinstancer6   DEFAULT_TEMPLATESstr	enumerater%   )r=   idts      r$   defaultTemplatesz"DateDetectorCache.defaultTemplates   sc    !3A6<< 0+=>> 0 0uq"	R	 	 B-/'**		,,r&   c                     g g f| _         | j        D ]}|                     |           | j         d         | j         d         z   | _        | ` dS )z<Add resp. cache Fail2Ban's default set of date templates.
		r   r   N)rG   rQ   rI   r;   )r=   rP   s     r$   rA   z%DateDetectorCache._addDefaultTemplate   s\     F$/!  br_Q'$/!*<<$
ooor&   N)__name__
__module____qualname____doc__r>   propertyrB   rI   rL   rQ   rA   r*   r&   r$   r6   r6   Y   s            	 	 (	& & &$3 3 3j - - (-	 	 	 	 	r&   r6   c                   8    e Zd ZdZdZd Zed             Zd ZdS )DateDetectorTemplateztUsed for "shallow copy" of the template object.

	Prevents collectively usage of hits/lastUsed in cached templates
	r#   hitslastUseddistancec                 >    || _         d| _        d| _        d| _        d S )Nr   rZ   )r=   r#   s     r$   r>   zDateDetectorTemplate.__init__   s"    $-$)$-$---r&   c                 V    | j         | j        j        z  t          d| j                  z  S )Nr   )r[   r#   rF   maxr]   r<   s    r$   rF   zDateDetectorTemplate.weight   s%    	T])	)C4=,A,A	AAr&   c                 ,    t          | j        |          S )zF Returns attribute of template (called for parameters not in slots)
		)r/   r#   )r=   r.   s     r$   __getattr__z DateDetectorTemplate.__getattr__   s     
	%	%%r&   N)	rS   rT   rU   rV   	__slots__r>   rW   rF   rc   r*   r&   r$   rY   rY      sa          :   B B (B& & & & &r&   rY   c                       e Zd ZdZ e            Zd ZddZd ZddZ	e
d	             Zd
 Ze
d             Zej        d             ZddZd ZdS )DateDetectorzjManages one or more date templates to find a date within a log line.

	Attributes
	----------
	templates
	c                     t                      | _        t                      | _        d| _        d| _        d| _        d| _        d| _        d | _	        d | _
        d S )Ni,  )r   N)r_   Nr_   r   )r:   _DateDetector__templatesr!   _DateDetector__known_names_DateDetector__unusedTime_DateDetector__lastPos_DateDetector__lastEndPos_DateDetector__lastTemplIdx_DateDetector__firstUnused_DateDetector__preMatch_DateDetector__default_tzr<   s    r$   r>   zDateDetector.__init__   sV    VV$uu$$$.&$"$$$/$r&   Fc                     |j         }|| j        v r|rd S t          d|z            | j                            |           | j                            t          |                     d S )Nz(There is already a template with name %s)r.   ri   
ValueErroraddrh   rH   rY   )r=   r#   	ignoreDupr.   s       r$   _appendTemplatezDateDetector._appendTemplate   sx    	$	T	.5
7 
7 7.x8899999r&   c                    t          |t                    r|x}d|vr|                                t                                        }|sddv rfd}|                     |           dS dv r|                     |d           dS dk    rt          d	          }nt          |          }t                              |           |                     |           t          
                    d
t          |dd          |j                   t                              dt          |dd          |j                   dS )a  Add a date template to manage and use in search of dates.

		Parameters
		----------
		template : DateTemplate or str
			Can be either a `DateTemplate` instance, or a string which will
			be used as the pattern for the `DatePatternRegex` template. The
			template will then be added to the detector.

		Raises
		------
		ValueError
			If a template already exists with the same name.
		r   )r)   z	{DEFAULT}c                 <    dk    r| j         t          j        z  nd S r(   )flagsr   
LINE_BEGIN)r#   r"   s    r$   r,   z-DateDetector.appendTemplate.<locals>.<lambda>  s!    3+CUCUx~(???[_ r&   Nz{DATE}F)preMatchallDefaultsz{NONE}z{UNB}^z  date pattern `%r`: `%s`r    z  date pattern regex for %r: %s)rK   rM   r   r   r   addDefaultTemplater%   r!   ru   logSysinfor/   r.   debugr0   )r=   r#   r   fltr"   s       @r$   appendTemplatezDateDetector.appendTemplate   sf    # &3	
--//C!!#&&8
 2
(((____ 		S!!!V	S	g5AAAV	#Hc22XX#GS11XsH%%%x   ++)
8Y##X]4 4 4,,0
8Y##X^5 5 5 5 5r&   NTc                     t          | j                  dk    }|rt          j        j        nt          j        j        D ]=}| ||          st          |fd          }|                     ||           >dS )z0Add Fail2Ban's default set of date templates.
		r   Nc                 B     t                                fd          S )Nc                 ,    t          j                  S r8   )r   unboundPattern)mr+   s    r$   r,   zCDateDetector.addDefaultTemplate.<locals>.<lambda>.<locals>.<lambda>7  s    <3Nq3Q3Q r&   )RE_DATE_PREMATCHsub)r+   rz   s   `r$   r,   z1DateDetector.addDefaultTemplate.<locals>.<lambda>7  s$    $(()Q)Q)Q)QS[\\ r&   )r2   )rt   )lenrh   rf   	_defCacherB   rQ   r4   ru   )r=   filterTemplaterz   r{   rt   r#   s     `   r$   r}   zDateDetector.addDefaultTemplate*  s     $"##a')'2_<##8N8_7 7h  )A)A 8#H
\
\
\
\^ ^ ^H I66667 7r&   c                     | j         S )r@   )rh   r<   s    r$   rB   zDateDetector.templates;  s     
	r&   c                 j   t          | j                  s|                                  t                                          t
          k    rt          j        nd } |t
          dz
  d|           d}d}d}| j        }|t          | j                  k     r| j        |         }|j        }|j	        t          j        t          j        z  z  r. |t
          dz
  d|           |                    |          }|}nx| j        d         | j        d         }
}	 |t
          dz
  d	||	|
||	dz
  |	         | j        d         ||	|
         ||
|
dz            | j        d
         
  
         ||	dz
  |	         | j        d         k    s;||	|	dz            | j        d
         k    r| j        d
                                         s||
|
dz            | j        d
         k    s;||
dz
  |
         | j        d         k    rT| j        d                                         s5 |t
          dz
  d||	|
                    |                    ||	|
          }n+ |t
          dz
  d           |                    |          }|}|r|                                }	|                                }
t          | j                  dk    sC|j	        t          j        t          j        z  z  s"|	| j        d         k    r$|
| j        d         k    r |t
          d|           n+ |t
          d           ||	|
|f}d}n |t
          d           |s |t
          dt          | j                             d}| j        D ]T}||k    r|dz  } |t
          dz
  d||j                   |j        }|                    |          }|r|                                }	|                                }
 |t
          d||	|j        | j        d         |j                   |dz   t          | j                  k    r n|j	        t          j        t          j        z  z  r nz|	dk    r#|j        r| j        |dz            j        j        s nQ|	|j        k    s|	| j        d         k    r, |t
          d           |	|d         k     r||	|
|f}d}|dz  }M n|dz  }V|s5|d         r-|\  }}	}
} |t
          d|           | j        |         }|j        }|r|xj        dz  c_        t-          j                    |_        |	|_        | j        |k    r| xj        dz  c_        |	||	dz
  |	         ||	         f| _        |
||
dz
           ||
|
dz            f| _        |r || j        k    r|                     |          }|| _        ||fS  |t
          d           dS )a  Attempts to find date on a log line using templates.

		This uses the templates' `matchDate` method in an attempt to find
		a date. It also increments the match hit count for the winning
		template.

		Parameters
		----------
		line : str
			Line which is searched by the date templates.

		Returns
		-------
		re.MatchObject, DateTemplate
			The regex match returned from the first successfully matched
			template.
		c                      d S r8   r*   )argss    r$   r,   z(DateDetector.matchTime.<locals>.<lambda>V  s    PT r&   r   z"try to match time for line: %.120sN)Nr_   r_   r_   z/  try to match last anchored template #%02i ...r   zJ  try to match last template #%02i (from %r to %r): ...%r==%r %s %r==%r...r   z+  boundaries are correct, search in part %rz,  boundaries show conflict, try whole searchz"  matched last time template #%02izB  ** last pattern collision - pattern change, reserve & search ...z8  ** last pattern not found - pattern change, search ...z search template (%i) ...z  try template #%02i: %sz2  matched time template #%02i (at %r <= %r, %r) %sz1  ** distance collision - pattern change, reservez  use best time template #%02iz no template.)NN)r   rh   r}   r~   getEffectiveLevellogLevellogrm   r#   rx   r   ry   LINE_END	matchDaterk   rl   isalnumr   endr.   r]   r[   timer\   rn   _reorderTemplate)r=   liner   matchfoundignoreBySearchrO   ddtemplr#   r]   endposs              r$   	matchTimezDateDetector.matchTimeA  sR   & 
T		 ..00H<<

BTBT##hqj6=== %
*%.
!T		a 78n/0EEF C
EqIIIt$$ENN~a($*;A*>fHC
`&	(1*X
q 1	(6/	&/D-a0	2 2 2 
(1*X
$."333HXaZ DN1$555dnQ>O>W>W>Y>Y5	&/d/222F1HVO 1! 444T=Nq=Q=Y=Y=[=[4 	S!BDRXDYZZZh77UUS!CDDD%%U^ N{{}}HYY[[F 		a^|.|/DDE  $.###$2CA2F(F(FS7;;;;SWXXXHfa'UUUCLMMM	 + 3x,c$2B.C.CDDD1" " "wN!VQC
.7<@@@Ht$$E XiikkVSG7#T^A%6G G G 	
!s4#$$$$e,1,2GGH e	Q7<1A!A#1F1O1Te 	7###x$.2C'C'C	c(GHHH	E!H		h)ue1fa
UFAA
  E!H  !&E8VQC2A666q!GH
 
<<1<<ikk77
A!d8A:h#67hG4>tF1H~tF6!8O/DD4 !A$$$a  A4(
 #h   	r&   c                     | j         S r8   )rp   r<   s    r$   
default_tzzDateDetector.default_tz  s    		r&   c                 .    t          |          | _        d S r8   )r   rp   )r=   values     r$   r   zDateDetector.default_tz  s    &u--$r&   c                    ||                      |          }|d         }|	 |                    ||d         | j                  }|kt                                          t
          k    rGt                              t
          d|d         |d                             d          |j                   |S n# t          $ r Y nw xY wdS )a  Attempts to return the date on a log line using templates.

		This uses the templates' `getDate` method in an attempt to find
		a date. 
		For the faster usage, always specify a parameter timeMatch (the previous tuple result
		of the matchTime), then this will work without locking and without cycle over templates.

		Parameters
		----------
		line : str
			Line which is searched by the date templates.

		Returns
		-------
		float
			The Unix timestamp returned from the first successfully matched
			template or None if not found.
		Nr   r   )r   z&  got time %f for %r using template %s)
r   getDaterp   r~   r   r   r   groupr.   rr   )r=   r   	timeMatchr#   dates        r$   getTimezDateDetector.getTime  s    ( ~~d##9q\(	D)A,4;LMMD  ""h..jjCAwQa  (-1 1 1[	 
  	 	 	D		s   BB4 4
C Cc                    rj| j                  t                                          t          k    r't                              t          dj                   j        | j        z
  j        | j	        k     r| j	        ndz  fd} |            sdz
  k    rS dz
   |            sS = gd<   | j	        t                    k     rL| j	                 j        r:| xj	        dz  c_	        | j	        t                    k     r| j	                 j        :t                                          t          k    r"t                              t          d           S S )zReorder template (bubble up) in template list if hits grows enough.

		Parameters
		----------
		num : int
			Index of template should be moved.
		z%  -> reorder template #%02i, hits: %rr   c                               j         } t                                          t          k    r6t                              t          d| j                 j                   | k    p         j        k    S )NzE  -> compare template #%02i & #%02i, weight %.3f > %.3f, hits %r > %r)rF   r~   r   r   r   r[   r\   )pweightr   numposrB   untimerF   s    r$   	_moveablez0DateDetector._reorderTemplate.<locals>._moveable  sv    n#G!!X--ZZa	3y~/BD D DG?v	#(???r&   r   r   z"  -> moved template #%02i -> #%02i)rh   r~   r   r   r   r[   r\   rj   rF   rn   r   )r=   r   r   r   r   rB   r   rF   s    ` @@@@@r$   r   zDateDetector._reorderTemplate  s    	 $9s^7  H,,
JJx@#w|TTTt006N6#1C77		SAX3@ @ @ @ @ @ @ @ @ @ )++ 
c!e||Z
a%C9;; Z~i9SU		c)nn	,	,4;M1N1S	,! 
	c)nn	,	,4;M1N1S	,  H,,
JJx=sCHHH
:	*r&   )F)NNTr8   )rS   rT   rU   rV   r6   r   r>   ru   r   r}   rW   rB   r   r   setterr   r   r*   r&   r$   rf   rf      s              : : : :(5 (5 (5T7 7 7 7"   (
J J JX   ( . . ." " " "H- - - - -r&   rf   r8   )"
__author____copyright____license__copyr   	threadingr   datetemplater   r   r   r	   r
   r   strptimer   utilsr   helpersr   rS   r~   r   compile
IGNORECASEr   Cacher   r%   r4   objectr6   rY   rf   r*   r&   r$   <module>r      s  ( 7
2                        & & & & & &             
8		2:0"-@@ %+tU;;;   0 )B(A    *k k k k k k k k\& & & & &6 & & &.H H H H H6 H H H H Hr&   