
    GkcJ                         d Z dZdZddlZddlZddlZddlmZ ddlm	Z	 dd	l
mZ dd
lmZmZmZmZ ej                            ej                            e          d          Z G d de          ZdS )zDaniel BlackzCopyright (c) 2013 Daniel BlackGPL    N   )
FailTicket)Utils   )	DummyJail)LogCaptureTestCasewith_alt_timewith_tmpdirMyTimefilesc                        e Zd Z fdZ fdZi fdZd Zd Zd Zd Z	d Z
d	 Zd
 Zed             Zd Zd Zeed                         Z xZS )ExecuteActionsc                     t          t          |                                            t                      | _        | j        j        | _        dS )zCall before every test case.N)superr   setUpr   _ExecuteActions__jailactions_ExecuteActions__actionsself	__class__s    @/usr/lib/python3/dist-packages/fail2ban/tests/actionstestcase.pyr   zExecuteActions.setUp)   s:    ##%%%$+;&$...    c                 V    t          t          |                                            d S )N)r   r   tearDownr   s    r   r   zExecuteActions.tearDown/   s%    &&(((((r   c                    | j                             d           | j         d         }d|                    dd          z   |_        d|                    dd          z   |_        d|                    dd          z   |_        d	|                    d
d          z   |_        d|                    dd          z   |_        d|                    dd          z   |_        |S )Nipzecho ip startstart zecho ip ban <ip>banzecho ip unban <ip>unbanzecho ip checkcheckzecho ip flushflushzecho ip stopstop)	r   addgetactionstart	actionbanactionunbanactioncheckactionflush
actionstop)r   oacts      r   defaultActionzExecuteActions.defaultAction2   s    .Tt##AEE'2$6$66#/$QUU5"%5%55#-(w););;#/#AEE'2$6$66#/#AEE'2$6$66#/!!%%"3"33#.	*r   c                     | j                             d           |                     t          | j         j        d           d S )Ntest)r   r&   assertRaises
ValueErrorr   s    r   testActionsAddDuplicateNamez*ExecuteActions.testActionsAddDuplicateName=   s;    .VJ 2F;;;;;r   c                    | j                             d           |                     | j         d                    |                     d| j                    |                     d| j                    | j                             d           | j         d= | j         d= |                     d| j                    |                     t          | j                   d           | j                             d           |                     | j                                         d           | 	                    t          | j         j        d           d S )Nr2   znonexistant actiontest1r      z	127.0.0.1)r   r&   
assertTrueassertInassertNotInassertEquallen
setBanTime
getBanTimer3   r4   removeBannedIPr5   s    r   testActionsManipulationz&ExecuteActions.testActionsManipulationA   s   .V//$.()))--''''888.W
nV
nW64>***3t~&&***.C   4>,,..s333J ={KKKKKr   c                    |                      | j                            d          d           |                     d           |                                  |                      | j                            g d          d           |                     d           |                     d           |                     d           |                     d           d S )	N	192.0.2.1r   Ban 192.0.2.1)rD   z	192.0.2.2z	192.0.2.3r   192.0.2.1 already bannedzBan 192.0.2.2zBan 192.0.2.3)r=   r   addBannedIPassertLoggedpruneLogassertNotLoggedr5   s    r   testAddBannedIPzExecuteActions.testAddBannedIPP   s    4>--k::A>>>O$$$--///4>--.U.U.UVVXYZZZ.///'''O$$$O$$$$$r   c                    |                                   | j                                         |                     ddz  d           | j                                         | j                                         |                     ddz  ddz             |                     | j                                        ddd	g fg           |                     | j                            d
          ddg           d S )N
stdout: %rip startTwaitzip fluship stop)zCurrently bannedr   )zTotal bannedr   zBanned IP listshort)r0   r   r   rH   r%   joinr=   statusr5   s    r   testActionsOutputz ExecuteActions.testActionsOutputZ   s   .L:-D999..L:-|i/GHHH4>((**,D#&6%<,> ? ? ?4>((113K#3% & & & & &r   c           
           j                             dt          j                            t
          d          ddi                                d            j                                                               t          j
         fdd                      j                                           j                                                               d                                t           j         j        d	d
i             j                             dt          j                            t
          d          ddd                                t           j         j        dt          j                            t
          d          dddd                                t           j         j        dt          j                            t
          d          i            d S )NActionzaction.d/action.pyopt1valuezTestAction initialisedc                  .                          d          S )NzTestAction action start
