
    Bd1-                         d Z dZd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
mZmZmZ dd	lmZ  e
e          Z G d
 de          ZdS )z.Cyril Jaquier, Lee Clemens, Yaroslav HalchenkozPCopyright (c) 2004 Cyril Jaquier, 2011-2012 Lee Clemens, 2012 Yaroslav HalchenkoGPL    N   )Actions   )	getLogger_as_boolextractOptionsMyTime)r
   c                   N   e Zd ZdZg dZd dZd Zd Zd Zd	 Z	d
 Z
d Zed             Zed             Zej        d             Zed             Zed             Zed             Zej        d             Zd!dZed             Zd Zd Zd Zd"dZd Zd#dZd Zd$dZd ZdS )%Jailag  Fail2Ban jail, which manages a filter and associated actions.

	The class handles the initialisation of a filter, and actions. It's
	role is then to act as an interface between the filter and actions,
	passing bans detected by the filter, for the actions to then act upon.

	Parameters
	----------
	name : str
		Name assigned to the jail.
	backend : str
		Backend to be used for filter. "auto" will attempt to pick
		the most preferred backend method. Default: "auto"
	db : Fail2BanDb
		Fail2Ban persistent database instance. Default: `None`

	Attributes
	----------
	name
	database
	filter
	actions
	idle
	status
	)	pyinotifygaminpollingsystemdautoNc                 N   || _         t          |          dk    rt                              d|z             || _        t          j                    | _        d | _        i | _	        t          
                    d| j        z             ||                     |           || _        d S )N   z]Jail name %r might be too long and some commands might not function correctly. Please shortenzCreating new jail '%s')	_Jail__dblenlogSyswarning_Jail__namequeueQueue_Jail__queue_Jail__filter	_banExtrainfoname_setBackendbackend)selfr   r!   dbs       6/usr/lib/python3/dist-packages/fail2ban/server/jail.py__init__zJail.__init__G   s    $)YY"__	>> 6	    $+$,$-$.++&2333G$,,,    c                 0    | j         j        d| j        dS )N())	__class____name__r   r"   s    r$   __repr__zJail.__repr__X   s    ^,,,diii	88r&   c           	      d   t          |          \  }}|                                }| j        }|dk    r]|| j        vr7t                              d|d|d           t          d|d|d          ||                    |          d          }|D ]}t          | d|                                z            }	  |di | |dk    r(||k    r"t          	                    d|d|d           nt          
                    d	|z             t          |           | _         d S # t          $ rG}t                              |dk    rt          j        nt          j        d
|d|           Y d }~d }~ww xY wt                              d| j        z             t'          d| j        z            )Nr   zUnknown backend z. Must be among z
 or 'auto'z_init%szCould only initiated z backend whenever z was requestedzInitiated %r backendzBackend z failed to initialize due to z,Failed to initialize any backend for Jail %r )r	   lower	_BACKENDSr   error
ValueErrorindexgetattr
capitalizer   r   r   _Jail__actionsImportErrorlogloggingDEBUGERRORr   RuntimeError)r"   r!   beArgsbackendsb
initmethodes          r$   r    zJail._setBackend[   s   "7++/'6MMOO'^(dn$$
LLL   
*    x~~g..//08 ; ;ai!,,..899:;J&Q'\\^^^!"GGG- . . . . [['!+,,,T]]DN
FF
 ; ; ;
JJ''W]]W]45AAqq9; ; ; ; ; ; ; ;; 	,,1DI=? ? ?1DI=	? 	? ?s   ;A'D%%
E6/=E11E6c                 x    ddl m} t                              d| j        d|            || fi || _        d S )Nr   )
FilterPollJail 'z' uses poller )
filterpollrD   r   r   r   r   )r"   kwargsrD   s      r$   _initPollingzJail._initPolling   sR    $$$$$$+++DIIIvv>???*T,,V,,$---r&   c                 x    ddl m} t                              d| j        d|            || fi || _        d S )Nr   )FilterGaminrE   z' uses Gamin )filtergaminrJ   r   r   r   r   )r"   rG   rJ   s      r$   
_initGaminzJail._initGamin   sR    &&&&&&+++4999ff=>>>+d--f--$---r&   c                 x    ddl m} t                              d| j        d|            || fi || _        d S )Nr   )FilterPyinotifyrE   z' uses pyinotify )filterpyinotifyrN   r   r   r   r   )r"   rG   rN   s      r$   _initPyinotifyzJail._initPyinotify   sR    ......+++tyyy&&ABBB!/$11&11$---r&   c                 x    ddl m} t                              d| j        d|            || fi || _        d S )Nr   )FilterSystemdrE   z' uses systemd )filtersystemdrR   r   r   r   r   )r"   rG   rR   s      r$   _initSystemdzJail._initSystemd   sR    ******+++TYYY?@@@-////$---r&   c                     | j         S )zName of jail.
		)r   r,   s    r$   r   z	Jail.name   s     
