
    Bd                        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ZddlZddl	Z	ddl
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mZmZ dd
lmZ ddlmZmZmZ ddl m!Z!mZ" ddl#m$Z$ ddl%m%Z% ddl&m'Z' ddl(m)Z) ddl*m+Z+m,Z-m.Z.m/Z/m0Z0m1Z1m2Z3m4Z4m5Z5 ddl6m7Z7  e7e8          Z,dZ9dZ: e e!j;                              Z<e	j=        >                    e	j=        j?                  Z?e	j=        >                    e	j=        j@                  Z@e?dz
  e_?        e,xe_,        xe_,        e_,        e%jA        ZBe%jC        ZDd ZEeExe_F        xe_F        xe_F        e$_F        d ZGe%jH        ZHd ZIe@fdZJ G d dejK                  ZK G d dejK                  ZLeKZMeLZNg aOd ZPePe_Q        dxe_R        e_R        e+jS        ZTd  ZUd! ZV	 	 	 d2d&ZWd' ZXd( ZYd) ZZd* Z[i fd+Z\ G d, d-e+          Z] G d. d/e]          Z^ G d0 d1e]          Z_dS )3zSerg BresterzICopyright (c) 2014- Serg G. Brester (sebres), 2008- Fail2Ban ContributorsGPL    N)joinisdirisfileexistsdirnamewraps)Thread   )fail2banclientfail2banserverfail2bancmdline)Fail2banCmdLine)exec_command_lineCSocket
VisualWait)Fail2banServerr   )protocol)server)MyTime)Utils   )	LogCaptureTestCaselogSyswith_tmpdirshutilloggingSTOCK
CONFIG_DIRTEST_NOWtearDownMyTime)	getLoggerzfail2ban-clientzfail2ban-serverc                  F    t                               | d                    d S Nr   )r   infoargss    G/usr/lib/python3/dist-packages/fail2ban/tests/fail2banclienttestcase.py_test_outputr*   J   s    T!W    c                     t                               d|            t          j        t          j                    | dz  z              d S )Nz===>>> time shift + %s min<   )r   debugr   setTimetime)shifts    r)   _time_shiftr2   Q   s<    *E222b()))))r+   c                      t           j        Mt           j                            t                     t           j                            t          dz             dS dS )z$Helper to wait observer becomes idleN   )	ObserversMain
wait_emptyMID_WAITTIME	wait_idle r+   r)   _observer_wait_idler;   Y   sI    N.L))).<!+,,,,, r+   c                 z     t           j        +t           j        j         fd}|t           j        _        dS dS )zOHelper to block observer before increase bantime until some condition gets trueNc                      t           j        _        t                              d           t          j                   t                              d            | i | d S )Nz4  [Observer::banFound] *** observer blocked for testz.  [Observer::banFound] +++ observer runs again)r5   r6   banFoundr   r.   r   wait_for)r(   kwargs_obs_banFoundcondtimeouts     r)   	_banFoundz0_observer_wait_before_incrban.<locals>._banFoundd   s`    *9>	<<FGGG>$   	<<@AAA=$!&!!!!!r+   )r5   r6   r>   )rB   rC   rD   rA   s   `` @r)   _observer_wait_before_incrbanrE   _   sT    N.)-" " " " " " " &). r+   c                       e Zd ZdZdS )ExitExceptionzException upon a normal exitN__name__
__module____qualname____doc__r:   r+   r)   rG   rG   t           ##r+   rG   c                       e Zd ZdZdS )FailExitExceptionzException upon abnormal exitNrH   r:   r+   r)   rO   rO   y   rM   r+   rO   c                  b    t          t                    rt                              d          S dS )Nr   exit)lenINTERACTpopr'   s    r)   _test_input_commandrU      s%    MM 	a	r+   Fc                     t          | |          }|                    d                    |          |rdndz              |                                 d S )N
 )openwriter   close)fnmodelinesfs       r)   _write_filer`      sL    	"d^^5		5044b	1222r+   c                     d }	 t          |           }|                                ||                                 S S # ||                                 w w xY wN)rY   readr[   )r\   r_   s     r)   
_read_filerd      sW    	
2hh!	
]779999 Q]779999 s	   "> A	/dev/null:memory:r:   rX   c                    t          | d          }|dk    rt          | d          }d}	|r:t          r2d }
t          j        t          ||
           |J dt          |          z              |d}t          j        d	          }t          j	        t          |d
          d          D ]=}|
                    d          }|                    |          rd}t          |           >t          j        d          }t          j	        t          |d          d          D ]=}|
                    d          }|                    |          rd}t          |           >|rdnd}	nyt          j        |           t          t          |d
          dddd|                    dd          z   ddt          | d          z   dt          | d          z   dd|z   dd d           |	r't          t          ||	          dgd!dd"d#| z   df|z   R   |rt          t          |d$          dg|R   t"          j        j        t(          j        k     r~t-          t          |d
                     t-          t          |d                     |rt-          t          |d$                     |	r#|	dk    rt-          t          ||	                     |r_t          rX|D ]U}t          j        t          j                            t          t          |                    t          ||                     V|r|D ]}t          |d%| iz  d           d&\  }}t"          j        j        t(          j        k     rKt7          t"          j        j                  }t"          j        j        d'k    rd(d)t"          j        j        z  z   f}|d*|fz   }d+|d,t          | d          d-t          | d          d.|f|z   d/dd0t7          t:          j                  fz   S )1Nconfigautozf2b-db.sqlite3	jail.confc                        fd|D             S )z?Filters list of 'files' to contain only directories (under dir)c                 N    g | ]!}t          t          |                    |"S r:   )r   pjoin).0r_   dirs     r)   
<listcomp>z2_start_params.<locals>.ig_dirs.<locals>.<listcomp>   s.    
4
4
4uU3]]33
41
4
4
4r+   r:   )rp   filess   ` r)   ig_dirsz_start_params.<locals>.ig_dirs   s    
4
4
4
4e
4
4
44r+   )ignorez?We are about to overload use_stock_cfg from the one provided %s)action.dzfilter.dz^dbfile\s*=zfail2ban.confT)inplacerW   zdbfile = :memory:z^backend\s*=backend = pollingz
jail.localrX   w[Definition]zloglevel = INFOzlogtarget = %z%%zsyslogsocket = autoz	socket = f2b.sockz
pidfile = f2b.pidz	dbfile = zdbmaxmatches = 100zdbpurgeage = 1d
[INCLUDES]	[DEFAULT]ztmp = zfail2ban.localtmp)r:   INFOr   -vz
--loglevel-c-sz-p--logtargetz--syslogsocketz	--timeout)rn   r   r   copytreeSTOCK_CONF_DIRreprrecompile	fileinputinputrstripmatchprintosmkdirr`   replaceunittestF2B	log_levelr   DEBUG	_out_filesymlinkpathabspathr   str	verbosityr   MAX_WAITTIME)r   	use_stockuse_stock_cfg	logtargetdb	f2b_localjailscreate_before_startcfgj_confrs   rlinenvvvllevs                   r)   _start_paramsr      sZ    S(&LLS"##"
 (% (5 5 5 	/.#g6666			DtMGZGZZ 
		,DMj  !oeC994HHH  d
++d

4ggdmm D;;;;j!!!oeC55tDDD  d
++d

4ggdmm D;;;; (<<b&& (3---eC))3I%%c4000sJ'''%Y'''    eC  # "(S."      =eC)**C<)<<<<LW]**E#''(((E#{##$$$ +U3())*** !+%%U3     He H H Ha:bgooeNA6677sAGGGG & & &aqE3<%%%%dLW\))	X\#	$	$$\a
HL**
*	,3|T""T5j))4sI1F1F	#	$'7s?/00'	 r+   c                 j    	 | |                      d          dz            dk    S # t          $ r Y dS w xY w)Nr   r   	INHERITEDF)index
ValueErrorstartparamss    r)   _inherited_logr      sL    	[&&}55a7	8K	GG   	s   !$ 
22c                     d }	 t          |           }t          j        d|                                          }t	          |          S # t
          $ r$}t                              |           Y d }~nd }~ww xY w|S )Nz\S+)rd   r   r   groupint	Exceptionr   r.   )pidfilepides      r)   _get_pid_from_filer      s~    7#
