
    h                     0   S r SrSrSSKrSSKrSSKrSSKrSSKrSSKrSSK	r	SSK
JrJrJrJrJr  SSKJr  SSKJr  SS	KJrJrJr  SS
KJr  SSKJrJrJr  SSK J!r!Jr"  SSK#J$r$  SSK%J%r%  SSK&J'r'  SSK(J)r)  SSK*J+r+J,r-J.r.J/r/J0r0J1r1J2r3J4r4J5r5  SSK6J7r7  \7" \85      r,Sr9Sr:\" \!Rv                  " 5       5      r<\	Rz                  R}                  \	Rz                  R~                  5      r?\	Rz                  R}                  \	Rz                  R                  5      r@\?S-
  \l?        \,=\l,        =\l,        \l,        \%R                  rB\%R                  rDS rE\E=\lF        =\lF        =\lF        \$lF        S rG\%R                  rHS rI\@4S jrJ " S S\R                  5      rK " S S\R                  5      rL\KrM\LrN/ qOS rP\P\lQ        S=\lR        \lR        \+R                  rTS  rUS! rV   S.S" jrWS# rXS$ rYS% rZS& r[0 4S' jr\ " S( S)\+5      r] " S* S+\]5      r^ " S, S-\]5      r_g)/z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                  4    [         R                  U S   5        g Nr   )r   infoargss    G/usr/lib/python3/dist-packages/fail2ban/tests/fail2banclienttestcase.py_test_outputr*   J   s    T!W    c                     [         R                  SU 5        [        R                  " [        R                  " 5       U S-  -   5        g )Nz===>>> time shift + %s min<   )r   debugr   setTimetime)shifts    r)   _time_shiftr2   Q   s,    *E2b()r+   c                      [         R                  bJ  [         R                  R                  [        5        [         R                  R	                  [        S-  5        gg)z$Helper to wait observer becomes idleN   )	ObserversMain
wait_emptyMID_WAITTIME	wait_idle r+   r)   _observer_wait_idler;   Y   s:    NN..L)..<!+, r+   c                    ^ ^^ [         R                  b8  [         R                  R                  mUU U4S jnU[         R                  l        gg)zOHelper to block observer before increase bantime until some condition gets trueNc                     > T[         R                  l        [        R	                  S5        [
        R                  " TT5        [        R	                  S5        T" U 0 UD6  g )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)   	_banFound0_observer_wait_before_incrban.<locals>._banFoundd   sD    *9>>	<<FG>>$ 	<<@A$!&!r+   )r5   r6   r>   )rB   rC   rD   rA   s   `` @r)   _observer_wait_before_incrbanrF   _   s4    NN..))-" &).. r+   c                       \ rS rSrSrSrg)ExitExceptiont   zException upon a normal exitr:   N__name__
__module____qualname____firstlineno____doc____static_attributes__r:   r+   r)   rH   rH   t       #r+   rH   c                       \ rS rSrSrSrg)FailExitExceptiony   zException upon abnormal exitr:   NrJ   r:   r+   r)   rS   rS   y   rQ   r+   rS   c                  V    [        [        5      (       a  [        R                  S5      $ g)Nr   exit)lenINTERACTpopr'   s    r)   _test_input_commandrZ      s    MM	a	r+   Fc                     [        X5      nUR                  SR                  U5      U(       a  SOS-   5        UR                  5         g )N
 )openwriter   close)fnmodelinesfs       r)   _write_filere      s2    	"^5	54b	12r+   c                     S n [        U 5      nUR                  5       Ub  UR                  5         $ $ ! Ub  UR                  5         f f = fN)r^   readr`   )ra   rd   s     r)   
