
    =*fd                         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JrJ	r	J
r
  SSKJrJr  SSKJr  S	S
KJr  S	SKJrJrJr   " S S\5      rg)zCyril Jaquierz Copyright (c) 2004 Cyril JaquierGPL    N   )CommandAction
CallingMapsubstituteRecursiveTags)OrderedDictActions)Utils   )	DummyJail)
pid_existswith_tmpdirLogCaptureTestCasec                       \ 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 5       r\S 5       r\S 5       r\S 5       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r g)CommandActionTest(   c                    ^ ^ [         R                  " T 5        [        SS5      T l        ST l        T R                  R
                  mUU 4S jnUT R                  l        g)zCall before every test case.NTestFc                      > STl         T " 5       $ )NT)"_CommandActionTest__action_started)orgstartselfs   ?/usr/lib/python3/dist-packages/fail2ban/tests/actiontestcase.py_action_start.CommandActionTest.setUp.<locals>._action_start1   s    4
*    )r   setUpr   _CommandActionTest__actionr   start)r   r   r   s   ` @r   r   CommandActionTest.setUp*   sI    4 f-$-$]]  ( &$--r   c                     U R                   (       a  U R                  R                  5         [        R                  " U 5        g)zCall after every test case.N)r   r   stopr   tearDownr   s    r   r#   CommandActionTest.tearDown6   s)    	==d#r   c           
         SSSS.nU R                  [        S 5        U R                  [        S 5        U R                  [        S 5        U R                  [        S 5        U R                  [        S	 5        U R                  [        [	        S
5      5      SSSSS.5        U R                  [        [	        S5      5      SSSSSSS.5        U R                  [        [	        S5      5      [	        S5      5        U R                  [        S 5        U R                  [        S 5        U R                  [        SS05      SS05        U R                  [        SSS.5      SSS.5        U R                  [        S S!S".5      S#S!S".5        U R                  [        S$S!S".5      S%S!S".5        U R                  [        S&S'S(S).5      S*S'S(S).5        U R                  [        U5      SS+S,S.5        U R                  [        S-S.S/.5      S0S.S/.5        U R                  [        S-S.S1S2.5      S1S.S1S2.5        U R                  [        S3S4S1S2.5      S5S4S1S2.5        g )6N	192.0.2.0z
123 <HOST>z	890 <ABC>HOSTABCxyzc                      [        SS05      $ )NA<A>r    r   r   <lambda>?CommandActionTest.testSubstituteRecursiveTags.<locals>.<lambda>D   s    "C<0r   c                      [        SSS.5      $ )N<B>r.   r-   Br/   r0   r   r   r1   r2   F   s    "U#;<r   c                       [        SSSS.5      $ )Nr4   <C>r.   )r-   r6   Cr/   r0   r   r   r1   r2   H   s    "U#GHr   c                  "    [        SSSSS.5      $ )Nzto=<B> fromip=<IP>r4   r8    )r-   r9   r6   Dr/   r0   r   r   r1   r2   K   s    ")=EPU\^#_`r   c                  "    [        SSSSS.5      $ )Nzto=<honeypot> fromip=<IP>z
<honeypot>z<sweet>r;   )	failregexsweethoneypotignoreregexr/   r0   r   r   r1   r2   M   s!    "1LWcqz  LN  $O  Pr   ))Xzx=x<T>T1)Zz<X> <T> <Y>Yzy=y<T>zx=x1rE   zy=y1zx=x1 1 y=y1)rB   rD   rH   rF   ))rB   zx=x<T> <Z> <<R1>> <<R2>>)R1rF   )R2rH   rC   )rF   z<T> <Y>rG   zx=x1 1 y=y1 1 y=y1 y=y1rF   rH   z1 y=y1)rB   rI   rJ   rD   rF   rH   ))actionstartzgipset create <ipmset> hash:ip timeout <bantime> family <ipsetfamily>
<iptables> -I <chain> <actiontype>)ipmsetz
f2b-<name>nameanybantime600ipsetfamilyinet)iptablesziptables <lockingopt>
lockingoptz-wchainINPUT)
actiontypez<multiport>)	multiportzY-p <protocol> -m multiport --dports <port> -m set --match-set <ipmset> src -j <blocktype>protocoltcpportssh	blocktypeREJECT))rK   zipset create f2b-any hash:ip timeout 600 family inet
iptables -w -I INPUT -p tcp -m multiport --dports ssh -m set --match-set f2b-any src -j REJECT)rL   zf2b-anyrM   rP   rS   )rV   ziptables -wrW   rY   )r\   I-p tcp -m multiport --dports ssh -m set --match-set f2b-any src -j REJECT)r]   rg   r^   ra   rd   c                  *    [        [        S5      5      $ )N)r-   z<<B><C>>r6   r<   r9   EDEz	cycle <A>r   r   r0   r   r   r1   r2   y       (? N B )r   c                  *    [        [        S5      5      $ )N)rm   ri   rj   rk   ro   r0   r   r   r1   r2   ~   rp   r   r-   r8   z<C> <D> <X>fun)r-   rB   z<C> <D> funz<C> <B>coolr5   z<C> coolz<matches> <B>z<matches> coolz/to=<honeypot> fromip=<IP> evilperson=<honeypot>pokier;   )r>   r@   rA   z%to=pokie fromip=<IP> evilperson=pokiez123 192.0.2.0z890 123 192.0.2.0z<<PREF>HOST>IPV4)r-   PREFz
<IPV4HOST>z1.2.3.4)r-   rv   IPV4HOSTzA <IP<PREF>HOST> B IP<PREF> CV4zA 1.2.3.4 B IPV4 C)assertRaises
ValueErrorassertEqualr   r   r   aInfos     r   testSubstituteRecursiveTags-CommandActionTest.testSubstituteRecursiveTags<   s   