r&   c                     | j         S )z;The database used to store persistent data for the jail.
		r   r,   s    r$   databasezJail.database   s     
r&   c                     || _         d S NrW   r"   values     r$   rX   zJail.database   s    $)))r&   c                     | j         S )z;The filter which the jail is using to monitor log files.
		)r   r,   s    r$   filterzJail.filter   s     
r&   c                     | j         S )z2Actions object used to manage actions for jail.
		)r7   r,   s    r$   actionszJail.actions   s     
r&   c                 2    | j         j        p| j        j        S )z-A boolean indicating whether jail is idle.
		r^   idler`   r,   s    r$   rc   z	Jail.idle   s     
		.T\..r&   c                 6    || j         _        || j        _        d S rZ   rb   r[   s     r$   rc   z	Jail.idle   s    $+$,r&   basicc                 v    d| j                             |          fd| j                            |          fgS )zThe status of the jail.
		Filter)flavorr   )r^   statusr`   )r"   rh   s     r$   ri   zJail.status   sD     dk   //0t|""&"112
 r&   c                 6    | j                                          S )z-Retrieve whether queue has tickets to ban.
		)r   emptyr,   s    r$   hasFailTicketszJail.hasFailTickets   s     \!!	!!r&   c                 :    | j                             |           dS )zQAdd a fail ticket to the jail.

		Used by filter to add a failure for banning.
		N)r   putr"   tickets     r$   putFailTicketzJail.putFailTicket   s     
 ,6r&   c                 h    	 | j                             d          }|S # t          j        $ r Y dS w xY w)zTGet a fail ticket from the jail.

		Used by actions to get a failure for banning.
		F)r   getr   Emptyro   s     r$   getFailTicketzJail.getFailTicket   sE    
LU##6
=	   
%%s    11c                   	 | j         }|dk    rd }||||<   n||v r||= t                              d||           |dk    rHt          |          ||<   |                    |          r!| j        t                              d           |dv r|t          j        |          ||<   |dv s|                    dd            |dk    r,d	 ||dk    r|	                    d
          ng D             |d<   |                    dg           t          |                    dd                    }t                    r|ffd	}n-|                    dd          }t          |dd          }||fd}|                    dd           |d         |ffd	}|                    dd           |d         	|f	fd	}||d<   d S d S )N zSet banTime.%s = %s	incrementzDban time increment is not available as long jail database is not set)maxtimerndtime)formulafactorry   rz   multipliers	evformular}   c                 ,    g | ]}t          |          S r/   )int).0is     r$   
<listcomp>z(Jail.setBanTimeExtra.<locals>.<listcomp>   s    kkka3q66kkkr&    evmultipliersr|   1c                 h    | j         |z  | j        t                    k     r| j        nd         z  S )N)TimeCountr   )ban	banFactorr}   s     r$   <lambda>z&Jail.setBanTimeExtra.<locals>.<lambda>   s7    X	KSY[AQAQ5Q5Q		WYZZ r&   r{   z?ban.Time * (1<<(ban.Count if ban.Count<20 else 20)) * banFactorz~inline-conf-expr~evalc                 F    t          | j        t          |                    S rZ   )maxr   r   )r   r   r{   s      r$   r   z&Jail.setBanTimeExtra.<locals>.<lambda>  s    #chPTU\P]P]B^B^ r&   ry   c                 6    t           ||                     S rZ   )min)r   r~   ry   s     r$   r   z&Jail.setBanTimeExtra.<locals>.<lambda>  s    YYs^^W1M1M r&   rz   c                 H     ||           t          j                     z  z   S rZ   )random)r   r~   rz   s     r$   r   z&Jail.setBanTimeExtra.<locals>.<lambda>	  s     ))C..6=??U\C\2\ r&   )r   r   r   r   rs   rX   r   r
   str2secondssplitr   r   compile)
r"   optr\   ber   r~   r{   ry   r}   rz   s
          @@@r$   setBanTimeExtrazJail.setBanTimeExtra   s5   ~"