_is_loggedr5   s   r   <lambda>z4ExecuteActions.testAddActionPython.<locals>.<lambda>n   s    $//:S*T*T r      zTestAction action stopAction3z/does/not/exist.pyAction4value2)rX   opt2Action5value3)rX   rb   opt3)r   r&   ospathrS   TEST_FILES_DIRrH   r   r:   r   wait_forr%   r3   IOError	TypeErrorr5   s   `r   testAddActionPythonz"ExecuteActions.testAddActionPythonf   s   .RW\\.*>??
G   ,---.//5>"T"T"T"TVWXXZZZ..,---G>y"6< < < .bgll>+?@@X&&( ( ( dn )7<< 455Xx88: : :
 dn )7<< 455r; ; ; ; ;r   c           	                                t           j        j        dt          j                            t          d          i                                  t           j        j        dt          j                            t          d          i             j                            dt          j                            t          d          i             j                                          	                    t          j         fdd                      j                                          j                                                              d           d S )NrW   zaction.d/action_noAction.pyzaction.d/action_nomethod.pyzaction.d/action_errors.pyc                  .                          d          S )NzFailed to startr[   r5   s   r   r]   z7ExecuteActions.testAddPythonActionNOK.<locals>.<lambda>   s    $//:K*L*L r   r^   zFailed to stop)r3   RuntimeErrorr   r&   rf   rg   rS   rh   r   r:   r   ri   r%   rH   r5   s   `r   testAddPythonActionNOKz%ExecuteActions.testAddPythonActionNOK   s;   L$."4RW\\.!# #   L$."4RW\\.!# #   .RW\\.! !   .//5>"L"L"L"LaPPRRR..$%%%%%r   c                    | j                             dt          j                            t
          d          i            | j                             dt          j                            t
          d          i            | j                            t          d                     | j         	                                 | 
                    d           |                     d           |                     d           | j                                          | 
                    d           |                     d	           |                     d
           d S )Naction1zaction.d/action_modifyainfo.pyaction2z1.2.3.4Failed to execute banzaction1 ban deleted aInfo IPzaction2 ban deleted aInfo IPzFailed to execute unbanzaction1 unban deleted aInfo IPzaction2 unban deleted aInfo IP)r   r&   rf   rg   rS   rh   r   putFailTicketr   _Actions__checkBanrJ   rH   _Actions__flushBanr5   s    r   testBanActionsAInfoz"ExecuteActions.testBanActionsAInfo   s<   .7<< @AA   .7<< @AA   +Jy11222.##%%% .///23332333.##%%% 01114555455555r   c                    d| j         _        d| j         _        | j                             d           | j                                          t          j        d           d}|dk     r8d|z  }| j                            t          |d                     |dz  }|dk     8| 
                    dd	
           t          j        d           |dk     r8d|z  }| j                            t          |d                     |dz  }|dk     8| 
                    dd	
           | j                                          | j                                          | 
                    d           |                     d           d S )Nr^      d   r      z
