
    Bdd                         d Z dZdZddlZddlZddlZddlZddlmZm	Z	m
Z
 ddlmZmZ ddlmZ d	d
lmZ d	dlmZmZmZ  G d de          ZdS )zCyril Jaquierz Copyright (c) 2004 Cyril JaquierGPL    N   )CommandAction
CallingMapsubstituteRecursiveTags)OrderedDictActions)Utils   )	DummyJail)
pid_existswith_tmpdirLogCaptureTestCasec                       e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
ed	             Zd
 Zed             Zed             Zed             Zed             Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd ZdS )CommandActionTestc                      t          j                    t          dd           _        d _         j        j         fd}| j        _        dS )zCall before every test case.NTestFc                  &    d_                       S )NT)"_CommandActionTest__action_started)orgstartselfs   ?/usr/lib/python3/dist-packages/fail2ban/tests/actiontestcase.py_action_startz.CommandActionTest.setUp.<locals>._action_start1   s    4
(**    )r   setUpr   _CommandActionTest__actionr   start)r   r   r   s   ` @r   r   zCommandActionTest.setUp*   sh    4   f--$-$] (      &$-r   c                 n    | j         r| j                                         t          j        |            dS )zCall after every test case.N)r   r   stopr   tearDownr   s    r   r    zCommandActionTest.tearDown6   s8    	 =d#####r   c           
         dddd}|                      t          d            |                      t          d            |                      t          d            |                      t          d            |                      t          d	            |                     t          t	          d
                    ddddd           |                     t          t	          d                    ddddddd           |                     t          t	          d                    t	          d                     |                      t          d            |                      t          d            |                     t          ddi          ddi           |                     t          ddd          ddd           |                     t          d d!d"          d#d!d"           |                     t          d$d!d"          d%d!d"           |                     t          d&d'd(d)          d*d'd(d)           |                     t          |          dd+d,d           |                     t          d-d.d/          d0d.d/           |                     t          d-d.d1d2          d1d.d1d2           |                     t          d3d4d1d2          d5d4d1d2           d S )6N	192.0.2.0z
123 <HOST>z	890 <ABC>HOSTABCxyzc                  $    t          ddi          S )NA<A>r    r   r   <lambda>z?CommandActionTest.testSubstituteRecursiveTags.<locals>.<lambda>D   s    "C<00 r   c                  &    t          ddd          S )N<B>r*   r)   Br+   r,   r   r   r-   z?CommandActionTest.testSubstituteRecursiveTags.<locals>.<lambda>F   s    "U#;#;<< r   c                  (    t          dddd          S )Nr/   <C>r*   )r)   r1   Cr+   r,   r   r   r-   z?CommandActionTest.testSubstituteRecursiveTags.<locals>.<lambda>H   s    "U#G#GHH r   c                  *    t          ddddd          S )Nzto=<B> fromip=<IP>r/   r3    )r)   r4   r1   Dr+   r,   r   r   r-   z?CommandActionTest.testSubstituteRecursiveTags.<locals>.<lambda>K   s    ")=EPU\^#_#_`` r   c                  *    t          ddddd          S )Nzto=<honeypot> fromip=<IP>z
<honeypot>z<sweet>r6   )	failregexsweethoneypotignoreregexr+   r,   r   r   r-   z?CommandActionTest.testSubstituteRecursiveTags.<locals>.<lambda>M   s/    "1LWcqz  LN  $O  $O  P  P r   ))Xzx=x<T>T1)Zz<X> <T> <Y>Yzy=y<T>zx=x1r@   zy=y1zx=x1 1 y=y1)r=   r?   rC   rA   ))r=   zx=x<T> <Z> <<R1>> <<R2>>)R1rA   )R2rC   r>   )rA   z<T> <Y>rB   zx=x1 1 y=y1 1 y=y1 y=y1rA   rC   z1 y=y1)r=   rD   rE   r?   rA   rC   ))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))rF   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)rG   zf2b-anyrH   rK   rN   )rQ   ziptables -wrR   rT   )rW   I-p tcp -m multiport --dports ssh -m set --match-set f2b-any src -j REJECT)rX   rb   rY   r\   r_   c                  :    t          t          d                    S )N)r)   z<<B><C>>r1   r7   r4   EDEz	cycle <A>r   r   r,   r   r   r-   z?CommandActionTest.testSubstituteRecursiveTags.<locals>.<lambda>y   %    (? N B B ) ) r   c                  :    t          t          d                    S )N)rh   rd   re   rf   rj   r,   r   r   r-   z?CommandActionTest.testSubstituteRecursiveTags.<locals>.<lambda>~   rk   r   r)   r3   z<C> <D> <X>fun)r)   r=   z<C> <D> funz<C> <B>coolr0   z<C> coolz<matches> <B>z<matches> coolz/to=<honeypot> fromip=<IP> evilperson=<honeypot>pokier6   )r9   r;   r<   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)   rq   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   testSubstituteRecursiveTagsz-CommandActionTest.testSubstituteRecursiveTags<   s   

 % J002 2 2J<<> > >JHHJ J J J``b b bJ P  PQ Q Q *KH-J -J  6>>  
 *Kq-s -s  %S#H[abb  
 *K 9 - -        @ J ! !   
 J ! !    *C<883,GGG*5+I+IJJR_ejLkLklll*+H+HIIQ[bhKiKijjj*v+N+NOOWgntQuQuvvv*9jx  QS  ,T  ,T  U  U>	
 	
   *511#	
 	
   *+P+PQQ6**, , ,*]f+g+ghhI>>@ @ @ *1PZ^lu+v+vww!4YGGI I I I Ir   c                 X    t          dd ddd          t                     ddd<                        t          fd           t                     dd	<                        t          fd
                                 j                            d          d                                 j                            d          d                                t           fd                                 j                            d          d           d S )Nr   c                     dS )Nz<A><A>r,   r!   s    r   r-   zHCommandActionTest.testSubstRec_DontTouchUnusedCallable.<locals>.<lambda>   s    H r   r6   )r)   r1   r4   r7   c                 2    dt          | d                   z  S )N   r)   int)r   is     r   r-   zHCommandActionTest.testSubstRec_DontTouchUnusedCallable.<locals>.<lambda>   s    Q#d3i..0 r   r4   c                       d         S )Nr4   r,   cms   r   r-   zHCommandActionTest.testSubstRec_DontTouchUnusedCallable.<locals>.<lambda>   s    r#w r   test=<C>r7   c                  "    t                     S Nr+   r   s   r   r-   zHCommandActionTest.testSubstRec_DontTouchUnusedCallable.<locals>.<lambda>   s    /Fr/J/J r   ztest=<A>ztest=0ztest=<A>--<B>--<A>ztest=0--<A><A>--0c                  :    j                             d           S )Nr   )r   
replaceTag)r   r   s   r   r-   zHCommandActionTest.testSubstRec_DontTouchUnusedCallable.<locals>.<lambda>   s    t}/G/G
TV/W/W r   z<D>)r   )r   r   rt   ZeroDivisionErrorrv   r   r   )r   r   s   `@r   $testSubstRec_DontTouchUnusedCallablez6CommandActionTest.testSubstRec_DontTouchUnusedCallable   sH   			   " "000"S'%777""S'%'J'J'J'JKKK 4=++J;;XFFF 4=++,@"EEGZ[[[%'W'W'W'W'WXXX4=++E266
CCCCCr   c                 6   dddd}|                      | j                            d|          d           |                      | j                            d|          d           |                      | j                            d	|          d
           |                      | j                            dddi          d           |                      | j                            dddi          d           |                      | j                            dddi          d           d|d<   |                      | j                            d	|          d           |                      | j                            dt          d                     d           d S )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                      t          d          S N
   strr!   s    r   r-   z2CommandActionTest.testReplaceTag.<locals>.<lambda>   s    CGG r   r   z09 10 11rv   r   r   r   rw   s     r   testReplaceTagz CommandActionTest.testReplaceTag   s   

 %
 =NE22   =.66   =7??   =K89; ;:< < < =M:;= =:< < < =-@AC C=? ? ? %,=7??  
 =-++,,,. .    r   c                     |                      | j                            dt          d                     d           d S )Nabcc                      t          d          S Nar~   r!   s    r   r-   z4CommandActionTest.testReplaceNoTag.<locals>.<lambda>   s    CHH r   r   r   r!   s    r   testReplaceNoTagz"CommandActionTest.testReplaceNoTag   sR     =E,,---/ /057 7 7 7 7r   c                     t           j        dd           t           j        dd           t           j        dd           t           j        dd           t           j        d	d
           t           j        dd                                t          d fd           t	           j        d                                t          d fd           d S )Nr   z<abzc>zb?family=inet6zb>ac<a><b>abz<ac>zx?family=inet6r6   z/properties contain self referencing definitionsc                  R     j                             d j         j        d          S )Nr   family=inet4conditionalr   r   _propertiesr!   s   r   r-   z?CommandActionTest.testReplaceTagSelfRecursion.<locals>.<lambda>   s*    4=##HM> $ ; ; r   z.possible self referencing definitions in queryc                  R     j                             d j         j        d          S )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   r-   z?CommandActionTest.testReplaceTagSelfRecursion.<locals>.<lambda>   s*    4=##NM> $ ; ; r   )setattrr   assertRaisesRegexru   delattrr!   s   `r   testReplaceTagSelfRecursionz-CommandActionTest.testReplaceTagSelfRecursion   s    	$-d###	$-d###	$-)4000	$-x(((	$-v&&&	$-)2...%W; ; ; ;  
 