b[[5
2c77
byy	#w++#S%000Ke__2c7ffSkk [dm+
NNYZZZ"""
- ''BsGFFF"&&Q\^bJcJcJk	]kk@QV[_aVaVaEKK,<,<,<gikkkB,,;BFF8S))**9	+ _&/     II ffY abbGg3V<<G&/^^^I
&&D
!
!
)mG&/MMMMMI
&&D
!
!
)mG&/]]]]]I2k???1 KlJkr&   c                 J    || j                             |d           S | j         S rZ   )r   rs   )r"   r   s     r$   getBanTimeExtrazJail.getBanTimeExtra  s'    _
.

S$
'
''	r&   c                     | j                             d          r| j                             dd          n| j                                        S )z)Returns max possible ban-time of jail.
		rx   ry   r   )r   rs   r`   
getBanTimer,   s    r$   getMaxBanTimezJail.getMaxBanTime  sK     n%%
E		Ir	*	*	*+/<+B+B+D+DEr&   Tc                    	 | j         }| j                            d          rd}|r|                                 }n| j                                        }| j                             | ||| j        j        j	                  D ]}	 | j        
                    |                                d          r3d|_        |                    |          }t          j                    |                                z
  }|dk    r|dk    r||z  }|dk    r|dk    r|                     |           # t"          $ rL}t$                              d|t$                                          t*          j        k    	           Y d}~d}~ww xY wdS dS # t"          $ rM}t$                              d
|t$                                          t*          j        k    	           Y d}~dS d}~ww xY w)z5Restore any previous valid bans from the database.
		Nrx   )jail
forbantimecorrectBanTime
maxmatchesT)
log_ignorer   r   zRestore ticket failed: %sexc_infozRestore bans failed: %s)rX   r   rs   r   r`   r   getCurrentBansr^   failManager
maxMatchesinIgnoreIPListgetIDrestoredr
   timegetTimerq   	Exceptionr   r2   getEffectiveLevelr:   r;   )r"   r   r   rp   btmdiftmrB   s          r$   restoreCurrentBanszJail.restoreCurrentBans  s*   8
m~+&& ,Z ,))++n ,))++Z-..DZ"t{/F/Q /   ; ;;		#	#FLLNNt	#	D	DNhfoj))ckmmfnn...e	uqyy
e|s	saxx
     ; ; ;ll.((**GM9  ; ; ; ; ; ; ; ;;3  ; ;( 
 8 8 8	<<)1%%''6  8 8 8 8 8 8 8 8 88s]   BF .D.5F 6A!D.F D.-F .
F8AE?:F ?FF 
G"AGG"c                    t                               d| j                   | j                                         | j                                         |                                  t                               d| j                   dS )zStart the jail, by starting filter and actions threads.

		Once stated, also queries the persistent database to reinstate
		any valid bans.
		zStarting jail %rzJail %r startedN)r   debugr   r^   startr`   r   r   r,   s    r$   r   z
Jail.start=  sr     	,,!49---+,+++++++r&   c           
         |r t                               d| j                   | j        | j        fD ]}	 |r|                                 |r|                                 0# t          $ rS}t                               d|| j        |t           	                                t          j        k               Y d}~d}~ww xY w|r"t                               d| j                   dS dS )z9Stop the jail, by stopping filter and actions threads.
		zStopping jail %rzStop %r of jail %r failed: %sr   NzJail %r stopped)r   r   r   r^   r`   stopjoinr   r2   r   r:   r;   r   )r"   r   r   objrB   s        r$   r   z	Jail.stopI  s    
 /	<<"DI...k4<( 
9 
9c	9 XXZZZ XXZZZ
 9 9 9
LL0#ty!&&(('-7  9 9 9 9 9 9 9 99 
 -	;; $),,,,,- -s   ,A!!
B>+A	B99B>c                 f    | j                                         p| j                                        S )z?Check jail "isAlive" by checking filter and actions threads.
		)r^   isAliver`   r,   s    r$   r   zJail.isAlive\  s+     
					8$,"6"6"8"88r&   )r   N)re   rZ   )T)TT)r+   
__module____qualname____doc__r1   r%   r-   r    rH   rL   rP   rT   propertyr   rX   setterr^   r`   rc   ri   rl   rq   ru   r   r   r   r   r   r   r   r/   r&   r$   r   r   '   s%        : :99   "9 9 9$? $? $?L- - -
. . .2 2 20 0 0   (
   (
 /  /   (
   (
 / / (/
 +  +    " " ("
  	 	 	* * *Z   
E E E"8 "8 "8 "8H
, 
, 
,- - - -&9 9 9 9 9r&   r   )
__author____copyright____license__r:   mathr   r   r`   r   helpersr   r   r	   r
   mytimer+   r   objectr   r/   r&   r$   <module>r      s   , >
b           A A A A A A A A A A A A       
8		x9 x9 x9 x9 x96 x9 x9 x9 x9 x9r&   