##%%#	S/   ,,q////////s   AA	 	
A7A22A7c                    t                               d| t          |           f           t          |           r1| }t          |d          } t	          |           st          |d          } t
          j        j        t          j	        k     rKt          |d          }t	          |          rt          |           nt                               dd|           t	          |           st                               d|           dS t                               d	|            t          |           d
S 	 t                               d           dk    st          j                    k    rt          dd| d          t!          j                  sdS t          j        t&          j                   t!          j        fdd          st          j        t&          j                   t                               d           t!          j                   S # t.          $ r$}t                               |           Y d }~nd }~ww xY wdS )Nzcleanup: %rr|   zfail2ban.pidf2b.logr4   zno logfile %rzcleanup: no pidfile for %rTzcleanup pidfile: %rFzcleanup pid: %rr   zpid z of z is invalidc                  .    t          j                    S rb   )r   
pid_exists)r   s   r)   <lambda>z_kill_srv.<locals>.<lambda>+  s    E$4S$9$9 9 r+   r   cleanup: kill ready)r   r.   r   rn   r   r   r   r   r   r   r   logr   r   getpidr   r   r   killsignalSIGTERMr?   SIGKILLr   	exception)r   piddirlogfiler   r   s       @r)   	_kill_srvr   	  s)   mguW~~6777	'NN +&&)$$'	 +6>**7 LW]**&)$$'G__ +W	::a'***w ,,+V444	#W---'""K	,, #&&&AXX	##	ggg>	?	??		#		 
$'#v~	99991	=	=  73,,$%%%c""	""   1s    1A"H BH 
I$IIc                 <     t                      fd            }|S )zHelper to decorate tests which receive in the last argument tmpdir to pass to kill_srv

	To be used in tandem with @with_tmpdir
	c                 n    |d         }	  | g|R  t          |           S # t          |           w xY w)N)r   )selfr(   r   r_   s      r)   wrapperzwith_kill_srv.<locals>.wrapper:  sG    H'
!D.4...W9Ws   # 4r	   )r_   r   s   ` r)   with_kill_srvr   5  s5    
 ((    ( 	r+   c                       fd}|S )z}Helper to decorate tests uses foreground server (as thread), started directly in test-cases

	To be used only in subclasses
	c                 Z     t           t                      fd                        }|S )Nc                    	 d }t                      	 t          fddi	t          d j        	f          }d|_        |                                 t          t          ff 	fd	}| _        t          j
        fdt                                                              dd                                           d		           t          j        d
                                              
 	g|R i ||rft          j        d                                                                                                   dd           r|                                 t'                       S # t(          $ rT}t+          d|z                                              }|r&t+          d|z                                                d }~ww xY w# |rft          j        d                                                                                                   dd           r|                                 t'                       w xY w)Nr   r   _TestCaseWorkernametargetr(   Tc                    t                                           dd           sJt          j                            t          d                    st          j        fdt                                         dd           s{	                    | d           t          j        fdt                                                             dd                                          dddt          	           d
 _        d S )Nendr|   c                  4                          dd           d uS Nr   getphases   r)   r   zywith_foreground_server_thread.<locals>._deco_wrapper.<locals>.wrapper.<locals>._stopAndWaitForServerEnd.<locals>.<lambda>_      UYYud334? r+   stopc                  4                          dd           d uS r   r   r   s   r)   r   zywith_foreground_server_thread.<locals>._deco_wrapper.<locals>.wrapper.<locals>._stopAndWaitForServerEnd.<locals>.<lambda>d  r   r+   Shutdown successfulzExiting Fail2banTallwaitc                      d S rb   r:   )r(   r@   s     r)   r   zywith_foreground_server_thread.<locals>._deco_wrapper.<locals>.wrapper.<locals>._stopAndWaitForServerEnd.<locals>.<lambda>h  s    D r+   )r"   r   r   r   r   rn   r   r?   r8   execCmdr   
assertTrueassertLoggedstopAndWaitForServerEnd)coder   r   r   r   s    r)   _stopAndWaitForServerEndzgwith_foreground_server_thread.<locals>._deco_wrapper.<locals>.wrapper.<locals>._stopAndWaitForServerEnd[  s    IIeT"" O27>>%Y:O:O+P+P On????NNNIIeT"" `
ll4f---n????NNN
ooeiit,,---
-/AtR^___$@$@T!!!r+   c                  4                          dd           d uS )Nstartr   r   s   r)   r   zWwith_foreground_server_thread.<locals>._deco_wrapper.<locals>.wrapper.<locals>.<lambda>k  s    599Wd334? r+   r   )r   r   z=== within server: begin ===z=== within server: end.  ===r   z=== Catch an exception: %sz#=== Error of server, log: ===
%s===)dictr   r   _testStartForegrounddaemonr   SUCCESSFAILEDr   r   r?   r   r   r   _wait_for_srv	DefLogSysr&   pruneLogr   r"   r   r   getLog)r   r   r(   r@   thr   r   r   r   r   r_   
startextras   ``      @@r)   r   zEwith_foreground_server_thread.<locals>._deco_wrapper.<locals>.wrapperI  s    	26656II{IjIIK	
%U
#
 
 
B
 BIHHJJJ (/&7 A A A A A A A A A $<D 	N????NNNOOEIIgt,,---sDkGGGN1222MMOOO1T35d555f55 
 ^2333	]]___	!!### 			% ggiii#  
 
 
	'!+---
++--C
 
2S8:::	]]___	
 
 ^2333	]]___	!!### 			% ggiiis&   C5F 
G!AGG!!G$ $A8I)r   r
   )r_   r   r   s   ` r)   _deco_wrapperz4with_foreground_server_thread.<locals>._deco_wrapperH  sD    889 9 9 9 9 8 ;9t 