$-%V; ; ; ;    r   c           	         t          | j        dd           t          | j        dd           t          | j        dd           t          | j        dd           t          | j        d	d
           | j        j        }t          d          D ]}|                     | j                            d| j        j        d|          d           |                     | j                            d| j        j        d|          d           |                     | j                            d| j        j        d|          d           |                     t          |          dk               t          | j        dd           |                     t          |          d           t          d          D ]}|                     | j                            d| j        j        d|          d           |                     | j                            d| j        j        d|          d           |                     | j                            d| j        j        d|          d           |                     t          |          dk               d S )Nr   r   zabc?family=inet4345zabc?family=inet6567r'   z	890-<abc>	banactionzText <xyz> text <abc>r   z<banaction> '<abc>'r6   )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rangerv   r   r   
assertTruelen)r   r   r   s      r   testReplaceTagConditionalCachedz1CommandActionTest.testReplaceTagConditionalCached  s   	$-&&&	$-+U333	$-+U333	$-,,,	$-&=>>>
-
#%88 # #aM2DM4M5  " "!# # # M2DM4Mu  . .!# # # M2DM4Mu  . .!# # # # //#e**/"""	$-,,,3u::q!!!88 # #aM2DM4M5  " "!# # # M2DM4Mu  . .!# # # M2DM4Mu  . .!# # # # //#e**/"""""r   c                 f   |dz  }d|z  | j         _        | j         j        | j         _        |                     | j         j        d|z             d|z  | j         _        |                     | j         j        d|z             d| j         _        |                     | j         j        d           d|z  | j         _        |                     | j         j        d|z             d| j         _        |                     | j         j        d           |                                  | 	                    d           | j         
                    dd i           |                     d	           |                     d
           | j                                          |                     | j         j                   d S )N/fail2ban.test
