
    ogf!                         d Z dZdZddlmZ ddlmZ ddlmZ  ee	      Z
 G d d	e      Z G d
 de      Z G d de      Zy)zCyril Jaquierz Copyright (c) 2004 Cyril JaquierGPL   )	getLogger   )IPAddr)MyTimec                   Z   e Zd ZdZdZdZdZdddi dfdZd Zd Z	d	 Z
d
 Zd Zd Zd Zd Zd Zd Zd#dZd$dZd%dZd Zd#dZd#dZd Zd Zd Zd Zed        Zej<                  d        Zed        Zej<                  d        Zd Z d&d Z!ed!        Z"e"j<                  d"        Z"y)'Ticket)_id_flags	_banCount_banTime_time_data_retry
_lastResetl    r      Nc                 &   | j                  |       d| _        d| _        d| _        ||nt	        j
                         | _        |xs g dd| _        |*|j                         D ]  \  }}|	|| j                  |<    |r| j                  |       yy)z{Ticket constructor

		@param ip the IP address
		@param time the ban time
		@param matches (log) lines caused the ticket
		    N)matchesfailures)
setIDr   r   r   r   timer   r   itemsupdate)selfipr   r   dataticketkvs           8/usr/lib/python3/dist-packages/fail2ban/server/ticket.py__init__zTicket.__init__+   s     **R.$+$.$-'tV[[]$*"=ba8$*	jjl sq}TZZ] ;;v     c                    d| j                   j                  j                  d      d   | j                  | j                  | j
                  | j                  | j                  d   | j                  j                  dg       fz  S )Nz@%s: ip=%s time=%s bantime=%s bancount=%s #attempts=%d matches=%r.r   r   )		__class____name__splitr
   r   r   r   r   getr   s    r!   __str__zTicket.__str__B   sg    	K
nn##C(,dhh

	]]DNN	ZZ
TZZ^^Ir:<
< <r#   c                     t        |       S N)strr+   s    r!   __repr__zTicket.__repr__H   s    	Tr#   c                     	 | j                   |j                   k(  xrH t        | j                  d      t        |j                  d      k(  xr | j                  |j                  k(  S # t        $ r Y yw xY w)Nr   F)r
   roundr   r   AttributeError)r   others     r!   __eq__zTicket.__eq__K   sh    
((eii
 	$**aE%++q11JJ%++ 
 
s   A"A% %	A10A1c                 `    |j                   D ]  }t        ||d       }|t        | ||       ! y r.   )	__slots__getattrsetattr)r   r   nr    s       r!   r   zTicket.updateS   s6     avq$1mD!Qr#   c                 H    t        |t              rt        |      }|| _        y r.   )
isinstancer/   r   r
   r   values     r!   r   zTicket.setIDY   s    s%=5$(r#   c                     | j                   S r.   )r
   r+   s    r!   getIDzTicket.getID_   s    	/r#   c                 N    | j                   j                  d| j                        S )Nr   )r   r*   r
   r+   s    r!   getIPzTicket.getIPb   s    	dhh	''r#   c                     || _         y r.   r   r=   s     r!   setTimezTicket.setTimee   s	    $*r#   c                     | j                   S r.   rD   r+   s    r!   getTimezTicket.getTimeh   s    	r#   c                     || _         y r.   r   r=   s     r!   
setBanTimezTicket.setBanTimek   s	    $-r#   c                 6    | j                   | j                   S |S r.   rI   )r   	defaultBTs     r!   
getBanTimezTicket.getBanTimen   s    ==4$--D)Dr#   c                 6    |s|| j                   kD  r|| _         y y r.   r   )r   r>   alwayss      r!   setBanCountzTicket.setBanCountq   s    ut~~%4> &r#   c                 .    | xj                   |z  c_         y r.   rO   r=   s     r!   incrBanCountzTicket.incrBanCountu   s    ..E.r#   c                     | j                   S r.   rO   r+   s    r!   getBanCountzTicket.getBanCountx   s    	r#   c                 ~    | j                   | j                   n|}|dk(  rt        j                  S | j                  |z   S )Nr&   )r   r	   MAX_TIMEr   )r   rL   bantimes      r!   getEndOfBanTimezTicket.getEndOfBanTime{   s6    "mm7T]]Y']
//	g	r#   c                 f    | j                   | j                   n|}|dk(  ry|| j                  |z   kD  S )Nr&   F)r   r   )r   r   rL   rX   s       r!   
isTimedOutzTicket.isTimedOut   s4    "mm7T]]Y']

g%
%&r#   c                 "    || j                   d<   y Nr   r   r=   s     r!   
setAttemptzTicket.setAttempt   s     $**Zr#   c                      | j                   d   S r]   r^   r+   s    r!   
getAttemptzTicket.getAttempt   s    	J	r#   c                 b    |r|| j                   d<   y 	 | j                   d= y # t        $ r Y y w xY w)Nr   )r   KeyError)r   r   s     r!   
setMatcheszTicket.setMatches   s6    "4::i	

9
 		s   " 	..c                     | j                   j                  dd      D cg c]+  }t        |t        t        f      s|ndj                  |      - c}S c c}w )Nr     )r   r*   r<   listtuplejoin)r   lines     r!   
getMatcheszTicket.getMatches   sK    zz~~i,
. "$u64BGGDMI 
. . 
.s   0Ac                 <    | j                   t        j                  z  S r.   r   r	   RESTOREDr+   s    r!   restoredzTicket.restored   s    	v	&&r#   c                     |r$| xj                   t        j                  z  c_         y | xj                   t        j                   z  c_         y r.   rn   r=   s     r!   rp   zTicket.restored   s,    
;;&//!;;;FOO$$;r#   c                 <    | j                   t        j                  z  S r.   r   r	   BANNEDr+   s    r!   bannedzTicket.banned   s    	v}}	$$r#   c                     |r$| xj                   t        j                  z  c_         y | xj                   t        j                   z  c_         y r.   rs   r=   s     r!   ru   zTicket.banned   s,    
;;&--;;;FMM"";r#   c                 T   t        |      dk(  r:t        |d   j                         D cg c]  \  }}|	||f c}}      | _        nnt        |      dk(  r| j                  j	                  |f       nCt        |      dkD  r5| j                  j	                  d t        t        |      gdz   D               t        |      r| j                  j	                  |       t        | j                  j                         D cg c]  \  }}|	||f c}}      | _        y c c}}w c c}}w )Nr   r   r   c              3   *   K   | ]  \  }}||f  y wr.   rf   ).0r   r    s      r!   	<genexpr>z!Ticket.setData.<locals>.<genexpr>   s     ;sqaU;s   )lendictr   r   r   zipiter)r   argsargvr   r    s        r!   setDatazTicket.setData   s    Y!^ tAw}}H!!-qeHI4:
4yA~::dW
4y1}::;cDJ<>&:;;Y::T djj&6&6&8JsqAMaUJK$* I Ks   
D
D
?
D$

D$
c           	         || j                   S | j                   s|S t        |t        t        d       t        t
        t        t        f      st        |      rAt        | j                   j                         D cg c]  \  }} ||      s||f c}}      S t        |d      r=t        | j                   j                         D cg c]  \  }}||v s||f c}}      S | j                   j                  ||      S c c}}w c c}}w )N__iter__)r   r<   r/   typeintfloatboolcomplexcallabler|   r   hasattrr*   )r   keydefaultr   r    s        r!   getDatazTicket.getData   s    [
**	
>	CT$ZE$w?	@sm $**"2"2"4?31QA!A?@@c: $**"2"2"4A31QS!AABB	W	%% @
 Bs   9C=

C=
D
D
c                     t        | dd      S )N	_banEpochr   )r8   r+   s    r!   banEpochzTicket.banEpoch   s    	{A	&&r#   c                     || _         y r.   )r   r=   s     r!   r   zTicket.banEpoch   s	    $.r#   r.   )F)r   )NN)#r(   
__module____qualname__r7   rW   ro   rt   r"   r,   r0   r5   r   r   r@   rB   rE   rG   rJ   rM   rQ   rS   rU   rY   r[   r_   ra   rd   rl   propertyrp   setterru   r   r   r   rf   r#   r!   r	   r	   #   s   a$2d .<(E'! 	. ' '
//% % % %--# #L$&* ' '
// r#   r	   c                   H    e Zd Zdddi dfdZd Zd Zd ZddZed        Z	y)	
FailTicketNc                     d | _         d| _        t        j                  | |||||       t	        |t
              s;||n| j                         | _         | j                  j                  dd      | _        y y )Nr   r   )	