.r+   r:   )r   r   s   ` r)   with_foreground_server_threadr   C  s%    
= = = = =| 	r+   c                       e Zd Zej        Zd Zd Zd Ze	dd            Z
ddZd	 Zd
 Zd Z eddi          d             Zeed                         ZdS )Fail2banClientServerBasec                     d S rb   r:   )r   r(   r@   s      r)   _setLogLevelz%Fail2banClientServerBase._setLogLevel  s    $r+   c                     t          j        |            dt          _        t          j        t          _        t          | j                  t          _
        dS )zCall before every test case.r   N)r   setUpr   DEF_LOGTARGETr   levelDEF_LOGLEVELstaticmethod
_test_exitr   _exitr   s    r)   r  zFail2banClientServerBase.setUp  s=    4   $&!&&t77/r+   c                     | j         t          _        t          t          _        t          t          _        t          j	        |            t                       dS )zCall after every test case.N)
_orig_exitr   r	  SRV_DEF_LOGTARGETr   r  SRV_DEF_LOGLEVELr  r   tearDownr"   r
  s    r)   r  z!Fail2banClientServerBase.tearDown  s?    //*&(&d###r+   r   c                 F    | dk    rt                      t                      r%   )rG   rO   )r   s    r)   r  z#Fail2banClientServerBase._test_exit  s!    	QYY				r+   TNc                     si 	 t          |d          t          j        fdt                    }|r                    d          rt          d|          |r4t          j         fdt                    }|st          dd|          d S d S #  t          |          r8t          d                                 z              	                                 t          |d	          }t          |          rt          |           n*t          |          st                              d
|            xY w)Nr{   c                  L                          d          pt                    S r   )r   r   )r   socks   r)   r   z8Fail2banClientServerBase._wait_for_srv.<locals>.<lambda>  s    		% 0 0 @F4LL r+   r   z7Unexpected: Socket file does not exists.
Start failed: c                  0    d                                  v S )NServer ready)r   r
  s   r)   r   z8Fail2banClientServerBase._wait_for_srv.<locals>.<lambda>  s    4;;==!@ r+   z.Unexpected: Server ready was not found, phase z.
Start failed: z,=== Error by wait fot server, log: ===
%s===r   z*No log file %s to examine details of error)rn   r   r?   r   r   r   r   r   r   r   r   r   r   r.   )r   r   readyr   r   retr   r  s   `   `  @r)   r   z&Fail2banClientServerBase._wait_for_srv  su   		
Z
 
 4	@@@@@,	O	O3
 5!! 
)    
.@@@@,
O
OC 9	  	  
		[!! 	:T[[]]JLLLMMOOO	sI		3Skk DcNNNN;'' D
LL=sCCCs   BB B#D=c                 p    |                      || j        d         | j        dd          |z   |z              d S )Nr   r   )assertRaisesr   )r   exitTyper   r(   s       r)   r   z Fail2banClientServerBase.execCmd  sI    Hd4Q7122,t36 6 6 6 6r+   c                     ||                     d          dz            }t          |          }	 |                    |          |                                 S # |                                 w xY w)Nr   r   )r   r   sendr[   )r   r   r(   r  ss        r)   execCmdDirectz&Fail2banClientServerBase.execCmdDirect  s]    	[&&t,,Q.	/$dmm!
&&,,7799991779999s   A A.c                    t                               d           d|d<   	 |                     t          d|z   d           d|d<   d|d<   t                               d           d S # d|d<   d|d<   t                               d           w xY w)Nzstart of test workerTr   z-fFr   zend of test worker)r   r.   r   r   )r   r   r   r   s       r)   r   z-Fail2banClientServerBase._testStartForeground  s    ,,%&&&%.&<<;.888 5>5<	<<$%%%%% 5>5<	<<$%%%%s   A& &&Br   )z[Thread]zstacksize = 128r   c                 <   |                                   |                     t          |dd           |                     d           |                     t          |d           |                     t          |d           |                     t          |dd           d S )Nr   threadz{'stacksize': 128}ping~~unknown~cmd~failed~~echo	TEST-ECHO)r   r   r   r   r   r   r   r   s      r)   testStartForegroundz,Fail2banClientServerBase.testStartForeground  s     --///,,wUH555())),,wV,,,,,v{$<===,,wV[99999r+   c                 z    t           j        st          j        d          t	          |d          }t          j        |          }|j                                        }|                    d           |                                 t          ||d          }ddi} fd}t          d	|||f
          }|                                 	                      t          d|z   d           d|d<   |                                 n# d|d<   |                                 w xY w                     ddd           d S )NzSkip test because no databaseztmp.dbz#UPDATE fail2banDb SET version = 555r   )r   r   r   Tc                 t    t          j        fdt                    s                    | d           d S d S )Nc                       d          S )Nr   r:   r   s   r)   r   z[Fail2banClientServerBase.testStartFailsInForeground.<locals>._stopTimeout.<locals>.<lambda>  s    U6]!2 r+   r   )r   r?   r   r  )r   r   r   s    `r)   _stopTimeoutzIFail2banClientServerBase.testStartFailsInForeground.<locals>._stopTimeout  sH    
.2222L
A
A ,{F+++++, ,r+   r   r   r   r   Fz/Attempt to travel to future version of databaseExit with code 255r   )r   
Fail2BanDbr   SkipTestrn   _dbcursorexecutescriptr[   r   r   r   r   r   r   r   )	r   r   dbnamer   curr   r   r-  r   s	   `        r)   testStartFailsInForegroundz3Fail2banClientServerBase.testStartFailsInForeground  s`    
	 <		:	;	;;X&  "
#9:::))+++cfDDD+4.%, , , , , 
	e  "
 ((***<<+-w7775=779999 5=779999ET  # # # # #s   D D )r   )TNN)rI   rJ   rK   r   r	  r  r  r  r  r  r  r   r   r  r   r   r)  r   r   r7  r:   r+   r)   r   r     s       #  8 8 8      ,	 	 	 	<6 6 6  
& 
& 
&  K 9 ,   
: : 
: # # - +# # #r+   r   c                       e Zd ZeefZd Zd Zed             Z	ee
d                         Zee
d                         Zee
d                         Zed             Zd Zd	S )
Fail2banClientTestc                     |                      t          t          t          t                                         |                      t          t          t          t
                                         d S rb   )r   r   rn   BINCLIENTSERVERr
  s    r)   testConsistencyz"Fail2banClientTest.testConsistency  sP    //&sF++,,---//&sF++,,-----r+   c                    |                      t          dd           |                     dt          z              |                     d           |                                  |                      t          dd           |                     t          j                               |                                  |                      t          ddd           |                     dt
          j        z              |                                  |                      t          dd	d
           |                     d           d S )Nr:   -hUsage: Report bugs to z-Vz-vqz	--versionz
Fail2Ban vz	--str2sec1d12h30m131400)r   r   r   r<  r   r   normVersionversionr
  s    r)   testClientUsagez"Fail2banClientTest.testClientUsage  s   ,,wD!!!I&'''%&&&--///,,wD!!!O/11222--///,,wE;///L?#::;;;--///,,wK444Hr+   c                 <   t          |d          }|                     t          |d           |                     d           |                     d           |                                  |                     t          |d           |                     d           d S )NTz-vvdzLoading filesz['set', 'logtarget',z--dp)r   r   r   r   r   r(  s      r)   testClientDumpz!Fail2banClientTest.testClientDump(  s     c4((+,,wV,,,O$$$*+++--///,,wV,,,*+++++r+   c                    t          |d          }|                     t          d|z   d           |                     |d|           |                     d           |                     d           	 |                     t          |dd           |                     t
          |d	           |                                  |                     t
          d|z   d           |                     d
           |                                  |                     t          |d           |                     d           |                     d           n_# |                                  |                     t          |d           |                     d           |                     d           w xY w|                                  |                     t
          |d           |                     d           |                     d           d S )NTz-br   r   r  Exit with code 0r&  r'  r%  zServer already runningr   r   zFailed to access socket pathzIs fail2ban running?)r   r   r   r   r   r   r   r(  s      r)   testClientStartBackgroundInsidez2Fail2banClientTest.testClientStartBackgroundInside4  s    c4((+,,w+-w777S$K888N###&''')<<fk:::<<%=>>>==???<<+-w777-...==???<<f---*+++'((((	 ==???<<f---*+++'((((--///,,v{F+++2333*+++++s   3BE AF+c                 
   t          |t          |d                    }t          j        j        r|                     t          |dz              nt          j        t          t          t                    f}t                              d|           ||z   dz   }t          j        |t          dd          }|                     t#          |          o|d	                    |                     |d|
           |                     d           |                                  	 |                     t          |dd           |                     d           |                     d           |                                  |                     t          |dd           |                     d           |                                  t+          t          |d                    }	 t-          j        |t0          j                   t5          j        t          j                   |                     t:          |dd           t-          j        |t0          j                   n$# t-          j        |t0          j                   w xY w|                     d           |                                  	 d	d l}n)# t@          $ r}t          j!        d|z            d }~ww xY wtD          g dz  a"|                     t          |d           |                     d           |                     dd           |                     d           |                                  tD          g dz  a"|                     t          |d           |                     d           |                     d           |                     d           |                     d           |                                  tD          ddgz  a"|                     t          |d           |                     d            |                                  |                     t:          |d!d"           |                     d            |                     d#           |                                  |                                  |                     t          |d$           |                     d           |                     d           d S # |                                  |                     t          |d$           |                     d           |                     d           w xY w)%Nr   r   )r   Start %s ...)--asyncr   FTrC   shelloutputr   r   r  r&  r'  rL  r$  z0.1zServer replied: pongr|   z1e-10z	timed outz%Skip test because of import error: %s)zecho INTERACT-ECHOstatusrQ   z-izINTERACT-ECHOStatuszNumber of jail:)reloadrestartrQ   zReading config files:r   zreload ~~unknown~jail~fail~~rQ   z@Failed during configuration: No section: '~~unknown~jail~fail~~'rW  z~~unknown~jail~fail~~r.  r   )#r   rn   r   r   fastr   r   sys