touch '%s'
rm -f '%s'z<actioncheck> && echo -n[ -e '%s' ]truereturnedipInvariant check failedzreturned successfully)r   rF   actionrepairrv   
actionstop	actionbanactioncheckactionunbanpruneLogassertNotLoggedbanassertLoggedr   r   tmps     r   testExecuteActionBanz&CommandActionTest.testExecuteActionBan*  s   	#*S0$-#}8$-4=,lS.@AAA)C/$-4=+\C-?@@@6$-4=*,FGGG+c1$-4=,mc.ABBB$$-4=,f555--///z""" -T4L!!!,---+,,,-DM,-----r   c                    d| j         _        d| j         _        d| j         _        d| j         _        | j                                          | j                             i            |                                  | j                             i            | 	                    dd           | j                             i            |                     d           | j         
                                 | j                             i            | j                                          | 	                    dd           |                     d           d S )	Nr6   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   testExecuteActionEmptyUnbanz-CommandActionTest.testExecuteActionEmptyUnbanD  s)   $- $-/$--$---B--///-bO$///-B----b-F&&&'''''r   c                     |dz  }d| j         _        d|z  | j         _        d|z  | j         _        d|z  | j         _        | j                                          | j                                          d S )Nr   r#   ztouch '%s.<HOST>'zrm -f '%s.<HOST>'z[ -e '%s.192.0.2.0' ])r   r%   rF   r   r   r   consistencyCheckr   s     r   testExecuteActionStartCtagsz-CommandActionTest.testExecuteActionStartCtagsX  sr    	#"$-1C7$-036$-5;$---  """""r   c                 0   |dz  }d| j         _        d|z  | j         _        d|z  | j         _        d|z  | j         _        |                     t          | j         j        dd i           |                     ddd	
           | 	                    d           d|z  | j         _        d|z  | j         _        d|z  | j         _        d|z  | j         _        | j                             dd i           |                     d           | 
                    d           d S )Nr   r6   r   rm '%s'r   r   r   Unable to restore environmentTallr   r   z-<actioncheck> && printf "%%%%b