% J02J<>JHJ J`bJ PQ *KH-J 6>
 *Kq-s %S#H[ab
 *K 9 -    @ J ! 
 J !  *C<83,G*5+IJR_ejLkl*+HIQ[bhKij*v+NOWgntQuv*9jx  QS  ,T  U>	
 *51#	
 *+PQ6*,*]f+ghI>@ *1PZ^lu+vw!4YGIr   c                   ^ ^ [        SS SSS.5      m[        T5        SS jTS'   T R                  [        U4S j5        [        T5        STS	'   T R                  [        U4S
 j5        T R	                  T R
                  R                  ST5      S5        T R	                  T R
                  R                  ST5      S5        T R                  [        UU 4S j5        T R	                  T R
                  R                  ST5      S5        g )Nr   c                     g)Nz<A><A>r0   r$   s    r   r1   HCommandActionTest.testSubstRec_DontTouchUnusedCallable.<locals>.<lambda>   s    Hr   r;   )r-   r6   r9   r<   c                 $    S[        U S   5      -  $ )N   r-   int)r   is     r   r1   r      s    Q#d3i.0r   r9   c                     > T S   $ )Nr9   r0   cms   r   r1   r      s	    r#wr   test=<C>r<   c                     > [        T 5      $ Nr/   r   s   r   r1   r      s    /Fr/Jr   ztest=<A>ztest=0ztest=<A>--<B>--<A>ztest=0--<A><A>--0c                  <   > TR                   R                  ST 5      $ )Nr   )r   
replaceTag)r   r   s   r   r1   r      s    t}}/G/G
TV/Wr   z<D>)r   )r   r   ry   ZeroDivisionErrorr{   r   r   )r   r   s   `@r   $testSubstRec_DontTouchUnusedCallable6CommandActionTest.testSubstRec_DontTouchUnusedCallable   s    			 " "0"S'%7""S'%'JK 4==++J;XF 4==++,@"EGZ[%'WX4==++E26
Cr   c           	         SSSS.nU R                  U R                  R                  SU5      S5        U R                  U R                  R                  SU5      S5        U R                  U R                  R                  S	U5      S
5        U R                  U R                  R                  SSS05      S5        U R                  U R                  R                  SSS05      S5        U R                  U R                  R                  SSS05      S5        SUS'   U R                  U R                  R                  S	U5      S5        U R                  U R                  R                  S[        S S95      S5        g )Nr'   123890r(   zText<br>textz	Text
textzText <HOST> textzText 192.0.2.0 textzText <xyz> text <ABC> ABCzText 890 text 123 ABCz	<matches>matchesz$some >char< should \< be[ escap}ed&
z,some \>char\< should \\\< be\[ escap\}ed\&\nz<ipmatches>	ipmatchesz<ipjailmatches>ipjailmatchesz%some >char< should \< be[ escap}ed&
z.some \>char\< should \\\< be\[ escap\}ed\&\r\nz<xyz>r*   zText 890 text 890 ABCz09 <matches> 11c                     [        S5      $ N
   strr$   s    r   r1   2CommandActionTest.testReplaceTag.<locals>.<lambda>   s    CGr   r   z09 10 11r{   r   r   r   r|   s     r   testReplaceTag CommandActionTest.testReplaceTag   s}   

%
 ==NE2 ==.6 ==7? ==K89;:< ==M:;=:< ==-@AC=? %,==7?
 ==-+,.r   c           	      l    U R                  U R                  R                  S[        S S95      S5        g )Nabcc                     [        S5      $ Nar   r$   s    r   r1   4CommandActionTest.testReplaceNoTag.<locals>.<lambda>   s    CHr   r   r   r$   s    r   testReplaceNoTag"CommandActionTest.testReplaceNoTag   s2     ==E,-/057r   c                   ^  [        T R                  SS5        [        T R                  SS5        [        T R                  SS5        [        T R                  SS5        [        T R                  S	S
5        [        T R                  SS5        T R                  [        SU 4S j5        [	        T R                  S5        T R                  [        SU 4S j5        g )Nr   z<abzc>zb?family=inet6zb>ac<a><b>abz<ac>zx?family=inet6r;   z/properties contain self referencing definitionsc                  b   > T R                   R                  ST R                   R                  SS9$ )Nr   family=inet4conditionalr   r   _propertiesr$   s   r   r1   ?CommandActionTest.testReplaceTagSelfRecursion.<locals>.<lambda>   s*    4==##HMM> $ ;r   z.possible self referencing definitions in queryc                  b   > T R                   R                  ST R                   R                  SS9$ )NzZ<x<x<x<x<x<x<x<x<x<x<x<x<x<x<x<x<x<x<x<x<x<x<x<x<x<x<x<x<x<x>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>family=inet6r   r   r$   s   r   r1   r      s*    4==##NMM> $ ;r   )setattrr   assertRaisesRegexrz   delattrr$   s   `r   testReplaceTagSelfRecursion-CommandActionTest.testReplaceTagSelfRecursion   s    	$--d#	$--d#	$--)40	$--x(	$--v&	$--)2.%W;
 
$--%V;r   c           
      6   [        U R                  SS5        [        U R                  SS5        [        U R                  SS5        [        U R                  SS5        [        U R                  S	S
5        U R                  R                  n[        S5       H  nU R	                  U R                  R                  SU R                  R                  SUS9S5        U R	                  U R                  R                  SU R                  R                  SUS9S5        U R	                  U R                  R                  SU R                  R                  SUS9S5        M     U R                  [        U5      S:  5        [        U R                  SS5        U R	                  [        U5      S5        [        S5       H  nU R	                  U R                  R                  SU R                  R                  SUS9S5        U R	                  U R                  R                  SU R                  R                  SUS9S5        U R	                  U R                  R                  SU R                  R                  SUS9S5        M     U R                  [        U5      S:  5        g )Nr   r   zabc?family=inet4345zabc?family=inet6567r+   z	890-<abc>	banactionzText <xyz> text <abc>r   z<banaction> '<abc>'r;   )r   cachezText 890-123 text 123 '123'r   zText 890-345 text 345 '345'r   zText 890-567 text 567 '567'   z	000-<abc>r   zText 000-123 text 123 '123'zText 000-345 text 345 '345'zText 000-567 text 567 '567')	r   r   _substCacheranger{   r   r   
assertTruelen)r   r   r   s      r   testReplaceTagConditionalCached1CommandActionTest.testReplaceTagConditionalCached  s@   	$--&	$--+U3	$--+U3	$--,	$--&=>
--
#
#%8aMM2DMM4M4M5  "!# MM2DMM4M4Mu  .!# MM2DMM4M4Mu  .!#  //#e*/"	$--,3u:q!8aMM2DMM4M4M5  "!# MM2DMM4M4Mu  .!# MM2DMM4M4Mu  .!#  //#e*/"r   c                    US-  nSU-  U R                   l        U R                   R                  U R                   l        U R                  U R                   R                  SU-  5        SU-  U R                   l        U R                  U R                   R                  SU-  5        SU R                   l        U R                  U R                   R
                  S5        SU-  U R                   l        U R                  U R                   R                  SU-  5        SU R                   l        U R                  U R                   R                  S5        U R                  5         U R                  S5        U R                   R                  SS 05        U R                  S	5        U R                  S
5        U R                   R                  5         U R                  U R                   R                  5        g )N/fail2ban.test
touch '%s'
rm -f '%s'z<actioncheck> && echo -n[ -e '%s' ]truereturnedipInvariant check failedzreturned successfully)r   rK   actionrepairr{   
actionstop	actionbanactioncheckactionunbanpruneLogassertNotLoggedbanassertLoggedr"   r   tmps     r   testExecuteActionBan&CommandActionTest.testExecuteActionBan*  su   	#*S0$--#}}88$--4==,,lS.@A)C/$--4==++\C-?@6$--4==**,FG+c1$--4==,,mc.AB$$--4==,,f5--/z" --T4L!,-+,--DMM,,-r   c                    SU R                   l        SU R                   l        SU R                   l        SU R                   l        U R                   R                  5         U R                   R                  0 5        U R                  5         U R                   R                  0 5        U R                  SSS9  U R                   R                  0 5        U R                  S5        U R                   R                  5         U R                   R                  0 5        U R                   R                  5         U R                  SSS9  U R                  S5        g )	Nr;   zecho -n 'flush'zecho -n 'stop'Nothing to doTwait	[phase 2]r"   )r   r   r   actionflushr   r   r   r   unbanr   flushr"   r   r$   s    r   testExecuteActionEmptyUnban-CommandActionTest.testExecuteActionEmptyUnbanD  s    $-- $--/$---$------B--/--bO$/--B------b--F&'r   c                    US-  nSU R                   l        SU-  U R                   l        SU-  U R                   l        SU-  U R                   l        U R                   R                  5         U R                   R                  5         g )Nr   r'   ztouch '%s.<HOST>'zrm -f '%s.<HOST>'z[ -e '%s.192.0.2.0' ])r   r)   rK   r   r   r   consistencyCheckr   s     r   testExecuteActionStartCtags-CommandActionTest.testExecuteActionStartCtagsX  sl    	#"$--1C7$--036$--5;$------  "r   c                 d   US-  nSU R                   l        SU-  U R                   l        SU-  U R                   l        SU-  U R                   l        U R                  [        U R                   R                  SS 05        U R                  SSS	S
9  U R                  S5        SU-  U R                   l        SU-  U R                   l        SU-  U R                   l        SU-  U R                   l        U R                   R                  SS 05        U R                  S5        U R                  S5        g )Nr   r;   r   rm '%s'r   r   r   Unable to restore environmentTallr   r   z-<actioncheck> && printf "%%%%b
" <ip> >> '%s')r   rK   r   r   r   ry   RuntimeErrorr   r   r   r   r   s     r   (testExecuteActionCheckRestoreEnvironment:CommandActionTest.testExecuteActionCheckRestoreEnvironmentb  s   	# $--)C/$--%O$--+c1$--L$--"3"3dD\B,.MSWX--*S0$--&_$--PSVV$--+c1$----T4L!,-67r   c           
         US-  nSU-  U R                   l        SU-  U R                   l        SU-  U R                   l        SU-  U R                   l        SU-  U R                   l        SU R                   l        U R                   R                  5         S GH_  nU R                  S	U-  5        U R                   R                  S
S05        U R                  SS-  SS9  U R                  SSS-  SU R                   R
                  (       a  SOS-  SS-  SS9  [        R                  " U5        U R                  5         U R                   R                  S
S05        U R                  SSS-  SU R                   R
                  (       a  SOS-  SS-  SS-  SS9  U R                   R
                  (       a  SU R                   l        GM0  U R                   R                  (       a  GMN  SU R                   l        GMb     g )Nr   ztouch '%s'; echo 'started ...'r   z![ -e '%s' ] && echo 'banned '<ip>zB[ -e '%s' ] && echo 'check ok' || { echo 'check failed'; exit 1; }echo 'repair ...'; touch '%s'F)r   r   r   z
[phase %s]r   	192.0.2.1z
stdout: %rzbanned 192.0.2.1Tr   Invariant check failed. Tryingzcheck failedz
repair ...zstarted ...zcheck okz	192.0.2.2zbanned 192.0.2.2r;   )r   rK   r   r   r   r   actionstart_on_demandr   r   r   r   r   osremove)r   r   r   s      r   "testExecuteActionCheckOnBanFailure4CommandActionTest.testExecuteActionCheckOnBanFailureu  s   	#>D$--)C/$--?#E$--behh$-->D$--(-$--%-- a==!"==dK()%%4  18>!DMM$>$>LMR:4  )
 99S>==?==dK()5>!DMM$>$>LMR:%%4	  1 mm  !#DMMMM///*.DMM'1 r   c                    US-  nSU R                   l        SU R                   l        SU-  U R                   l        SU-  U R                   l        SU-  U R                   l        U R                   R                  SS 05        U R                  SSS	S
9  U R                  5         SU R                   l        U R                  [        U R                   R                  SS 05        U R                  SSSS	S
9  g )Nr   r;   r   r   r   r   r   zecho 'repair ...'Tr   r   )r   rK   r   r   r   r   r   r   r   ry   r   r   s     r   'testExecuteActionCheckRepairEnvironment9CommandActionTest.testExecuteActionCheckRepairEnvironment  s    	# $--$--%O$--+c1$-->D$----T4L!46ItT--/2$--L$--"3"3dD\B#"  .r   c                     U R                  [        [        U R                  S5        SU R                  l        U R                  U R                  R                  S5        g )NROSTr'   )ry   AttributeErrorgetattrr   r  r{   r$   s    r   testExecuteActionChangeCtags.CommandActionTest.testExecuteActionChangeCtags  s@    NGT]]FC"$--4==%%k2r   c                     [        SSS S.5      nSU R                  l        SU R                  l        U R                  R	                  U5        U R                  R                  U5        U R                  SSS	S
9  g )Nr   r   c                     SSSS.$ )No      tester)fidfportuserr0   r$   s    r   r1   ?CommandActionTest.testExecuteActionUnbanAinfo.<locals>.<lambda>  s    r   )r*   r   zF-*zFecho '<ABC>, failure <F-ID> of <F-USER> -<F-TEST>- from <ip>:<F-PORT>'z$echo '<ABC>, user <F-USER> unbanned'z> -- stdout: '123, failure 111 of tester -- from 192.0.2.1:222'z' -- stdout: '123, user tester unbanned'Tr   )r   r   r   r   r   r   r   r|   s     r   testExecuteActionUnbanAinfo-CommandActionTest.testExecuteActionUnbanAinfo  sw    

	 % e$--D$----E--eC,  r   c                    SU R                   l        U R                   R                  5         U R                  U R                   R	                  S5      5        U R                  S5        U R                  5         U R                  U R                   R                  S5      5        U R                  S5        U R                  5         g )Nr;   r   )r   rK   r   r   
