%PDF- %PDF-
Mini Shell

Mini Shell

Direktori : /usr/lib/python2.7/site-packages/fail2ban/tests/
Upload File :
Create Path :
Current File : //usr/lib/python2.7/site-packages/fail2ban/tests/fail2banclienttestcase.pyo

�
��&dc@s�dZdZdZddlZddlZddlZddlZddlZddlZddl	Z	ddl
mZm
Z
mZmZmZddlmZddlmZdd	lmZmZmZdd
lmZddlmZmZmZddl m!Z!mZ"dd
l#m$Z$ddl%m%Z%ddl&m'Z'ddl(m)Z)ddl*m+Z+m,Z-m.Z.m/Z/m0Z0m1Z1m2Z3m4Z4m5Z5ddl6m7Z7e7e8�Z,dZ9dZ:ee!j;��Z<e	j=j>e	j=j?�Z?e	j=j>e	j=j@�Z@e?de_?e,e_,e_,e_,e%jAZBe%jCZDd�ZEeEe_Fe_Fe_Fe$_Fd�ZGe%jHZHd�ZIe@d�ZJdejKfd��YZKdejKfd��YZLeKZMeLZNgaOd�ZPePe_QeRe_Se_Se+jTZUd�ZVd �ZWeRdd!d"d0d1dd$�ZYd%�ZZd&�Z[d'�Z\d(�Z]id)�Z^d*e+fd+��YZ_d,e_fd-��YZ`d.e_fd/��YZadS(2sSerg BrestersICopyright (c) 2014- Serg G. Brester (sebres), 2008- Fail2Ban ContributorstGPLi����N(tjointisdirtisfiletexiststdirname(twraps(tThreadi(tfail2banclienttfail2banservertfail2bancmdline(tFail2banCmdLine(texec_command_linetCSockett
VisualWait(tFail2banServerR(tprotocol(tserver(tMyTime(tUtilsi(	tLogCaptureTestCasetlogSystwith_tmpdirtshutiltloggingtSTOCKt
CONFIG_DIRtTEST_NOWttearDownMyTime(t	getLoggersfail2ban-clientsfail2ban-servercGstj|d�dS(Ni(Rtinfo(targs((sI/usr/lib/python2.7/site-packages/fail2ban/tests/fail2banclienttestcase.pyt_test_outputJscCs/tjd|�tjtj�|d�dS(Ns===>>> time shift + %s mini<(RtdebugRtsetTimettime(tshift((sI/usr/lib/python2.7/site-packages/fail2ban/tests/fail2banclienttestcase.pyt_time_shiftQscCs:tjdk	r6tjjt�tjjtd�ndS(Ni(t	ObserverstMaintNonet
wait_emptytMID_WAITTIMEt	wait_idle(((sI/usr/lib/python2.7/site-packages/fail2ban/tests/fail2banclienttestcase.pyt_observer_wait_idleYscsCtjdk	r?tjj����fd�}|tj_ndS(NcsG�tj_tjd�tj���tjd��||�dS(Ns4  [Observer::banFound] *** observer blocked for tests.  [Observer::banFound] +++ observer runs again(R&R'tbanFoundRR!Rtwait_for(Rtkwargs(t
_obs_banFoundtcondttimeout(sI/usr/lib/python2.7/site-packages/fail2ban/tests/fail2banclienttestcase.pyt	_banFoundds


(R&R'R(R-(R1R2R3((R0R1R2sI/usr/lib/python2.7/site-packages/fail2ban/tests/fail2banclienttestcase.pyt_observer_wait_before_incrban_s	t
ExitExceptioncBseZRS((t__name__t
__module__(((sI/usr/lib/python2.7/site-packages/fail2ban/tests/fail2banclienttestcase.pyR5tstFailExitExceptioncBseZRS((R6R7(((sI/usr/lib/python2.7/site-packages/fail2ban/tests/fail2banclienttestcase.pyR8yscGs!tt�rtjd�SdSdS(Nitexit(tlentINTERACTtpop(R((sI/usr/lib/python2.7/site-packages/fail2ban/tests/fail2banclienttestcase.pyt_test_input_command�s
cGsCt||�}|jdj|�|r-dnd�|j�dS(Ns
t(topentwriteRtclose(tfntmodetlinestf((sI/usr/lib/python2.7/site-packages/fail2ban/tests/fail2banclienttestcase.pyt_write_file�s&cCsAd}zt|�}|j�SWd|dk	r<|j�nXdS(N(R(R?treadRA(RBRE((sI/usr/lib/python2.7/site-packages/fail2ban/tests/fail2banclienttestcase.pyt
_read_file�ss	/dev/nulls:memory:R>cCs�t|d�}|dkr-t|d�}nd}	|rPtrPd�}
tjt|d|
�|dkrsd0}ntjd	�}xRtj	t|d
�dt
�D]2}|jd�}|j|�r�d
}n|GHq�Wtjd�}xRtj	t|d�dt
�D]2}|jd�}|j|�r2d}n|GHqW|rGdnd}	nrt
j|�tt|d
�dddd|jdd�ddt|d�dt|d�dd|ddd�
|	r�tt||	�dd dd!d"|df|�n|rtt|d#�d|�ntjjtjkr�tt|d
��tt|d��|rttt|d#��n|	r�|	dkr�tt||	��q�n|r�tr�x?|D]4}
t
jt
jjtt|
��t||
��q�Wn|r"x,|D]!}
t|
i|d$6dd�q�Wnd2\}}tjjtjkr�ttjj�}tjjd&kr�d'd(tjjf}q�n|d)|f}d*|d+t|d�d,t|d�d-|f|d.dd/ttj�fS(3Ntconfigtautosf2b-db.sqlite3s	jail.confcSs,g|D]!}tt||��r|^qS(N(Rtpjoin(tdirtfilesRE((sI/usr/lib/python2.7/site-packages/fail2ban/tests/fail2banclienttestcase.pytig_dirs�stignoresaction.dsfilter.ds^dbfile\s*=s
fail2ban.conftinplaces
sdbfile = :memory:s^backend\s*=sbackend = pollings
jail.localR>tws[Definition]sloglevel = INFOslogtarget = t%s%%ssyslogsocket = autos	socket = sf2b.socks
pidfile = sf2b.pids	dbfile = sdbmaxmatches = 100sdbpurgeage = 1ds
[INCLUDES]s	[DEFAULT]stmp = sfail2ban.localttmptINFOit-tvs
--loglevels-cs-ss-ps--logtargets--syslogsockets	--timeout(saction.dsfilter.d(((sINFO(RKRRtcopytreetSTOCK_CONF_DIRR(tretcompilet	fileinputtinputtTruetrstriptmatchtostmkdirRFtreplacetunittesttF2Bt	log_levelRtDEBUGt	_out_filetsymlinktpathtabspathRTtstrt	verbosityR
tMAX_WAITTIME(RSt	use_stockt
use_stock_cfgt	logtargettdbt	f2b_localtjailstcreate_before_starttcfgtj_confRNtrtlinetntvvvtllev((sI/usr/lib/python2.7/site-packages/fail2ban/tests/fail2banclienttestcase.pyt
_start_params�s~		%		%		

5
"7cCs8y||jd�ddkSWntk
r3tSXdS(Ns--logtargetit	INHERITED(tindext
ValueErrortFalse(tstartparams((sI/usr/lib/python2.7/site-packages/fail2ban/tests/fail2banclienttestcase.pyt_inherited_log�s
cCs_d}y2t|�}tjd|�j�}t|�SWn tk
rZ}tj|�nX|S(Ns\S+(	R(RHRYR_tgrouptintt	ExceptionRR!(tpidfiletpidte((sI/usr/lib/python2.7/site-packages/fail2ban/tests/fail2banclienttestcase.pyt_get_pid_from_file�scs�tjd|t|�f�t|�r^|}t|d�}t|�s^t|d�}q^ntjjtj	kr�t|d�}t|�r�t
|�q�tjdd|�nt|�s�tjd|�tStjd|�t
|���dkr�tSy�tjd	���d
ks.�tj�krGtd�|f��ntj��sZtStj�tj�tj�fd�d
�s�tj�tj�ntjd�tj��SWn tk
r�}tj|�nXtS(Nscleanup: %rsf2b.pidsfail2ban.pidsf2b.logis
no logfile %rscleanup: no pidfile for %rscleanup pidfile: %rscleanup pid: %rispid %s of %s is invalidcstj��S(N(Rt
pid_exists((R�(sI/usr/lib/python2.7/site-packages/fail2ban/tests/fail2banclienttestcase.pyt<lambda>)siscleanup: kill ready(RR!RRKRRcRdReRRfRgtlogR]R�R(R�R`tgetpidRRR�tkilltsignaltSIGTERMR.tSIGKILLR�t	exception(R�tpiddirtlogfileR�((R�sI/usr/lib/python2.7/site-packages/fail2ban/tests/fail2banclienttestcase.pyt	_kill_srvs@

cst���fd��}|S(Ncs-|d}z�||�SWdt|�XdS(Ni����(R�(tselfRR�(RE(sI/usr/lib/python2.7/site-packages/fail2ban/tests/fail2banclienttestcase.pytwrapper8s
(R(RER�((REsI/usr/lib/python2.7/site-packages/fail2ban/tests/fail2banclienttestcase.pyt
with_kill_srv3scs�fd�}|S(Ncs(tt����fd���}|S(Nc	s�d}t��zFy�t�dd���tddd�jd���f�}t|_|j�tt	f����fd�}|�_
tj�fd�t
��j�jd	d���j�td
�d��tjd��j�����||�SWnGtk
rS}d
|GH�j�}|rMd|GH�j�n�nXWd|r�tjd��j��j
��jdd�r�|j�q�nt�XdS(NRpR}tnamet_TestCaseWorkerttargetRcs�t��jdd�rRtjjt�d��rRtj�fd�t	�n�jdd�s��j
|�d�tj�fd�t��j�jdd���j
dddtd	t�nd
��_dS(Ntendsf2b.pidcs�jdd�dk	S(NR�(tgetR(((tphase(sI/usr/lib/python2.7/site-packages/fail2ban/tests/fail2banclienttestcase.pyR�]ststopcs�jdd�dk	S(NR�(R�R(((R�(sI/usr/lib/python2.7/site-packages/fail2ban/tests/fail2banclienttestcase.pyR�bssShutdown successfulsExiting Fail2bantalltwaitc_sdS(N(R((RR/((sI/usr/lib/python2.7/site-packages/fail2ban/tests/fail2banclienttestcase.pyR�fs(RR�R(R`RiRRKRR.R*texecCmdRmt
assertTruetassertLoggedR]tstopAndWaitForServerEnd(tcode(R�R�R�RS(sI/usr/lib/python2.7/site-packages/fail2ban/tests/fail2banclienttestcase.pyt_stopAndWaitForServerEndYs/cs�jdd�dk	S(Ntstart(R�R(((R�(sI/usr/lib/python2.7/site-packages/fail2ban/tests/fail2banclienttestcase.pyR�isR�R�R�s=== within server: begin ===s=== Catch an exception: %ss#=== Error of server, log: ===
%s===s=== within server: end.  ===R�(R(tdictR|Rt_testStartForegroundR]tdaemonR�tSUCCESStFAILEDR�RR.RmR�R�t
_wait_for_srvt	DefLogSysRtpruneLogR�tgetLogRR(R�RSRR/tthR�R�R�(REt
startextra(R�R�R�RSsI/usr/lib/python2.7/site-packages/fail2ban/tests/fail2banclienttestcase.pyR�GsB			
!	

		



(RR(RER�(R�(REsI/usr/lib/python2.7/site-packages/fail2ban/tests/fail2banclienttestcase.pyt
_deco_wrapperFs!;((R�R�((R�sI/usr/lib/python2.7/site-packages/fail2ban/tests/fail2banclienttestcase.pytwith_foreground_server_threadAs>tFail2banClientServerBasecBs�eZejZd�Zd�Zd�Zedd��Z	e
ddd�Zd�Z
d�Zd�Zed	idd6�d
��ZRS(cOsdS(N((R�RR/((sI/usr/lib/python2.7/site-packages/fail2ban/tests/fail2banclienttestcase.pyt_setLogLevel�scCs8tj|�dt_tjt_t|j�t	_
dS(NR}(RtsetUpRt
DEF_LOGTARGETR�tleveltDEF_LOGLEVELtstaticmethodt
_test_exitRt_exit(R�((sI/usr/lib/python2.7/site-packages/fail2ban/tests/fail2banclienttestcase.pyR��s
	cCs6|jt_tt_tt_tj	|�t
�dS(N(t
_orig_exitRR�tSRV_DEF_LOGTARGETRR�tSRV_DEF_LOGLEVELR�RttearDownR(R�((sI/usr/lib/python2.7/site-packages/fail2ban/tests/fail2banclienttestcase.pyR��s
		
icCs%|dkrt��n	t��dS(Ni(R5R8(R�((sI/usr/lib/python2.7/site-packages/fail2ban/tests/fail2banclienttestcase.pyR��scs/�si�ny�t|d��tj��fd�t�}|sU�jd�rktd|f��n|r�tj�fd�t�}|s�td�|f��q�nWnyt|�r�d�j�GH�j�nt|d�}t	|�rt
|�nt|�s$tjd	|�n�nXdS(
Nsf2b.sockcs�jd�pt��S(NR�(R�R((R�tsock(sI/usr/lib/python2.7/site-packages/fail2ban/tests/fail2banclienttestcase.pyR��sR�s9Unexpected: Socket file does not exists.
Start failed: %rcsd�j�kS(NsServer ready(R�((R�(sI/usr/lib/python2.7/site-packages/fail2ban/tests/fail2banclienttestcase.pyR��ssBUnexpected: Server ready was not found, phase %r.
Start failed: %rs,=== Error by wait fot server, log: ===
%s===sf2b.logs*No log file %s to examine details of error(
RKRR.RmR�R�R�R�R�RRgRR!(R�RStreadyR�R�tretR�((R�R�R�sI/usr/lib/python2.7/site-packages/fail2ban/tests/fail2banclienttestcase.pyR��s2	

cGs-|j||jd|jd||�dS(Nii(tassertRaisesR(R�texitTypeR�R((sI/usr/lib/python2.7/site-packages/fail2ban/tests/fail2banclienttestcase.pyR��scGsF||jd�d}t|�}z|j|�SWd|j�XdS(Ns-si(R~R
tsendRA(R�R�RR�ts((sI/usr/lib/python2.7/site-packages/fail2ban/tests/fail2banclienttestcase.pyt
execCmdDirect�s
cCs[tjd�t|d<z|jtd|d�Wdt|d<t|d<tjd�XdS(Nsstart of test workerR�s-fR�send of test worker(s-f(RR!R]R�R�R�(R�RSR�R�((sI/usr/lib/python2.7/site-packages/fail2ban/tests/fail2banclienttestcase.pyR��s



R�s[Thread]sstacksize = 128RrcCsm|j�|jt|dd�|jd�|jt|d�|jt|d�|jt|dd�dS(NR�tthreads{'stacksize': 128}tpings~~unknown~cmd~failed~~techos	TEST-ECHO(R�R�R�R�R�(R�RSR�((sI/usr/lib/python2.7/site-packages/fail2ban/tests/fail2banclienttestcase.pyttestStartForeground�s

N(s[Thread]sstacksize = 128(R6R7RR�R�R�R�R�R�R�R]R(R�R�R�R�R�R�(((sI/usr/lib/python2.7/site-packages/fail2ban/tests/fail2banclienttestcase.pyR��s									tFail2banClientTestcBs�eZeefZd�Zd�Zed��Zee	d���Z
ee	d���Zee	d���Zed��Z
d�ZRS(cCs<|jtttt���|jtttt���dS(N(R�RRKtBINtCLIENTtSERVER(R�((sI/usr/lib/python2.7/site-packages/fail2ban/tests/fail2banclienttestcase.pyttestConsistency�scCs�|jtdd�|jdt�|jd�|j�|jtdd�|jtj��|j�|jtd
dd�|jdtj�|j�|jtddd	�|jd
�dS(Ns-hsUsage: sReport bugs to s-Vs-vqs	--versions
Fail2Ban vs	--str2sect1d12h30mt131400(((((R�R�R�R�R�R
tnormVersiontversion(R�((sI/usr/lib/python2.7/site-packages/fail2ban/tests/fail2banclienttestcase.pyttestClientUsage�s



cCsjt|t�}|jt|d�|jd�|jd�|j�|jt|d�|jd�dS(Ns-vvds
Loading filess['set', 'logtarget',s--dp(R|R]R�R�R�R�(R�RSR�((sI/usr/lib/python2.7/site-packages/fail2ban/tests/fail2banclienttestcase.pyttestClientDumps


cCs't|t�}|jtd|d�|j|td|�|jd�|jd�z[|jt|dd�|jt|d�|j�|jtd|d�|jd	�Wd|j�|jt|d
�|jd�|jd�X|j�|jt|d
�|jd�|jd
�dS(Ns-bR�R�sServer readysExit with code 0R�s	TEST-ECHOs~~unknown~cmd~failed~~sServer already runningR�sShutdown successfulsFailed to access socket pathsIs fail2ban running?(s-b(s-b(R|R]R�R�R�R�R�R�(R�RSR�((sI/usr/lib/python2.7/site-packages/fail2ban/tests/fail2banclienttestcase.pyttestClientStartBackgroundInsides&






cCs;t|dt|d��}tjjr>|jt|d%�n�tjtt	t
�f}tjd|�||d&}t
j|dtdtdt�}|jt|�o�|d	�|j|td
|�|jd�|j�z|jt|dd
�|jd
�|jd�|j�|jt|dd�|jd�|j�tt|d��}z=tj|tj�tjt
j�|jt|dd�Wdtj|tj �X|jd�|j�t!dddg7a!|jt|d�|jd�|jdd�|jd�|j�t!dddg7a!|jt|d�|jd�|jd�|jd�|jd�|j�t!d dg7a!|jt|d�|jd!�|j�|jt|dd"�|jd!�|jd#�|j�Wd|j�|jt|d$�|jd�|jd�XdS('NRpsf2b.logR�sStart %s ...s--asyncR2tshelltoutputiR�sServer readyR�s	TEST-ECHOsExit with code 0R�s0.1sServer replied: pongsf2b.pids1e-10s	timed outsecho INTERACT-ECHOtstatusR9s-is
INTERACT-ECHOtStatussNumber of jail:treloadtrestartsReading config files:sShutdown successfulsreload ~~unknown~jail~fail~~s@Failed during configuration: No section: '~~unknown~jail~fail~~'s~~unknown~jail~fail~~sExit with code 255R�(sstart(s--asyncsstart("R|RKRcRdtfastR�R�tsyst
executableR�R�RR!Rt
executeCmdRmR�R]R�R:R�R�R�R�R`R�R�tSIGSTOPR#tsleeptDEFAULT_SHORT_INTERVALR�tSIGCONTR;(R�RSR�tcmdR�R�((sI/usr/lib/python2.7/site-packages/fail2ban/tests/fail2banclienttestcase.pyttestClientStartBackgroundCall0sx!

























c
CsRt|dd�}|jtdddt|d�d�|jdt|d�d�|j�|jtddt|d	�d
t|d�d�|jd
�|j�tt|d�d�j�|jtdddt|d	�d
t|d�d�|jd�|j�tj	t|d��|jtdd
�|jd�|j�dS(NRpR}s--asyncs-ctmissR�sBase configuration directory s does not existRIs-ssf2b.sockR�sCould not find servertasLFail2ban seems to be in unexpected state (not running but the socket exists)sUsage: (((((
R|R�R�RKR�R�R?RAR`tremove(R�RSR�((sI/usr/lib/python2.7/site-packages/fail2ban/tests/fail2banclienttestcase.pyttestClientFailStart�s$
%

(


cCsvt|dd�}|jt|dd�|jd�|j�|jt|dddd�|jd�|j�dS(	NRpR}R�tjailsCould not find servers--asyncs--xxxs"Unexpected argument(s) for reload:(R|R�R�R�R�(R�RSR�((sI/usr/lib/python2.7/site-packages/fail2ban/tests/fail2banclienttestcase.pyttestClientFailCommands�s



cCs}d}xpdD]h}d}t|d��K}xA|rn|j�|ratjjratj|�n|d8}q.WWdQXq
WdS(Ng�Q���?iiiii(ii(Rt	heartbeatRcRdR�R#R�(R�t	sleeptimetverbosetcntrtvis((sI/usr/lib/python2.7/site-packages/fail2ban/tests/fail2banclienttestcase.pyttestVisualWait�s
	
(R6R7t_exec_clientR�RR�R�RR�R�R�R�R�R�R�(((sI/usr/lib/python2.7/site-packages/fail2ban/tests/fail2banclienttestcase.pyR��s		UtFail2banServerTestcBs�eZeefZd�Zeed���Zeed���Z	eed���Z
ed��Zedidd6�d��Z
ejjd	d
�edidfd6d
fd6dddddddddddfd6�d���Zejjdd�edidfd6ed6d d!fd"6d#d$ddd%d&d'dd(d)dd*ddd%d&d+dd(dfd6�d,���Ze�d-��Zer�e�d.��Zd/�ZnRS(0cCs5|jtdd�|jdt�|jd�dS(Ns-hsUsage: sReport bugs to ((R�R�R�R�(R�((sI/usr/lib/python2.7/site-packages/fail2ban/tests/fail2banclienttestcase.pyttestServerUsage�scCs(t|dt|d��}tjttt�f}tjd|�||d}tj	|dt
dtdt�}|j
t|�o�|d�|j|td	|�|jd
�|j�z-|jt|dd�|jt|d
�Wd|j�|jt|d�|jd�|jd�XdS(NRpsf2b.logsStart %s ...s-bR2R�R�iR�sServer readyR�s	TEST-ECHOs~~unknown~cmd~failed~~R�sShutdown successfulsExit with code 0(s-b(R|RKR�R�R�R�RR!RR�RmR�R]R�R:R�R�R�R�R�R�(R�RSR�R�R�((sI/usr/lib/python2.7/site-packages/fail2ban/tests/fail2banclienttestcase.pyttestServerStartBackground�s !



c	Cs�t|dd�}|jtddt|d��|jdt|d�d�|j�tt|d�d�j�|jtd
dt|d	�d
t|d��|jd�|j�tj	t|d��dS(NRpR}s-cR�sBase configuration directory s does not existsf2b.sockR�RIs-ssLFail2ban seems to be in unexpected state (not running but the socket exists)(((
R|R�R�RKR�R�R?RAR`R�(R�RSR�((sI/usr/lib/python2.7/site-packages/fail2ban/tests/fail2banclienttestcase.pyttestServerFailStart�s
"

cCs�t|dd�}t|d�}|jd�|jt|d�|jd�tt|d�dd	d
d	dd�|jd
�|jt|d�|jddddt�|jd�|jt|dd�|jddddt�dS(NRpR}RIs[test-phase 0]s--tests$OK: configuration test is successfuls	jail.confR�R>s
[broken-jail]sfilter = broken-jail-filtersenabled = trues[test-phase 0a]s.Unable to read the filter 'broken-jail-filter'sErrors in jail 'broken-jail'.s ERROR: test configuration failedR�s[test-phase 0b]s-tR�(	R|RKR�R�R�R�RFR�R](R�RSR�Ru((sI/usr/lib/python2.7/site-packages/fail2ban/tests/fail2banclienttestcase.pyttestServerTestFailStart�s"



	

	csWz�t�dt�d��}tjttt�f}tjd|�||d}tj	|dt
dtdt�}|j
t|�o�|d�|j�td	|�|jd
�|j�tjd��Wd|j
t���Xtj�fd�t
�|jtt�d
���|jd�|j�|j
t���|jd�dS(NRpsGf2b.log[format="SRV: %(relativeCreated)3d | %(message)s", datetime=off]sStart %s ...s-bR2R�R�iR�sServer readysKill server ... %scstt�d��S(Nsf2b.pid(RRK((RS(sI/usr/lib/python2.7/site-packages/fail2ban/tests/fail2banclienttestcase.pyR�+ssf2b.pidscleanup: kill readyscleanup: no pidfile for(s-b(R|RKR�R�R�R�RR!RR�RmR�R]R�R:R�R�R�R�R.tassertFalseR(R�RSR�R�R�((RSsI/usr/lib/python2.7/site-packages/fail2ban/tests/fail2banclienttestcase.pyttestKillAfterStarts&!



R�RJRqcs�t|d��t|d��t|d��t|d��tjt�d��dtddddd�fd�}d�d�d����fd�}|d
d�|d
d�|dd	gdd	d
dg�tt�d�dddddd�t�dtttj���dfd�t�d�t�d�|j	d�t
jjt
jkrkt��n|jt|d�|jdddtdt�|jd��|jd �|jd!d"dt�|jd#d$dtdt�|jd%d&d'dt�|j	d(�|dd	d
g�t�d)�t
jjt
jkrRt��n|jt|d�|jddt�|jd*d dt�|jd�d�dt�|jd+d,dt�|jd-d.dt�|jd/d0dt�|jd1�|j	d2�|dd	g�|d
dd3d4ddd5dd6d7d�|jt|d�|jddt�|jd*d dt�|jd8�|jd+d9dt�|jd:�|jd;�|jd<�|d
dd=t�|dd
dg�|j	d>�t�d)tttj���d?fdtttj���d@fdtttj���dAfdtttj���dBfd�t
jjt
jkr�t��n|jdCdDdtdt�|jt|dEdFdGdH�|jdIdt�|jdJdKdLdMdNdOdPdt�|jdQdRdSdTdt�t�|j|j|dU�dVidWdXdYdZd[gd\6idWdHdYgdF6gf�|j|j|dUdXdWd]�dVd\gd\dFgggf�|j|j|d^d\dU�d	dWdXdYdZd[g�|j|j|d^dFdU�d	dWdHdYg�|j|j|d^d\dUdZ�d	d	�|j|j|d^d\dUdH�d	dV�|j|j|d^d\dUdZdH�d	d	dVg�t�d)�t�d)�|j	d_�|jt|d`dF�|jddadIdtdt�|jdbdcddded.dfdgdhdt�|jdidjdtdt�|jdkdldt�|j	dm�|jt|dEdFdGdn�|jt|dEdFdGdo�|jdpdqdtdt�t�|j	dr�|jt|d^dFdGds�|jdWdYdndodtdt�|j	dt�|jt|d^d\dG�|jdXd[dZdWdYdtdt�|j	du�|jt|d`dvdF�|jdd.dtdt�|jded.dbdcdddt�|jdwdxdt�|jdy�|jdzd{dt�|jdNdOdt�|d
dd=t�|dg�|j	d|�|jt|dd\�|jddt�|jd}d~dt�|jdd�d�dt�|j	d��|dd	g�|jt|d�|jddt�|jd}�|jd�dedt�|jd��d��dt�|j	d��t�d)tttj���d�fdtttj���d�fdtttj���d�fd�t
jjt
jkr�
t��n|jd�d�dtdt�|jd�d�d�d�dt�|jd��|j	d��|jt|d�d�d�d��|jd�d�dtdt�|j	d��|jt|d�d�d��|jd�d�dtdt�|jt|d�d�d�d��|jd�d�dtdt�|j	d��|jt|d�dEd\dGd�d��|jd�d�dtdt�|jt|d�dEd\d�d��|jd�d�dtdt�|j	d��|jt|ddv�|jddt�|jd~d*d�dt�|jd�d�d dLdt�|j	d��|jt|d�d�d��|jd�d�dt�|j	d��|dd	gd�d��|jt|d�|jddt�|jd�d�dt�|j	d��|dd	g�|jt|d�|jddt�|j	d��|jt|d�ddF�|jddt�|jd��|j	�|jt|d�dd�dF�|jddt�|jd-d.dt�|j	d��|jt|d�dd�d��|jddt�|jd�d�dtdt�|j	d��|jt|d�dEd\d�d�d��|jt|d�d^d\d��|jd�d�dt�dS(�NRIs	test1.logs	test2.logs	test3.logsaction.dstest-action1R>cs�t�dd|�}|s-tj|�dSt|ddddddd	d
dd|d
|d|d|d|�tjjtjkr�t	|�ndS(Nsaction.ds%s.confRQs	[DEFAULT]s_exec_once = 0R>s[Definition]snorestored = %(_exec_once)ss
restore = sinfo = s<_use_flush_ = echo '[%(name)s] %(actname)s: -- flushing IPs's6actionstart =  echo '[%(name)s] %(actname)s: ** start's7actionreload = echo '[%(name)s] %(actname)s: .. reload'sMactionban =    echo '[%(name)s] %(actname)s: ++ ban <ip> %(restore)s%(info)s's;actionunban =  echo '[%(name)s] %(actname)s: -- unban <ip>'s5actionstop =   echo '[%(name)s] %(actname)s: __ stop'(
RKR`R�RFRcRdReRRfRg(tactnametallowR�R�tbantunbanR�RB(Ru(sI/usr/lib/python2.7/site-packages/fail2ban/tests/fail2banclienttestcase.pyt_write_action_cfgCs(
	
iitpollingc%sttt�d�ddddddddd	d
dddd
|ddd|krUdndd|krjdndd|krdndd�d|kr�d�ndd|kr�d�ndd	d|kr�dndd|kr�dndddd
|ddd|kr
dndd|kr"dndd�d|kr>dnd�#tjjtjkrptt�d��ndS(Ns	jail.confRQs
[INCLUDES]R>s	[DEFAULT]susedns = nosmaxretry = 3sfindtime = 10msBfailregex = ^\s*failure <F-ERRCODE>401|403</F-ERRCODE> from <HOST>sdatepattern = {^LN-BEG}EPOCHsignoreip = 127.0.0.1/8 ::1s[test-jail1]s
backend = sfilter =s	action = is*         test-action1[name='%(__name__)s']isj         test-action2[name='%(__name__)s', restore='restored: <restored>', info=', err-code: <F-ERRCODE>']is�         test-action2[name='%(__name__)s', actname=test-action3, _exec_once=1, restore='restored: <restored>', actionflush=<_use_flush_>]s
logpath = s
          s@            ^\s*error <F-ERRCODE>401|403</F-ERRCODE> from <HOST>senabled = trues[test-jail2](RFRKRcRdReRRfRg(tenabledtactionstbackend(Ruttest1logttest2logttest3log(sI/usr/lib/python2.7/site-packages/fail2ban/tests/fail2banclienttestcase.pyt_write_jail_cfg[s<

R�stest-action2RRis	jail.confR�s
[broken-jail]sfilter = broken-jail-filtersenabled = trueRQs# failure 401 from 192.0.2.1: test 1s[test-phase 1a]R�sReload finished.s1 ticket(s) in 'test-jail1R�R�sAdded logfile: %rs[test-jail1] Ban 192.0.2.1s-stdout: '[test-jail1] test-action1: ** start's-stdout: '[test-jail1] test-action2: ** start'sPstdout: '[test-jail1] test-action2: ++ ban 192.0.2.1 restored: 0, err-code: 401'sAstdout: '[test-jail1] test-action3: ++ ban 192.0.2.1 restored: 0's.Unable to read the filter 'broken-jail-filter's)Errors in jail 'broken-jail'. Skipping...s:Jail 'broken-jail' skipped, because of wrong configurations[test-phase 1b]sw+s[test-jail1] Unban 192.0.2.1s.stdout: '[test-jail1] test-action1: .. reload's.stdout: '[test-jail1] test-action2: .. reload'sCreating new jail 'test-jail2'sJail 'test-jail2' starteds4stdout: '[test-jail1] test-action3: -- flushing IPs's,stdout: '[test-jail1] test-action3: __ stop's7stdout: '[test-jail1] test-action3: -- unban 192.0.2.1's[test-phase 2a]R�s+               echo '[<name>] %s: started.'s,               echo '[<name>] %s: reloaded.'R�s+               echo '[<name>] %s: stopped.'sAdded logfile:s.stdout: '[test-jail1] test-action1: reloaded.'s7stdout: '[test-jail1] test-action2: -- unban 192.0.2.1's,stdout: '[test-jail1] test-action2: __ stop's7stdout: '[test-jail1] test-action1: -- unban 192.0.2.1'Rs[test-phase 2b]s#   error 403 from 192.0.2.2: test 2s#   error 403 from 192.0.2.3: test 2s# failure 401 from 192.0.2.4: test 2s# failure 401 from 192.0.2.8: test 2s2 ticket(s) in 'test-jail2s5 ticket(s) in 'test-jail1tsets
test-jail2tbanips	192.0.2.9s3 ticket(s) in 'test-jail2s[test-jail1] Ban 192.0.2.2s[test-jail1] Ban 192.0.2.3s[test-jail1] Ban 192.0.2.4s[test-jail1] Ban 192.0.2.8s[test-jail2] Ban 192.0.2.4s[test-jail2] Ban 192.0.2.8s[test-jail2] Ban 192.0.2.9s[test-jail2] Found 192.0.2.2s[test-jail2] Ban 192.0.2.2s[test-jail2] Found 192.0.2.3s[test-jail2] Ban 192.0.2.3tbannedis	192.0.2.4s	192.0.2.1s	192.0.2.8s	192.0.2.3s	192.0.2.2s
test-jail1s192.0.2.222R�s[test-phase 2c]R�sRestore Bans[test-jail2] Unban 192.0.2.4s[test-jail2] Unban 192.0.2.8s[test-jail2] Unban 192.0.2.9sJail 'test-jail2' stoppeds"[test-jail2] Restore Ban 192.0.2.4s"[test-jail2] Restore Ban 192.0.2.8s"[test-jail2] Restore Ban 192.0.2.9sPstdout: '[test-jail2] test-action2: ++ ban 192.0.2.4 restored: 1, err-code: 401'sPstdout: '[test-jail2] test-action2: ++ ban 192.0.2.8 restored: 1, err-code: 401'sAstdout: '[test-jail2] test-action3: ++ ban 192.0.2.4 restored: 1'sAstdout: '[test-jail2] test-action3: ++ ban 192.0.2.8 restored: 1's[test-phase 2d]s
192.0.2.21s
192.0.2.22s5stdout: '[test-jail2] test-action3: ++ ban 192.0.2.22s6stdout: '[test-jail2] test-action3: ++ ban 192.0.2.22 s[test-phase 2d.1]s
s[test-phase 2d.2]s[test-phase 2e]s--unbans7stdout: '[test-jail2] test-action2: -- unban 192.0.2.21s8stdout: '[test-jail2] test-action2: -- unban 192.0.2.22's4stdout: '[test-jail2] test-action3: -- flushing IPs's8stdout: '[test-jail2] test-action3: -- unban 192.0.2.21's8stdout: '[test-jail2] test-action3: -- unban 192.0.2.22's[test-phase 3]sReload jail 'test-jail1'sJail 'test-jail1' reloadedsReload jail 'test-jail2'sJail 'test-jail2' reloadedsJail 'test-jail1' starteds[test-phase 4]sStopping jail 'test-jail2'sRemoved logfile: %rs[test-phase 5]s# failure 401 from 192.0.2.1: test 5s#   error 403 from 192.0.2.5: test 5s# failure 401 from 192.0.2.6: test 5s6 ticket(s) in 'test-jail1s%[test-jail1] 192.0.2.1 already banneds[test-jail1] Found 192.0.2.1s[test-jail1] Found 192.0.2.6s[test-jail1] Ban 192.0.2.6s[test-jail1] Found 192.0.2.5s[test-phase 6a]s--asyncRs	192.0.2.5s	192.0.2.6s192.0.2.5 is not banneds[test-jail1] Unban 192.0.2.6s[test-phase 6b]s192.0.2.2/31s[test-jail1] Unban 192.0.2.2s[test-jail1] Unban 192.0.2.3s192.0.2.8/31s192.0.2.100/31s[test-jail1] Unban 192.0.2.8s192.0.2.100/31 is not banneds[test-phase 6c]s
192.0.2.96/28s192.0.2.112/28s[test-jail1] Ban 192.0.2.96/28s[test-jail1] Ban 192.0.2.112/28tunbanips
192.0.2.64/26s [test-jail1] Unban 192.0.2.96/28s![test-jail1] Unban 192.0.2.112/28s[test-phase 7]s[test-jail1] Unban 192.0.2.4sJail 'test-jail1' stoppeds[test-phase 7b]s--allsFlush ban lists'Unbanned 0, 0 ticket(s) in 'test-jail1's[test-phase 8a]Rsxxx-unknown-backend-zzzs0Restart jail 'test-jail1' (reason: 'polling' != sUnknown backend s[test-phase 8b]s[test-phase end-1]s$the jail 'test-jail2' does not exists--if-existss[test-phase end-2]s	--restarts[test-phase end-3]taddignoreips192.0.2.1/32s2001:DB8::1/96tignoreip(ii((RKR`RaR]RFRkR�RR#R�RcRdReRRfRgR�R�R�R*tassertNotLoggedR�R,tassertSortedEqualR�tassertEqualR�(R�RSR�RR((RuRR	R
sI/usr/lib/python2.7/site-packages/fail2ban/tests/fail2banclienttestcase.pyttestServerReloadTest3s|
!*


-





















	b%


	#





















	A%























tactionsnginx-block-maps%(tmp)s/blck-failures.logRtsaction.dRos[nginx-blck-lst]sbackend = pollingsusedns = nos#logpath = %(tmp)s/blck-failures.logsRaction = nginx-block-map[blck_lst_reload="", blck_lst_file="%(tmp)s/blck-lst.map"]s�         blocklist_de[actionban='curl() { echo "*** curl" "$*";}; <Definition/actionban>', email="Fail2Ban <fail2ban@localhost>", apikey="TEST-API-KEY", agent="fail2ban-test-agent", service=<name>]sfilter =sdatepattern = ^Epochs3failregex = ^ failure "<F-ID>[^"]+</F-ID>" - <ADDR>smaxretry = 1senabled = trueRscCs+t|d�}di|d6}di|d6}t|dtttj���dtttj���dtttj���dtttj���d	tttj���d
�|jddd
ddddtdt�t	|�t
|�}|jd|�|jd|�|jd|�|jd|�|jd|�|jdddtdt�|jt
|dddd�t	|�t
|�}|jd|�|jd|�|jd|�|jd|�|jd|�|jt
�|jd�t	|�t
|�}|j|d�dS( NRIs%(tmp)s/blck-failures.logRSs%(tmp)s/blck-lst.mapsw+s" failure "125-000-001" - 192.0.2.1s" failure "125-000-002" - 192.0.2.1s+ failure "125-000-003" - 192.0.2.1 (������)s+ failure "125-000-004" - 192.0.2.1 (������)s" failure "125-000-005" - 192.0.2.1s [nginx-blck-lst] Ban 125-000-001s [nginx-blck-lst] Ban 125-000-002s [nginx-blck-lst] Ban 125-000-003s [nginx-blck-lst] Ban 125-000-004s [nginx-blck-lst] Ban 125-000-005s5 ticket(s)R�R�s\125-000-001 1;
s\125-000-002 1;
s\125-000-003 1;
s\125-000-004 1;
s\125-000-005 1;
s�stdout: '*** curl --fail --data-urlencode server=Fail2Ban <fail2ban@localhost> --data apikey=TEST-API-KEY --data service=nginx-blck-lst s=stdout: ' --data format=text --user-agent fail2ban-test-agentRs125-000-001s125-000-002s125-000-005s5[nginx-blck-lst] Flush ticket(s) with nginx-block-mapR>(RKRFRkR�RR#R�R]R*RgRHtassertInR�R�tassertNotInR�R(R�RSR�Rutlgfntmpfntmp((sI/usr/lib/python2.7/site-packages/fail2ban/tests/fail2banclienttestcase.pyttestServerActions_NginxBlockMap%sR	






tfilters
sendmail-auths%(tmp)s/test.logRns	[DEFAULT]sdbmaxmatches = 1Rrs�test_action = dummy[actionstart_on_demand=1, init="start: %(__name__)s", target="%(tmp)s/test.txt",
      actionban='<known/actionban>;
        echo "<matches>"; printf "=====\n%%b\n=====\n\n" "<matches>" >> <target>']s[sendmail-auth]slogpath = %(tmp)s/test.logsaction = %(test_action)ss%filter = sendmail-auth[logtype=short]smaxretry = 3smaxmatches = 2s[sendmail-reject]s'filter = sendmail-reject[logtype=short]c
Cs3t|d�}di|d6}di|d6}tttj���dtttj���dtttj���df}tttj���dtttj���d	tttj���d
f}|jd�t|d|�|jd
ddtdt	�t
|�t|�}|d}	|j|	|�x"|dD]}	|j
|	|�qGW|jd�t|d|�|jdddtdt	�t
|�t|�}x|D]}	|j
|	|�q�W|jd�|jt|ddd�|jddddtdt	�t|�}|d}	|j|	�|j
|	|�x2|dd!D]#}	|j|	�|j|	|�qWW|jdddtdt	�t|�}|d}	|j|	�|j
|	|�x2|dd!D]#}	|j|	�|j|	|�q�W|jd�|jt�|jt|��dS(NRIs%(tmp)s/test.logRSs%(tmp)s/test.txts] smtp1 sm-mta[5133]: s1000000000001: [192.0.2.1]: possible SMTP attack: command=AUTH, count=1s] smtp1 sm-mta[5133]: s1000000000002: [192.0.2.1]: possible SMTP attack: command=AUTH, count=2s] smtp1 sm-mta[5133]: s1000000000003: [192.0.2.1]: possible SMTP attack: command=AUTH, count=3s� 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.s� 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.s� 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.s[test-phase sendmail-auth]sw+s[sendmail-auth] Ban 192.0.2.1s1 ticket(s) in 'sendmail-auth'R�R�iis[test-phase sendmail-reject]s[sendmail-reject] Ban 192.0.2.2s 1 ticket(s) in 'sendmail-reject's[test-phase restart sendmail-*]R�s	--restarts--allsReload finished.s%[sendmail-auth] Restore Ban 192.0.2.1i����s'[sendmail-reject] Restore Ban 192.0.2.2s[test-phase stop server](RKRkR�RR#R�RFR�R]R*RgRHRRR�R�RR�R�R(
R�RSR�RuRttofnt	smaut_msgt	smrej_msgttdtm((sI/usr/lib/python2.7/site-packages/fail2ban/tests/fail2banclienttestcase.pyttestServerJails_Sendmailush(















cs�t|d��t|d��tjt�d��dt�fd�}d��fd�}|ddd	t�|dd
d	t�|�t�d�|jd�|jt|d
�t�dt	t
tj���dfd�t
�|jdddtdt�t
�|jd�td�t
�|jddddtdt�t
�|jd�t�t�fd��t�dt	t
tj���dfd�|jdddtdt�|jd �|jt|d!d"d#d$�|jd%d&dtdt�t�t
�|jd'�td(�t
�|jd)dtdt�t
�|jd*�|jt|d!d"d#d$�|jd%d+dtdt�|jd,�t�id-d.6�tj���fd/�}�jd0|��jd0d1��tj�fd2�t��j�tjjr*d3nd4t�fd5�}|�_|jt�|jd6�|j�j �|j!�j"d�d�d.<|jd6dt��j$�dS(7NRIs	test1.logsaction.dstest-action1c	sgt�dd|�}t|ddddd|r7dndd	�tjjtjkrct|�ndS(
Nsaction.ds%s.confRQs	[DEFAULT]R>s[Definition]seactionban =     printf %%s "[%(name)s] %(actname)s: ++ ban <ip> -c <bancount> -t <bantime> : <F-MSG>"siactionprolong = printf %%s "[%(name)s] %(actname)s: ++ prolong <ip> -c <bancount> -t <bantime> : <F-MSG>"sBactionunban =   printf %%b '[%(name)s] %(actname)s: -- unban <ip>'(RKRFRcRdReRRfRg(R�tprolongRB(Ru(sI/usr/lib/python2.7/site-packages/fail2ban/tests/fail2banclienttestcase.pyR�s	Rcs�tt�d�ddddddddd	d
dddd
|dddd�ddd�tjjtjkr�tt�d��ndS(Ns	jail.confRQs
[INCLUDES]R>s	[DEFAULT]susedns = nosmaxretry = 3s
findtime = 1msbantime = 5msbantime.increment = truesdatepattern = {^LN-BEG}EPOCHs[test-jail1]s
backend = sfilter =s*action = test-action1[name='%(__name__)s']s*         test-action2[name='%(__name__)s']s
logpath = sXfailregex = ^\s*failure <F-ERRCODE>401|403</F-ERRCODE> from <HOST>:\s*<F-MSG>.*</F-MSG>$senabled = true(RFRKRcRdReRRfRg(R(RuR(sI/usr/lib/python2.7/site-packages/fail2ban/tests/fail2banclienttestcase.pyR�s&
R�R$stest-action2RQs[test-phase 0) time-0]R�sw+s> failure 401 from 192.0.2.11: I'm bad "hacker" `` $(echo test)isDstdout: '[test-jail1] test-action1: ++ ban 192.0.2.11 -c 1 -t 300 : sDstdout: '[test-jail1] test-action2: ++ ban 192.0.2.11 -c 1 -t 300 : R�R�s[test-phase 1) time+10m]i
s7stdout: '[test-jail1] test-action1: -- unban 192.0.2.11s7stdout: '[test-jail1] test-action2: -- unban 192.0.2.11s0 ticket(s) in 'test-jail1's[test-phase 2) time+10m]cs�S(N(((twakeObs(sI/usr/lib/python2.7/site-packages/fail2ban/tests/fail2banclienttestcase.pyR�7ssC failure 401 from 192.0.2.11: I'm very bad "hacker" `` $(echo test)isDstdout: '[test-jail1] test-action1: ++ ban 192.0.2.11 -c 2 -t 300 : sDstdout: '[test-jail1] test-action2: ++ ban 192.0.2.11 -c 2 -t 300 : s"[test-phase 2) time+10m - get-ips]R�s
test-jail1R
s--with-times
192.0.2.11s+ 300 =s[test-phase 2) time+11m]isHstdout: '[test-jail1] test-action2: ++ prolong 192.0.2.11 -c 2 -t 600 : s"[test-phase 2) time+11m - get-ips]s+ 600 =s'[test-phase end) stop on busy observer]itstatecsKtjd�d�d<tj�fd�t��j�tjd�dS(Ns!++ observer enters busy state ...iR&cs�ddkS(NR&i(((R�(sI/usr/lib/python2.7/site-packages/fail2ban/tests/fail2banclienttestcase.pyR�css-- observer leaves busy state.(RRRR.Rmtdb_purge((R�tobsMain(sI/usr/lib/python2.7/site-packages/fail2ban/tests/fail2banclienttestcase.pyt_long_action`s



tcallcSsdS(N(R((((sI/usr/lib/python2.7/site-packages/fail2ban/tests/fail2banclienttestcase.pyR�gscs�ddkS(NR&i(((R�(sI/usr/lib/python2.7/site-packages/fail2ban/tests/fail2banclienttestcase.pyR�isg{�G�z�?g�������?cs
�||�S(N((twtimet	forceQuit(tobsMain_stop(sI/usr/lib/python2.7/site-packages/fail2ban/tests/fail2banclienttestcase.pyt_stoplssobserver leaves busy state(%RKR`RaR]R�RFR�R�R�RkR�RR#R,R�R*R%R4RR&R'taddRR.RmR�RcRdR�R�RR�tidleRt_ObserverThread__dbR(R(R�RSR�RRR)R.((R�RuR(R-RR%sI/usr/lib/python2.7/site-packages/fail2ban/tests/fail2banclienttestcase.pyttestServerObserver�s�

	$




	$







		'	


cCs|jt�dS(N(R�R�(R�RSR�((sI/usr/lib/python2.7/site-packages/fail2ban/tests/fail2banclienttestcase.pyt_testServerStartStop|scCs%xtd�D]}|j�q
WdS(Ni�(txrangeR3(R�ti((sI/usr/lib/python2.7/site-packages/fail2ban/tests/fail2banclienttestcase.pyttestServerStartStop�s(R6R7t_exec_serverR�RR�RR�R�R�R�R�R�RRcRdtskip_if_cfg_missingRR]R#R2R�R3R6(((sI/usr/lib/python2.7/site-packages/fail2ban/tests/fail2banclienttestcase.pyR��sp	��	

=	

O�((R>(bt
__author__t
__copyright__t__license__R[R`RYR�R#R�Rctos.pathRRKRRRRt	functoolsRt	threadingRtclientRR	R
tclient.fail2bancmdlineRtclient.fail2banclientRR�R
Rtclient.fail2banserverRR7R>RRt
server.mytimeRtserver.utilsRtutilsRRR�RRRRRRXRRthelpersRR6R�R�t
getServerPathR�RdtmaxWaitTimeRmR*R�R�R�R�R R�R%R&R,R4R5R8R�R�R;R=t
input_commandR�t
PRODUCTIONtdumpFileRgRFRHR(R|R�R�R�R�R�R�R�R�(((sI/usr/lib/python2.7/site-packages/fail2ban/tests/fail2banclienttestcase.pyt<module>sx(@
											
S		
	,	Fh�

Zerion Mini Shell 1.0