executabler;  r<  r   r.   r   
executeCmdr   r   rR   r   r   r   r   r   r   r   SIGSTOPr0   sleepDEFAULT_SHORT_INTERVALr   SIGCONTreadlineImportErrorr1  rS   )r   r   r   cmdr  r   ra  r   s           r)   testClientStartBackgroundCallz0Fail2banClientTest.testClientStartBackgroundCallS  s    cU3	-B-BCCC+\ 
2<<z12222 .%V,,	-3	<<$$$	{	2	23		#|5	N	N	N3??3s88&A'''c4S111N###--///F)<<fk:::[!!!'(((==???<<fe444+,,,==??? 
E#y11	2	23!GC   Ju+,,,LLfg666 GC    BGC    [!!!==???IOOOO
 I I I

CaG
H
HHI     8
 <<d+++_%%%X0111'(((==???    8
 <<d+++,---*+++^$$$'(((==???"
 8 <<d+++WXXX==???<<X/FGGGWXXX)***==???==???<<f---*+++'(((((	 ==???<<f---*+++'((((sL   "B>S+ !AI ; S+ !I<<,S+ )J. -S+ .
K8KKF;S+ +AUc                    t          |d          }|                     t          dddt          |d          d           |                     dt          |d          z   d	z              |                                  |                     t          ddt          |d
          dt          |d          d           |                     d           |                                  t          t          |d          d                                           |                     t          dddt          |d
          dt          |d          d           |                     d           |                                  t          j	        t          |d                     |                     t          dd           |                     d           |                                  d S )Nr   rO  r:   rQ  r   missr   Base configuration directory  does not existri   r   r{   rW  Could not find serveraLFail2ban seems to be in unexpected state (not running but the socket exists)rA  
r   r   r   rn   r   r   rY   r[   r   remover(  s      r)   testClientFailStartz&Fail2banClientTest.testClientFailStart  s    c[999+ ,,vrdE#v&&1 1 13eC6H6HHK\\]]]--/// ,,vrsH		tU3
%;%;XG G G+,,,--/// uS*s##))+++,,vrdE#x(($c:0F0FQ Q Qbccc--///)E#z""### ,,vr4   I--/////r+   c                 D   t          |d          }|                     t          |dd           |                     d           |                                  |                     t          |dddd           |                     d           |                                  d S )	Nr   rO  rW  jailri  rQ  z--xxxz"Unexpected argument(s) for reload:)r   r   r   r   r   r(  s      r)   testClientFailCommandsz)Fail2banClientTest.testClientFailCommands  s     c[999+ ,,v{V  +,,,--/// ,,v{h) ) )8999--/////r+   c                     d}dD ]p}d}t          |d          5 }|rB|                                 |r%t          j        j        st          j        |           |dz  }|Bd d d            n# 1 swxY w Y   qd S )NgQ?)r   r      r4   r   )r   	heartbeatr   r   rY  r0   r^  )r   	sleeptimeverbosecntrviss        r)   testVisualWaitz!Fail2banClientTest.testVisualWait  s    )  g
47A #
 ]]___ ) 
j	QYT	                 s   AA**A.	1A.	N)rI   rJ   rK   _exec_clientr<  r   r>  rG  r   rI  r   rM  rd  rn  rq  ry  r:   r+   r)   r9  r9    s        "F,. . .   	, 	, +	, , , - +,: W) W) - +W)r   - +:   +"	 	 	 	 	r+   r9  c                      e Zd ZeefZd Zeed                         Z	eed                         Z
eed                         Zed             Z eddi          d	             Zej                            d
           edddd          d                         Zej                            d           eddddd          d                         Z e            d             ZdS )Fail2banServerTestc                     |                      t          dd           |                     dt          z              |                     d           d S )Nr:   r@  rA  rB  )r   r   r   r=  r
  s    r)   testServerUsagez"Fail2banServerTest.testServerUsage  sL    ,,wD!!!I&'''%&&&&&r+   c                    t          |t          |d                    }t          j        t          t          t
                    f}t                              d|           ||z   dz   }t          j	        |t          dd          }|                     t          |          o|d                    |                     |d|	           |                     d
           |                                  	 |                     t"          |dd           |                     t$          |d           |                                  |                     t"          |d           |                     d           |                     d           d S # |                                  |                     t"          |d           |                     d           |                     d           w xY w)Nr   rO  rP  rK  FTrR  r   r   r  r&  r'  r%  r   r   rL  )r   rn   rZ  r[  r;  r=  r   r.   r   r\  r   r   rR   r   r   r   r   r   r   r   r   r   rc  r  s        r)   testServerStartBackgroundz,Fail2banServerTest.testServerStartBackground  s    cU3	-B-BCCC+	sF++,#,,~s###kG##l%MMM#//#c((%s1v&&&S$C000N###--///)<<fk:::<<%=>>>==???<<f---*+++'(((((	 ==???<<f---*+++'((((s   29F AG#c                 d   t          |d          }|                     t          ddt          |d                     |                     dt          |d          z   dz              |                                  t          t          |d          d	                                           |                     t          ddt          |d
          dt          |d                     |                     d           |                                  t          j	        t          |d                     d S )Nr   rO  r:   r   rf  rg  rh  r{   rj  ri   r   rk  rl  r(  s      r)   testServerFailStartz&Fail2banServerTest.testServerFailStart  s    c[999+ ,,vrsF		  3eC6H6HHK\\]]]--/// uS*s##))+++,,vrsH		tU3