" <ip> >> '%s')r   rF   r   r   r   rt   RuntimeErrorr   r   r   r   r   s     r   (testExecuteActionCheckRestoreEnvironmentz:CommandActionTest.testExecuteActionCheckRestoreEnvironmentb  s   	# $-)C/$-%O$-+c1$-L$-"3dD\BBB,.MSWXXX--*S0$-&_$-PSVV$-+c1$--T4L!!!,---677777r   c           	      R   |dz  }d|z  | j         _        d|z  | j         _        d|z  | j         _        d|z  | j         _        d|z  | j         _        d| j         _        | j                                          dD ]-}|                     d	|z             | j         	                    d
di           | 
                    ddz  d           |                     dddz  d| j         j        rdndz  ddz  d           t          j        |           |                                  | j         	                    d
di           | 
                    dddz  d| j         j        rdndz  ddz  ddz  d           | j         j        rd| j         _        | j         j        sd| j         _        /d S )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.2r6   )r   rF   r   r   r   r   actionstart_on_demandr   r   r   r   r   osremove)r   r   r   s      r   "testExecuteActionCheckOnBanFailurez4CommandActionTest.testExecuteActionCheckOnBanFailureu  s   	#>D$-)C/$-?#E$-behh$->D$-(-$-%-  / /a==!"""=dK()))%%4  1 1 18>!DM$>QLLMR:4  ) ) )
 9S>>>==???=dK()))5>!DM$>QLLMR:%%4	  1 1 1 m  /!#DMM/ /*.DM'1/ /r   c                    |dz  }d| j         _        d| j         _        d|z  | j         _        d|z  | j         _        d|z  | j         _        | j                             dd i           |                     ddd	
           |                                  d| j         _        | 	                    t          | j         j        dd i           |                     dddd	
           d S )Nr   r6   r   r   r   r   r   zecho 'repair ...'Tr   r   )r   rF   r   r   r   r   r   r   r   rt   r   r   s     r   'testExecuteActionCheckRepairEnvironmentz9CommandActionTest.testExecuteActionCheckRepairEnvironment  s    	# $-$-%O$-+c1$->D$--T4L!!!46ItTTT--///2$-L$-"3dD\BBB#"  . . . . .r   c                     |                      t          t          | j        d           d| j        _        |                     | j        j        d           d S )NROSTr#   )rt   AttributeErrorgetattrr   r   rv   r!   s    r   testExecuteActionChangeCtagsz.CommandActionTest.testExecuteActionChangeCtags  sI    NGT]FCCC"$-4=%k22222r   c                     t          ddd d          }d| j        _        d| j        _        | j                            |           | j                            |           |                     ddd	
           d S )Nr   r   c                     ddddS )No      tester)fidfportuserr,   r!   s    r   r-   z?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   rw   s     r   testExecuteActionUnbanAinfoz-CommandActionTest.testExecuteActionUnbanAinfo  s    

	    % e$-D$--E-eC,      r   c                    d| j         _        | j                                          |                     | j                             d                     |                     d           |                                  |                     | j                             d                     |                     d           |                                  d S )Nr6   r   )r   rF   r   r   