_firstTimer   r	   r"   r<   r   rG   r   r*   )r   r   r   r   r   r   s         r!   r"   zFailTicket.__init__   s_    $/$+//$D'48	FJ	'!-T4<<>4?
A.4; 
(r#   c                     || _         | j                  d   sd| j                  d<   |sd| j                  d<   g | j                  d<   yy)z Set artificial retry count, normally equal failures / attempt,
		used in incremental features (BanTimeIncr) to increase retry count for bad IPs
		r   r   r   r   Nr   r   r=   s     r!   setRetryzFailTicket.setRetry   sI     $+	J	4::j	4::j4::i 
r#   c                     | j                   S )zV Returns failures / attempt count or
		artificial retry count increased for bad IPs
		)r   r+   s    r!   getRetryzFailTicket.getRetry   s     
r#   c           	          || j                   kD  rc| j                  ||z
  k  rIt        t        | j                  t        || j                  z
        z  |z              | _        ||z
  | _        || _         yy)z Adjust time of ticket and current attempts count considering given maxTime
		as estimation from rate by previous known interval (if it exceeds the findTime)
		N)r   r   r   r2   r   r   )r   r   maxTimes      r!   
adjustTimezFailTicket.adjustTime   sd     
DJJ
oow&eDKK%t0F*GG'QRSDKWnDO4: r#   c                     | xj                   |z  c_         | j                  dxx   |z  cc<   |r?| j                  d   r | j                  d   |z   | j                  d<   y || j                  d<   y y )Nr   r   r   )r   r   attemptcounts       r!   inczFailTicket.inc  sb    +++**ZG#
jj JJy1G;DJJy#DJJy r#   c                     t         | _        | S r.   )r   r'   os    r!   wrapzFailTicket.wrap  s    !+	
(r#   )Nr   r   )
r(   r   r   r"   r   r   r   r   staticmethodr   rf   r#   r!   r   r      s:    $2d 	/	$  r#   r   c                       e Zd Zed        Zy)	BanTicketc                     t         | _        | S r.   )r   r'   r   s    r!   r   zBanTicket.wrap"  s    !+	
(r#   N)r(   r   r   r   r   rf   r#   r!   r   r      s     r#   r   N)
__author____copyright____license__helpersr   ipdnsr   mytimer   r(   logSysobjectr	   r   r   rf   r#   r!   <module>r      sS   . 
2    
8	{V {|8 8~
 r#   