%;%;= = =bccc--///)E#z""#####r+   c           	      D   t          |d          }t          |d          }|                     d           |                     t          |d           |                     d           t          t          |d          dd	d
d	dd           |                     d           |                     t          |d           |                     dddd           |                     d           |                     t          |dd           |                     dddd           d S )Nr   rO  ri   z[test-phase 0]z--testz$OK: configuration test is successfulrk   rj  rX   [broken-jail]filter = broken-jail-filterenabled = truez[test-phase 0a].Unable to read the filter 'broken-jail-filter'zErrors in jail 'broken-jail'.z ERROR: test configuration failedTr/  z[test-phase 0b]z-tr   )r   rn   r   r   r   r   r`   r   )r   r   r   r   s       r)   testServerTestFailStartz*Fail2banServerTest.testServerTestFailStart!  sF    c[999+c8# -- !!!,,wX...:;;; eC%%sB$&68 8 8 --!""",,v{H---D"%4  1 1 1
 --!""",,v{D'222D"%4  1 1 1 1 1r+   c                    	 t          t          d                    }t          j        t          t          t
                    f}t                              d|           ||z   dz   }t          j	        |t          dd          }|                     t          |          o|d                    |                     d|	           |                     d
           |                                  t                              d           |                     t!                               n'# |                     t!                               w xY wt          j        fdt                     |                     t'          t          d                               |                     d           |                                  |                     t!                               |                     d           d S )NzGf2b.log[format="SRV: %(relativeCreated)3d | %(message)s", datetime=off]rO  rP  rK  FTrR  r   r   r  zKill server ... %sc                  @    t          t           d                     S )Nr|   )r   rn   )r   s   r)   r   z7Fail2banServerTest.testKillAfterStart.<locals>.<lambda>S  s    VE#y$9$9::: r+   r|   r   zcleanup: no pidfile for)r   rn   rZ  r[  r;  r=  r   r.   r   r\  r   r   rR   r   r   r   r   r?   assertFalser   r  s    `   r)   testKillAfterStartz%Fail2banServerTest.testKillAfterStart?  s   #seCM/O /O P P P; .%V,,	-3	<<$$$	{	W	$3		#|5	N	N	N3??3s88&A'''c4S111^$$$==???	<<$c***??9S>>""""4??9S>>"""".::::LIII6%Y//00111)***--/////)C..!!!-.....s   DD1 1$Er   rj   r!  c                 n"   t          |d          t          |d          t          |d          t          |d          t          j        t          d                     	 	 dƈfd		}dǈfd	} |d            |d            |dgg d           t          t          d          dddddd           t          dgt	          t          t          j                                        dz   fdz  R   t          d           t          d           |                     d           t          j
        j        t          j        k     rt                     |                     t           |d           |                     dddt$                     |                     d z             |                     d!           |                     d"d#d$           |                     d%d&dt$                     |                     d'd(d)d$           |                     d*            |dd+g,           t          j
        j        t          j        k     rt                     |                     t           |d           |                     dt$          -           |                     d.d!d$           |                     d z  d z  d$           |                     d/d0d$           |                     d1d2d$           |                     d3d4d$           |                     d5           |                     d6            |dg,            |dd7dz  d8dz  d9dz  :           |                     t           |d           |                     dt$          -           |                     d.d!d$           |                     d;           |                     d/d<d$           |                     d=           |                     d>           |                     d?            |dd@A            |d+dg,           |                     dB           t          dCgt	          t          t          j                                        dDz   fdz  t	          t          t          j                                        dEz   fdz  z   t	          t          t          j                                        dFz   fdz  z   t	          t          t          j                                        dGz   fdz  z   R   t          j
        j        t          j        k     rt                     |                     dHdIdt$                     |                     t           |dJdKdLdM           |                     dNt$          -           |                     dOdPdQdRdSdTdUd$           |                     dVdWdXdYd$           t)                       |                     |                     |dZ          d[d\g d]idKg d^igf           |                     |                     |dZd_d`da          d[d\gd\dKgg gf           |                     |                     |dbd\dZ          d         g d]           |                     |                     |dbdKdZ          d         g d^           |                     |                     |dbd\dZdc          d         d           |                     |                     |dbd\dZdM          d         d[           |                     |                     |dbd\dZdcdM          d         dd[g           |                     dd           |                     t           |dedK           |                     ddfdNdt$                     |                     dgdhdidjd2dkdldmd$	  	         |                     dndodt$                     |                     dpdqd$           |                     dr           |                     t           |dJdKdLds           |                     t           |dJdKdLdt           |                     dudvdt$                     t)                       |                     dw           |                     t           |dbdKdLdx           |                     d`dydsdtdt$                     |                     dz           |                     t           |dbd\dL           |                     d_d{dcd`dydt$                     |                     d|           |                     t           |ded}dK           |                     dd2dt$                     |                     djd2dgdhdid$           |                     d~dd$           |                     d           |                     ddd$           |                     dSdTd$            |dd@A            |g ,           |                     d           |                     t           |dd\           |                     dt$          -           |                     ddd$           |                     dddd$           |                     d            |dg           |                     t           |d           |                     dt$          -           |                     d           |                     ddjd$           |                     dz  dz  d$           |                     d           t          dCgt	          t          t          j                                        dz   fdz  t	          t          t          j                                        dz   fdz  z   t	          t          t          j                                        dz   fdz  z   R   t          j
        j        t          j        k     rt                     |                     dddt$                     |                     ddddd$           |                     d           |                     d           |                     t           |dddd           |                     dddt$                     |                     d           |                     t           |ddd           |                     dddt$                     |                     t           |dddd           |                     dddt$                     |                     d           |                     t           |ddJd\dLdd           |                     dddt$                     |                     t           |ddJd\dd           |                     dddt$                     |                     d           |                     t           |dd}           |                     dt$          -           |                     dd.dd$           |                     ddd!dQd$           |                     d           |                     t           |ddd           |                     ddd$           |                     d            |dgd           |                     t0          |d           |                     dt$          -           |                     ddd$           |                     d            |dg           |                     t           |d           |                     dt$          -           |                     d           |                     t0          |dddK           |                     dt$          -           |                     d           |                                  |                     t           |ddddK           |                     dt$          -           |                     d1d2d$           |                     d           |                     t           |dddd           |                     dt$          -           |                     dddt$                     |                     d           |                     t           |ddJd\dddĦ           |                     t           |ddbd\dŦ           |                     ddd$           d S )Nri   	test1.logz	test2.logz	test3.logru   test-action1TrX   c                    t          dd| z            }|st          j        |           d S t          |ddddddd	d
dd|d|d|d|d|           t          j        j        t          j        k    rt          |           d S d S )Nru   %s.confrx   r~   z_exec_once = 0rX   ry   znorestored = %(_exec_once)sz
restore = zinfo = z<_use_flush_ = echo '[%(name)s] %(actname)s: -- flushing IPs'z6actionstart =  echo '[%(name)s] %(actname)s: ** start'z7actionreload = echo '[%(name)s] %(actname)s: .. reload'zMactionban =    echo '[%(name)s] %(actname)s: ++ ban <ip> %(restore)s%(info)s'z;actionunban =  echo '[%(name)s] %(actname)s: -- unban <ip>'z5actionstop =   echo '[%(name)s] %(actname)s: __ stop')
rn   r   rm  r`   r   r   r   r   r   r   )	actnameallowr   rW  banunbanr   r\   r   s	           r)   _write_action_cfgzBFail2banServerTest.testServerReloadTest.<locals>._write_action_cfgk  s    c:y72332
 IbMMM
Fr3!B<e=vSUXA5;T   l--bMMMMM .-r+   r   r   r:   pollingc                    t          g t          d          ddddddddd	d
dddd|z   ddd|v rdndd|v rdndd|v rdnddz   d| v rdz   ndd| v rdz   ndd	d| v rdndd| v rdndddd|z   ddd|v rdndd|v rdnddz   d| v rdndR   t          j        j        t
          j        k    rt          t          d                     d S d S )Nrk   rx   r}   rX   r~   usedns = nomaxretry = 3zfindtime = 10mzBfailregex = ^\s*failure <F-ERRCODE>401|403</F-ERRCODE> from <HOST>datepattern = {^LN-BEG}EPOCHzignoreip = 127.0.0.1/8 ::1[test-jail1]