executeCmdr   r   _processCmdr!   s    r   testExecuteActionStartEmptyz-CommandActionTest.testExecuteActionStartEmpty  s     $--//$-**2..///O$$$--/////$-++B//000O$$$--/////r   c           	          |                      | j                            ddddd                     |                     ddd	d
d           d S )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   testExecuteWithVarsz%CommandActionTest.testExecuteWithVars  s    //$-** 1"3  + 
 
 
 
 
 )-/T  ; ; ; ; ;r   c                 8   d| j         _        d| j         _        d| j         _        g d}ddd                    |          d}|                                  | j                             |            | j        d	|d
         z  |d         g|R ddi |                     d|d
         z  dd           |                                  | j         	                    |           | j         
                                 |                     d|d
         z  dd           d S )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   rx   s      r    testExecuteReplaceEscapeWithVarsz2CommandActionTest.testExecuteReplaceEscapeWithVars  sh   R$-4$-8$-  ' 
Pii   %
 --///-E$teHoC07C C C=AC C C5; 4$  @ @ @--///-e-5; 4$  @ @ @ @ @r   c                 X    t          j        d           |                     d           d S )Nz+/bin/ls >/dev/null
bogusXXX now 2>/dev/nullz HINT on 127: "Command not found"r   r   r   r!   s    r   testExecuteIncorrectCmdz)CommandActionTest.testExecuteIncorrectCmd   s/    IJJJ677777r   c                    t          j                     }t          j        j        sdnd}|                     t          j        d|                     |                     t          j                     ||z   k    ot          j                     ||z   dz   k               |                     ddd           |                     dd	           d S )
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   testExecuteTimeoutz$CommandActionTest.testExecuteTimeout  s    
)++%\&0AAD'=+JHHHIII//$)++0WTY[[EGOVWDW5WXXXJ 54@@@--/ / / / /r   c                 *   t          j        dd          t          d          5 }|                    dz             d d d            n# 1 swxY w Y   dfd}fdt	          j                    |                     t          j        dz  |	                                  |                     t          j
        fd
d                     |                     dd           |                     d           |                     dd           t          j        dz              t	          j                    |                     t          j        dz  |	                                  |                     t          j
        fdd                     |                     dd           |                     d           |                     dd           t          j                   t          j        dz              d S )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                  P                  d upt          j                     z
  dk    S Nr}   )r  )getnastypidr  s   r   getnasty_toutzLCommandActionTest.testExecuteTimeoutWithNastyChildren.<locals>.getnasty_tout  s.    KMM y{{UQr   c                  
   d } t           j                            dz             r]t          dz             5 }	 t	          |                                          } n# t          $ r Y nw xY wd d d            n# 1 swxY w Y   | S )N.pid)r   pathisfileopenr   readru   )cpidftmpFilenames     r   r  zJCommandActionTest.testExecuteTimeoutWithNastyChildren.<locals>.getnastypid$  s    
4gnn[6)** 	kF"	#	# q]]dd   
d              
 ;s4   A8!AA8
A)&A8(A))A88A<?A<zbash %sr  c                  $    t                      S r   r   r&  s   r   r-   zGCommandActionTest.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                      S r   r*  r+  s   r   r-   zGCommandActionTest.testExecuteTimeoutWithNastyChildren.<locals>.<lambda>C  r,  r   z -- timed outr  r  )tempfilemktempr$  writer  r  r   r   r   r
   wait_forr   r   unlink)r   r'  r  r&  r  r  r(  s      @@@@r   #testExecuteTimeoutWithNastyChildrenz5CommandActionTest.testExecuteTimeoutWithNastyChildren  s   {33+K 77  	                  %          )++%=+{M3 3 3 4 4 4 
$//%.!=!=!=!=qAABBBIABBBK   ))+ + +)K& !!! )++%=+ ;.G G G H H H 
$//%.!=!=!=!=qAABBBIABBBO$$$--/ / /)K)K& !!!!!s   AAAc                     t          j        d           |                     d           t          j        d           |                     d           d S )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   testCaptureStdOutErrz&CommandActionTest.testCaptureStdOutErrL  sf    56663444<> > ><> > > > >r   c                     t          d d dd          }|                     d|z  d           |                     t          d |           d S )	Nc                      t          d          S r   r   r!   s    r   r-   z2CommandActionTest.testCallingMap.<locals>.<lambda>U  s    R r   c                      t          d          S r   r~   r!   s    r   r-   z2CommandActionTest.testCallingMap.<locals>.<lambda>U  s    SXX r   string   )callmeerror
dontcallmenumberz)%(callme)s okay %(dontcallme)s %(number)iz10 okay string 17c                     d| z  S )Nz	%(error)ir,   )xs    r   r-   z2CommandActionTest.testCallingMap.<locals>.<lambda>]  s
    +/ r   )r   rv   rt   ru   )r   mymaps     r   testCallingMapz CommandActionTest.testCallingMapT  sp    
