
    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"                  j%                  ej"                  j'                  e      d      Z G d de      Zy)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
                  | _        y)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                 *    t         t        |           y )N)r   r   tearDownr   s    r   r   zExecuteActions.tearDown/   s    &(r   c                    | j                   j                  d       | j                   d   }d|j                  dd      z   |_        d|j                  dd      z   |_        d|j                  dd      z   |_        d	|j                  d
d      z   |_        d|j                  dd      z   |_        d|j                  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#/$QUU5"%55#-(w);;#/#AEE'2$66#/#AEE'2$66#/!!%%"33#.	*r   c                     | j                   j                  d       | j                  t        | j                   j                  d       y )Ntest)r   r&   assertRaises
ValueErrorr   s    r   testActionsAddDuplicateNamez*ExecuteActions.testActionsAddDuplicateName=   s0    ..VJ 2 2F;r   c                    | j                   j                  d       | j                  | j                   d          | j                  d| j                          | j	                  d| j                          | j                   j                  d       | j                   d= | j                   d= | j	                  d| j                          | j                  t        | j                         d       | j                   j                  d       | j                  | j                   j                         d       | j                  t        | j                   j                  d       y )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..W
nnV
nnW64>>*3t~~&*..C 4>>,,.s3J = ={Kr   c                 ~   | j                  | j                  j                  d      d       | j                  d       | j	                          | j                  | j                  j                  g d      d       | j                  d       | j                  d       | j                  d       | j                  d       y )	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VXYZ./'O$O$r   c                    | j                          | j                  j                          | j                  ddz  d       | j                  j	                          | j                  j                          | j                  ddz  ddz         | j                  | j                  j                         ddd	g fg       | j                  | j                  j                  d
      ddg       y )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....L:-|i/GH4>>((*,D#&6%<,> ?4>>((13K#3% &r   c           
           j                   j                  dt        j                  j	                  t
        d      ddi        j                  d        j                   j                           j                  t        j                   fdd              j                   j                           j                   j	                           j                  d        j                  t         j                   j                  d	d
i         j                   j                  dt        j                  j	                  t
        d      ddd        j                  t         j                   j                  dt        j                  j	                  t
        d      dddd        j                  t         j                   j                  dt        j                  j	                  t
        d      i        y )NActionzaction.d/action.pyopt1valuezTestAction initialisedc                  &     j                  d      S )NzTestAction action start
_is_loggedr5   s   r   <lambda>z4ExecuteActions.testAddActionPython.<locals>.<lambda>n   s    $//:S*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   sd   ..RWW\\.*>?
G ,-..//5>>"TVWXZ....,-G>>y"6< ..bggll>+?@X&( dnn  )77<< 45Xx8:
 dnn  )77<< 45r;r   c           	           j                  t         j                  j                  dt        j
                  j                  t        d      i         j                  t         j                  j                  dt        j
                  j                  t        d      i         j                  j                  dt        j
                  j                  t        d      i         j                  j                           j                  t        j                   fdd              j                  j                           j                  j                           j                  d       y )NrW   zaction.d/action_noAction.pyzaction.d/action_nomethod.pyzaction.d/action_errors.pyc                  &     j                  d      S )NzFailed to startr[   r5   s   r   r]   z7ExecuteActions.testAddPythonActionNOK.<locals>.<lambda>   s    $//:K*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"4RWW\\.!# L$.."4"4RWW\\.!# ..RWW\\.! ..//5>>"LaPR....$%r   c                 |   | j                   j                  dt        j                  j	                  t
        d      i        | j                   j                  dt        j                  j	                  t
        d      i        | j                  j                  t        d             | j                   j                          | j                  d       | j                  d       | j                  d       | j                   j                          | j                  d       | j                  d	       | j                  d
       y )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    ..77<< @A ..77<< @A ++Jy12..##% ./2323..##% 014545r   c                    d| j                   _        d| j                   _        | j                   j                  d       | j                   j	                          t        j                  d       d}|dk  r5d|z  }| j                  j                  t        |d             |dz  }|dk  r5| j                  dd	
       t        j                  d       |dk  r5d|z  }| j                  j                  t        |d             |dz  }|dk  r5| j                  dd	
       | j                   j                          | j                   j                          | j                  d       | j                  d       y )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161 	