backend = filter =z	action = r   z*         test-action1[name='%(__name__)s']r   zj         test-action2[name='%(__name__)s', restore='restored: <restored>', info=', err-code: <F-ERRCODE>']   z         test-action2[name='%(__name__)s', actname=test-action3, _exec_once=1, restore='restored: <restored>', actionflush=<_use_flush_>]
logpath = z
          z@            ^\s*error <F-ERRCODE>401|403</F-ERRCODE> from <HOST>r  z[test-jail2]r`   rn   r   r   r   r   r   r   )enabledactionsbackendr   test1logtest2logtest3logs      r)   _write_jail_cfgz@Fail2banServerTest.testServerReloadTest.<locals>._write_jail_cfg  sx    $uS+&& $ $$$$$ $ 	$
 $ J$ #$ !$ $ $ !7*$ -7$ $ 	
W 10$ 	
W qp$$ 	
W( (%$& 8'$(  !G||L8)$*  !G||L8+$, J-$0 	
W HG1$2 W"3$4 5$6 7$6 !7*7$6 -77$8 9$< 	
W qp=$B 	
W( (C$D 8E$F W"G$ $ $ $J l--eC%%&&&&& .-r+   )r  test-action2r   )r   r   r  )r  r  rk   rj  r  r  r  rx   z# failure 401 from 192.0.2.1: test 1r  z[test-phase 1a]rW  Reload finished.z1 ticket(s) in 'test-jail1r   zAdded logfile: %rz[test-jail1] Ban 192.0.2.1z-stdout: '[test-jail1] test-action1: ** start'z-stdout: '[test-jail1] test-action2: ** start'r/  zPstdout: '[test-jail1] test-action2: ++ ban 192.0.2.1 restored: 0, err-code: 401'zAstdout: '[test-jail1] test-action3: ++ ban 192.0.2.1 restored: 0'r  z)Errors in jail 'broken-jail'. Skipping...z:Jail 'broken-jail' skipped, because of wrong configurationz[test-phase 1b]r   )r  r   z[test-jail1] Unban 192.0.2.1z.stdout: '[test-jail1] test-action1: .. reload'z.stdout: '[test-jail1] test-action2: .. reload'zCreating new jail 'test-jail2'zJail 'test-jail2' startedz4stdout: '[test-jail1] test-action3: -- flushing IPs'z,stdout: '[test-jail1] test-action3: __ stop'z7stdout: '[test-jail1] test-action3: -- unban 192.0.2.1'z[test-phase 2a]z+               echo '[<name>] %s: started.'z,               echo '[<name>] %s: reloaded.'z+               echo '[<name>] %s: stopped.')r  r   rW  r   zAdded logfile:z.stdout: '[test-jail1] test-action1: reloaded.'z7stdout: '[test-jail1] test-action2: -- unban 192.0.2.1'z,stdout: '[test-jail1] test-action2: __ stop'z7stdout: '[test-jail1] test-action1: -- unban 192.0.2.1'F)r  r  z[test-phase 2b]a+z#   error 403 from 192.0.2.2: test 2z#   error 403 from 192.0.2.3: test 2z# failure 401 from 192.0.2.4: test 2z# failure 401 from 192.0.2.8: test 2z2 ticket(s) in 'test-jail2z5 ticket(s) in 'test-jail1setz
test-jail2banip	192.0.2.9z3 ticket(s) in 'test-jail2z[test-jail1] Ban 192.0.2.2z[test-jail1] Ban 192.0.2.3z[test-jail1] Ban 192.0.2.4z[test-jail1] Ban 192.0.2.8z[test-jail2] Ban 192.0.2.4z[test-jail2] Ban 192.0.2.8z[test-jail2] Ban 192.0.2.9z[test-jail2] Found 192.0.2.2z[test-jail2] Ban 192.0.2.2z[test-jail2] Found 192.0.2.3z[test-jail2] Ban 192.0.2.3bannedr   
test-jail1)	192.0.2.4	192.0.2.1	192.0.2.8	192.0.2.3	192.0.2.2)r  r  r  r  r  z192.0.2.222r   r  z[test-phase 2c]rX  zRestore Banz[test-jail2] Unban 192.0.2.4z[test-jail2] Unban 192.0.2.8z[test-jail2] Unban 192.0.2.9zJail 'test-jail2' stoppedz"[test-jail2] Restore Ban 192.0.2.4z"[test-jail2] Restore Ban 192.0.2.8z"[test-jail2] Restore Ban 192.0.2.9zPstdout: '[test-jail2] test-action2: ++ ban 192.0.2.4 restored: 1, err-code: 401'zPstdout: '[test-jail2] test-action2: ++ ban 192.0.2.8 restored: 1, err-code: 401'zAstdout: '[test-jail2] test-action3: ++ ban 192.0.2.4 restored: 1'zAstdout: '[test-jail2] test-action3: ++ ban 192.0.2.8 restored: 1'z[test-phase 2d]z
192.0.2.21z
192.0.2.22z5stdout: '[test-jail2] test-action3: ++ ban 192.0.2.22z6stdout: '[test-jail2] test-action3: ++ ban 192.0.2.22 z[test-phase 2d.1]rW   r  z[test-phase 2d.2]r  z[test-phase 2e]z--unbanz7stdout: '[test-jail2] test-action2: -- unban 192.0.2.21z8stdout: '[test-jail2] test-action2: -- unban 192.0.2.22'z4stdout: '[test-jail2] test-action3: -- flushing IPs'z8stdout: '[test-jail2] test-action3: -- unban 192.0.2.21'z8stdout: '[test-jail2] test-action3: -- unban 192.0.2.22'z[test-phase 3]zReload jail 'test-jail1'zJail 'test-jail1' reloadedzReload jail 'test-jail2'zJail 'test-jail2' reloadedzJail 'test-jail1' startedz[test-phase 4])r  zStopping jail 'test-jail2'zRemoved logfile: %rz[test-phase 5]z# failure 401 from 192.0.2.1: test 5z#   error 403 from 192.0.2.5: test 5z# failure 401 from 192.0.2.6: test 5z6 ticket(s) in 'test-jail1z%[test-jail1] 192.0.2.1 already bannedz[test-jail1] Found 192.0.2.1z[test-jail1] Found 192.0.2.6z[test-jail1] Ban 192.0.2.6z[test-jail1] Found 192.0.2.5z[test-phase 6a]rQ  r  z	192.0.2.5z	192.0.2.6z192.0.2.5 is not bannedz[test-jail1] Unban 192.0.2.6z[test-phase 6b]z192.0.2.2/31z[test-jail1] Unban 192.0.2.2z[test-jail1] Unban 192.0.2.3z192.0.2.8/31z192.0.2.100/31z[test-jail1] Unban 192.0.2.8z192.0.2.100/31 is not bannedz[test-phase 6c]z192.0.2.96/28z192.0.2.112/28z[test-jail1] Ban 192.0.2.96/28z[test-jail1] Ban 192.0.2.112/28unbanipz192.0.2.64/26z [test-jail1] Unban 192.0.2.96/28z![test-jail1] Unban 192.0.2.112/28z[test-phase 7]z[test-jail1] Unban 192.0.2.4zJail 'test-jail1' stoppedz[test-phase 7b]--allzFlush ban listz'Unbanned 0, 0 ticket(s) in 'test-jail1'z[test-phase 8a]zxxx-unknown-backend-zzz)r  r  z0Restart jail 'test-jail1' (reason: 'polling' != zUnknown backend z[test-phase 8b]z[test-phase end-1]z$the jail 'test-jail2' does not existz--if-existsz[test-phase end-2]	--restartz[test-phase end-3]addignoreipz192.0.2.1/32z2001:DB8::1/96ignoreip)r  TrX   rX   rX   rX   rX   )r  r:   r  )rn   r   r   r`   r   r   r   r0   r   r   r   r   r   r   r   r   r   r   r8   assertNotLoggedr;   assertSortedEqualr  assertEqualr   )	r   r   r   r  r  r   r  r  r  s	        @@@@r)   testServerReloadTestz'Fail2banServerTest.testServerReloadTest[  s    	c8#3$$(3$$(3$$((5j!!"""6:/1     0'' '' '' '' '' '' '' '' ''T N++++N++++/1#www////eC%%sB$&68 8 8 hgC$6$6 7 7:_ _adeegggghh --!"""\gm++X,,wX...T  > > > '(2333011122  > > > UF,        3.?T  K K K --!"""/1Q%    \gm++X,,wX...&\:::!T  + + + !!t  - - - 33  ? ? ? #D  * * * 91t  = = = <> > > --!"""/1#N
7.
H
8>
I
7.
HJ J J J ,,wX...&\:::!T  + + + '(((33  ? ? ? <> > > 13 3 3<> > > N%8888/1Q%    --!"""h FKMMCCEIV[]]		DDFJKV[]]		DDFJK 	V[]]		DDFJK    \gm++XT  > > > ,,w,. . .l  4 4 4T  + + + !!     ++K TTTU:::;    ++K[+}6 689^lL12< 8  
 ++K," ""#%'E 'E 'EF F F ++K," ""#%'+ '+ '+, , , 4%%k,+/ //02457 7 74%%k,+/ //02457 7 74%%k,+{< <<=?BCQI I I --!""",,wl  T  > > >
 !!!'''T  	 	 	 UU,       
 FF     --!""",,w,/ / /,,w,/ / /:;L  Z Z Z
 --#$$$,,wUL'4HHH\<T  V V V--#$$$,,wUL'BBB[+{S_  a a a --!""",,wi' ' 'D|  = = = !!!t     <=4  I I I 9; ; ;==4  I I I T     N%8888/" -- !!!,,wX|<<<&\:::T  + + + D     -- !!!/1#,,wX...&\:::   D  * * * 8#8#  / / /
 -- !!!h FKMMCCEIFKMMCCEIJFKMMCCEIJ   
 \gm++X*<  I I I !!*T	  + + + 5666 --!""",,wg{K1 1 1!t,    
 --!""",,wg~' ' '!!t,     ,,wg~'79 9 9!!t,  @ @ @
 --!""",,we\7O=MO O O#$$\     ,,we\9o? ? ?%&D|     -- !!!,,wY  &\:::!!t     T	     --!""",,wgw     ,$  8 8 8
 --!"""/1#'@AAAA,,v{H---&\:::54  ! ! ! --!"""/1#,,wX...&\::: --$%%%,,v{h& & &&\::::;;;--///,,wh|5 5 5&\:::#D  * * *
 --$%%%,,whW. . .&\:::D|  = = =
 --$%%%,,we\=.BRT T T,,we\:/ / /N$4$?????r+   znginx-block-map)action)%(tmp)s/blck-failures.log)ru   )z[nginx-blck-lst]rw   r  z#logpath = %(tmp)s/blck-failures.logzoaction = nginx-block-map[srv_cmd="echo nginx", srv_pid="%(tmp)s/f2b.pid", blck_lst_file="%(tmp)s/blck-lst.map"]z         blocklist_de[actionban='curl() { echo "*** curl" "$*";}; <Definition/actionban>', email="Fail2Ban <fail2ban@localhost>", apikey="TEST-API-KEY", agent="fail2ban-test-agent", service=<name>]r  datepattern = ^Epochz3failregex = ^ failure "<F-ID>[^"]+</F-ID>" - <ADDR>zmaxretry = 1r  )r   r   r   c                    t          |d          }dd|iz  }dd|iz  }t          |dt          t          t	          j                                        dz   t          t          t	          j                                        dz   t          t          t	          j                                        dz   t          t          t	          j                                        d	z   t          t          t	          j                                        d
z              |                     dddddddt                     t          |           t          |          }| 
                    d|           | 
                    d|           | 
                    d|           | 
                    d|           | 
                    d|           |                     ddd           |                     dddt                     |                     t          |dddd            t          |           t          |          }|                     d|           |                     d|           |                     d|           | 
                    d|           | 
                    d|           |                     t                     |                     d!           t          |           t          |          }|                     |d"           d S )#Nri   r  r   z%(tmp)s/blck-lst.mapw+z" failure "125-000-001" - 192.0.2.1z" failure "125-000-002" - 192.0.2.1u1    failure "125-000-003" - 192.0.2.1 (òðåòèé)u1    failure "125-000-004" - 192.0.2.1 (òðåòèé)z" failure "125-000-005" - 192.0.2.1z [nginx-blck-lst] Ban 125-000-001z [nginx-blck-lst] Ban 125-000-002z [nginx-blck-lst] Ban 125-000-003z [nginx-blck-lst] Ban 125-000-004z [nginx-blck-lst] Ban 125-000-005z5 ticket(s)Tr   z\125-000-001 1;
z\125-000-002 1;
z\125-000-003 1;
z\125-000-004 1;
z\125-000-005 1;
zstdout: 'nginx -qt'zstdout: 'nginx -s reload'r/  zstdout: '*** curl --fail --data-urlencode server=Fail2Ban <fail2ban@localhost> --data apikey=TEST-API-KEY --data service=nginx-blck-lst z=stdout: ' --data format=text --user-agent fail2ban-test-agentr  z125-000-001z125-000-002z125-000-005z5[nginx-blck-lst] Flush ticket(s) with nginx-block-maprX   )rn   r`   r   r   r   r0   r   r8   r   rd   assertInr   r   assertNotInr   r  )r   r   r   r   lgfnmpfnmps          r)   testServerActions_NginxBlockMapz2Fail2banServerTest.testServerActions_NginxBlockMapG  s   . 	c8#	$s|	3$	5#,	.$dDs6;==AAs6;==AAs6;==\\s6;==\\s6;==AA   %%%%%,     D///$"--$b)))--$b)))--$b)))--$b)))--$b))) )+FDQQQQB,	     ,,wWm]MZZZD///$"',,,',,,',,,--$b)))--$b))) w''' KLLLD///$"2rr+   zsendmail-auth)filter)%(tmp)s/test.logT)r~   zdbmaxmatches = 1)a  test_action = dummy[actionstart_on_demand=1, init="start: %(__name__)s", target="%(tmp)s/test.txt",
      actionban='<known/actionban>; echo "found: <jail.found> / <jail.found_total>, banned: <jail.banned> / <jail.banned_total>"
        echo "<matches>"; printf "=====\n%%b\n=====\n\n" "<matches>" >> <target>',
      actionstop='<known/actionstop>; echo "stats <name> - found: <jail.found_total>, banned: <jail.banned_total>"']z[sendmail-auth]rw   r  logpath = %(tmp)s/test.logaction = %(test_action)sz%filter = sendmail-auth[logtype=short]r  r  zmaxmatches = 2r  z[sendmail-reject]rw   r  r  r  z'filter = sendmail-reject[logtype=short]r  r  r  )r   r   r   r   c           	      $   t          |d          }dd|iz  }dd|iz  }t          t          t          j                                        dz   t          t          t          j                                        dz   t          t          t          j                                        dz   f}t          t          t          j                                        dz   t          t          t          j                                        d	z   t          t          t          j                                        d