executeCmdr   r   _processCmdr$   s    r   testExecuteActionStartEmpty-CommandActionTest.testExecuteActionStartEmpty  s     $----//$--**2./O$--///$--++B/0O$--/r   c           	          U R                  U R                  R                  SSSSS.S95        U R                  SSS	S
SS9  g )NzUprintf %b "foreign input:\n -- $f2bV_A --\n -- $f2bV_B --\n -- $(echo -n $f2bV_C) --"z I'm a hacker; && $(echo $f2bV_B)zI"m very bad hackerz#`Very | very
$(bad & worst hacker)`)f2bV_Af2bV_Bf2bV_C)varsDictzforeign input:z' -- I'm a hacker; && $(echo $f2bV_B) --z -- I"m very bad hacker --z* -- `Very | very $(bad & worst hacker)` --Tr   )r   r   r  r   r$   s    r   testExecuteWithVars%CommandActionTest.testExecuteWithVars  s\    //$--** 1"3 + 
 
 )-/T  ;r   c                    SU R                   l        SU R                   l        SU R                   l        / SQnSSSR	                  U5      S.nU R                  5         U R                   R                  U5        U R                  " S	US
   -  US   /UQ7SS06  U R                  SUS
   -  SSS9  U R                  5         U R                   R                  U5        U R                   R                  5         U R                  SUS
   -  SSS9  g )Nz3echo "** ban <ip>, reason: <reason> ...\n<matches>"zecho "** unban <ip>"zecho "** stop monitoring")z<actionunban>z" Hooray! #z`I'm cool script kiddyz7`I`m very cool > /here-is-the-path/to/bin/.x-attempt.shz<actionstop>r   zAhacking attempt ( he thought he knows how f2b internally works ;)
)r   reasonr   z	** ban %sr   r!  r   Tz** unban %sz** stop monitoringr   )r   r   r   r   joinr   r   r   r   r   r"   )r   r   r}   s      r    testExecuteReplaceEscapeWithVars2CommandActionTest.testExecuteReplaceEscapeWithVars  s   R$--4$--8$--' 
Pii %
 --/--EteHoC07C=AC5; 4$  @--/--e--5; 4$  @r   c                 R    [         R                  " S5        U R                  S5        g )Nz+/bin/ls >/dev/null
bogusXXX now 2>/dev/nullz HINT on 127: "Command not found"r   r  r   r$   s    r   testExecuteIncorrectCmd)CommandActionTest.testExecuteIncorrectCmd   s     IJ67r   c                    [         R                   " 5       n[        R                  R                  (       d  SOSnU R	                  [
        R                  " SUS95        U R                  [         R                   " 5       X-   :  =(       a    [         R                   " 5       X-   S-   :*  5        U R                  SSSS9  U R                  SS	5        g )
Nr   g{Gz?zsleep 30timeoutz -- timed out afterTr    -- killed with SIGTERM -- killed with SIGKILL)	timeunittestF2BfastassertFalser   r  r   r   )r   stimer+  s      r   testExecuteTimeout$CommandActionTest.testExecuteTimeout  s    
))+%\\&&AD'=++JHI//$))+0WTYY[EOVWDW5WXJ 54@--/r   c                   ^^^^ [         R                  " SS5      m[        TS5       nUR                  ST-  5        S S S 5        SmUU4S jnU4S jm[        R                  " 5       mU R                  [        R                  " ST-  US	95        T" 5       mU R                  [        R                  " U4S
 jS5      5        U R                  SS5        U R                  S5        U R                  SS5        [        R                  " TS-   5        [        R                  " 5       mU R                  [        R                  " ST-  US	95        T" 5       mU R                  [        R                  " U4S jS5      5        U R                  SS5        U R                  S5        U R                  SS5        [        R                  " T5        [        R                  " TS-   5        g ! , (       d  f       GN= f)Nz.sh	fail2ban_wzo#!/bin/bash
		trap : HUP EXIT TERM

		echo "$$" > %s.pid
		echo "my pid $$ . sleeping lo-o-o-ong"
		sleep 30
		r   c                  Z   > T " 5       S L=(       d    [         R                   " 5       T-
  S:  $ Nr   )r.  )getnastypidr3  s   r   getnasty_toutLCommandActionTest.testExecuteTimeoutWithNastyChildren.<locals>.getnasty_tout  s*    M yy{UQr   c                    > S n [         R                  R                  TS-   5      (       a3  [        TS-   5       n [	        UR                  5       5      n S S S 5        U $ U $ ! [         a     Nf = f! , (       d  f       U $ = f)N.pid)r   pathisfileopenr   readrz   )cpidftmpFilenames     r   r;  JCommandActionTest.testExecuteTimeoutWithNastyChildren.<locals>.getnastypid$  sw    
4ggnn[6)**	kF"	#q]d 
$
 ;$;  
 
$	#
 ;s(   A0A  
A-*A0,A--A00
A?zbash %sr*  c                  $   > [        T 5      (       + $ r   r   rD  s   r   r1   GCommandActionTest.testExecuteTimeoutWithNastyChildren.<locals>.<lambda>5      Z-=)=r   r   zmy pid z Resource temporarily unavailablez	timed outzkilled with SIGTERMzkilled with SIGKILLr?  zout=`bash %s`; echo ALRIGHTc                  $   > [        T 5      (       + $ r   rI  rJ  s   r   r1   rK  C  rL  r   z -- timed outr,  r-  )tempfilemktemprB  writer.  r2  r   r  r   r
   wait_forr   r   unlink)r   rE  r<  rD  r;  r3  rF  s      @@@@r   #testExecuteTimeoutWithNastyChildren5CommandActionTest.testExecuteTimeoutWithNastyChildren  s   {3+K77  	   % ))+%=++{M3 4 
$//%..!=qABIABK ))+))K& ! ))+%=++ ;.G H 
$//%..!=qABIABO$--/))K))K& !m s   G!!
G0c                     [         R                  " S5        U R                  S5        [         R                  " S5        U R                  S5        g )Nzecho "How now brown cow"zstdout: 'How now brown cow'
z7echo "The rain in Spain stays mainly in the plain" 1>&2z6stderr: 'The rain in Spain stays mainly in the plain'
r&  r$   s    r   testCaptureStdOutErr&CommandActionTest.testCaptureStdOutErrL  sB    5634<><>r   c                 z    [        S S SSS9nU R                  SU-  S5        U R                  [        S U5        g )	Nc                     [        S5      $ r   r   r$   s    r   r1   2CommandActionTest.testCallingMap.<locals>.<lambda>U  s    Rr   c                     [        S5      $ r   r   r$   s    r   r1   rZ  U  s    SXr   string   )callmeerror
dontcallmenumberz)%(callme)s okay %(dontcallme)s %(number)iz10 okay string 17c                     SU -  $ )Nz	%(error)ir0   )xs    r   r1   rZ  ]  s    +/r   )r   r{   ry   rz   )r   mymaps     r   testCallingMap CommandActionTest.testCallingMapT  sG    
08M$% .6 J 95Ar   c                    [        S S SS.5      nUR                  5         SUS'   US	 U R                  [        U5      S5        U R	                  SU5        U R                  US   US	   4S
5        UR                  5         [        U5      nU R                  [        U5      S5        U R                  SU5        U R                  US   US	   US   4S5        SUS'   UR                  5       nS US'   SUS'   US		 US	 U R                  S	U;   5        U R                  SU;   5        U R                  S	U;   5        U R                  SU;   5        U R                  US   US	   US   US   4S5        U R                  US   US   4S5        g )Nc                     gr:  r0   r$   s    r   r1   8CommandActionTest.testCallingMapModify.<locals>.<lambda>a      Ur   c                     U S   S-   $ Nr      r0   r$   s    r   r1   ri  b      T#Y]r   testr   r   c   r   rq  r   r   )rr  r   r   )r      ro  dddddc                     U S   S-   $ )Nr      r0   r$   s    r   r1   ri  w  s    cQr   r   )r   rs  ro  rt  )r      )
r   resetr{   r   assertNotInreprassertIncopyr   r2  )r   msm2s       r   testCallingMapModify&CommandActionTest.testCallingMapModify_  s   " ! '')!C&f3q613AcFAcF#W-'')
1g!3q61--QAcFAcFAcF+_=!C&vvx"&"S'"S'gg//#(//#(3"93"9AcFAcFAcFAcF35LMBsGRW%v.r   c                    [        S S SS.5      n[        U5      nU R                  SU5        U R                  SU5        U R                  SU5        UR	                  S5      nU R                  S	U5        U R                  S
U5        U R                  SU5        S US'   UR	                  S5      nU R                  S	U5        U R                  S
U5        U R                  SU5        U R                  SU5        g )Nc                     gr:  r0   r$   s    r   r1   5CommandActionTest.testCallingMapRep.<locals>.<lambda>  rj  r   c                     U S   S-   $ rl  r0   r$   s    r   r1   r    rn  r   r;   rp  z'a': z'b': z'c': ''Tz'a': 5z'b': 11c                     U S   S-   $ )Nxxxrw  r0   r$   s    r   r1   r    s    Uar   rq  z'c': )r   r{  rz  r|  _asrepr)r   r~  r  s      r   testCallingMapRep#CommandActionTest.testCallingMapRep  s    "
 !
 1g!7A7A--	1iio!--!--	1--	1'!C&iio!--!--	1--9a r   c                     [        [        5       5      nSUl        SUl        UR	                  5         U R                  SSS9  SUl        U R                  SSS9  SUl        UR                  5         g )Ng-C6?TzActions: enter idle moder   r   FzActions: leave idle mode)r	   r   	sleeptimeidler   r   activer"  )r   r   s     r   testActionsIdleMode%CommandActionTest.testActionsIdleMode  sd    ik!!+!&'').R8!&.R8!(&&(r   )__action__action_startedN)!__name__
__module____qualname____firstlineno__r   r#   r~   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r#  r'  r4  rS  rV  re  r  r  r  __static_attributes__r0   r   r   r   r   (   s    
&$aIFD>&P7('#R . .2(( # # 8 8$ $/ $/L . .&3
(;"@88	/:"z>	B!/F!.r   r   )
__author____copyright____license__r   rN  r.  r/  server.actionr   r   r   server.actionsr   r	   server.utilsr
   	dummyjailr   utilsr   r   r   r   r0   r   r   <module>r     sF   . 
2 	    N N 1     > >	* 	r   