008M8M$ $ $% .6   J 9 95AAAAAr   c                    t          d d dd          }|                                 d|d<   |d= |                     t          |          d           |                     d|           |                     |d         |d	         fd
           |                                 t          |          }|                     t          |          d           |                     d|           |                     |d         |d	         |d         fd           d|d<   |                                }d |d<   d|d<   |d	= |d= |                     d	|v            |                     d|v            | 	                    d	|v            | 	                    d|v            |                     |d         |d	         |d         |d         fd           |                     |d         |d         fd           d S )Nc                     dS r  r,   r!   s    r   r-   z8CommandActionTest.testCallingMapModify.<locals>.<lambda>a      U r   c                     | d         dz   S Nr      r,   r!   s    r   r-   z8CommandActionTest.testCallingMapModify.<locals>.<lambda>b      T#Y] r   testr   r   c   r   rL  r   r   )rM  r   r   )r}      rJ  dddddc                     | d         dz   S )Nr      r,   r!   s    r   r-   z8CommandActionTest.testCallingMapModify.<locals>.<lambda>w  s    cQ r   r   )r}   rN  rJ  rO  )r      )
r   resetrv   r   assertNotInreprassertIncopyr   r  )r   msm2s       r   testCallingMapModifyz&CommandActionTest.testCallingMapModify_  s   ""   ! '')))!C&f3q6613AcFAcF#W---'')))
1gg!3q661--QAcFAcFAcF+_===!C&vvxx"&&"S'"S'gg//#(//#(3"93"9AcFAcFAcFAcF35LMMMBsGRW%v.....r   c                 f   t          d d dd          }t          |          }|                     d|           |                     d|           |                     d|           |                    d          }|                     d	|           |                     d
|           |                     d|           d |d<   |                    d          }|                     d	|           |                     d
|           |                     d|           |                     d|           d S )Nc                     dS r  r,   r!   s    r   r-   z5CommandActionTest.testCallingMapRep.<locals>.<lambda>  rE  r   c                     | d         dz   S rG  r,   r!   s    r   r-   z5CommandActionTest.testCallingMapRep.<locals>.<lambda>  rI  r   r6   rK  z'a': z'b': z'c': ''Tz'a': 5z'b': 11c                     | d         dz   S )NxxxrR  r,   r!   s    r   r-   z5CommandActionTest.testCallingMapRep.<locals>.<lambda>  s    Ua r   rL  z'c': )r   rV  rU  rW  _asrepr)r   rY  rZ  s      r   testCallingMapRepz#CommandActionTest.testCallingMapRep  s5   ""
   !
 1gg!7A7A--	1iioo!--!--	1--	1''!C&iioo!--!--	1--9a     r   c                     t          t                                }d|_        d|_        |                                 |                     dd           d|_        |                     dd           d|_        |                                 d S )Ng-C6?TzActions: enter idle moder   r   FzActions: leave idle mode)r	   r   	sleeptimeidler   r   activer  )r   r   s     r   testActionsIdleModez%CommandActionTest.testActionsIdleMode  s    ikk!!+!&''))).R888!&.R888!(&&(((((r   N)__name__
__module____qualname__r   r    ry   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r	  r  r  r3  r5  rB  r\  rc  rh  r,   r   r   r   r   (   s       
& 
& 
&$ $ $aI aI aIFD D D>& & &P7 7 7  ('# '# '#R . . +.2( ( (( # # +# 8 8 +8$ $/ $/ +$/L . . +.&3 3 3
  (  ; ; ;"@ @ @88 8 8	/ 	/ 	/:" :" :"z> > >	B 	B 	B!/ !/ !/F! ! !.    r   r   )
__author____copyright____license__r   r.  r  r  server.actionr   r   r   server.actionsr   r	   server.utilsr
   	dummyjailr   utilsr   r   r   r   r,   r   r   <module>rt     s   . 
2 				    N N N N N N N N N N 1 1 1 1 1 1 1 1                         > > > > > > > > > >	 	 	 	 	* 	 	 	 	 	r   