z   f}|                     d           t          |dg|R   |                     ddddt                     t          |           t          |          }|d         }	|                     |	|           |dd          D ]}	|                     |	|           |                     d           t          |dg|R   |                     ddddt                     t          |           t          |          }|D ]}	|                     |	|           |                     d           |                     t          |ddd           |                     ddddddt                     t          |          }|d          }	|                     |	           |                     |	|           |dd          D ]-}	|                     |	           |                     |	|           .|                     d!ddt                     t          |          }|d          }	|                     |	           |                     |	|           |dd          D ]-}	|                     |	           |                     |	|           .|                     d"           |                     t                     |                     t%          |                     d S )#Nri   r  r   z%(tmp)s/test.txtz] smtp1 sm-mta[5133]: s1000000000001: [192.0.2.1]: possible SMTP attack: command=AUTH, count=1z] smtp1 sm-mta[5133]: s1000000000002: [192.0.2.1]: possible SMTP attack: command=AUTH, count=2z] smtp1 sm-mta[5133]: s1000000000003: [192.0.2.1]: possible SMTP attack: command=AUTH, count=3z smtp1 sm-mta[21134]: s2000000000001: ruleset=check_rcpt, arg1=<123@example.com>, relay=xxx.dynamic.example.com [192.0.2.2], reject=550 5.7.1 <123@example.com>... Relaying denied. Proper authentication required.z smtp1 sm-mta[21134]: s2000000000002: ruleset=check_rcpt, arg1=<345@example.com>, relay=xxx.dynamic.example.com [192.0.2.2], reject=550 5.7.1 <345@example.com>... Relaying denied. Proper authentication required.z smtp1 sm-mta[21134]: s3000000000003: ruleset=check_rcpt, arg1=<567@example.com>, relay=xxx.dynamic.example.com [192.0.2.2], reject=550 5.7.1 <567@example.com>... Relaying denied. Proper authentication required.z[test-phase sendmail-auth]r  z[sendmail-auth] Ban 192.0.2.1z%stdout: 'found: 0 / 3, banned: 1 / 1'z1 ticket(s) in 'sendmail-auth'Tr   r   r   z[test-phase sendmail-reject]r  z[sendmail-reject] Ban 192.0.2.2z 1 ticket(s) in 'sendmail-reject'z[test-phase restart sendmail-*]rW  r  r  r  z3stdout: 'stats sendmail-auth - found: 3, banned: 1'z5stdout: 'stats sendmail-reject - found: 3, banned: 1'z%[sendmail-auth] Restore Ban 192.0.2.1r   z'[sendmail-reject] Restore Ban 192.0.2.2z[test-phase stop server])rn   r   r   r   r0   r   r`   r   r8   r   rd   r  r  r   r   r  r   r  r   )
r   r   r   r   r  tofn	smaut_msg	smrej_msgtdms
             r)   testServerJails_Sendmailz+Fail2banServerTest.testServerJails_Sendmail  sM   R 	c8#	ucl	*$	ucl	*$ s6;==||s6;==||s6;==||) s6;==  s  ss6;==  s  ss6;==  s  s) --,---dD%9%%%%"%L#L  B B B D///$"l!1bQRR=  a==B--.///dD%9%%%%$&M%4l  D D D D///$"  a==B--1222,,w['# # # 8:*,LRV]i	  k k k $"m!A--2QrT?  aAr,.PVZam  o o o$"m!A--2QrT?  aAr--*+++w''' 6$<<     r+   c           	        	
 t          |d          t          |d          t          j        t          d                     d9fd	}d:fd	} |dd	
            |dd
            |             t          d           |                     d           |                     t          |d           t          dgt          t          t          j
                                        dz   fdz  R   t                       |                     dddt                     t                       |                     d           t          d           t                       |                     ddddt                     t                       |                     d           d	t          fd           t          dgt          t          t          j
                                        dz   fdz  R   |                     dd dt                     |                     d!           |                     t          |d"d#d$d%           |                     d&d'dt                     dt                       |                     d(           t          d)           t                       |                     d*dt                     t                       |                     d+           |                     t          |d"d#d$d%           |                     d&d,dt                     |                     d-           t!                       d.d/it"          j        		fd0}	                    d1|           	                    d1d2            t)          j        fd3t,                     	j        
