
    =*f                     r   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  SSKJr  SSKJrJrJr  SS	KJr  SS
K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"J#r#  \RH                  RK                  \RH                  RM                  \'5      S5      r(0 r)SSK!J*r*  \	RV                  RX                  r-\RH                  RK                  \RH                  RM                  \'5      S5      r.0 r/ " S S\	R`                  5      r1 " S S\"5      r2 " S S\"5      r3 " S S\"5      r4 " S S\"5      r5g)z!Cyril Jaquier, Yaroslav Halchenkoz>Copyright (c) 2004 Cyril Jaquier, 2011-2013 Yaroslav HalchenkoGPL    N   )ConfigReaderConfigReaderUnsharedDefinitionInitConfigReaderNoSectionError)configparserinc)
JailReaderextractOptionssplitWithOptions)FilterReader)JailsReader)ActionReaderCommandAction)Configurator)MyTime)version   )LogCaptureTestCasewith_tmpdirfiles)
CONFIG_DIRconfigc                   x   ^  \ rS rSrU 4S jrU 4S jrSS jrS rSS jrS r	S r
S	 rS
 rS rS rS rSrU =r$ )ConfigReaderTest5   c                    > [         [        U ]  5         [        R                  " SS9U l        [        U R
                  S9U l        g)zCall before every test case.zf2b-temp)prefixbasedirN)superr   setUptempfilemkdtempdr   cself	__class__s    E/usr/lib/python3/dist-packages/fail2ban/tests/clientreadertestcase.pyr"   ConfigReaderTest.setUp7   s3    $%':.$&/$&    c                 j   > [         R                  " U R                  5        [        [        U ]  5         g)zCall after every test case.N)shutilrmtreer%   r!   r   tearDownr'   s    r*   r0   ConfigReaderTest.tearDown=   s!    --$(*r,   c                    [         R                  R                  U;   a  [         R                  R                  U5      n[         R                  R	                  U R
                  U5      n[         R                  R                  U5      (       d  [         R                  " U5        [        U R
                  < SU< 3S5      nUb  UR                  SU-  5        Ub  UR                  U5        UR                  5         g )N/wz
[section]
option = %s
	)ospathsepdirnamejoinr%   existsmakedirsopenwriteclose)r(   fnamevaluecontentr%   d_fs          r*   _writeConfigReaderTest._writeB   s    WW[[E	wwu1
TVVQ2
''..

KKO
dffe$c*!
77    777'')r,   c                     [         R                  " U R                  < SU< 35        U R                  U R                  R                  S5      5        g )Nr3   r&   )r5   unlinkr%   
assertTruer&   read)r(   r?   s     r*   _removeConfigReaderTest._removeS   s0    ))tvvu%&//$&&++c"#r,   c                     U R                  U R                  R                  U5      5        U R                  R                  SS/5      S   $ )Nsection)intoptionrO   )rH   r&   rI   
getOptions)r(   rC   s     r*   
_getoptionConfigReaderTest._getoptionW   s:    //$&&++a.!			9'8&9	:8	DDr,   c                    U R                   R                  S5        U R                   R                  SSS5        U R                   R                  SSS5        U R                   R                  SSS5        U R                   R                  SS5      nU R	                  USS	S
S.5        U R                   R                  SS5      nU R	                  USS	S S.5        U R                   R                  SSSSS.5      nU R	                  USS	S
S.5        g )N
Definitiona1br&   test))rN   rU   r   )boolrW   r   )rN   r&   r   r   Tr   )rU   rW   r&   ))rN   rU   )rY   rW   )rN   r&   )rN   r   )rY   r   )r&   add_sectionsetrP   assertSortedEqual)r(   optss     r*   testConvertConfigReaderTest.testConvert[   s    &&\"&&**\3$&&**\3$&&**\3'			<7
9$QT:;			<.
0$QT=>			<	+J7
9$QT:;r,   c                    [         R                  R                  U R                  S5      nU R	                  SS5        U R                  U R                  S5      S5        [         R                  " US5        [         R                  " U[         R                  5      (       d+  U R                  U R                  R                  S5      5        g SS Kn[        R                  " SUR                  5       -  5      e)Nzd.confr   r%   z0Skipping on %s -- access rights are not enforced)r5   r6   r9   r%   rD   assertEqualrQ   chmodaccessR_OKassertFalser&   rI   platformunittestSkipTest)r(   rC   rf   s      r*   testInaccessibleFile%ConfigReaderTest.testInaccessibleFilej   s    ggll4668$!++h4??3'+((1a. 
1bgg		DFFKK$%			MPXPaPaPcc	ddr,   c                    U R                  U R                  R                  S5      5        U R                  SS5        U R	                  U R                  5       S5        U R                  SS5        U R	                  U R                  5       S5        U R                  SS5        U R	                  U R                  5       S	5        U R                  S
S5        U R	                  U R                  5       S	5        U R                  SS5        U R	                  U R                  5       S5        U R                  SS5        U R	                  U R                  5       S5        U R                  SS5        U R	                  U R                  5       S5        U R                  S5        U R                  S5        U R	                  U R                  5       S5        U R                  S5        U R	                  U R                  5       S	5        U R                  S5        U R	                  U R                  5       S5        U R                  S
5        U R	                  U R                  5       S5        g )Nr&   c.confrV   r   2r   zc.d/98.conf998i  zc.d/90.conf990zc.d/99.conf999i  zc.local3   zc.d/1.local4   i  )re   r&   rI   rD   ra   rQ   rJ   r(   s    r*   testOptionalDotDDir$ConfigReaderTest.testOptionalDotDDirw   s   466;;s#$++h4??$a(++h4??$a(++mU#4??$c*++mU#4??$c*++mU#4??$c*++i4??$a(++mS!4??$a(,,},,y4??$c*,,}4??$c*,,}4??$c*,,}4??$a(r,   c                    U R                  SS SS9  U R                  SS SS9  U R                  SS SS9  U R                  SS S	S9  U R                  S
S SS9   " S S[        5      nU" SS0 5      U l        U R                  R                  U R                  5        U R                  U R                  R                  5       5        U R                  R                  0 SS9  U R                  R                  5       nU R                  UR                  S5      S5        U R                  UR                  S5      S5        U R                  UR                  S5      S5        g )Nrl   zS
[INCLUDES]
before = ib.conf
after  = ia.conf
[Definition]
test = %(default/test)s
r@   rA   zib.confz,
[DEFAULT]
test = A
[Definition]
option = 1
zib.localz,
[DEFAULT]
test = B
[Definition]
option = 2
zia.confz,
[DEFAULT]
test = C
[Definition]
oafter = 3
zia.localz,
[DEFAULT]
test = D
[Definition]
oafter = 4
c                   ,    \ rS rSrSS/SS/SS/S.rSrg)?ConfigReaderTest.testLocalInIncludes.<locals>.TestDefConfReader   rN   Nstring)rO   oafterrX    )__name__
__module____qualname____firstlineno___configOpts__static_attributes__r   r,   r*   TestDefConfReaderr{      s    t}t};r,   r   r&   rO   T)allr   r~   rt   rX   D)rD   r   r&   
setBaseDirr%   rH   rI   rP   getCombinedra   get)r(   r   os      r*   testLocalInIncludes$ConfigReaderTest.testLocalInIncludes   s9   ++hd -+  ++it .+  ++j /+  ++it .+  ++j /+ 4  S(B/$&&&DFF//$&&++- &&BD!
ff!155?A&155?A&155=#&r,   c                    U R                  U R                  R                  S5      5        U R                  SS SS9  U R	                  U R                  R                  S5      5        U R                  U R                  R                  5       SS/5        U R                  U R                  R                  SS5      S5        U R                  U R                  R                  SS	5      S
5        U R                  U R                  R                  SS5      S5        U R                  U R                  R                  SS5      S5        U R                  U R                  R                  SS5      S5        g )Nizi.confzu
[DEFAULT]
b = a
zz = the%(__name__)s

[section]
y = 4%(b)s
e = 5${b}
z = %(__name__)s

[section2]
z = 3%(__name__)s
ry   rM   section2y4aez5${b}zzz
thesection	3section2)re   r&   rI   rD   rH   ra   sectionsr   ru   s    r*   testInterpolations#ConfigReaderTest.testInterpolations   s
   466;;s#$++hd -+  //$&&++c"#466??$y*&=>466::i-t4466::i-w7466::i-y9466::i.=466::j#.<r,   c                 ~   U R                  U R                  R                  S5      5        U R                  SS SS9  U R	                  U R                  R                  S5      5        U R                  U R                  R                  SS5      S5        U R                  U R                  R                  SS5      S	5        g )
Ngg.confz4
[DEFAULT]
# A comment
b = a
c = d ;in line comment
ry   DEFAULTrW   rU   r&   r%   )re   r&   rI   rD   rH   ra   r   ru   s    r*   testCommentsConfigReaderTest.testComments   s    466;;s#$++hd -+  //$&&++c"#466::i-s3466::i-s3r,   c                    U R                  U R                  R                  S5      5        U R                  SS SS9  U R	                  U R                  R                  S5      5        U R                  U R                  R                  SS5      S5        U R                  U R                  R                  SS5      S	5        U R                  U R                  R                  S
S5      S5        U R                  U R                  R                  S
S5      S5        U R                  U R                  R                  S
S5      S5        U R                  U R                  R                  S
S5      S5        U R                  U R                  R                  SS5      S5        U R                  U R                  R                  SS5      S5        U R                  U R                  R                  SS5      S5        U R                  U R                  R                  SS5      S5        U R                  [        U R                  R                  SS5        U R                  [        U R                  R                  S
S5        g )Nr   r   z
[DEFAULT]
a = def-a
b = def-b,a:`%(a)s`
c = def-c,b:"%(b)s"
d = def-d-b:"%(known/b)s"

[jail]
a = jail-a-%(test/a)s
b = jail-b-%(test/b)s
y = %(test/y)s

[test]
a = test-a-%(default/a)s
b = test-b-%(known/b)s
x = %(test/x)s
y = %(jail/y)s
ry   rX   rU   ztest-a-def-arW   ztest-b-def-b,a:`test-a-def-a`jailzjail-a-test-a-def-az+jail-b-test-b-def-b,a:`jail-a-test-a-def-a`r&   z5def-c,b:"jail-b-test-b-def-b,a:`jail-a-test-a-def-a`"r%   z'def-d-b:"def-b,a:`jail-a-test-a-def-a`"z'def-c,b:"test-b-def-b,a:`test-a-def-a`"z def-d-b:"def-b,a:`test-a-def-a`"r   zdef-c,b:"def-b,a:`def-a`"zdef-d-b:"def-b,a:`def-a`"xr   )	re   r&   rI   rD   rH   ra   r   assertRaises	Exceptionru   s    r*   testTargetedSectionOptions+ConfigReaderTest.testTargetedSectionOptions   s   466;;s#$++hd -+ $ //$&&++c"#466::fc*N;466::fc*,KL466::fc*,AB466::fc*,YZ466::fc*,cd466::fc*,UV466::fc*,UV466::fc*,NO466::i-/JK466::i-/JKItvvzz637Itvvzz637r,   )r&   r%   )NN)r&   )r   r   r   r   r"   r0   rD   rJ   rQ   r^   ri   rv   r   r   r   r   r   __classcell__r)   s   @r*   r   r   5   sG    0+
"$E<e)4.'`=.
4 8  8r,   r   c                      ^  \ rS rSrU 4S jrS rS rS rS rS r	S r
S	 rS
 rS rS rS rS rS r\S 5       rS rSrU =r$ )JailReaderTesti  c                 .   > [         [        U ]
  " U0 UD6  g N)r!   r   __init__r(   argskwargsr)   s      r*   r   JailReaderTest.__init__	  s    &77r,   c                    S H  nU R                  [        SU< S35      SS/5        U R                  [        SU< S35      SS/5        U R                  [        SU< S35      SS/5        U R                  [        SU< S35      SS/5        U R                  [        SU< S35      SS/5        U R                  [        SU< S35      SS/5        U R                  [        S	U< S35      S	S/5        M     g )
N)
	 rU   rW   za[x=y]za[x=y][z=z]za[x="y][z"]z