B H4(...../12r   c                    | j                  ddd      }|j                  dz   |d<   d|_        d|j                  z   |_        d|j                  z   |_        | j
                  j                          | j                  ddz         | j                  | j
                  j                  d	      d
       | j                  | j
                  j                  d      d
       | j                  ddddz  ddz  ddz  dd       | j                  d       |j                  dz   |d<   | j
                  j                  d       | j                  dd       | j                  d       | j
                  j                          | j                  ddz  ddz  dddddz  ddd	       | j                  d       |j                  |d<   | j                  | j
                  j                  d      d
       | j                  dddz  ddz  dd       | j                  ddz  d       | j                  d       | j
                  j                          | j                  ddddz  dd z  dd       | j                  ddz  ddz  ddz  d!d       | j                  d"       |j                  |d<   | j
                  j                          | j
                  j!                          | j                  ddz  ddz  d#dd       | j                  d$ddz  d%d       y )&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   s0   KEF#$'OOj$@# !"#$s}}4#-&8#/..|j014>>--k:A>4>>--m<a@O%6*$$&&$	   --PQ$'OOj$@# !...B  --PQ..##%"""",A)$   --/0$'OO# !4>>--m<a@%*&&$   |&66   --?@..##%*,""""$	  
 "")*"   --34$'OO# !...."")$	   w""#  r   c                 ^   | j                  ddddd      }|j                  dz   |d<   d|_        d|_        d|j                  z   |_        d|j
                  z   |_        | j                  j                          | j                  ddz         | j                  | j                  j                  d	      d
       | j                  | j                  j                  d      d
       | j                  ddddz  ddz  ddz  ddz  dd       |j                  dz   |d<   | j                  d       | j                  j                  d       | j                  dddz  dd       | j                  ddz  ddz  ddz  d       | j                  d       | j                  | j                  j                  d      d
       | j                  dddz  ddz  ddz  dddd       | j                  ddz  ddz  d       |j                  |d<   | j                  | j                  j                  d      d
       |j                  dz   |d<   | j                  d       | j                  j                          | j                  ddz  dd z  d!d"dddz  d#dd	       | j                  ddz  d       | j                  d$       |j                  |d<   | j                  | j                  j                  d      d
       | j                  dddz  ddz  dd       | j                  dd%z  ddz  d       | j                  d&       |j                  |d<   | j                  j                          | j                  d!d"dd z  ddz  dd       | j                  ddz  ddz  ddz  ddz  ddz  d       | j                  d'       |j                  |d<   | j                  j!                          | j                  j#                          | j                  dd z  ddz  ddz  d(dd       | j                  d)ddz  d*d       y )+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o#$'OOj$@# !"#"#$s}}4#-&8#/..|j014>>--k:A>4>>--m<a@O%6""$$""&&$   %(OOj$@# !--PQ...R/!$   ""/!""	   --NO4>>--m<a@R/!"""""$   /!""  
 %(OO# !4>>--m<a@$'OOj$@# !--PQ..##%"""",A/!!$   /!  
 --/0$'OO# !4>>--m<a@%""&&$   """"  
 --?@$'OO# !..##%*,""""$	  
 ""/!""/!""   --34$'OO# !....""/!/!$   w""#  r   c                 (   | j                  dddddd      }|dz   |d<   d	|_        d
|_        d|_        | j	                  d       | j                  | j                  j                  ddg      d       | j                  ddddz  ddz  ddz  ddz  d	       | j	                  d       | j                  |dz          | j                  d       | j                  d       | j	                          | j                  |dz          | j                  d       | j                  d       t        j                  t        j                         dz          | j	                  d       | j                  | j                  j                  g d      d        | j                  d!d"d#dd$z  dd%z  d	       | j                  |dz          | j                  |dz          | j                  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          | j	                  d,       | j                  | j                  j                  ddg      d       | j                  d-dd.z  dd/z  d0d1dd(z  dd)z  d	       | j	                  d2       | j                  | j                  j                  d3      d        | j                  d4dd5z  d	       | j                  d-dd.z  dd/z  d0d1dd(z  dd)z  d	       | j	                  d6       | j                  |dz          | j                  d7       | j                  d8       | j	                          | j                  |dz          | j                  d8d9d	       | j                  d7       d:|_        d;|_        | j                  | j                  j#                  t%        dd<            d<       | j                  d=d>d	       y )?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  s'    	$&+$6 	# +o#d)"#<#]#/--,-4>>--{M.JKQOO%6""**"",,   --*+--H%&*+--/--H'(() 	.."#--564>>--.YZ\]^;=N""""	  
 --H--H(*=**,,,,.. "   	.."#))CL))CL--EF4>>--{M.JKQOA####!#C,,..   --PQ4>>--m<a@#..   A####!#C,,..   --,---H1267--/--H""  . 45 #/#-4>>11*[!2LMq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   '   s|    ')  	<L%
&;>&&62 #3 #3JL\pd 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bggooh7AY(' Y(r   