t0          j        j        rd4nd5df
fd6	}|	_        |                     t                     |                     d7           |                     	j                   |                     	j         d            dd.<   |                     d7d8           	!                                 d S );Nri   r  ru   r  Tc           
          t          dd| z            }t          |ddddd|rdndd	           t          j        j        t
          j        k    rt          |           d S d S )
Nru   r  rx   r~   rX   ry   zeactionban =     printf %%s "[%(name)s] %(actname)s: ++ ban <ip> -c <bancount> -t <bantime> : <F-MSG>"ziactionprolong = printf %%s "[%(name)s] %(actname)s: ++ prolong <ip> -c <bancount> -t <bantime> : <F-MSG>"zBactionunban =   printf %%b '[%(name)s] %(actname)s: -- unban <ip>')rn   r`   r   r   r   r   r   r   )r  prolongr\   r   s      r)   r  z@Fail2banServerTest.testServerObserver.<locals>._write_action_cfg  sz    c:y72332r3mqqH   l--bMMMMM .-r+   r  c                     t          t          d          ddddddddd	d
dddd| z   ddddz   ddd           t          j        j        t
          j        k    rt          t          d                     d S d S )Nrk   rx   r}   rX   r~   r  r  zfindtime = 1mzbantime = 5mzbantime.increment = truer  r  r  r  z*action = test-action1[name='%(__name__)s']z*         test-action2[name='%(__name__)s']r  zXfailregex = ^\s*failure <F-ERRCODE>401|403</F-ERRCODE> from <HOST>:\s*<F-MSG>.*</F-MSG>$r  r  )r  r   r  s    r)   r  z>Fail2banServerTest.testServerObserver.<locals>._write_jail_cfg%  s    uS+&&""L7*J008_!  $ l--eC%%&&&&& .-r+   F)r  r  r  rx   z[test-phase 0) time-0]rW  r  z> failure 401 from 192.0.2.11: I'm bad "hacker" `` $(echo test)r  zDstdout: '[test-jail1] test-action1: ++ ban 192.0.2.11 -c 1 -t 300 : zDstdout: '[test-jail1] test-action2: ++ ban 192.0.2.11 -c 1 -t 300 : r   z[test-phase 1) time+10m]
   z7stdout: '[test-jail1] test-action1: -- unban 192.0.2.11z7stdout: '[test-jail1] test-action2: -- unban 192.0.2.11z0 ticket(s) in 'test-jail1'z[test-phase 2) time+10m]c                       S rb   r:   )wakeObss   r)   r   z7Fail2banServerTest.testServerObserver.<locals>.<lambda>`  s     r+   r  zC failure 401 from 192.0.2.11: I'm very bad "hacker" `` $(echo test)r   zDstdout: '[test-jail1] test-action1: ++ ban 192.0.2.11 -c 2 -t 300 : zDstdout: '[test-jail1] test-action2: ++ ban 192.0.2.11 -c 2 -t 300 : z"[test-phase 2) time+10m - get-ips]r   r  r  z--with-timez
192.0.2.11z+ 300 =z[test-phase 2) time+11m]r   zHstdout: '[test-jail1] test-action2: ++ prolong 192.0.2.11 -c 2 -t 600 : z"[test-phase 2) time+11m - get-ips]z+ 600 =z'[test-phase end) stop on busy observer]stater   c                      t                               d           d d<   t          j         fdt                                                      t                               d           d S )Nz!++ observer enters busy state ...r   r  c                       d         dk    S )Nr  r   r:   rj  s   r)   r   zMFail2banServerTest.testServerObserver.<locals>._long_action.<locals>.<lambda>  s    !G*/ r+   z-- observer leaves busy state.)r   r&   r   r?   r   db_purge)rj  obsMains   r)   _long_actionz;Fail2banServerTest.testServerObserver.<locals>._long_action  sf    	;;23331W:>))))<888
	;;/00000r+   callc                      d S rb   r:   r:   r+   r)   r   z7Fail2banServerTest.testServerObserver.<locals>.<lambda>  s    d r+   c                       d         dk    S )Nr  r   r:   r  s   r)   r   z7Fail2banServerTest.testServerObserver.<locals>.<lambda>  s    7q r+   g{Gz?g?c                      | |          S rb   r:   )wtime	forceQuitobsMain_stops     r)   _stopz4Fail2banServerTest.testServerObserver.<locals>._stop  s    
,ui
(
((r+   zobserver leaves busy stater  )r  T)r  )"rn   r   r   r`   r   r   r   r   r   r   r0   r;   r   r8   r2   rE   r"   r5   r6   addr   r?   r   r   r   r   rY  r   r  r  idler  _ObserverThread__dbr   )r   r   r   r  r  r  r  rj  r   r  r  r  r  s          @@@@@@r)   testServerObserverz%Fail2banServerTest.testServerObserver  s   c8#3$$((5j!!"""     ' ' ' ' ' ' '. NE::::ND9999/h--())),,wX...h V[]]		aacfgg    II,       
 --*+++b///<< ,	       
 --*+++ '000h V[]]		ffhkll    II,       
 --4555,,wUL'=QQQ<  9 9 9 '--*+++a...M,       
 --4555,,wUL'=QQQ<  9 9 9 --9:::l!N'1 1 1 1 1 1 
++fl###	++fll###.((((,777,#<,544#$ ) ) ) ) ) )',w'''34447<   7.555!G*0t<<<	,,.....r+   Fc                 :    |                      t                     d S rb   )r   r   r(  s      r)   _testServerStartStopz'Fail2banServerTest._testServerStartStop  s     (((((r+   c                 R    t          d          D ]}|                                  d S )Ni  )ranger  )r   is     r)   testServerStartStopz&Fail2banServerTest.testServerStartStop  s6    $KK    q   r+   N)rI   rJ   rK   _exec_serverr=  r   r~  r   r   r  r  r  r  r   r  r   r   skip_if_cfg_missingr  r  r  r  r  r:   r+   r)   r|  r|    s       "F,' ' '
 ) ) - +). $ $ - +$$ 1 1 - +18 / / +/6  D&>:::h@ h@ ;:h@V ,""*;"<<7 , ,   *: :+  =<,:x ,""/"::.
&, &, & & &NN! N!O& & ;:PN!`  !!O O "!Od   r+   r|  )FNre   rf   r:   rg   N)`
__author____copyright____license__r   r   r   rZ  r0   r   r   os.pathr   rn   r   r   r   r   	functoolsr
   	threadingr   clientr   r   r   client.fail2bancmdliner   client.fail2banclientr   rz  r   r   client.fail2banserverr   r  rX   r   r   server.mytimer   server.utilsr   utilsr   r   r   r   r   r   r   r    r   r!   r"   helpersr#   rI   r<  r=  getServerPathr;  r   maxWaitTimer   r8   r  r  r  r  r*   rT  r2   r5   r;   rE   rG   rO   r   r   rS   rU   input_command
PRODUCTIONdumpFiler   r`   rd   r   r   r   r   r   r   r   r9  r|  r:   r+   r)   <module>r     s  , 
[     				 				 



    A A A A A A A A A A A A A A             D D D D D D D D D D 4 4 4 4 4 4 Z Z Z Z Z Z Z Z Z Z U U U U U U U U             " " " " " "            ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?        
8				g*n*,,--|''(ABB|''(ABB  ,a/        ( &   
        * * * 	- - - 1= & & & &*    O1   
    5   
 	    3  ""   '	  
   7;;@U U U Un    ) ) )X   .0 C C C CLF# F# F# F# F#1 F# F# F#RV V V V V1 V V VrA  A  A  A  A 1 A  A  A  A  A r+   