ogfrdZdZdZddlZddlZddlZddlZddlZddlZddl Z ddl m Z m Z m Z mZddlmZddlmZmZmZdd lmZdd lmZdd lmZmZdd lmZdd lmZddl m Z ddl!m"Z"m#Z#ejHjKejHjMe'dZ(iZ)ddl!m*Z*e jVjXZ-ejHjKejHjMe'dZ.iZ/Gdde j`Z1Gdde"Z2Gdde"Z3Gdde"Z4Gdde"Z5y)z!Cyril Jaquier, Yaroslav Halchenkoz>Copyright (c) 2004 Cyril Jaquier, 2011-2013 Yaroslav HalchenkoGPLN) ConfigReaderConfigReaderUnsharedDefinitionInitConfigReaderNoSectionError)configparserinc) JailReaderextractOptionssplitWithOptions) FilterReader) JailsReader) ActionReader CommandAction) Configurator)MyTime)version)LogCaptureTestCase with_tmpdirfiles) CONFIG_DIRconfigcdeZdZfdZdZd dZdZddZdZdZ dZ d Z d Z d Z d ZxZS)ConfigReaderTestctt| tjd|_t |j |_y)zCall before every test case.zf2b-temp)prefixbasedirN)superrsetUptempfilemkdtempdrc)self __class__s E/usr/lib/python3/dist-packages/fail2ban/tests/clientreadertestcase.pyr!zConfigReaderTest.setUp7s3$%'   : .$&  /$&cBtj|jy)zCall after every test case.N)shutilrmtreer$r&s r(tearDownzConfigReaderTest.tearDown=s--r)ctjj|vr}tjj|}tjj |j |}tjj |stj|t|j d|d}||jd|z||j||jy)N/wz [section] option = %s ) ospathsepdirnamejoinr$existsmakedirsopenwriteclose)r&fnamevaluecontentr$d_fs r(_writezConfigReaderTest._writeAsWW[[E wwu1  TVVQ2 ''.. KKO dffe $c*! 77    777'')r)ctj|jd||j|jj dy)Nr0r%)r2unlinkr$ assertTruer%read)r&r<s r(_removezConfigReaderTest._removeRs0))tvvu %&//$&&++c"#r)c|j|jj||jjddgdS)Nsection)intoptionrJ)rDr%rE getOptions)r&r@s r( _getoptionzConfigReaderTest._getoptionVs://$&&++a.!   9'8&9 :8 DDr)c|jjd|jjddd|jjddd|jjddd|jjdd}|j |dd d d |jjdd }|j |dd dd |jjdd dd d }|j |dd d d y)N Definitiona1br%test))rIrOr)boolrQr)rIr%rrTr)rOrQr%))rIrO)rSrQ)rIr%)rIr)rSr)r% add_sectionsetrKassertSortedEqual)r&optss r( testConvertzConfigReaderTest.testConvertZs&&\"&&**\3$&&**\3$&&**\3'   <7 9$QT:;   <. 0$QT=>   < +J7 9$QT:;r)ctjj|jd}|j dd|j |j ddtj|dtj|tjs+|j|jjdyddl }tjd|jz)Nzd.confrr$z0Skipping on %s -- access rights are not enforced)r2r3r6r$rA assertEqualrLchmodaccessR_OK assertFalser%rEplatformunittestSkipTest)r&r@r_s r(testInaccessibleFilez%ConfigReaderTest.testInaccessibleFileisggll4668$!++h4??3'+((1a. 1bgg DFFKK$%   MPXPaPaPcc ddr)c|j|jjd|jdd|j |j d|jdd|j |j d|jdd|j |j d |jd d |j |j d |jd d |j |j d|jdd|j |j d|jdd|j |j d|j d|j d|j |j d|j d |j |j d |j d|j |j d|j d |j |j dy)Nr%c.confrPr2rz c.d/98.conf998iz c.d/90.conf990z c.d/99.conf999izc.local3z c.d/1.local4i)r^r%rErArZrLrFr-s r(testOptionalDotDDirz$ConfigReaderTest.testOptionalDotDDirvs466;;s#$++h4??$a(++h4??$a(++mU#4??$c*++mU#4??$c*++mU#4??$c*++i4??$a(++mS!4??$a(,,},,y4??$c*,,}4??$c*,,}4??$c*,,}4??$a(r)c|jddd|jddd|jddd|jddd |jd dd Gd d t}|ddi|_|jj|j|j |jj |jjid|jj}|j|jdd|j|jdd|j|jddy)NrdzS [INCLUDES] before = ib.conf after = ia.conf [Definition] test = %(default/test)s r=r>zib.confz, [DEFAULT] test = A [Definition] option = 1 zib.localz, [DEFAULT] test = B [Definition] option = 2 zia.confz, [DEFAULT] test = C [Definition] oafter = 3 zia.localz, [DEFAULT] test = D [Definition] oafter = 4 c$eZdZddgddgddgdZy)?ConfigReaderTest.testLocalInIncludes..TestDefConfReaderrINstring)rJoafterrR)__name__ __module__ __qualname__ _configOptsr)r(TestDefConfReaderrqst}t};r)ryr%rJT)allrrsrlrRD) rArr% setBaseDirr$rDrErK getCombinedrZget)r&ryos r(testLocalInIncludesz$ConfigReaderTest.testLocalInIncludess9++hd-+++it.+ ++j/+ ++it.+ ++j/+ 4 S(B /$&&&DFF//$&&++- &&BD! ff!155?A&155?A&155=#&r)c|j|jjd|jddd|j |jjd|j |jj ddg|j |jjddd|j |jjdd d |j |jjdd d|j |jjdd d |j |jjdd dy)Nizi.confzu [DEFAULT] b = a zz = the%(__name__)s [section] y = 4%(b)s e = 5${b} z = %(__name__)s [section2] z = 3%(__name__)s rorHsection2y4aez5${b}zzz thesection 3section2)r^r%rErArDrZsectionsr~r-s r(testInterpolationsz#ConfigReaderTest.testInterpolationss 466;;s#$++hd -+ //$&&++c"#466??$y*&=>466::i-t4466::i-w7466::i-y9466::i. =466::j#. ?-QTAUV$%>?-QTAUV$%=>,QTAUV$%>?-QTAUV$%>?-QTAUVWr)cptdtt}|jt|j y)N XXXABSENTXXXr share_config)r rCONFIG_DIR_SHARE_CFGr ValueErrorrEr&rs r(testIncorrectJailz JailReaderTest.testIncorrectJails% NJEY Z$J *r)c.tdtt}|j|j |j|j |j|j |jd|jdy)N emptyactionrz"No filter set for jail emptyactionz'No actions were defined for emptyaction)r IMPERFECT_CONFIGIMPERFECT_CONFIG_SHARE_CFGrDrErK isEnabled assertLoggedrs r(testJailActionEmptyz"JailReaderTest.testJailActionEmptysh M+;Jd e$//$))+//$//#$//$.."#89=>r)c<tdtt}|j|j |j |j |j|j|jdtz|jdy)NmissingbitsjailrzJFound no accessible config files for 'filter.d/catchallthebadies' under %szUnable to read the filter r rrrDrEr^rKrrrs r(testJailActionFilterMissingz*JailReaderTest.testJailActionFilterMissing"sq %/?Nh i$//$))+4??$%//$.."#`csst/0r)c tdtt}|j|j |j |j |j|j|jdy)Nbrokenactiondefrz$Invalid action definition 'joho[foo'rrs r(testJailActionBrokenDefz&JailReaderTest.testJailActionBrokenDef*^ %/?* ,$//$))+4??$%//$.."#:;r)c(tdtt}|j|j |j|j |j|j |j|jddy)N tz_correctr logtimezoneUTC+0200) r rrrDrErKrrZoptionsrs r(testJailLogTimeZonez"JailReaderTest.testJailLogTimeZone2se L*:* ,$//$))+//$//#$//$.."#4<< . ;r)c tdtt}|j|j |j |j |j|j|jdy)Nbrokenfilterdefrz$Invalid filter definition 'flt[test'rrs r(testJailFilterBrokenDefz&JailReaderTest.testJailFilterBrokenDef:rr)ctjjdtdtt }|j |j|j |j|j|j|j|jd|jd|j|jdy)NTstocksshdrzssh-funky-blocker)r`F2BSkipIfCfgMissingr rrrDrErKr^rrZgetNamesetNamers r(testStockSSHJailzJailReaderTest.testStockSSHJailBs ,,d+ FJ=Q R$//$))+//$//#$4>>#$4<<>6*,,"#4<<>#67r)c tjjdtdtt d}|j |j|j |j|j |j|j}|jgdg|Dcgc]}t|dkDs|ddk(s|c}|jgdg|Dcgc]}t|dkDs|dd k(s|c}|jgd g|Dcgc]}t|dkDs|dd k(s|c}|jgd }d }|D]A}|jt|dkDxr|djd|dz }||kDsAyycc}wcc}wcc}w)NTrsshd-override-flt-optsrr force_enable)rUr prefregexz^Testrr)rUraddjournalmatchz _COMM=testr)rUrmaxlinesrr)rUrusednsnorregexr)r`rrr rrrDrErKrconvertrZlenindexr^endswith)r&rstreamr usednsidxrs r(testOverrideFilterOptInJailz*JailReaderTest.testOverrideFilterOptInJailLs ,,d+ ,6F* ?$//$))+//$//#$//$.."# <<>&KLVWB!Q!!0A(AABDDE;!Q!! (:A;=llLM)! aCFQJ91Q4==#9:61)mU=C$r)r`rrr lowerrrrDrErKrrZrr)r&rpreflinerrrs r(testLogTypeOfBackendInJailz)JailReaderTest.testLogTypeOfBackendInJailfs ,,d+  Ca3Cx ohnn&66@P,4 ADOODIIK OODOO%& \\^Fudllnn>X[c>cdeAA3q6A:!A$.*@aACC CBsC4C4$C4c d}dddif}t|}|j|||jdiftd|jddddftd |jd iftd |jd d d iftd|jd d diftd|jttd|jttd|jttd|jttd|jttdd}dif}t|}|j||d}ddddddddd d!d"d"d# f}t|}|j||t|j d d$}|d%t d&|d'j Df}|j||y)(Nzmail-whois[name=SSH]z mail-whoisnameSSHz mail.who_iscatdog)rOrQzmail.who_is[a=cat,b=dog]z mail--ho_ismailrO,z mail[a=',']rQz mail[a=b, ]z mail-how[z-mail[a="test with interim (wrong) "" quotes"]z-mail[a='test with interim (wrong) '' quotes']zmail[a='x, y, z', b=x, y, z]z mail['s']zabc[]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=]rJ123z with=okay?zandwith,okay...zhow about spaceszsingle'in'doublezdouble"in"singlezleave some spacez one for luck) opt01opt02opt03opt04opt05opt06opt07opt08opt09opt10opt11][rc3JK|]\}}||jddfyw)rrN)replace).0kvs r( z1JailReaderTest.testSplitOption..s$BdaAIIc4 !Bs!#r)r rZrrrdictitems)r&rJexpectedresult expected2s r(testSplitOptionzJailReaderTest.testSplitOptionus !&VUO ,( & !&8V$M2&}(EFM5#9:NKe, logs: a.log b.log c.log"actnamer)rUrrlogrz:echo "name: log, ban: , logs: a.log b.log c.log d.log"za.log b.log c.log d.log)rUrrrRrRz5echo "name: test, ban: , logs: a.log b.log c.log") r rrrDrErKrZrrV_JailReader__actionsr)r&rrOs r(testMultiLineOptionz"JailReaderTest.testMultiLineOptionsN Kd$)senderzf2b-test@example.com)blocklist_de_apikeyztest-key)rzX%(action_blocklist_de)s mynetwatchman[port=1234,protocol=udp,agent="%(fail2ban_agent)s"]rlrrUagentrrz Fail2Ban/%srr blocklist_de mynetwatchman)r`rrr rrrE_cfg get_sectionsrrDrKrrappendextendrrZ)r&rrractcmdr useragents r(testVersionAgentzJailReaderTest.testVersionAgentsm ,,d+ O$ K$D&! YY # # %("$(?//$//#$ <<>& # Lc #h!m  !fo#a&G+JJsO A+JJAJ1!A$'/#a("Q&JKLg%)3s8Q3q6E?HngW`ab3q6E?HowXabc Ks 3 E3 E3 cdtjj|d}t|dj tjj|d}tj d||j tjtjj|d|g|j tj|g|jd|z|j tjtjj|dgy)Nf1r1f2 nonexisting*z4File %s is a dangling link, thus cannot be monitored) r2r3r6r9r;symlinkrZr _globr)r&r$r+r,s r(testGlobzJailReaderTest.testGlobs ww||At"r3- ww||At"**]2:##BGGLLC$89B4@:##B',JROP:##BGGLLM$BCRHr)cti}|j|jg|j|j d|j t |jdi|j t |jd|j t |jdd|j t |jdiy)NrrRany) rrZrr^ has_sectionrr merge_sectionrr~rK)r&r%s r(testCommonFunctionz!JailReaderTest.testCommonFunctions#!1::<$1==()NAOOVR@NAIIv6NAEE659NALL&"=r))rtrurvrrrrrrrrrrrr rr)rr1r7rrs@r(rrsi8 W+?1<<<84 C3&j0dBII >r)rcBeZdZdZdZdZdZdZdZdZ dZ d Z y ) FilterReaderTestcgddddgdggdgdgdgd g}tddi}|jt|j|j d|j |j |tddd d itt }|j|j dd |dd<|j |j |y)N)rU testcase01rrrr;r)z^\s*(?:\S+ )?(?:kernel: \[\d+\.\d+\] )?(?:@vserver_\S+ )?(?:(?:\[\d+\])?:\s+[\[\(]?sshd(?:\(\S+\))?[\]\)]?:?|[\[\(]?sshd(?:\(\S+\))?[\]\)]?:?(?:\[\d+\])?:)?\s*(?:error: PAM: )?Authentication failure for .* from \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 \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.+$^.+ module for .* from \s*$)rUr;addignoreregexz"^.+ john from host 192.168.1.1\s*$)rUr;rz _COMM=sshd+z_SYSTEMD_UNIT=sshd.servicez_UID=0)rUr;rzFIELD= with spaces r=zAFIELD= with + char and spaces)rUr; datepatternz%Y %m %d %H:%M:%Sr5rrr)r r|TEST_FILES_DIRrErKrVrTEST_FILES_DIR_SHARE_CFG)r&output filterReaders r(rXzFilterReaderTest.testConverts'~067*?BC,$&)B---/8r)ctdddddtt}|j|j d|j }|j |dd|jdy)Nr;zX)rrRr@rz6Wrong int value 'X' for 'maxlines'. Using default one:)r rDrCrErKr}assertNotEqualrr&rFrWs r(testConvertOptionsz#FilterReaderTest.testConvertOptions-sjlLxY\:])>C,$  ! ! #$d:&,LMr)cgdg}tdditt}|j|j d|j }|j ||y)N)rUjailnamerz to=sweet@example.com fromip= substitionrMr@r rDrCrErKrrVr&rErFr%s r(!testFilterReaderSubstitionDefaultz2FilterReaderTest.testFilterReaderSubstitionDefault6sX S T&lJ)>C,$!F#r)ctdditt}|j|j d|j }|j d|dvy)N testcase02rMr@rr)r rDrCrErKr}rDrJs r(testFilterReaderSubstKnownz+FilterReaderTest.testFilterReaderSubstKnown?sXlJ)>C,$  ! ! #$//&D--.r)cgdg}tdddditt}|j|j d|j }|j ||y)N)rUrMrzto=sour@example.com fromip=rNrMhoneypotzsour@example.comr@rOrPs r(testFilterReaderSubstitionSetz.FilterReaderTest.testFilterReaderSubstitionSetJs^ R S&lJEW8X)>C,$!F#r)cgdg}td\}}tdd|tt}|j |j d|j }|j||y)N)rUrMrz?^to=test,sweet@example.com,test2,sweet@example.com fromip=$zusubstition[failregex="^$", honeypot=",", sweet="test,,test2"]rNrMr@r r rDrCrErKrrVr&rE filterName filterOptrFr%s r(testFilterReaderSubstitionKnownz0FilterReaderTest.testFilterReaderSubstitionKnownSsk r s&(z|*ilJ )>C,$!F#r)cgdg}td\}}tdd|tt}|j |j d|j }|j||y)N)rUrMrz)^\s*to=fail2ban@localhost fromip=\s*$zUsubstition[failregex="^\s*\s*$", honeypot=""]rNrMr@rYrZs r(!testFilterReaderSubstitionSectionz2FilterReaderTest.testFilterReaderSubstitionSection^sk ^ _&(\^*ilJ )>C,$!F#r)ctdddditt}|j|j d|j t tj|tdddddtt}|j|j d|j t tj|y)NrNrMrVz r@z)rVsweet)r rDrCrErKrrr)r&rFs r(testFilterReaderSubstitionFailz/FilterReaderTest.testFilterReaderSubstitionFailislJ\8R)>C,$J 4 4lClJYYe8f)>C,$J 4 4lCr)c|tjjtjjtd}t tjj|ddi}|j |jtjj|dtjj|dg |jd|jdd|jdd|jddy#t$r}|jd |zYd}~yd}~wwxYw) Nfilter.dztestcase01.confr;ztestcase-common.confrN __prefix_liner ignoreregexz)unexpected options after readexplicit: %s) r2r3abspathr6rCr rZ readexplicitrKr~rfail)r&path_rFrs r(testFilterReaderExplicitz)FilterReaderTest.testFilterReaderExplicitws ''//"'',,~zB C%bggll52CDlTVW,<,,.GGLL./eEV1WX@4 L/2L+.L-0 @99 8A >??@s AD D;D66D;N) rtrurvrXrKrQrTrWr]r_rbrkrxr)r(r9r9s3*9XN$ /$ $ $ D@r)r9c*eZdZddZdZedZy)JailsReaderTestCacheNct||}|j||j|j|j |j |j dy)Nrr)rr| readEarlygetEarlyOptionsreadAllrDrK)r&rrr configurators r(_readWholeConfz#JailsReaderTestCache._readWholeConfsW3??3!8TWZZ[&?h?s EF F&)FN)rtrurvrtr}rrrxr)r(rmrms 1 #'#'r)rmcteZdZfdZdZdZdZdZdZdZ dZ e d Z d Z d Ze d ZxZS) JailsReaderTestc,tt| |i|yr)r rrrs r(rzJailsReaderTest.__init__s'88r)ctjjds-td}|j t |j yy)Nz/XXXr)r2r3r7rrrrE)r&readers r(testProvidingBadBasedirz'JailsReaderTest.testProvidingBadBasedirs5    '6Z- r)cZttt}|j|j |j |j d|jt|j|jd}d|_ |j|gdgddd d gd gd d ggd gdgdgdgdddddddgddgddggggdgdgdgdd dgd dgd dgd dggdd d gd!d"gd!d#gd!d$gd!d%gg|jd&|jd'|jd(y))NrF) ignoreWrongTallow_no_files)addrauto)rtest-known-interprrrr)z*failure test 1 (filter.d/test.conf) z+failure test 2 (filter.d/test.local) z"failure test 3 (jail.local) start)rmissinglogfilesr)rUrr)r brokenactionr)rUrrr)rUrrrrrrzhit with big stick rr)rparse_to_end_of_jail.confr)rUrrr)rUrrr)rUrrrrrr)rrrrz 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)rrrrDrEr^rKrrrmaxDiffrVrassertNotLogged)r&jails comm_commandss r(testReadTestJailConfz$JailsReaderTest.testReadTestJailConfs} .=W X%//%**,5###67J .--t-4-$,"(%~8  !"&6#38.(N,-  n= 1@14 m   n )* ( lEFEFuwsuE$%L78}%LMr)c tjjdtjtj j tddD]j}tj j|jdd}t|dit}|j|j |ji|j%d r|j'd |j)d|z|j|j*j-ddj/d|z|j1t2j4t7dz}|j9|j-ddd|z|dvsD|j'd|j-ddd|zmy#t$r8}|jd |d t!|j"d |Yd}~4d}~wwxYw)NTraction.d*.confz.confrrrzaction rz: z-commonrNz.Action file %r is lacking [Definition] sectionmsgrz#Action file %r is lacking actionban)timeoutbantime)ignorerz5Action file %r does not contains jail-name 'f2b-TEST')pfziptables-allportsiptables-multiportzf2b-TEST actionstartzSAction file %r: interpolation of actionstart does not contains jail-name 'f2b-TEST')r`rrglobr2r3r6rbasenamerrrDrErKrritypertrassertInr_optsr~stripr}r _escapedTagsrUrZ)r& actionConfig actionName actionReaderrrWs r(testReadStockActionConfz'JailsReaderTest.testReadStockActionConfs ,,d+ii ZX NOpl  .66wC:z62zJ<??<$$&'GB   i (MM, 5 5 7 9L HJ OOL&&**;;AAC . =?  # #  & &-C)D D $ FDTXXf%v @< OQFF ]]:txx r: _bn np-p GIIZa1A1A1EFFGs?G H -HH c tjjdttt }|j |j|j |j|j}|j|gt}|jD].}|dk(r |j|d}t|\}}|j||j t!|t#|||t t}|j |jd|z|ji|j |j$jdd j'|j|d }|j t!|j't)|D] } t| \} } |j t!| |j t+| t,| d k(r|j/d | t1| |it t} |j | j| ji| j} |j t!| |j | j$jd d j'1y)NTrrINCLUDESrr@zFailed to read filter:rrrrportr)r`rrrrrrDrErKrrZrUrr~r rrr rrr isinstancerrr)r&rr allFiltersrr[r\rFactionsr&actNameactOptrcmdss r(testReadStockJailConfz%JailsReaderTest.testReadStockJailConfsD ,,d+ j7K L%//%**,//%""$%--/-="%u*nn%Ed j  $):)*5:y >>*??3z?#z4%z;<??<$$&'?*'LM2??<%%))+r:@@BC YYtX &7??3w}}'(w'Es$S)OGVOOCL!OOJvt,-&& ]]66"r& .^sXJ JJ} %4F)G  q!1!!45a8JsA.A0rrdrc3RK|]}t|jdd!yw)rrN)r r)rrs r(rzBJailsReaderTest.testReadStockJailFilterComplete..bs(15>$,,x()!,s%'z=More filters exists than are referenced in stock jail.conf %rz2Stock jail.conf references non-existent filters %r)r`rrrrrrDrErKrUrr2r3r6rrissubset difference)r&rfilters filters_jails r(testReadStockJailFilterCompletez/JailsReaderTest.testReadStockJailFilterCompleteXs ,,d+ jtJ^ _%//%**,//%""$% J IIbggll8ZB CJ J'9>,$,//'""<0CgFXFXYeFffh//,''08<;R;RSZ;[[]r)c tjjdttdt }|j |j|j |j|jd}|j t||D]K}t|dk\s|d|dgdd gk(s"|j tj|ddkDMd D]G}|jd |gd |D|jd|d dg||jd|g|I|j|ddd|jD]"}|j }|j#}|j t|d|z|D]}|j}|j#} dt%|vs1|jd|j&d} |d| g} |D]e}t|dkDr)|ddk(r!|dd| k(rd|dD cgc]} | d c} v} n(t|dkDr|ddk(r|dd| k(r |ddk(rd} | sen|j | d| dt%|%ycc} w)NTrrrrjrrrUr)rrecidiverc3VK|]!}t|dk(s|ddk(s|dd#yw)rjrrNr)r)rr's r(rzDJailsReaderTest.testReadStockJailConfForceEnabled..s*KSQ3q6U?S!WKs )) )rwarnrrBzNo actions found for jail %srz blocktypeFrrlrrrAz Found no z command among )r`rrrrrrDrErKrrr str2secondsrrZ_JailsReader__jailsrrstr _initOpts) r&rrcommandjr jail_namercommands action_nameblocktype_presenttarget_commandr's r(!testReadStockJailConfForceEnabledz1JailsReaderTest.testReadStockJailConfForceEnabledks ,,d+ jtJ^ _%//%**,//%""$%--t-4-//#m$%8g 'laWQZ4 8JJOOF&&wqz2Q678 .a==%K KM==%Hf-}==='1}-.=$Q'1  % %+a  # #7yy{9??3w< )I 57+v~~H.."KH % ]]; 0 01 (K8^  g, wqz[8q|~%(wqz,JSV,JJ L1 u!4q|~%'!* *C     __ #h- )+%++*-Ks! J c tjjdt}|j t |j |jt |j|j}|j |dd|j |dd|j|j|j|jfd}|j|d|d cxkxr |d knc|j|d |d kD|j|d |d kD|jgdgdgdgdgdgdgdg|j j d|j |j jd|j |jt y)NTrsocketz/var/run/fail2ban/fail2ban.sockpidfilez/var/run/fail2ban/fail2ban.pidcvtD]\}}|ddk(s|d|k(s|cStd|d)NrrUrzDid not find command 'set z' among commands ) enumerater)rJrrrs r(find_setz7JailsReaderTest.testStockConfigurator..find_setsN"tq!tu}1 X  8 r) syslogsocketloglevel logtarget dbpurgeagedbfile dbmaxmatches)rUrr)rUrINFO)rUrz/var/log/fail2ban.log)rU allowipv6r)rUrz"/var/lib/fail2ban/fail2ban.sqlite3)rUr )rUr1dz/tmp)r`rrrr|rrZ getBaseDirrprqrrrKconvertToProtocolgetConfigStreamrDrV_Configurator__jails)r&rsrWrrs @r(testStockConfiguratorz%JailsReaderTest.testStockConfigurators ,,d+,*%<**,j9  % % '$4>#DE4 ?$DE  "  ) ) +(// Nhz2JXk5JJ//(<(8H+==>//(>*Xh-??@#1 ;###..v6<44??A6J<**,j9r)ctjtjj|dtjtjj|dt tjj|dddj t tjj|dddj t tjj|dd}|j d|j t|i}|j|j|j|j|jd }|Dcgc]}|dd gd k(r|d d}}|jttd |Dd|j|dddycc}w)Nrdrztestaction1.confr1ztestfilter1.conf jail.confz [testjail1] enabled = true action = testaction1[actname=test1] testaction1[actname=test2] testaction.py testaction.py[actname=test3] filter = testfilter1 rTrrj)rU testjail1rc3&K|] }|d yw)rNrx)rrs r(rz9JailsReaderTest.testMultipleSameAction..s?6!9?srlrBz{})r2mkdirr3r6r9r;r:rrDrErKrrZrrU)r&rjailfdrrcomm add_actionss r(testMultipleSameActionz&JailsReaderTest.testMultipleSameActionso((277<< ,-((277<< ,-rww||GZ); r) r9r2r3r6r:r;rrDrErKr)r&rrrrs r(rzJailsReaderTest._testLogPathsz  Wk2C 8&,,   ,,. g &%//%**,//%""$%--/r))rtrurvrrrrrrrrrrrrrrrs@r(rrse9. /Nbp6<E~]&=+~2:h..:)7r)r)6 __author__ __copyright__ __license__rrr2rxr+r"r`client.configreaderrrrrclientr client.jailreaderr r r client.filterreaderr client.jailsreaderrclient.actionreaderrrclient.configuratorr server.mytimerrutilsrrr3r6r5__file__rCrDrrrrrrTestCaserrr9rmrrxr)r(rs (1 P   ,,$LL.,=."2bggooh7A||0077<< 98DN8x((N8bv>'v>rG@)G@T7'-7'tV(Vr)