a[x="y z"]z
a[x="y	z"]z
a[x="y
z"])ra   r   )r(   r7   s     r*   testSplitWithOptions#JailReaderTest.testSplitWithOptions  s    c$s_5#QTAUV$C%9:(QTAUV$%>?-QTAUV$%>?-QTAUV$%=>,QTAUV$%>?-QTAUV$%>?-QTAUV r,   c                 j    [        S[        [        S9nU R                  [        UR
                  5        g )NXXXABSENTXXXr    share_config)r
   r   CONFIG_DIR_SHARE_CFGr   
ValueErrorrI   r(   r   s     r*   testIncorrectJail JailReaderTest.testIncorrectJail  s%    	NJEY	Z$J		*r,   c                 (   [        S[        [        S9nU R                  UR	                  5       5        U R                  UR                  5       5        U R                  UR                  5       5        U R                  S5        U R                  S5        g )Nemptyactionr   z"No filter set for jail emptyactionz'No actions were defined for emptyaction)r
   IMPERFECT_CONFIGIMPERFECT_CONFIG_SHARE_CFGrH   rI   rP   	isEnabledassertLoggedr   s     r*   testJailActionEmpty"JailReaderTest.testJailActionEmpty  sh    	M+;Jd	e$//$))+//$//#$//$.."#89=>r,   c                 6   [        S[        [        S9nU R                  UR	                  5       5        U R                  UR                  5       5        U R                  UR                  5       5        U R                  S[        -  5        U R                  S5        g )Nmissingbitsjailr   zJFound no accessible config files for 'filter.d/catchallthebadies' under %szUnable to read the filter	r
   r   r   rH   rI   re   rP   r   r   r   s     r*   testJailActionFilterMissing*JailReaderTest.testJailActionFilterMissing#  sq    	%/?Nh	i$//$))+4??$%//$.."#`csst/0r,   c                    [        S[        [        S9nU R                  UR	                  5       5        U R                  UR                  5       5        U R                  UR                  5       5        U R                  S5        g )Nbrokenactiondefr   z$Invalid action definition 'joho[foo'r   r   s     r*   testJailActionBrokenDef&JailReaderTest.testJailActionBrokenDef+  ^    	%/?*
,$//$))+4??$%//$.."#:;r,   c                 "   [        S[        [        S9nU R                  UR	                  5       5        U R                  UR                  5       5        U R                  UR                  5       5        U R                  UR                  S   S5        g )N
tz_correctr   logtimezoneUTC+0200)	r
   r   r   rH   rI   rP   r   ra   optionsr   s     r*   testJailLogTimeZone"JailReaderTest.testJailLogTimeZone3  se    	L*:*
,$//$))+//$//#$//$.."#4<<.
;r,   c                    [        S[        [        S9nU R                  UR	                  5       5        U R                  UR                  5       5        U R                  UR                  5       5        U R                  S5        g )Nbrokenfilterdefr   z$Invalid filter definition 'flt[test'r   r   s     r*   testJailFilterBrokenDef&JailReaderTest.testJailFilterBrokenDef;  r   r,   c                    [         R                  R                  SS9  [        S[        [
        S9nU R                  UR                  5       5        U R                  UR                  5       5        U R                  UR                  5       5        U R                  UR                  5       S5        UR                  S5        U R                  UR                  5       S5        g )NTstocksshdr   zssh-funky-blocker)rg   F2BSkipIfCfgMissingr
   r   r   rH   rI   rP   re   r   ra   getNamesetNamer   s     r*   testStockSSHJailJailReaderTest.testStockSSHJailC  s    
,,d+	FJ=Q	R$//$))+//$//#$4>>#$4<<>6*,,"#4<<>#67r,   c           	         [         R                  R                  SS9  [        S[        [
        SS9nU R                  UR                  5       5        U R                  UR                  5       5        U R                  UR                  5       5        UR                  5       nU R                  / SQ/U Vs/ s H!  n[        U5      S:  d  M  US   S:X  d  M  UPM#     sn5        U R                  / SQ/U Vs/ s H!  n[        U5      S:  d  M  US   S	:X  d  M  UPM#     sn5        U R                  / S
Q/U Vs/ s H!  n[        U5      S:  d  M  US   S:X  d  M  UPM#     sn5        UR                  / SQ5      nSnU HG  nU R                  [        U5      S:  =(       a    US   R                  S5      5        US-  nXT:  d  MG    g    g s  snf s  snf s  snf )NTr   sshd-override-flt-optsr    r   force_enable)r[   r   	prefregexz^Testr   r   )r[   r   addjournalmatchz
_COMM=testr   )r[   r   maxlinesr   r   )r[   r   usednsnor   regexr   )rg   r   r   r
   r   r   rH   rI   rP   r   convertra   lenindexre   endswith)r(   r   streamr   	usednsidxr   s         r*   testOverrideFilterOptInJail*JailReaderTest.testOverrideFilterOptInJailM  s   
,,d+	,6F*
?$//$))+//$//#$//$.."#<<>& KL<v!Q!A!(;Av<> VWBv!Q!A!0A(AAvBD DE;v!Q!A!
(:Av;= llLM)!aCFQJ91Q4==#9:61mU  = C <s6   2G
	G
G
4G
G
G
6G
G
G
c                    [         R                  R                  SS9  S H  nS H  n[        SUR	                  5       -   [
        [        SS9nU R                  UR                  5       5        U R                  UR                  5       5        UR                  5       nU R                  SUR                  5       SS	U-  //U Vs/ s H!  n[        U5      S
:  d  M  US
   S:X  d  M  UPM#     sn5        M     M     g s  snf )NTr   )r   r   )JRNLFILETESTINITchecklogtype_r   r[   addfailregexz^%s failure from <HOST>$r   )rg   r   r   r
   lowerr   r   rH   rI   rP   r   ra   r   r   )r(   r   prefliner   r   r   s         r*   testLogTypeOfBackendInJail)JailReaderTest.testLogTypeOfBackendInJailg  s    
,,d+a3xohnn&66@P,4ADOODIIK OODOO%&\\^Fudllnn>X[c>cdeAA3q6A:a!A$.*@aAC 4  Bs   C9C9#C9c                    SnSSS04n[        U5      nU R                  X#5        U R                  S0 4[        S5      5        U R                  SSSS.4[        S	5      5        U R                  S
0 4[        S
5      5        U R                  SSS04[        S5      5        U R                  SSS04[        S5      5        U R                  [        [         S5        U R                  [        [         S5        U R                  [        [         S5        U R                  [        [         S5        U R                  [        [         S5        SnS0 4n[        U5      nU R                  X#5        SnSSSSSSSSS S!S"S"S#.4n[        U5      nU R                  X#5        [        UR	                  SS$5      5      nUS%   [        S& US'   R                  5        5       5      4nU R                  XC5        g )(Nzmail-whois[name=SSH]z
mail-whoisnameSSHzmail.who_iscatdog)rU   rW   zmail.who_is[a=cat,b=dog]zmail--ho_ismailrU   ,zmail[a=',']rW   zmail[a=b, ]z	mail-how[z-mail[a="test with interim (wrong) "" quotes"]z-mail[a='test with interim (wrong) '' quotes']zmail[a='x, y, z', b=x, y, z]z	mail['s']zabc[]abczoption[opt01=abc,opt02="123",opt03="with=okay?",opt04="andwith,okay...",opt05="how about spaces",opt06="single'in'double",opt07='double"in"single',  opt08= leave some space, opt09=one for luck, opt10=, opt11=]rO   123z
with=okay?zandwith,okay...zhow about spaceszsingle'in'doublezdouble"in"singlezleave some spacezone for luck )opt01opt02opt03opt04opt05opt06opt07opt08opt09opt10opt11][r   c              3   L   #    U  H  u  pXR                  S S5      4v   M     g7f)r  r  N)replace).0kvs      r*   	<genexpr>1JailReaderTest.testSplitOption.<locals>.<genexpr>  s"     B.AdaIIc4 !.As   "$r   )r   ra   r   r   r  dictitems)r(   rO   expectedresult	expected2s        r*   testSplitOptionJailReaderTest.testSplitOptionv  s   !&VUO,(&!&8$M2&}(EFM5#9:NKe<fgM2&}(EFFS#J')FGFS#J')FGJ<J0cdJ0cdJ0RSJ@ &R[(&!&8$ c&  ( &!&8$ &..d34&{Bhqk.?.?.ABB) 9%r,   c                    [        SS[        [        S9nU R                  UR	                  5       5        U R                  UR                  5       5        U R                  UR                  S   S5        U R                  UR                  S   S5        U R                  UR                   Vs/ s H  o"R                  5       PM     sn/ SQS	SSS
SS/SS
/SS///// SQS	SSSSS/SS/SS/SS///// SQS	SSSSS/SS/SS/////5        g s  snf )N	multi-logT)r   r    r   logpathza.log
b.log
c.logactionzeaction[actname='ban']
action[actname='log', logpath="a.log
b.log
c.log
d.log"]
action[actname='test'])r[   r,  	addactionban	multi-setr0  	actionbanz4echo "name: ban, ban: <ip>, logs: a.log
b.log
c.log"actnamer  )r[   r,  r/  logr4  z:echo "name: log, ban: <ip>, logs: a.log
b.log
c.log
d.log"za.log
b.log
c.log
d.log)r[   r,  r/  rX   rX   z5echo "name: test, ban: <ip>, logs: a.log
b.log
c.log")r
   r   r   rH   rI   rP   ra   r   r\   _JailReader__actionsr   )r(   r   rU   s      r*   testMultiLineOption"JailReaderTest.testMultiLineOption  sR   	Kd<L[u	v$//$))+//$//#$4<<	*,AB4<<)  ,^  _t/H/HI/H!))+/HI,{KSXJK[[ / 
 -{KSXQR,-/D[ / 
 .[(TZKL[] 0 L Is   *Dc           
          [         R                  R                  SS9  [        SS[        S9n[
        R                  " US5        UR                  R                  5       n[        S5      US'   U R                  UR                  5       5        UR                  5       n/ nU H}  n[        U5      S::  a  M  US   S	:X  a  US   S
:X  a  UR                  U5        M9  US   S:X  d  MD  UR                  US    Vs/ s H  ofS   S
:X  d  M  S	/USS -   U-   PM     sn5        M     S[         -  nU R#                  [        U5      S5        U R#                  US   S	SSSS
U/5        U R#                  US   S	SSSS
U/5        g s  snf )NTr   blocklisttest)r   r    r   ))r   r9  )filterr  )	failregexz^test <HOST>$)senderzf2b-test@example.com)blocklist_de_apikeyztest-key)r.  zX%(action_blocklist_de)s
mynetwatchman[port=1234,protocol=udp,agent="%(fail2ban_agent)s"]rt   r   r[   agentr1  r   zFail2Ban/%sr   r.  blocklist_demynetwatchman)rg   r   r   r
   r   r   rI   _cfgget_sectionsr$  rH   rP   r   r   appendextendr   ra   )r(   r   r   r   actcmdr   	useragents           r*   testVersionAgentJailReaderTest.testVersionAgent  sk   
,,d+	O$
	K$D&!YY##%(" $ (? //$//#$<<>&
#c	#h!m	!fo#a&G+JJsOA+JJAJ1A$'/&#a("Q&JK  g%)3s8Q3q6E?HngW`ab3q6E?HowXabc	 Ks   5E;
E;
c                 l   [         R                  R                  US5      n[        US5      R	                  5         [         R                  R                  US5      n[         R
                  " SU5        U R                  [        R                  " [         R                  R                  US5      5      U/5        U R                  [        R                  " U5      / 5        U R                  SU-  5        U R                  [        R                  " [         R                  R                  US5      5      / 5        g )Nf1r4   f2nonexisting*z4File %s is a dangling link, thus cannot be monitored)
r5   r6   r9   r<   r>   symlinkra   r
   _globr   )r(   r%   rK  rL  s       r*   testGlobJailReaderTest.testGlob  s     
ww||At"r3-	ww||At"**]2 :##BGGLLC$89B4@:##B',JROP:##BGGLLM$BCRHr,   c                    [        0 S9nU R                  UR                  5       / 5        U R                  UR	                  S5      5        U R                  [        UR                  S0 5        U R                  [        UR                  S5        U R                  [        UR                  SS5        U R                  [        UR                  S0 5        g )Nr   rX   any)r   ra   r   re   has_sectionr   r   merge_sectionr   r   rP   )r(   r&   s     r*   testCommonFunction!JailReaderTest.testCommonFunction  s    #!1::<$1==()NAOOVR@NAIIv6NAEE659NALL&"=r,   r   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r)  r6  rH  r   rQ  rX  r   r   r   s   @r*   r   r     sn    8	W+?1<<<84C3&j0dB I I > >r,   r   c                   J    \ rS rSrS rS rS rS rS rS r	S r
S	 rS
 rSrg)FilterReaderTesti   c                    / SQSSS/ SQ// SQ/ SQ/ SQ/ S	Q/n[        SS0 5      nUR                  [        5        UR                  5         UR	                  S 5        U R                  UR                  5       U5        [        SSS
S0[        [        S9nUR                  5         UR	                  S 5        SUS   S'   U R                  UR                  5       U5        g )N)r[   
testcase01r   r   r1  r]  r  )z^\s*(?:\S+ )?(?:kernel: \[\d+\.\d+\] )?(?:@vserver_\S+ )?(?:(?:\[\d+\])?:\s+[\[\(]?sshd(?:\(\S+\))?[\]\)]?:?|[\[\(]?sshd(?:\(\S+\))?[\]\)]?:?(?:\[\d+\])?:)?\s*(?:error: PAM: )?Authentication failure for .* from <HOST>\s*$z^\s*(?:\S+ )?(?:kernel: \[\d+\.\d+\] )?(?:@vserver_\S+ )?(?:(?:\[\d+\])?:\s+[\[\(]?sshd(?:\(\S+\))?[\]\)]?:?|[\[\(]?sshd(?:\(\S+\))?[\]\)]?:?(?:\[\d+\])?:)?\s*(?:error: PAM: )?User not known to the underlying authentication module for .* from <HOST>\s*$a  ^\s*(?:\S+ )?(?:kernel: \[\d+\.\d+\] )?(?:@vserver_\S+ )?(?:(?:\[\d+\])?:\s+[\[\(]?sshd(?:\(\S+\))?[\]\)]?:?|[\[\(]?sshd(?:\(\S+\))?[\]\)]?:?(?:\[\d+\])?:)?\s*(?:error: PAM: )?User not known to the\nunderlying authentication.+$<SKIPLINES>^.+ module for .* from <HOST>\s*$)r[   r]  addignoreregexz"^.+ john from host 192.168.1.1\s*$)r[   r]  r   z
_COMM=sshd+z_SYSTEMD_UNIT=sshd.servicez_UID=0)r[   r]  r   zFIELD= with spaces r_  zAFIELD= with + char and spaces)r[   r]  datepatternz%Y %m %d %H:%M:%Sr   5r   r       r   )r   r   TEST_FILES_DIRrI   rP   r\   r   TEST_FILES_DIR_SHARE_CFG)r(   outputfilterReaders      r*   r^   FilterReaderTest.testConvert  s    '~ 06 7*?B</&2 lL"=,.)$ --/8lL:s:K)>C,$&)B---/8r,   c                     [        SSSSS.[        [        S9nUR                  5         UR	                  S 5        UR                  5       nU R                  US   S5        U R                  S5        g )Nr]  z<test>X)r   rX   rb  r   z6Wrong int value 'X' for 'maxlines'. Using default one:)r   rf  re  rI   rP   r   assertNotEqualr   r(   rh  r]   s      r*   testConvertOptions#FilterReaderTest.testConvertOptions.  sj    lLxY\:])>C,$		!	!	#$d:&,LMr,   c                     / SQ/n[        SS0 [        [        S9nUR                  5         UR	                  S 5        UR                  5       nU R                  X15        g )N)r[   jailnamer  z to=sweet@example.com fromip=<IP>substitutionrq  rb  r   rf  re  rI   rP   r   r\   r(   rg  rh  r&   s       r*   !testFilterReaderSubstitionDefault2FilterReaderTest.testFilterReaderSubstitionDefault7  sV    ST&nj")>C,$!#r,   c                     [        SS0 [        [        S9nUR                  5         UR	                  S 5        UR                  5       nU R                  SUS   ;   5        g )N
testcase02rq  rb  r   r;  )r   rf  re  rI   rP   r   rH   rm  s      r*   testFilterReaderSubstKnown+FilterReaderTest.testFilterReaderSubstKnown@  sX     lJ)>C,$		!	!	#$//&D--.r,   c                     / SQ/n[        SSSS0[        [        S9nUR                  5         UR	                  S 5        UR                  5       nU R                  X15        g )N)r[   rq  r  zto=sour@example.com fromip=<IP>rr  rq  honeypotzsour@example.comrb  rs  rt  s       r*   testFilterReaderSubstitionSet.FilterReaderTest.testFilterReaderSubstitionSetK  s\    RS&nj:GY:Z)>C,$!#r,   c                     / SQ/n[        S5      u  p#[        SSU[        [        S9nUR	                  5         UR                  S 5        UR                  5       nU R                  XQ5        g )N)r[   rq  r  z?^to=test,sweet@example.com,test2,sweet@example.com fromip=<IP>$zwsubstitution[failregex="^<known/failregex>$", honeypot="<sweet>,<known/honeypot>", sweet="test,<known/honeypot>,test2"]rr  rq  rb  r   r   rf  re  rI   rP   r   r\   r(   rg  
filterName	filterOptrh  r&   s         r*   testFilterReaderSubstitionKnown0FilterReaderTest.testFilterReaderSubstitionKnownT  sg    rs&(|~*nj))>C,$!#r,   c                     / SQ/n[        S5      u  p#[        SSU[        [        S9nUR	                  5         UR                  S 5        UR                  5       nU R                  XQ5        g )N)r[   rq  r  z)^\s*to=fail2ban@localhost fromip=<IP>\s*$zWsubstitution[failregex="^\s*<Definition/failregex>\s*$", honeypot="<default/honeypot>"]rr  rq  rb  r  r  s         r*   !testFilterReaderSubstitionSection2FilterReaderTest.testFilterReaderSubstitionSection_  sg    ^_&(^`*nj))>C,$!#r,   c                 z   [        SSSS0[        [        S9nUR                  5         UR	                  S 5        U R                  [        [         R                  U5        [        SSSSS.[        [        S9nUR                  5         UR	                  S 5        U R                  [        [         R                  U5        g )Nrr  rq  r|  z
<honeypot>rb  z<sweet>)r|  sweet)r   rf  re  rI   rP   r   r   r   )r(   rh  s     r*   testFilterReaderSubstitionFail/FilterReaderTest.testFilterReaderSubstitionFailj  s    nj:|:T)>C,$J 4 4lCnjy[g:h)>C,$J 4 4lCr,   c                 ~   [         R                  R                  [         R                  R                  [        S5      5      n[        [         R                  R                  US5      S0 5      nU R                  UR                  5       [         R                  R                  US5      [         R                  R                  US5      /5         UR                  S 5        UR                  SS5        UR                  SS5        UR                  SS5        g ! [         a  nU R                  S	U-  5         S nAg S nAff = f)
Nfilter.dztestcase01.confr]  ztestcase-common.confrT   __prefix_liner;  ignoreregexz)unexpected options after readexplicit: %s)r5   r6   abspathr9   re  r   ra   readexplicitrP   r   r   fail)r(   path_rh  r   s       r*   testFilterReaderExplicit)FilterReaderTest.testFilterReaderExplicitx  s    
''//"'',,~zB
C%bggll52CDlTVW,<,,.GGLL./eEV1WX@4 L/2L+.L-0	 @998A>??@s   AD 
D<D77D<r   N)r   r   r   r   r^   rn  ru  ry  r}  r  r  r  r  r   r   r,   r*   r[  r[     s3    *9XN$	/$	$	$D@r,   r[  c                   4    \ rS rSrSS jrS r\S 5       rSrg)JailsReaderTestCachei  Nc                     [        X#S9nUR                  U5        UR                  5         UR                  5         UR	                  5         U R                  UR                  S 5      5        g )Nr   r   )r   r   	readEarlygetEarlyOptionsreadAllrH   rP   )r(   r    r   r   configurators        r*   _readWholeConf#JailsReaderTestCache._readWholeConf  sU    <S,'" //,))$/0r,   c                     SnU R                  5       R                  S5       H)  n[        R                  " SU-   U5      (       d  M$  US-  nM+     U$ )Nr   r   z^\s*Reading files?: .*/r   )getLogrsplitrematch)r(   	filematchcntss       r*   _getLoggedReadCount(JailsReaderTestCache._getLoggedReadCount  sI    	#;;=%ahh))3Q771HC & 
*r,   c                 L   [         R                  R                  5         [        R                  n[
        R                  [        l         [        R                  " U5        [        R                  " [        U5        [        R                  " [        S-   US-   5        [        R                  " [        S-   US-   5        [        5       nU R                  XS9  U R                  S5      nU R                  US:H  SU-  5        U R                  US	US
9  U R                  S5      nU R                  US:H  SU-  5        U R                  S5      nU R                  US:H  SU-  5        U R                  S5      nU R                  US:H  SU-  5        U[        l        g ! U[        l        f = f)Nz
/jail.confz/jail.localz/fail2ban.confz/fail2ban.localrT  z
jail.localr   z3Unexpected count by reading of jail files, cnt = %sTr  zjail\.localz:Unexpected count by second reading of jail files, cnt = %szfilter\.d/common\.confz5Unexpected count by reading of filter files, cnt = %szaction\.d/iptables\.confz5Unexpected count by reading of action files, cnt = %s)rg   r   
SkipIfFastr	   logLevelloggingDEBUGr.   r/   copytreer   copyr$  r  r  rH   )r(   r    saved_ll	share_cfgr  s        r*   testTestJailConfCache*JailsReaderTestCache.testTestJailConfCache  sh   
,,%%($]]/'	==	??:w'	;;zL('M*AB	;;z,,g8I.IJ v9 w7		!	!,	/3 ??3!8RUXXY wT	J		!	!.	13??3!8Y\__` 
	!	!";	<3??3!8TWZZ[		!	!"=	>3??3!8TWZZ[&?h?s   	EF F#r   )FN)	r   r   r   r   r  r  r   r  r   r   r,   r*   r  r    s     1 #' #'r,   r  c                   ~   ^  \ rS rSrU 4S jrS rS rS rS rS r	S r
S	 r\S
 5       rS rS r\S 5       rSrU =r$ )JailsReaderTesti  c                 .   > [         [        U ]
  " U0 UD6  g r   )r!   r  r   r   s      r*   r   JailsReaderTest.__init__  s    '88r,   c                     [         R                  R                  S5      (       d*  [        SS9nU R	                  [
        UR                  5        g g )Nz/XXXr   )r5   r6   r:   r   r   r   rI   )r(   readers     r*   testProvidingBadBasedir'JailsReaderTest.testProvidingBadBasedir  s8    			'6Z- 
 r,   c                 H   [        [        [        S9nU R                  UR	                  5       5        U R                  UR                  SS95        U R                  [        UR                  5        UR                  SS9nS U l
        U R                  U/ SQ/ SQSS	S
/ SQ/SS	// SQ/ SQ/ SQ/ SQ/ SQSSSSSS/SS/SS//// SQ/ SQ/ SQ/ SQSS/SS/SS/SS// SQSS /S!S"/S!S#/S!S$/S!S%//5        U R                  S&5        U R                  S'5        U R                  S(5        g ))Nr   F)ignoreWrongTallow_no_files)addr   auto)r  test-known-interpr  r1  r  r  )z*failure test 1 (filter.d/test.conf) <HOST>z+failure test 2 (filter.d/test.local) <HOST>z"failure test 3 (jail.local) <HOST>start)r  missinglogfilesr  )r[   r  r  <IP>)r  brokenactionr  )r[   r  r  r  )r[   r  r/  r  r  r.  r2  zhit with big stick <ip>r3  r  )r  parse_to_end_of_jail.confr  )r[   r  r  r  )r[   r   r  r  )r[   r   r   r   r   r  r  )r  r   r  r   zconfig-errorz~Jail 'brokenactiondef' skipped, because of wrong configuration: Invalid action definition 'joho[foo': unexpected option syntaxz~Jail 'brokenfilterdef' skipped, because of wrong configuration: Invalid filter definition 'flt[test': unexpected option syntaxzoJail 'missingaction' skipped, because of wrong configuration: Unable to read action 'noactionfileforthisaction'zmJail 'missingbitsjail' skipped, because of wrong configuration: Unable to read the filter 'catchallthebadies'z!Errors in jail 'missingbitsjail'.zSkipping...z6No file(s) found for glob /weapons/of/mass/destruction)r   r   r   rH   rI   re   rP   r   r   r   maxDiffr\   r   assertNotLogged)r(   jailscomm_commandss      r*   testReadTestJailConf$JailsReaderTest.testReadTestJailConf  s}   
.=W
X%//%**,5###67J.--t-4-$,"(%~ 8 
 !"&6#38.(N,- n= 
 1@14m n)*(l EF EFuwsuE$%L 78}%LMr,   c           
         [         R                  R                  SS9  [        R                  " [        R
                  R                  [        SS5      5       GHb  n[        R
                  R                  U5      R                  SS5      n[        US0 [        S9nU R                  UR                  5       5         UR                  0 5        UR%                  S5      (       a  M  U R'                  SUR)                  5       SU-  S9  U R                  UR*                  R-                  SS5      R/                  5       SU-  S9  UR1                  [2        R4                  [7        S5      -  S9nU R9                  UR-                  S5      SSU-  S9  US;   d  GM>  U R'                  SUR-                  SS5      SU-  S9  GMe     g ! [         a;  nU R                  S	U< S
[!        U5      R"                  < SU< 35         S nAGN4S nAff = f)NTr   action.d*.confz.confr  r   r   zaction r   z: z-commonrT   z.Action file %r is lacking [Definition] sectionmsgr2  z#Action file %r is lacking actionban)timeoutbantime)ignorer  z5Action file %r does not contains jail-name 'f2b-TEST')pfziptables-allportsiptables-multiportzf2b-TESTactionstartzSAction file %r: interpolation of actionstart does not contains jail-name 'f2b-TEST')rg   r   r   globr5   r6   r9   r   basenamer  r   rH   rI   rP   r   r  typer   r   assertInr   _optsr   stripr   r   _escapedTagsr[   ra   )r(   actionConfig
actionNameactionReaderr   r]   s         r*   testReadStockActionConf'JailsReaderTest.testReadStockActionConf  s   
,,d+iiZX NOl  .66wC:z62zJ<??<$$&'GB 

i
(
(MM, 5 5 7	9L	H  J 	OOL&&**;;AAC	.	=  ? ##&&-C)DD $ FDTXXf%v	@<	O  Q FF	]]:txxr:
_bn
n  p- P  GIIZa1A1A1EFFGs   :F??
H	0G??Hc           
         [         R                  R                  SS9  [        [        [
        S9nU R                  UR                  5       5        U R                  UR                  5       5        UR                  5       nU R                  U/ 5        [        5       nUR                  5        GH*  nUS:X  a  M  UR                  US5      n[        U5      u  pVUR                  U5        U R                  [!        U5      5        [#        XTU[
        [        S9nU R                  UR                  5       SU-   5        UR                  0 5        U R                  UR$                  R                  SS	5      R'                  5       5        UR                  US
5      nU R                  [!        UR'                  5       5      5        [)        U5       GH	  n	[        U	5      u  pU R                  [!        U
5      5        U R                  [+        U[,        5      5        U
S:X  a  U R/                  SU5        [1        X0 [
        [        S9nU R                  UR                  5       5        UR                  0 5        UR                  5       nU R                  [!        U5      5        U R                  UR$                  R                  SS	5      R'                  5       5        GM     GM-     g )NTr   r   INCLUDESr:  rb  zFailed to read filter:r;  r  r.  r  portr2  )rg   r   r   r   r   r   rH   rI   rP   r   ra   r[   r   r   r   r  r   r   r  r  r   
isinstancer$  r  r   )r(   r  r  
allFiltersr   r  r  rh  actionsrE  actNameactOptr  cmdss                 r*   testReadStockJailConf%JailsReaderTest.testReadStockJailConf  s.   
,,d+
j7K
L%//%**,//%""$%--/- ="% u* nnd
j		$):)*5:>>*??3z?# z%z;<??<$$&'?*'LM2 ??<%%))+r:@@BCYYtX&7??3w}}'( w's$S)OGOOCL!OOJvt,-&&	]]66"r&
<LOOL%%'(B!DOOCI 	OOL&&**;;AACD (- r,   c           
      |   [         R                  R                  SS9  [        [        S[
        S9nU R                  UR                  5       5        U R                  UR                  5       5        [        S [        R                  " [        R                  R                  SSS5      5       5       5      n[        S UR                   5       5      nS U l        U R                  UR!                  U5      S	UR#                  U5      -  5        U R                  UR!                  U5      S
UR#                  U5      -  5        g )NTr   r    r   r   c              3     #    U  Hw  nUR                  S 5      (       a  M  UR                  S5      (       a  M3  [        R                  R                  [        R                  R	                  U5      S   5      S   v   My     g7f)zcommon.confz-aggressive.confr   r   N)r   r5   r6   splitextsplit)r  rU   s     r*   r"  BJailsReaderTest.testReadStockJailFilterComplete.<locals>.<genexpr>_  s^      JCqJJ}% 9)*4F)G 9  q!1!!45a8Cs   BBA	Br   r  r  c              3   X   #    U  H   n[        UR                  S    5      S   v   M"     g7f)r:  r   N)r   r   )r  r   s     r*   r"  r  c  s&      9D>$,,x()!,s   (*z=More filters exists than are referenced in stock jail.conf %rz2Stock jail.conf references non-existent filters %r)rg   r   r   r   r   r   rH   rI   rP   r[   r  r5   r6   r9   r  r  issubset
difference)r(   r  filtersfilters_jails       r*   testReadStockJailFilterComplete/JailsReaderTest.testReadStockJailFilterCompleteY  s   
,,d+
jtJ^
_%//%**,//%""$% JIIbggll8ZBCJ J'  9> , $,//'""<0CgFXFXYeFffh//,''08<;R;RSZ;[[]r,   c                 B   [         R                  R                  SS9  [        [        S[
        S9nU R                  UR                  5       5        U R                  UR                  5       5        UR                  SS9nU R                  [        U5      5        U HQ  n[        U5      S:  d  M  US   US   /SS	/:X  d  M&  U R                  [        R                  " US   5      S:  5        MS     S
 HH  nU R                  SU/S U 5       5        U R                  SUSS/U5        U R                  SU/U5        MJ     U R                  US   S   S5        UR                   GH5  nUR                   nUR#                  5       nU R                  [        U5      SU-  S9  U H  nUR                  5       nUR#                  5       n	S[%        U5      ;   d  M4  U R                  SUR&                  5        Sn
USU	/nU Hu  n[        U5      S:  a.  US   S:X  a%  USS U:X  a  SUS    Vs/ s H  oS   PM	     sn;   n
O,[        U5      S:  a  US   S:X  a  USS U:X  a  US   S:X  a  Sn
U
(       d  Mu    O   U R                  U
SU< S[%        U5      < 3S9  M     GM8     g s  snf )NTr   r  r  rr   r   r   r[   r  )r   recidiver  c              3   d   #    U  H&  n[        U5      S :X  d  M  US   S:X  d  M  USS v   M(     g7f)rr   r   r  Nr   )r   )r  rF  s     r*   r"  DJailsReaderTest.testReadStockJailConfForceEnabled.<locals>.<genexpr>  s.     KSQW3q6U?WS!Ws   000r   warnr  rd  zNo actions found for jail %sr  z<blocktype>	blocktypeFr.  rt   r1  r   rc  z	Found no z command among )rg   r   r   r   r   r   rH   rI   rP   r   r   r   str2secondsr  ra   _JailsReader__jailsr5  r   str	_initOpts)r(   r  r  commandjr  	jail_namer.  commandsaction_nameblocktype_presenttarget_commandrF  s                r*   !testReadStockJailConfForceEnabled1JailsReaderTest.testReadStockJailConfForceEnabledl  s   
,,d+ jtJ^
_%//%**,//%""$%--t-4- //#m$% g	'laWQZ4	8JJOOF&&wqz2Q67   a ==%KKM ==%Hf-}==='1}-   =$Q'1%%a##7yy{9 ??3w<)I5  7 v~~H.."KH%	]]; 0 01 (K8^
g,
wqz[8q|~%(wqz,JzVz,JJL1u!4q|~%'!**C 		  
__
#h-)  +%  &* -Ks   $Jc                   ^ [         R                  R                  SS9  [        5       nUR	                  [
        5        U R                  UR                  5       [
        5        UR                  5         UR                  5       nU R                  US   S5        U R                  US   S5        UR                  5         UR                  5         UR                  5         UR                  5       mU4S jnU R                  U" S5      U" S	5      s=:  =(       a    U" S
5      :  Os  5        U R                  U" S5      U" S5      :  5        U R                  U" S5      U" S5      :  5        U R                  T/ SQ/ SQ/ SQ/ SQ/ SQ/ SQ/ SQ/5        UR                   R	                  S5        U R                  UR                   R                  5       S5        U R                  UR                  5       [
        5        g )NTr   socketz/var/run/fail2ban/fail2ban.sockpidfilez/var/run/fail2ban/fail2ban.pidc                    > [        T5       H  u  pUS   S:X  d  M  US   U :X  d  M  Us  $    [        SU < ST< 35      e)Nr   r[   r   zDid not find command 'set z' among commands )	enumerater   )rO   r   r   r  s      r*   find_set7JailsReaderTest.testStockConfigurator.<locals>.find_set  sG    "tqtu}1X # 
8 
 r,   syslogsocketloglevel	logtarget
dbpurgeagedbfiledbmaxmatches)r[   r  r  )r[   r  INFO)r[   r  z/var/log/fail2ban.log)r[   	allowipv6r  )r[   r  z"/var/lib/fail2ban/fail2ban.sqlite3)r[   r  
   )r[   r  1dz/tmp)rg   r   r   r   r   r   ra   
getBaseDirr  r  r  rP   convertToProtocolgetConfigStreamrH   r\   _Configurator__jails)r(   r  r]   r  r  s       @r*   testStockConfigurator%JailsReaderTest.testStockConfigurator  s   
,,d+,*%<**,j9		%	%	'$4>#DE4	?$DE  "))+( //Nhz2JJXk5JJ //(<(8H+==>//(>*Xh-??@ #1 ;#  ##..v6<44??A6J<**,j9r,   c                    [         R                  " [         R                  R                  US5      5        [         R                  " [         R                  R                  US5      5        [	        [         R                  R                  USS5      S5      R                  5         [	        [         R                  R                  USS5      S5      R                  5         [	        [         R                  R                  US5      S5      nUR                  S5        UR                  5         [        U0 S9nU R                  UR                  5       5        U R                  UR                  5       5        UR                  S	S
9nU Vs/ s H  nUS S / SQ:X  d  M  USS  PM     nnU R                  [        [        S U 5       5      5      S5        U R                  US   S   S5        g s  snf )Nr  r  ztestaction1.confr4   ztestfilter1.conf	jail.confz
[testjail1]
enabled = true
action = testaction1[actname=test1]
         testaction1[actname=test2]
         testaction.py
         testaction.py[actname=test3]
filter = testfilter1
r   Tr  rr   )r[   	testjail1r/  c              3   *   #    U  H	  oS    v   M     g7f)r   Nr   )r  r.  s     r*   r"  9JailsReaderTest.testMultipleSameAction.<locals>.<genexpr>  s     ?;!9;s   rt   rd  z{})r5   mkdirr6   r9   r<   r>   r=   r   rH   rI   rP   r   ra   r   r[   )r(   r    jailfdr  r  commadd_actionss          r*   testMultipleSameAction&JailsReaderTest.testMultipleSameAction  sp   ((277<<,-((277<<,-rww||GZ);<cBHHJrww||GZ);<cBHHJWk2C8&,,   	,,.
gB
7%//%**,//%""$%--t-4-&3 5md
2Ah33 abm+ 5 3s?;??@!D ;r?2&-5s   G#	G#c                 D    U R                  [        SU R                  SS9  g )Nz'Have not found any log file for .* jailpollingbackend)assertRaisesRegexr   _testLogPathru   s    r*   testLogPathFileFilterBackend,JailsReaderTest.testLogPathFileFilterBackend  s%    %Oi  )r,   c                      SSK Jn  U R                  SS9  U R                  SS9  g ! [         a  n[        R                  " S5      eS nAff = f)Nr   )FilterSystemdz&systemd python interface not availablesystemdr6  zsystemd[journalflags=2])server.filtersystemdr=  r   rg   rh   r9  )r(   r=  r   s      r*   testLogPathSystemdBackend)JailsReaderTest.testLogPathSystemdBackend  sV    E3 I&56 
 E			C	DDEs   ' 
AAAc                 Z   [        [        R                  R                  US5      S5      nUR	                  SU< SU< S35        UR                  5         [        US9nU R                  UR                  5       5        U R                  UR                  5       5        UR                  5         g )Nr*  r4   z&
[testjail1]
enabled = true
backend = z
logpath = ze/not/exist.log
          /this/path/should/not/exist.log
action = 
filter = 
failregex = test <HOST>
r   )r<   r5   r6   r9   r=   r>   r   rH   rI   rP   r   )r(   r    r7  r/  r  s        r*   r9  JailsReaderTest._testLogPath	  sz    Wk2C8&,, 	 	 	,,.
g
&%//%**,//%""$%--/r,   )r  )r   r   r   r   r   r  r  r  r  r  r  r'  r   r2  r:  r@  r9  r   r   r   s   @r*   r  r    se    9.
/Nbp6<E~]&=+~2:h . .:)7  r,   r  )6
__author____copyright____license__r  r  r5   r  r.   r#   rg   client.configreaderr   r   r   r   clientr	   client.jailreaderr
   r   r   client.filterreaderr   client.jailsreaderr   client.actionreaderr   r   client.configuratorr   server.mytimer   r   utilsr   r   r6   r9   r8   __file__re  rf  r   r   r   r   r   r   TestCaser   r   r[  r  r  r   r,   r*   <module>rR     s	  ( 1
P   	 	   , , $ L L . , = . "  2bggooh7A  ||00 77<< 98D  O8x(( O8dv>' v>rG@) G@T7'- 7'tV( Vr,   