192.0.2.%dr   z / 20,TrO      2   z / 50,zUnbanned 30, 0 ticket(s)zUnbanned 50, 0 ticket(s))r   banPrecedenceunbanMaxCountr?   r   r   setTimer   ru   r   rH   r%   rS   rJ   )r   ir   s      r   testUnbanOnBusyBanBombingz(ExecuteActions.testUnbanOnBusyBanBombing   s    "#$.!"$..C   ..!	Bq2;ZA..///61 	
B H4(((.	Bq2;ZC0011161 	
B H4(((...///122222r   c                 Z   |                      ddd          }|j        dz   |d<   d|_        d|j        z   |_        d|j        z   |_        | j                                         |                     ddz             |                     | j        	                    d	          d
           |                     | j        	                    d          d
           | 
                    ddddz  ddz  ddz  dd           |                     d           |j        dz   |d<   | j                            d           | 
                    dd           |                     d           | j                                         | 
                    ddz  ddz  dddddz  ddd	  	         |                     d           |j        |d<   |                     | j        	                    d          d
           | 
                    dddz  ddz  dd           |                     ddz  d           |                     d           | j                                         | 
                    ddddz  dd z  dd           |                     ddz  ddz  ddz  d!d           |                     d"           |j        |d<   | j                                         | j                                         | 
                    ddz  ddz  d#dd           |                     d$ddz  d%d           d S )&N	 <family>)r#   r$   ; exit 1actionflush?family=inet6T<actioncheck> ; rM   rN   rD   r   2001:db8::1rE   Ban 2001:db8::1ip ban 192.0.2.1ip ban 2001:db8::1allrP   >[test-phase 1a] simulate inconsistent irreparable env by unbanactioncheck?family=inet6z,Invariant check failed. Unban is impossible.rO   z>[test-phase 1b] simulate inconsistent irreparable env by fluship flush inet4ip flush inet6Failed to flush bans'No flush occurred, do consistency check<Invariant check failed. Trying to restore a sane environmentrQ   [test-phase 2] consistent envip check inet4r   -[test-phase 3] failed flush in consistent envip check inet6Unable to restore environment![test-phase end] flush successfulaction ip terminatedERRORUnban tickets each individualy)r0   r,   actionstart_on_demandr)   r*   r   r   rJ   r=   rG   rH   rI   r+   rA   rw   r%   rS   r   r/   s     r   testActionsConsistencyCheckz*ExecuteActions.testActionsConsistencyCheck   s   KEEFF#$'Oj$@# !"#$s}4#-&8#/.|j01114>--k::A>>>4>--m<<a@@@O%6*$$&&$	     --PQQQ$'Oj$@# !....B    --PQQQ.##%%%"""",A)$     --/000$'O# !4>--m<<a@@@%*&&$     |&66     --?@@@.##%%%*,""""$	    
 "")*"     --3444$'O# !.."")$	     w""#      r   c                    |                      ddddd          }|j        dz   |d<   d|_        d|_        d|j        z   |_        d|j        z   |_        | j                                         |                     ddz             | 	                    | j        
                    d	          d
           | 	                    | j        
                    d          d
           |                     ddddz  ddz  ddz  ddz  dd           |j        dz   |d<   |                     d           | j                            d           |                     dddz  dd           |                     ddz  ddz  ddz  d           |                     d           | 	                    | j        
                    d          d
           |                     dddz  ddz  ddz  dddd           |                     ddz  ddz  d           |j        |d<   | 	                    | j        
                    d          d
           |j        dz   |d<   |                     d           | j                                         |                     ddz  dd z  d!d"dddz  d#dd	  	         |                     ddz  d           |                     d$           |j        |d<   | 	                    | j        
                    d          d
           |                     dddz  ddz  dd           |                     dd%z  ddz  d           |                     d&           |j        |d<   | j                                         |                     d!d"dd z  ddz  dd           |                     ddz  ddz  ddz  ddz  ddz  d           |                     d'           |j        |d<   | j                                         | j                                         |                     dd z  ddz  ddz  d(dd           |                     d)ddz  d*d           d S )+Nr   )r   r#   r$   r%   r   r   Tr   rM   rN   rD   r   r   rE   r   ip start inet4r   ip start inet6r   r   r   r   r   zip stop inet6zip stop inet4r   z<[test-phase 1b] simulate inconsistent irreparable env by banr   r   rt   2001:db8::2z>[test-phase 1c] simulate inconsistent irreparable env by flushr   r   r   r   zFailed to flush bans in jailr   r   r   r   r   r   r   )r0   r,   r   actionrepair_on_unbanr)   r*   r   r   rJ   r=   rG   rH   r+   rI   rA   rw   r%   rS   r   s     r   "testActionsConsistencyCheckDiffFamz1ExecuteActions.testActionsConsistencyCheckDiffFam%  s   Kkbmnnoo#$'Oj$@# !"#"#$s}4#-&8#/.|j01114>--k::A>>>4>--m<<a@@@O%6""$$""&&$     %(Oj$@# !--PQQQ....R/!$     ""/!""	     --NOOO4>--m<<a@@@R/!"""""$     /!""    
 %(O# !4>--m<<a@@@$'Oj$@# !--PQQQ.##%%%"""",A/!!$     /!    
 --/000$'O# !4>--m<<a@@@%""&&$     """"    
 --?@@@$'O# !.##%%%*,""""$	    
 ""/!""/!""     --3444$'O# !..""/!/!$     w""#      r   c                 4	   |                      dddddd          }|dz   |d<   d	|_        d
|_        d|_        |                     d           |                     | j                            ddg          d           |                     ddddz  ddz  ddz  ddz  d	           |                     d           | 	                    |dz              |                     d           | 
                    d           |                                  | 	                    |dz              |                     d           | 
                    d           t          j        t          j                    dz              |                     d           |                     | j                            g d          d            |                     d!d"d#dd$z  dd%z  d	           | 	                    |dz              | 	                    |dz              | 
                    d&d'ddz  dd(z  ddz  dd)z  d*d+d		  	         t          j        t          j                    dz              t          j        |dz              t          j        |dz              |                     d,           |                     | j                            ddg          d           |                     d-dd.z  dd/z  d0d1dd(z  dd)z  d	           |                     d2           |                     | j                            d3          d            |                     d4dd5z  d	           | 
                    d-dd.z  dd/z  d0d1dd(z  dd)z  d	           |                     d6           | 	                    |dz              |                     d7           | 
                    d8           |                                  | 	                    |dz              |                     d8d9d	           | 
                    d7           d:|_        d;|_        |                     | j                            t%          dd<                    d<           |                     d=d>d	           d S )?Nz <family>; touch "<FN>"z <family>; test -f "<FN>"z <family>; echo -n "" > "<FN>"z <family>; rm -f "<FN>"z) <family>; echo "<ip> <family>" >> "<FN>")r   r#   r$   r%   r!   z	/<family>FNTz%echo ip repair <family>; touch "<FN>"zGecho ip reban <ip> <family>; echo "<ip> <family> -- rebanned" >> "<FN>"z[test-phase 0] initial banrD   r   r   rE   r   rM   r   zip ban 192.0.2.1 inet4r   zip ban 2001:db8::1 inet6r   z[test-phase 1] check banz/inet4z192.0.2.1 inet4z2001:db8::1 inet6z/inet6   z#[test-phase 2] check already banned)rD   r   r   r   rF   z2001:db8::1 already bannedzBan 2001:db8::2r   r   zReban 192.0.2.1zReban 2001:db8::1zip reban 192.0.2.1 inet4zip reban 2001:db8::1 inet6z192.0.2.1 inet4 -- repairedz2001:db8::1 inet6 -- repairedz3[test-phase 3a] check reban after sane env repairedr   zip repair inet4zip repair inet6zReban 192.0.2.1, action 'ip'zReban 2001:db8::1, action 'ip'z>[test-phase 3a] check reban by epoch mismatch (without repair)r   zReban 2001:db8::2, action 'ip'zip reban 2001:db8::2 inet6z[test-phase 4] check rebanz192.0.2.1 inet4 -- rebannedz2001:db8::1 inet6 -- rebannedz2001:db8::2 inet6 -- rebannedr    zexit 1r   zFailed to execute rebanzError banning 192.0.2.1)r0   r   actionrepairactionrebanrI   r=   r   rG   rH   dumpFilerJ   r   r   timerf   remover)   _Actions__reBanr   )r   tmpr/   s      r   !testActionsRebanBrokenAfterRepairz0ExecuteActions.testActionsRebanBrokenAfterRepair  sA    	$&+$6  	 	# +o#d)"#<#]#/--,---4>--{M.JKKQOOOO%6""**"",,     --*+++--H%&&&*+++--///--H'(((())) 	."###--56664>--.Y.Y.YZZ\]^^^;=N""""	    
 --H--H(*=**,,,,.. "     	."###)CL)CL--EFFF4>--{M.JKKQOOOA####!#C,,..     --PQQQ4>--m<<a@@@#..     A####!#C,,..     --,-----H12226777--///--H""  . . . 4555 #/#-4>11*[!2L2LMMqQQQ$  ( ( ( ( (r   )__name__
__module____qualname__r   r   r0   r6   rB   rK   rU   rl   rp   rx   r
   r   r   r   r   r   __classcell__)r   s   @r   r   r   '   sD       ' ' ' ' ') ) ) ) )  	 	 	 	< < <L L L% % %
& 
& 
&; ; ;>& & &&6 6 62 #3 #3 -#3JL L L\p p pd g( g( + -g( g( g( g( g(r   r   )
__author____copyright____license__r   rf   tempfileserver.ticketr   server.utilsr   	dummyjailr   utilsr	   r
   r   r   rg   rS   dirname__file__rh   r    r   r   <module>r      s   . 
1  				  & & & & & &                         I I I I I I I I I I I Ibgooh77AAY( Y( Y( Y( Y(' Y( Y( Y( Y( Y(r   