_read_fileri      sE    	
2h!	
]779 Q]779 s	   3 A	c                    [        U S5      nUS:X  a  [        U S5      nSn	U(       Ga/  [        (       Ga#  S n
[        R                  " [        XS9  Ub   S[        U5      -  5       eUc  Sn[        R                  " S	5      n[        R                  " [        US
5      SS9 H7  nUR                  S5      nUR                  U5      (       a  Sn[        U5        M9     [        R                  " S5      n[        R                  " [        US5      SS9 H7  nUR                  S5      nUR                  U5      (       a  Sn[        U5        M9     U(       a  SOSn	Og[        R                  " U5        [        [        US
5      SSSSUR!                  SS5      -   SS[        U S5      -   S[        U S5      -   SSU-   SS S5        U	(       a!  [        [        X5      S/S!SS"S#U -   S4U-   Q76   U(       a  [        [        US$5      S/UQ76   ["        R$                  R&                  [(        R*                  :  ag  [-        [        US
5      5        [-        [        US5      5        U(       a  [-        [        US$5      5        U	(       a  U	S:w  a  [-        [        X5      5        U(       a_  [        (       aT  U HN  n[        R.                  " [        R0                  R3                  [        [        U5      5      [        X5      5        MP     U(       a  U H  n[        US%U 0-  S5        M     S&u  p["        R$                  R&                  [(        R4                  :  ab  [7        ["        R$                  R&                  5      n["        R$                  R8                  S':  a!  S(S)["        R$                  R8                  -  -   4nUS*U4-   nS+US,[        U S5      S-[        U S5      S.U4U-   S/SS0[7        [:        R<                  5      4-   $ )1Nconfigautozf2b-db.sqlite3	jail.confc           	      h    U Vs/ s H   n[        [        X5      5      (       d  M  UPM"     sn$ s  snf )z?Filters list of 'files' to contain only directories (under dir))r   pjoin)dirfilesrd   s      r)   ig_dirs_start_params.<locals>.ig_dirs   s%    
4euU3]31e
44
4s   //)ignorez?We are about to overload use_stock_cfg from the one provided %s)action.dzfilter.dz^dbfile\s*=zfail2ban.confT)inplacer\   zdbfile = :memory:z^backend\s*=backend = pollingz
jail.localr]   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)ro   r   r   copytreeSTOCK_CONF_DIRreprrecompile	fileinputinputrstripmatchprintosmkdirre   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_confrr   rlinenvvvllevs                   r)   _start_paramsr      sa    S(&LS"#"
%%5 	//.#6		 [DtMGZZ[	,DMjj !ooeC94Hd
++d
4ggdmmD;	 I 	jj!!ooeC5tDd
++d
4ggdmmD;	 E !<b& ((3-eC)3I%%c400sJ''%Y'' eC # "(S."  eC)*C<)<LLW]]*E#'(E#{#$U3()*+%U3  eea::bggooeNA67sG aqE3<%  LLW\\)	X\\##	$$\\a
HLL***
*	,3|T""T5j)4sI1F	#	$'7s?//0'	 r+   c                 V     X R                  S5      S-      S:H  $ ! [         a     gf = f)Nr   r   	INHERITEDF)index
ValueErrorstartparamss    r)   _inherited_logr      s7    	&&}5a7	8K	GG 	s    
((c                     S n [        U 5      n[        R                  " SU5      R                  5       n[	        U5      $ ! [
         a   n[        R                  U5         S nAU$ S nAff = f)Nz\S+)ri   r   r   groupint	Exceptionr   r.   )pidfilepides      r)   _get_pid_from_filer      sZ    7#
##%#	S/ ,,q//s   :? 
A)	A$$A)c                   ^ [         R                  SU [        U 5      45        [        U 5      (       a*  U n[        US5      n [	        U 5      (       d  [        US5      n [
        R                  R                  [        R                  :  a?  [        WS5      n[	        U5      (       a  [        U5        O[         R                  SSU5        [	        U 5      (       d  [         R                  SW5        g[         R                  S	U 5        [        U 5      mTc  g
 [         R                  ST5        TS::  d  T[        R                  " 5       :X  a  [        ST< SU < S35      e[         R"                  " T5      (       d  g[        R$                  " T[&        R(                  5        [         R*                  " U4S jS5      (       d%  [        R$                  " T[&        R,                  5        [         R                  S5        [         R"                  " T5      (       + $ ! [.         a  n[         R1                  U5         S nAgS nAff = f)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                  :   > [         R                  " T 5      (       + $ rg   )r   
pid_exists)r   s   r)   <lambda>_kill_srv.<locals>.<lambda>+  s    E$4$4S$9 9r+   r   cleanup: kill ready)r   r.   r   ro   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	'NN&&)$'	6>*7 LLW]]*&)$'G__W	::a'*w,,+V4	#W-'"K	,, #&AX		#	g>	??			#		
''#v~~	91	=	=773,,$%c"	"" 1s    A$H :BH 
H=H88H=c                 0   ^  [        T 5      U 4S j5       nU$ )zHelper to decorate tests which receive in the last argument tmpdir to pass to kill_srv

To be used in tandem with @with_tmpdir
c                 X   > US   n T" U /UQ76 [        U5        $ ! [        U5        f = f)N)r   )selfr(   r   rd   s      r)   wrapperwith_kill_srv.<locals>.wrapper:  s-    H'
D.4.W9Ws    )r	   )rd   r   s   ` r)   with_kill_srvr   5  s"    
 (  	r+   c                    ^  U 4S jnU$ )z{Helper to decorate tests uses foreground server (as thread), started directly in test-cases

To be used only in subclasses
c                 F   >^  [         [        T 5      U U4S j5       5       nU$ )Nc                 T  >^ ^^^	 S n[        5       m [        T4SS0TD6m	[        ST R                  TT	T4S9nSUl        UR                  5         [        [        44UU U	U4S jjnUT l        [        R                  " U4S j[        5        T R                  TR                  SS 5      5        T R                  TST	TS	9  [        R                   " S
5        T R#                  5         T
" T TT	/UQ70 UD6U(       a]  [        R                   " S5        T R#                  5         T R                  5         TR                  SS 5      (       a  UR%                  5         ['        5         $ ! [(         aI  n[+        SU-  5        T R-                  5       nU(       a  [+        SU-  5        T R#                  5         e S nAff = f! U(       a]  [        R                   " S5        T R#                  5         T R                  5         TR                  SS 5      (       a  UR%                  5         ['        5         f = f)Nr   r   _TestCaseWorkernametargetr(   Tc                   > [        5         TR                  SS 5      (       dM  [        R                  R	                  [        TS5      5      (       d  [        R                  " U4S j[        5        TR                  SS 5      (       di  TR                  U TS5        [        R                  " U4S j[        5        TR                  TR                  SS 5      5        TR                  SSS[        S	9  S
 Tl        g )Nendr|   c                  ,   > T R                  SS 5      S L$ Nr   getphases   r)   r   ywith_foreground_server_thread.<locals>._deco_wrapper.<locals>.wrapper.<locals>._stopAndWaitForServerEnd.<locals>.<lambda>_      UYYud34?r+   stopc                  ,   > T R                  SS 5      S L$ r   r   r   s   r)   r   r   d  r   r+   Shutdown successfulzExiting Fail2banTallwaitc                      g rg   r:   )r(   r@   s     r)   r   r   h  s    Dr+   )r"   r   r   r   r   ro   r   r?   r8   execCmdr   
assertTrueassertLoggedstopAndWaitForServerEnd)coder   r   r   r   s    r)   _stopAndWaitForServerEndgwith_foreground_server_thread.<locals>._deco_wrapper.<locals>.wrapper.<locals>._stopAndWaitForServerEnd[  s    IIeT""277>>%Y:O+P+Pnn?NIIeT""
ll4f-nn?N
ooeiit,-
-/AtR^_$@T!r+   c                  ,   > T R                  SS 5      S L$ )Nstartr   r   s   r)   r   Wwith_foreground_server_thread.<locals>._deco_wrapper.<locals>.wrapper.<locals>.<lambda>k  s    599Wd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   rd   
startextras   ``      @@r)   r   Ewith_foreground_server_thread.<locals>._deco_wrapper.<locals>.wrapperI  s    	2656I{IjIK	
%%U
#
B
 BIHHJ (/&7 A A $<D 	NN?NOOEIIgt,-sDkGNN12MMOT35d5f5 
^^23	]]_	!!# 			%ggi#  
	'!+-
++-C

2S8:	]]_	
 
^^23	]]_	!!# 			%ggis&   CE! !
F4+AF//F44F7 7A0H')r   r
   )rd   r   r   s   ` r)   _deco_wrapper4with_foreground_server_thread.<locals>._deco_wrapperH  s)    89  9t 
.r+   r:   )r   r  s   ` r)   with_foreground_server_threadr  C  s    
=| 	r+   c                       \ rS rSr\R
                  rS rS rS r	\
SS j5       rSS jrS rS	 rS
 r\" SS0S9S 5       r\\S 5       5       rSrg)Fail2banClientServerBasei  c                     g rg   r:   )r   r(   r@   s      r)   _setLogLevel%Fail2banClientServerBase._setLogLevel  s    r+   c                     [         R                  " U 5        S[        l        [        R
                  [        l        [        U R                  5      [        l
        g)zCall before every test case.r   N)r   setUpr   DEF_LOGTARGETr   levelDEF_LOGLEVELstaticmethod
_test_exitr   _exitr   s    r)   r  Fail2banClientServerBase.setUp  s5    4 $&!&&t7/r+   c                     U R                   [        l        [        [        l        [        [        l        [        R                  " U 5        [        5         g)zCall after every test case.N)
_orig_exitr   r  SRV_DEF_LOGTARGETr   r  SRV_DEF_LOGLEVELr  r   tearDownr"   r  s    r)   r  !Fail2banClientServerBase.tearDown  s2    ///*&(&d#r+   c                 6    U S:X  a
  [        5       e[        5       er%   )rH   rS   )r   s    r)   r  #Fail2banClientServerBase._test_exit  s    	QY			r+   Nc                 p  ^ ^^ T(       d  0 m [        US5      m[        R                  " UU4S j[        5      nU(       a  TR	                  S5      (       a  [        SU< 35      eU(       a:  [        R                  " U 4S j[        5      nU(       d  [        ST< SU< 35      eg g !   [        U5      (       a,  [        ST R                  5       -  5        T R                  5         [        US	5      n[        U5      (       a  [        U5        e [        U5      (       d  [        R                  S
U5        e = f)Nr{   c                  J   > T R                  S5      =(       d    [        T5      $ r   )r   r   )r   socks   r)   r   8Fail2banClientServerBase._wait_for_srv.<locals>.<lambda>  s    		% 0 @F4L @r+   r   z7Unexpected: Socket file does not exists.
Start failed: c                  *   > ST R                  5       ;   $ )NServer ready)r   r  s   r)   r   r    s    4;;=!@r+   z.Unexpected: Server ready was not found, phase z.
Start failed: z,=== Error by wait for server, log: ===
%s===r   z*No log file %s to examine details of error)ro   r   r?   r   r   r   r   r   r   r   r   r   r   r.   )r   r   readyr   r   retr   r  s   `   `  @r)   r   &Fail2banClientServerBase._wait_for_srv  s    		
Z
 4	@,	O3
5!!
  
..@,
OC	   		[!!	:T[[]JLMMO	sI	3SkkcN 	 ;''
LL=sCs   BB( (BD5c                 h    U R                  XR                  S   U R                  SS  U-   U-   5        g )Nr   r   )assertRaisesr   )r   exitTyper   r(   s       r)   r    Fail2banClientServerBase.execCmd  s7    H44Q712,t36r+   c                     XR                  S5      S-      n[        U5      n UR                  U5      UR                  5         $ ! UR                  5         f = f)Nr   r   )r   r   sendr`   )r   r   r(   r  ss        r)   execCmdDirect&Fail2banClientServerBase.execCmdDirect  sF    	&&t,Q.	/$dm!
&&,7791779s   A Ac                     [         R                  S5        SUS'    U R                  [        SU-   S5        SUS'   SUS'   [         R                  S5        g ! SUS'   SUS'   [         R                  S5        f = f)Nzstart of test workerTr   z-fFr   zend of test worker)r   r.   r   r   )r   r   r   r   s       r)   r   -Fail2banClientServerBase._testStartForeground  sv    ,,%&%.&<<;.8 5>5<	<<$% 5>5<	<<$%s   A !A7r   )z[Thread]zstacksize = 128r   c                    U R                  5         U R                  [        USS5        U R                  S5        U R                  [        US5        U R                  [        US5        U R                  [        USS5        g )Nr   threadz{'stacksize': 128}ping~~unknown~cmd~failed~~echo	TEST-ECHO)r   r   r   r   r   r   r   r   s      r)   testStartForeground,Fail2banClientServerBase.testStartForeground  sa     --/,,wUH5(),,wV,,,v{$<=,,wV[9r+   c                 ,  ^  [         R                  (       d  [        R                  " S5      e[	        US5      n[         R                  " U5      nUR
                  R                  5       nUR                  S5        UR                  5         [        XSS9nSS0nU 4S jn[        S	UXV4S
9nUR                  5          T R                  [        SU-   S5        SUS'   UR                  5         T R                  SSSS9  g ! SUS'   UR                  5         f = f)NzSkip test because no databaseztmp.dbz#UPDATE fail2banDb SET version = 555r   )r   r   r   Tc                 v   >^ [         R                  " U4S j[        5      (       d  TR                  U S5        g g )Nc                     > T S   (       + $ )Nr   r:   r   s   r)   r   [Fail2banClientServerBase.testStartFailsInForeground.<locals>._stopTimeout.<locals>.<lambda>  s    U6]!2r+   r   )r   r?   r   r,  )r   r   r   s    `r)   _stopTimeoutIFail2banClientServerBase.testStartFailsInForeground.<locals>._stopTimeout  s+    
..2L
A
A{F+ Br+   r   r   r/  r   Fz/Attempt to travel to future version of databaseExit with code 255r   )r   
Fail2BanDbr   SkipTestro   _dbcursorexecutescriptr`   r   r   r   r   r   r   r   )	r   r   dbnamer   curr   r   r?  r   s	   `        r)   testStartFailsInForeground3Fail2banClientServerBase.testStartFailsInForeground  s     
					:	;;X& "
#9:))+cD+4.%, 
	"
 ((*<<+-w75=779ET  # 5=779s   ;C< <Dr:   )r   )TNN)rK   rL   rM   rN   r   r  r  r  r  r  r  r  r   r   r,  r   r  r9  r   r   rJ  rP   r:   r+   r)   r  r    s    ##8  	<6
&  K 9 , 
:
: #  #r+   r  c                       \ rS rSr\\4rS rS r\	S 5       r
\	\S 5       5       r\	\S 5       5       r\	\S 5       5       r\	S 5       rS	 rS
rg)Fail2banClientTesti  c                     U R                  [        [        [        [        5      5      5        U R                  [        [        [        [
        5      5      5        g rg   )r   r   ro   BINCLIENTSERVERr  s    r)   testConsistency"Fail2banClientTest.testConsistency  s2    //&sF+,-//&sF+,-r+   c                     U R                  [        SS5        U R                  S[        -   5        U R                  S5        U R	                  5         U R                  [        SS5        U R                  [
        R                  " 5       5        U R	                  5         U R                  [        SSS5        U R                  S[
        R                  -   5        U R	                  5         U R                  [        SS	S
5        U R                  S5        g )Nr:   -hUsage: Report bugs to z-Vz-vqz	--versionz
Fail2Ban vz	--str2sec1d12h30m131400)r   r   r   rP  r   r   normVersionversionr  s    r)   testClientUsage"Fail2banClientTest.testClientUsage  s    ,,wD!I&'%&--/,,wD!O//12--/,,wE;/L?#:#::;--/,,wK4Hr+   c                     [        US5      nU R                  [        US5        U R                  S5        U R                  S5        U R	                  5         U R                  [        US5        U R                  S5        g )NTz-vvdzLoading filesz['set', 'logtarget',z--dp)r   r   r   r   r   r8  s      r)   testClientDump!Fail2banClientTest.testClientDump(  se     c4(+,,wV,O$*+--/,,wV,*+r+   c                 L   [        US5      nU R                  [        SU-   S5        U R                  USUS9  U R	                  S5        U R	                  S5         U R                  [        USS5        U R                  [
        US	5        U R                  5         U R                  [
        SU-   S5        U R	                  S
5        U R                  5         U R                  [        US5        U R	                  S5        U R	                  S5        U R                  5         U R                  [
        US5        U R	                  S5        U R	                  S5        g ! U R                  5         U R                  [        US5        U R	                  S5        U R	                  S5        f = f)NTz-br   r   r!  Exit with code 0r6  r7  r5  zServer already runningr   r   zFailed to access socket pathzIs fail2ban running?)r   r   r   r   r   r   r   r8  s      r)   testClientStartBackgroundInside2Fail2banClientTest.testClientStartBackgroundInside4  sU    c4(+,,w+-w7S$K8N#&')<<fk:<<%=>==?<<+-w7-.==?<<f-*+'(--/,,v{F+23*+ ==?<<f-*+'(s   A*E AF#c                 <	   [        U[        US5      S9n[        R                  R                  (       a  U R                  [        US-   5        O[        R                  [        [        [        5      4n[        R                  SU5        X2-   S-   n[        R                  " U[        SSS9nU R!                  [#        U5      =(       a    US	   5        U R%                  USUS
9  U R'                  S5        U R)                  5          U R                  [        USS5        U R'                  S5        U R'                  S5        U R)                  5         U R                  [        USS5        U R'                  S5        U R)                  5         [+        [        US5      5      n [,        R.                  " U[0        R2                  5        [4        R6                  " [        R8                  5        U R                  [:        USS5        [,        R.                  " U[0        R<                  5        U R'                  S5        U R)                  5          S	S Kn[D        / SQ-  q"U R                  [        US5        U R'                  S5        U R'                  SS5        U R'                  S5        U R)                  5         [D        / SQ-  q"U R                  [        US5        U R'                  S5        U R'                  S5        U R'                  S5        U R'                  S5        U R)                  5         [D        SS/-  q"U R                  [        US5        U R'                  S 5        U R)                  5         U R                  [:        US!S"5        U R'                  S 5        U R'                  S#5        U R)                  5         U R)                  5         U R                  [        US$5        U R'                  S5        U R'                  S5        g ! [,        R.                  " U[0        R<                  5        f = f! [@         a  n[        RB                  " SU-  5      eS nAff = f! U R)                  5         U R                  [        US$5        U R'                  S5        U R'                  S5        f = f)%Nr   r   )r   Start %s ...)--asyncr   FTrC   shelloutputr   r   r!  r6  r7  rc  r4  z0.1zServer replied: pongr|   z1e-10z	timed outz%Skip test because of import error: %s)zecho INTERACT-ECHOstatusrV   z-izINTERACT-ECHOStatuszNumber of jail:)reloadrestartrV   zReading config files:r   zreload ~~unknown~jail~fail~~rV   z@Failed during configuration: No section: '~~unknown~jail~fail~~'ro  z~~unknown~jail~fail~~rA  r   )#r   ro   r   r   fastr   r   sys
executablerO  rP  r   r.   r   
executeCmdr   r   rW   r   r   r   r   r   r   r   SIGSTOPr0   sleepDEFAULT_SHORT_INTERVALr   SIGCONTreadlineImportErrorrD  rX   )r   r   r   cmdr#  r   ry  r   s           r)   testClientStartBackgroundCall0Fail2banClientTest.testClientStartBackgroundCallS  s    cU3	-BC+\\<<z12 ..%V,	-3	<<$		2	23			#|5	N3??3s8&A'c4S1N#--/F)<<fk:[!'(==?<<fe4+,==? 
E#y1	23!GGC JJu++,LLfg6 GGC [!==?I   8
 <<d+_%X01'(==?  8
 <<d+,-*+^$'(==?"
 8 <<d+WX==?<<X/FGWX)*==?==?<<f-*+'(c GGC   I


CaG
HHIN ==?<<f-*+'(sM   BQ A!O; =AQ P% E)Q ;'P""Q %
Q/QQQ ARc                    [        USS9nU R                  [        SSS[        US5      S5        U R	                  S[        US5      -   S	-   5        U R                  5         U R                  [        SS[        US
5      S[        US5      S5        U R	                  S5        U R                  5         [        [        US5      S5      R                  5         U R                  [        SSS[        US
5      S[        US5      S5        U R	                  S5        U R                  5         [        R                  " [        US5      5        U R                  [        SS5        U R	                  S5        U R                  5         g )Nr   rg  r:   ri  r   missr   Base configuration directory  does not existrk   r   r{   ro  Could not find serveraLFail2ban seems to be in unexpected state (not running but the socket exists)rV  
r   r   r   ro   r   r   r^   r`   r   remover8  s      r)   testClientFailStart&Fail2banClientTest.testClientFailStart  s<    c[9+ ,,vrdE#v&13eC6HHK\\]--/ ,,vrsH	tU3
%;XG+,--/ uS*s#))+,,vrdE#x($c:0FQbc--/))E#z"# ,,vr4 I--/r+   c                     [        USS9nU R                  [        USS5        U R                  S5        U R	                  5         U R                  [        USSSS5        U R                  S5        U R	                  5         g )	Nr   rg  ro  jailr  ri  z--xxxz"Unexpected argument(s) for reload:)r   r   r   r   r   r8  s      r)   testClientFailCommands)Fail2banClientTest.testClientFailCommands  sr     c[9+ ,,v{V+,--/ ,,v{h)89--/r+   c                 .   SnS H{  nSn[        US5       nU(       aZ  UR                  5         U(       a5  [        R                  R                  (       d  [
        R                  " U5        US-  nU(       a  MZ  S S S 5        M}     g ! , (       d  f       M  = f)NgQ?)r   r      r4   r   )r   	heartbeatr   r   rq  r0   rv  )r   	sleeptimeverbosecntrviss        r)   testVisualWait!Fail2banClientTest.testVisualWait  sh    )g
47A#
]]_))
jj	QYT	 $ 	 s   A B
B	r:   N)rK   rL   rM   rN   _exec_clientrP  r   rR  r\  r   r_  r   rd  r|  r  r  r  rP   r:   r+   r)   rM  rM    s    "F,. 	, 	, ,  ,: W)  W)r   :  "	r+   rM  c                   h   \ rS rSr\\4rS r\\	S 5       5       r
\\	S 5       5       r\\	S 5       5       r\S 5       r\" SS0S	9S
 5       r\R"                  R%                  SS9\" SSSS.S	9S 5       5       r\R"                  R%                  SS9\" SSSSS.S	9S 5       5       r\" 5       S 5       rSrg)Fail2banServerTesti  c                     U R                  [        SS5        U R                  S[        -   5        U R                  S5        g )Nr:   rU  rV  rW  )r   r   r   rQ  r  s    r)   testServerUsage"Fail2banServerTest.testServerUsage  s4    ,,wD!I&'%&r+   c                 "   [        U[        US5      S9n[        R                  [        [        [
        5      4n[        R                  SU5        X2-   S-   n[        R                  " U[        SSS9nU R                  [        U5      =(       a    US   5        U R                  USUS	9  U R                  S
5        U R                  5          U R!                  ["        USS5        U R!                  [$        US5        U R                  5         U R!                  ["        US5        U R                  S5        U R                  S5        g ! U R                  5         U R!                  ["        US5        U R                  S5        U R                  S5        f = f)Nr   rg  rh  rb  FTrj  r   r   r!  r6  r7  r5  r   r   rc  )r   ro   rr  rs  rO  rQ  r   r.   r   rt  r   r   rW   r   r   r   r   r   r   r   r   r   r{  r#  s        r)   testServerStartBackground,Fail2banServerTest.testServerStartBackground  s<    cU3	-BC+	sF+,#,,~s#G##l%M#//#c(%s1v&S$C0N#--/)<<fk:<<%=>==?<<f-*+'(	 ==?<<f-*+'(s   
/E AFc                    [        USS9nU R                  [        SS[        US5      5        U R	                  S[        US5      -   S-   5        U R                  5         [        [        US5      S	5      R                  5         U R                  [        SS[        US
5      S[        US5      5        U R	                  S5        U R                  5         [        R                  " [        US5      5        g )Nr   rg  r:   r   r  r  r  r{   r  rk   r   r  r  r8  s      r)   testServerFailStart&Fail2banServerTest.testServerFailStart  s     c[9+ ,,vrsF	3eC6HHK\\]--/ uS*s#))+,,vrsH	tU3
%;=bc--/))E#z"#r+   c           	         [        USS9n[        US5      nU R                  S5        U R                  [        US5        U R                  S5        [        [        US5      SS	S
S	SS5        U R                  S5        U R                  [        US5        U R                  SSSSS9  U R                  S5        U R                  [        USS5        U R                  SSSSS9  g )Nr   rg  rk   z[test-phase 0]z--testz$OK: configuration test is successfulrm   r  r]   [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 failedTrB  z[test-phase 0b]z-tr   )r   ro   r   r   r   r   re   r   )r   r   r   r   s       r)   testServerTestFailStart*Fail2banServerTest.testServerTestFailStart!  s     c[9+c8# -- !,,wX.:; eC%sB$&68 --!",,v{H-D"%4  1
 --!",,v{D'2D"%4  1r+   c                 T  ^  [        T[        TS5      S9n[        R                  [        [        [
        5      4n[        R                  SU5        X2-   S-   n[        R                  " U[        SSS9nU R                  [        U5      =(       a    US   5        U R                  TSUS	9  U R                  S
5        U R                  5         [        R                  ST5        U R                  [!        T5      5        [        R"                  " U4S j[        5        U R%                  ['        [        TS5      5      5        U R                  S5        U R                  5         U R                  [!        T5      5        U R                  S5        g ! U R                  [!        T5      5        f = f)NzGf2b.log[format="SRV: %(relativeCreated)3d | %(message)s", datetime=off]rg  rh  rb  FTrj  r   r   r!  zKill server ... %sc                  8   > [        [        T S5      5      (       + $ )Nr|   )r   ro   )r   s   r)   r   7Fail2banServerTest.testKillAfterStart.<locals>.<lambda>S  s    VE#y$9::r+   r|   r   zcleanup: no pidfile for)r   ro   rr  rs  rO  rQ  r   r.   r   rt  r   r   rW   r   r   r   r   r?   assertFalser   r  s    `   r)   testKillAfterStart%Fail2banServerTest.testKillAfterStart?  sB   #seCM/O P; ..%V,	-3	<<$		W	$3			#|5	N3??3s8&A'c4S1^$==?	<<$c*??9S>"..:LI6%Y/01)*--///)C.!-. ??9S>"s   CF F'r   rl   r1  c                   ^^^^ [        US5      m[        US5      m[        US5      m[        US5      m[        R                  " [        TS5      5          SU4S	 jjnSUUUU4S
 jjnU" SS9  U" SS9  U" S// SQS9  [        [        TS5      SSSSSS5        [        TS/[	        [        [        R                  " 5       5      5      S-   4S-  Q76   [        TS5        [        TS5        U R                  S5        [        R                  R                  [        R                  :  a  [        T5        U R                  [         US5        U R#                  SSS[$        S9  U R#                  ST-  5        U R#                  S5        U R#                  SS SS!9  U R#                  S"S#S[$        S9  U R#                  S$S%S&SS!9  U R                  S'5        U" SS(/S)9  [        R                  R                  [        R                  :  a  [        T5        U R                  [         US5        U R#                  S[$        S*9  U R'                  S+SSS!9  U R#                  ST-  ST-  SS!9  U R#                  S,S-SS!9  U R#                  S.S/SS!9  U R#                  S0S1SS!9  U R'                  S25        U R                  S35        U" S/S)9  U" SS4S-  S5S-  S6S-  S79  U R                  [         US5        U R#                  S[$        S*9  U R'                  S+SSS!9  U R'                  S85        U R#                  S,S9SS!9  U R#                  S:5        U R#                  S;5        U R'                  S<5        U" SS=S>9  U" S(S/S)9  U R                  S?5        [        TS@/[	        [        [        R                  " 5       5      5      SA-   4S-  [	        [        [        R                  " 5       5      5      SB-   4S-  -   [	        [        [        R                  " 5       5      5      SC-   4S-  -   [	        [        [        R                  " 5       5      5      SD-   4S-  -   Q76   [        R                  R                  [        R                  :  a  [        T5        U R#                  SESFS[$        S9  U R                  [         USGSHSISJ5        U R#                  SK[$        S*9  U R#                  SLSMSNSOSPSQSRSS!9  U R'                  SSSTSUSVSS!9  [)        5         U R+                  U R-                  USW5      SXSY/ SZQ0SH/ S[Q0/45        U R+                  U R-                  USWS\S]S^5      SXSY/SYSH// /45        U R+                  U R-                  US_SYSW5      S   / SZQ5        U R+                  U R-                  US_SHSW5      S   / S[Q5        U R/                  U R-                  US_SYSWS`5      S   S5        U R/                  U R-                  US_SYSWSJ5      S   SX5        U R/                  U R-                  US_SYSWS`SJ5      S   SSX/5        U R                  Sa5        U R                  [         USbSH5        U R#                  SScSKS[$        S9  U R#                  SdSeSfSgS/ShSiSjSS!9	  U R#                  SkSlS[$        S9  U R'                  SmSnSS!9  U R                  So5        U R                  [         USGSHSISp5        U R                  [         USGSHSISq5        U R#                  SrSsS[$        S9  [)        5         U R                  St5        U R                  [         US_SHSISu5        U R#                  S]SvSpSqS[$        S9  U R                  Sw5        U R                  [         US_SYSI5        U R#                  S\SxS`S]SvS[$        S9  U R                  Sy5        U R                  [         USbSzSH5        U R#                  SS/S[$        S9  U R#                  SgS/SdSeSfSS!9  U R#                  S{S|SS!9  U R#                  S}5        U R'                  S~SSS!9  U R'                  SPSQSS!9  U" SS=S>9  U" / S)9  U R                  S5        U R                  [         USSY5        U R#                  S[$        S*9  U R#                  SSSS!9  U R'                  SSSSS!9  U R                  S5        U" S/S9  U R                  [         US5        U R#                  S[$        S*9  U R#                  S5        U R#                  SSgSS!9  U R#                  ST-  ST-  SS!9  U R                  S5        [        TS@/[	        [        [        R                  " 5       5      5      S-   4S-  [	        [        [        R                  " 5       5      5      S-   4S-  -   [	        [        [        R                  " 5       5      5      S-   4S-  -   Q76   [        R                  R                  [        R                  :  a  [        T5        U R#                  SSS[$        S9  U R#                  SSSSSS!9  U R'                  S5        U R                  S5        U R                  [         USSSS5        U R#                  SSS[$        S9  U R                  S5        U R                  [         USSS5        U R#                  SSS[$        S9  U R                  [         USSSS5        U R#                  SSS[$        S9  U R                  S5        U R                  [         USSGSYSISS5        U R#                  SSS[$        S9  U R                  [         USSGSYSS5        U R#                  SSS[$        S9  U R                  S5        U R                  [         USSz5        U R#                  S[$        S*9  U R#                  SS+SSS!9  U R'                  SSSSNSS!9  U R                  S5        U R                  [         USSS5        U R#                  SSSS!9  U R                  S5        U" S/SS9  U R                  [0        US5        U R#                  S[$        S*9  U R#                  SSSS!9  U R                  S5        U" S/S9  U R                  [         US5        U R#                  S[$        S*9  U R                  S5        U R                  [0        USSSH5        U R#                  S[$        S*9  U R#                  S5        U R                  5         U R                  [         USSSSH5        U R#                  S[$        S*9  U R'                  S.S/SS!9  U R                  S5        U R                  [         USSSS5        U R#                  S[$        S*9  U R#                  SSS[$        S9  U R                  S5        U R                  [         USSGSYSSS5        U R                  [         USS_SYS5        U R#                  SSSS!9  g )Nrk   	test1.logz	test2.logz	test3.logru   test-action1Tr]   c                   > [        TSSU -  5      nU(       d  [        R                  " U5        g [        USSSSSSS	S
SSUSUSUSUSU5        [        R
                  R                  [        R                  ::  a  [        U5        g g )Nru   %s.confrx   r~   z_exec_once = 0r]   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')
ro   r   r  re   r   r   r   r   r   r   )	actnameallowr   ro  banunbanr   ra   r   s	           r)   _write_action_cfgBFail2banServerTest.testServerReloadTest.<locals>._write_action_cfgk  s    c:y7232
IIbM
r3!B<e=vSUXA5;T ll-bM .r+   c                    > [        / [        TS5      PSPSPSPSPSPSPSPSPS	PS
PSPSPSPSU-   PSPSPSU;   a  SOSPSU;   a  SOSPSU;   a  SOSPST-   PSU ;   a  ST-   OSPSU ;   a  ST-   OSPS	PSU ;   a  SOSPSU ;   a  SOSPSPSPSU-   PSPSPSU;   a  SOSPSU;   a  SOSPST-   PSU ;   a  SOSP76   [        R                  R                  [
        R                  ::  a  [        [        TS5      5        g g )Nrm   rx   r}   r]   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]re   ro   r   r   r   r   r   r   )enabledactionsbackendr   test1logtest2logtest3logs      r)   _write_jail_cfg@Fail2banServerTest.testServerReloadTest.<locals>._write_jail_cfg  s"    $uS+& $ $$$$$ $ 	$
 $ J$ #$ !$ $ $ !7*$ -7$ $ 	
W 1$ 	
W q$$ 	
W(%$& 8'$(  !G|L8)$*  !G|L8+$, J-$0 	
W H1$2 W"3$4 5$6 7$6 !7*7$6 -77$8 9$< 	
W q=$B 	
W(C$D 8E$F W"G$J ll-eC%& .r+   )r  test-action2r   )r   r   r  )r  r  rm   r  r  r  r  rx   z# failure 401 from 192.0.2.1: test 1r  z[test-phase 1a]ro  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'rB  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   ro  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]rp  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]r\   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]ri  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  Tr]   r]   r]   r]   r]   ))r   r   r:   polling)ro   r   r   re   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)   testServerReloadTest'Fail2banServerTest.testServerReloadTest[  s2    	c8#3$(3$(3$(((5j!"6:/10'' ''T N+N+1#w/eC%sB$&68 hgC$6 7:_ _adeeghh --!"\\gmm+X,,wX.T  > '(230122  > UF,    3.?T  K --!"1Q% \\gmm+X,,wX.&\:!T  + !!t  - 33  ? #D  * 91t  = <> --!"1#N
7.
H
8>
I
7.
HJ ,,wX.&\:!T  + '(33  ? <> 13<> N%81Q% --!"h FKKMCCEIV[[]	DDFJKV[[]	DDFJK 	V[[]	DDFJK \\gmm+XT  > ,,w,.l  4T  + !!   ++KTU:;  ++K[+}689^lL12< 8
 ++K,""#%'EF ++K,""#%'+, 4%%k,+//024574%%k,+//024574%%k,+{<<=?BCQI --!",,wlT  >
 !!!'''T  	 UU,   
 FF   --!",,w,/,,w,/:;L  Z
 --#$,,wUL'4H\<T  V--#$,,wUL'B[+{S_  a --!",,wi'D|  = !!!t   <=4  I 9;==4  I T   N%8" -- !,,wX|<&\:T  + D   -- !1#,,wX.&\: D  * 8#8#  /
 -- !h FKKMCCEIFKKMCCEIJFKKMCCEIJ
 \\gmm+X*<  I !!*T	  + 56 --!",,wg{K1!t,  
 --!",,wg~'!!t,   ,,wg~'79!!t,  @
 --!",,we\7O=MO#$$\   ,,we\9o?%&D|   -- !,,wY&\:!!t   T	   --!",,wgw ,$  8
 --!"1#'@A,,v{H-&\:54  ! --!"1#,,wX.&\: --$%,,v{h&&\::;--/,,wh|5&\:#D  *
 --$%,,whW.&\:D|  =
 --$%,,we\=.BR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                    [        US5      nSSU0-  nSSU0-  n[        US[        [        [        R
                  " 5       5      5      S-   [        [        [        R
                  " 5       5      5      S-   [        [        [        R
                  " 5       5      5      S-   [        [        [        R
                  " 5       5      5      S	-   [        [        [        R
                  " 5       5      5      S
-   5        U R                  SSSSSSS[        S9  [        U5        [        U5      nU R                  SU5        U R                  SU5        U R                  SU5        U R                  SU5        U R                  SU5        U R                  SSSS9  U R                  SSS[        S9  U R                  [        USSSS 5        [        U5        [        U5      nU R                  SU5        U R                  SU5        U R                  SU5        U R                  SU5        U R                  SU5        U R                  [        5        U R                  S!5        [        U5        [        U5      nU R                  US"5        g )#Nrk   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'rB  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-mapr]   )ro   re   r   r   r   r0   r   r8   r   ri   assertInr   r   assertNotInr   r  )r   r   r   r   lgfnmpfnmps          r)   testServerActions_NginxBlockMap2Fail2banServerTest.testServerActions_NginxBlockMapG  s5   . 	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B,	   ,,wWm]MZD/$"',',',--$b)--$b) w' K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           
         [        US5      nSSU0-  nSSU0-  n[        [        [        R                  " 5       5      5      S-   [        [        [        R                  " 5       5      5      S-   [        [        [        R                  " 5       5      5      S-   4n[        [        [        R                  " 5       5      5      S-   [        [        [        R                  " 5       5      5      S	-   [        [        [        R                  " 5       5      5      S
-   4nU R                  S5        [        US/UQ76   U R                  SSSS[        S9  [        U5        [        U5      nUS   n	U R                  X5        USS   H  n	U R                  X5        M     U R                  S5        [        US/UQ76   U R                  SSSS[        S9  [        U5        [        U5      nU H  n	U R                  X5        M     U R                  S5        U R                  [        USSS5        U R                  SSSSSS[        S9  [        U5      nUS    n	U R                  U	5        U R                  X5        USS   H%  n	U R                  U	5        U R                  X5        M'     U R                  S!SS[        S9  [        U5      nUS    n	U R                  U	5        U R                  X5        USS   H%  n	U R                  U	5        U R                  X5        M'     U R                  S"5        U R!                  [        5        U R#                  [%        U5      5        g )#Nrk   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-*]ro  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])ro   r   r   r   r0   r   re   r   r8   r   ri   r  r  r   r   r  r   r  r   )
r   r   r   r   r  tofn	smaut_msg	smrej_msgtdms
             r)   testServerJails_Sendmail+Fail2banServerTest.testServerJails_Sendmail  s,   R 	c8#	ucl	*$	ucl	*$ s6;;=||s6;;=||s6;;=||) s6;;=  s  ss6;;=  s  ss6;;=  s  s) --,-dD%9%"%L#L  B D/$"l!1QR=a==  --./dD%9%$&M%4l  D D/$"a==  --12,,w['# 8:*,LRV]i	  k $"m!A--Qr?aA  ,.PVZam  o$"m!A--Qr?aA  --*+w' 6$< r+   c           	        ^^^	^
^^ [        US5      m[        US5      m[        R                  " [        TS5      5        S8U4S jjnS9UU4S jjnU" SSS	9  U" S
SS	9  U" 5         [        TS5        U R	                  S5        U R                  [        US5        [        TS/[        [        [        R                  " 5       5      5      S-   4S-  Q76   [        5         U R                  SSS[        S9  [        5         U R	                  S5        [        S5        [        5         U R                  SSSS[        S9  [        5         U R	                  S5        Sm[        U4S j5        [        TS/[        [        [        R                  " 5       5      5      S-   4S-  Q76   U R                  SSS[        S9  U R	                  S 5        U R                  [        US!S"S#S$5        U R                  S%S&S[        S9  Sm[        5         U R	                  S'5        [        S(5        [        5         U R                  S)S[        S9  [        5         U R	                  S*5        U R                  [        US!S"S#S$5        U R                  S%S+S[        S9  U R	                  S,5        [!        5         S-S.0m["        R$                  m	UU	4S/ jnT	R'                  S0U5        T	R'                  S0S1 5        [(        R*                  " U4S2 j[,        5        T	R.                  m
[0        R2                  R4                  (       a  S3OS4S4U
4S5 jjnUT	l        U R7                  [        5        U R9                  S65        U R;                  T	R<                  5        U R?                  T	R@                  S 5        STS-'   U R                  S6SS79  T	RC                  5         g ):Nrk   r  ru   r  Tc           
         > [        TSSU -  5      n[        USSSSSU(       a  SOSS	5        [        R                  R                  [
        R                  ::  a  [        U5        g g )
Nru   r  rx   r~   r]   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>')ro   re   r   r   r   r   r   r   )r  prolongra   r   s      r)   r  @Fail2banServerTest.testServerObserver.<locals>._write_action_cfg  sa    c:y7232r3m rH ll-bM .r+   c                    > [        [        TS5      SSSSSSSSS	S
SSSSU -   SSSST-   SSS5        [        R                  R                  [
        R                  ::  a  [        [        TS5      5        g g )Nrm   rx   r}   r]   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  >Fail2banServerTest.testServerObserver.<locals>._write_jail_cfg%  s    uS+&""L7*J008_!$ ll-eC%& .r+   F)r  r   r  rx   z[test-phase 0) time-0]ro  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                     > T $ rg   r:   )wakeObss   r)   r   7Fail2banServerTest.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                     > [         R                  S5        ST S'   [        R                  " U 4S j[        5        TR                  5         [         R                  S5        g )Nz!++ observer enters busy state ...r   r  c                     > T S   S:H  $ )Nr  r   r:   r  s   r)   r   MFail2banServerTest.testServerObserver.<locals>._long_action.<locals>.<lambda>  s    !G*/r+   z-- observer leaves busy state.)r   r&   r   r?   r   db_purge)r  obsMains   r)   _long_action;Fail2banServerTest.testServerObserver.<locals>._long_action  sA    	;;231W:>>)<8
	;;/0r+   callc                      g rg   r:   r:   r+   r)   r   r    s    dr+   c                     > T S   S:H  $ )Nr  r   r:   r  s   r)   r   r    s    7qr+   g{Gz?g?c                    > T" X5      $ rg   r:   )wtime	forceQuitobsMain_stops     r)   _stop4Fail2banServerTest.testServerObserver.<locals>._stop  s    
u
((r+   zobserver leaves busy stater  )r  T)r  )"ro   r   r   re   r   r   r   r   r   r   r0   r;   r   r8   r2   rF   r"   r5   r6   addr   r?   r   r   r   r   rq  r   r  r  idler  _ObserverThread__dbr   )r   r   r   r  r  r  r  r  r   r  r  r  r  s          @@@@@@r)   testServerObserver%Fail2banServerTest.testServerObserver  sI   c8#3$(((5j!"' '. NE:ND9h--(),,wX.h V[[]	aacfgg II,   
 --*+b/<< ,	   
 --*+ '0h V[[]	ffhkll II,   
 --45,,wUL'=Q<  9 '--*+a.M,   
 --45,,wUL'=Q<  9 --9:l!NN'1 
++fl#	++fl#..(,7,#<<,,4#$ )',w'347<< 7..5!G*0t<	,,.r+   r:   N)rK   rL   rM   rN   _exec_serverrQ  r   r  r   r   r  r  r  r  r  r  r   r   skip_if_cfg_missingr  r  r  _testServerStartStoptestServerStartStoprP   r:   r+   r)   r  r    sN   "F,'
 )  ). $  $$ 1  18 / /6  D&>:h@ ;h@V ,,""*;"<7 , *:+ =,:x ,,""/":.
&, &NN!O& ;PN!`  !O "Od 
r+   r  )FNz	/dev/nullz:memory:r:   )r]   N)`
__author____copyright____license__r   r   r   rr  r0   r   r   os.pathr   ro   r   r   r   r   	functoolsr
   	threadingr   clientr   r   r   client.fail2bancmdliner   client.fail2banclientr   r  r   r   client.fail2banserverr   r  r]   r   r   server.mytimer   server.utilsr   utilsr   r   r   r   r   r   r   r    r   r!   r"   helpersr#   rK   rP  rQ  getServerPathrO  r   maxWaitTimer   r8   r  r  r  r  r*   rl  r2   r5   r;   rF   rH   rS   r   r   rX   rZ   input_command
PRODUCTIONdumpFiler   re   ri   r   r   r   r   r   r  r  rM  r  r:   r+   r)   <module>r6     s5  , 
[  	 	 
    A A   D D 4 Z Z U   "  ? ? ?   
8			n**,-||''(A(AB||''(A(AB  ,a/        (( && 
        * 	- 1= &*O11 
55 
 	  3  ""   ''	
 7;;@Un)X .0 CLF#1 F#RV1 VrA 1 A r+   