
    ogfq                       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ZddlZddl	Z	ddl
mZmZmZ ddlmZ ddlmZ dd	lmZmZ dd
lmZ ddlm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# ddl$m%Z%m&Z&m'Z' ddl(m)Z) 	 ddlm*Z* ejX                  j[                  ejX                  j]                  e/      d      Z0dZ1 e%d      Z2 G d de      Z3 G d de!      Z4 G d de4      Z5 G d de4      Z6 G d d ejn                        Z8 G d! d"ejn                        Z9 G d# d$e      Z: G d% d&e!      Z;dd'l<m=Z=m>Z>m?Z?  G d( d)e!      Z@y# e+$ r dZ*Y w xY w)*zCyril Jaquierz Copyright (c) 2004 Cyril JaquierGPL    N   )Regex	FailRegexRegexException)actions)Server)DNSUtilsIPAddr)Jail)
JailThread)	BanTicket)Utils   )	DummyJail)LogCaptureTestCasewith_alt_timeMyTime)	getLoggerextractOptions
PREFER_ENC)version)filtersystemdfilespollingfail2banc                       e Zd Zd Zd Zy)
TestServerc                      y N selfargskwargss      ?/usr/lib/python3/dist-packages/fail2ban/tests/servertestcase.pysetLogLevelzTestServer.setLogLevel<           c                      y r    r!   r"   s      r&   setLogTargetzTestServer.setLogTarget?   r(   r)   N)__name__
__module____qualname__r'   r+   r!   r)   r&   r   r   ;   s    r)   r   c                   H     e Zd ZeZ fdZ fdZddZddZd Z	d Z
 xZS )	TransmitterBasec                     t         t        |           | j                         | _        | j                  j
                  | _        d| _        | j                  j                  | j                  t               y)Call before every test case.	TestJail1N)
superr0   setUpTEST_SRV_CLASSserver_Server__transmtransmjailNameaddJailFAST_BACKENDr#   	__class__s    r&   r5   zTransmitterBase.setUpG   sR    $&##%$+++$+ $-++dmm\2r)   c                 ^    | j                   j                          t        t        |           yzCall after every test case.N)r7   quitr4   r0   tearDownr=   s    r&   rB   zTransmitterBase.tearDownQ   s"     ++')r)   r    c                 f   d||g}d|g}|$|j                  d|       |j                  d|       |dk(  r|}fd}	| j                   |	| j                  j                  |             |	||f             |s:| j                   |	| j                  j                  |             |	d|f             yy)zoProcess set/get commands and compare both return values 
		with outValue if it was given otherwise with inValuesetgetNr   r    c                 "    rt        |       S | S )zPrepare value for comparison)repr)xrepr_s    r&   vz%TransmitterBase.setGetTest.<locals>.vd   s    47##r)   r   )insertassertEqualr9   proceed)
r#   cmdinValueoutValueoutCodejailrI   setCmdgetCmdrJ   s
         `   r&   
setGetTestzTransmitterBase.setGetTestW   s     3 &3<&		==D	==D 8$ 1T[[((011gx5H3IJ	Adkk))&12Aq(m4DE 
r)   c                 T   d||g}d|g}|$|j                  d|       |j                  d|       | j                  j                  |      d   }| j                  | j                  j                  |      d   d       | j                  | j                  j                  |      d|f       y )NrD   rE   r   r   )rK   r9   rM   rL   )r#   rN   rO   rR   rS   rT   	initValues          r&   setGetTestNOKzTransmitterBase.setGetTestNOKm   s    3 &3<&		==D	==D kk!!&)!,)4;;&&v.q1154;;&&v.I?r)   c                 H   d|z   }d|z   }| j                  | j                  j                  d||g      dg f       t        |      D ]  \  }}| j                  j                  d|||g      }| j	                  |d   t        t        t        |d               fdt        t        t        |d |dz                fd       | j                  j                  d||g      }| j	                  |d   t        t        t        |d               fdt        t        t        |d |dz                fd        t        |      D ]  \  }}| j                  j                  d|||g      }| j	                  |d   t        t        t        |d               fdt        t        t        ||dz   d              fd       | j                  j                  d||g      }| j	                  |d   t        t        t        |d               fdt        t        t        ||dz   d              fd        y )	NadddelrE   r   rD   r   r   )level)rL   r9   rM   	enumerateassertSortedEquallistmapstr)	r#   rN   valuesrR   cmdAddcmdDelnvaluerets	            r&   jailAddDelTestzTransmitterBase.jailAddDelTestz   s   3;&3;&;;tS)*QG5F# hha			eT659	:33q64CQ(8#9:QSfUYVWXYVYlE[@\<]efg			eT3/	033q64CQ(8#9:QSfUYVWXYVYlE[@\<]efg	h
 F# hha			eT659	:33q64CQ(8#9:QSfUVWXUXUYlE[@\<]efg			eT3/	033q64CQ(8#9:QSfUVWXUXUYlE[@\<]efg	hr)   c           	      x   d|z   }d|z   }| j                  | j                  j                  d||g      dg f       t        |      D ]r  \  }}| j                  | j                  j                  d|||g      d|d |dz    f       | j                  | j                  j                  d||g      d|d |dz    f       t t        |      D ]r  \  }}| j                  | j                  j                  d||dg      d||dz   d  f       | j                  | j                  j                  d||g      d||dz   d  f       t y )NrZ   r[   rE   r   rD   r   )rL   r9   rM   r]   )	r#   rN   inValues	outValuesrR   rc   rd   re   rf   s	            r&   jailAddDelRegexTestz#TransmitterBase.jailAddDelRegexTest   s_   3;&3;&;;tS)*QG5H% haKKfe45	$1Q3 KKc*+	$1Q3	 H% haKKfa01	!A#$ KKc*+	!A#$	r)   )r    r   NF)r,   r-   r.   r   r6   r5   rB   rU   rX   rh   rl   __classcell__r>   s   @r&   r0   r0   C   s)    3*F,@h"r)   r0   c                   $   e 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 Zd Zd Zd Zd Z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! Z$d" Z%d# Z&d$ Z'd% Z(d& Z)d' Z*d( Z+d) Z,d* Z-d+ Z.d, Z/d- Z0y.)/Transmitterc                 V    | j                  | j                  j                                y r    )assertFalser7   	isStartedr#   s    r&   testServerIsNotStartedz"Transmitter.testServerIsNotStarted   s     4;;((*+r)   c                 \    | j                  | j                  j                  dg      d       y )Nstopr   NrL   r9   rM   rt   s    r&   testStopServerzTransmitter.testStopServer   s#    4;;&&x0)<r)   c                 \    | j                  | j                  j                  dg      d       y )Nping)r   pongry   rt   s    r&   testPingzTransmitter.testPing   s#    4;;&&x0+>r)   c                 |    | j                  | j                  j                  dg      dt        j                  f       y )Nr   r   )rL   r9   rM   r   rt   s    r&   testVersionzTransmitter.testVersion   s,    4;;&&	{3a5IJr)   c                    	 | j                  | j                  j                  g d      d       | j                  t	        j
                                | j                  d       | j                          | j                  | j                  j                  g d      d       | j                  t	        j
                                | j                  d       | j                          | j                  | j                  j                  g d      d       | j                  d	       | j                          y # | j                  | j                  j                  g d      d       | j                  d	       | j                          w xY w)
N)rD   	allowipv6yes)r   r   z
IPv6 is on)rD   r   nor   r   zIPv6 is off)rD   r   auto)r   r   zIPv6 is auto)	rL   r9   rM   
assertTruer
   IPv6IsAllowedassertLoggedpruneLogrr   rt   s    r&   testSetIPv6zTransmitter.testSetIPv6   s   
6DKK''(CDjQ??8))+,\"DMMODKK''(BCYOH**,-]#T]]_ DKK''(DE{S^$dmmo DKK''(DE{S^$dmmos   C"D3 3AFc                    t         j                  j                  st        j                         }| j	                  | j
                  j                  ddg      d       t        j                         }||z
  }| j                  d|cxk  xr dk  nc d|z         y | j	                  | j
                  j                  ddg      d       y )	Nsleepz0.1rx   g
ףp=
?g?zSleep was %g sec)msgz0.0001)unittestF2BfasttimerL   r9   rM   r   )r#   t0t1dts       r&   	testSleepzTransmitter.testSleep   s    					2DKK''%(899E		2
R2??4"?s?(:R(??@DKK''((;<iHr)   c                    t         j                  j                  st        j                  dd      \  }}nd}| j                  d|       | j                  j                  | j                         | j                  d|       | j                  d|       | j                  ddd       | j                  dd       | j                  d	d
d       | j                  d	d       | j                  j                  | j                  t               | j                  d|       | j                  j                  | j                         | j                  | j                  j                  g d      d       | j                  | j                  j                  ddg      d       | j                  | j                  j                  g d      d       | j                  | j                  j                  ddg      d       | j                  | j                  j                  g d      d       | j                  | j                  j                  dd	g      d       | j                  j                  | j                  t               | j                  | j                  j                  g d      d       t         j                  j                  s+t        j                          t        j"                  |       y y )Nz.db	fail2ban_z:memory:dbfiledbmaxmatches100d   LIZARD
dbpurgeage600X  )rD   r   Nonerx   rE   )rD   r   r   )rD   r   500)r   r   	memory_dbtempfilemkstemprX   r7   delJailr:   rU   r;   r<   rL   r9   rM   oscloseunlink)r#   tmptmpFilenames      r&   testDatabasezTransmitter.testDatabase   sL   			&&uk:3;X{+++dmm$//(K(//(K(//.%-^X.//,s+\8,++dmm\2//(K(++dmm$ 4;;&& 4;;&&	8 4;;&&!# 4;;&&	> 4;;&&! 4;;&&	< ++dmm\24;;&& 
		88C=99[ 
 r)   c                 f   d}d}d}| j                  | j                  j                  d|dg      d|f       | j                  | j                  j                  d|g      d|f       | j                  | j                  j                  d|dg      d   d       | j                  | j                  j                  d|d	g      d|f       | j                  | j                  j                  d| j                  dg      d   d       | j                  | j                  j                  g d
      d   d       y )N	TestJail2	TestJail3	TestJail4rZ   r   r   zinvalid backendr   r   )rZ   --allr   rL   r9   rM   r:   )r#   jail2jail3jail4s       r&   testAddJailzTransmitter.testAddJail   s!   
%
%
%;;ui01Au:?4;;&&u~6E
C;;u&789!<aA;;uf-.E
< ;;t}}i89!<aA ;;23A6;r)   c                      j                   j                  j                  d j                  g      d       t	        j
                  t        j                          j                  t        j                   fdd              j                   j                  j                  d j                  g      d        j                   j                   j                  j                         y )Nstartrx   c                       j                   j                  d      xr6 t         j                  j	                  d j
                  g      t               S )Nr   statusr7   isAlive
isinstancer9   rM   r:   RuntimeErrorrt   s   r&   <lambda>z/Transmitter.testStartStopJail.<locals>.<lambda>  A    4;;q!r*T[[5H5H(TXTaTaIb5ceq*r&r r)      rw   )rL   r9   rM   r:   r   r   r   DEFAULT_SLEEP_TIMEr   wait_forassertNotInr7   _Server__jailsrt   s   `r&   testStartStopJailzTransmitter.testStartStopJail  s    ;;/0)=**U%%&//5>>r  ;;./<4==$++"<"<=r)   c                      j                   j                  dt                j                   j                  j                  d j                  g      d        j                   j                  j                  ddg      d       t        j                  t        j                          j                  t        j                   fdd              j                   j                  j                  ddg      d        j                  t        j                   fdd              j                   j                   j                   j                          j                  d j                   j                         y )	Nr   r   rx   c                       j                   j                  d      xr6 t         j                  j	                  d j
                  g      t               S )Nr   r   r   rt   s   r&   r   z2Transmitter.testStartStopAllJail.<locals>.<lambda>"  r   r)   r   rw   r   c                  D    t         j                  j                         S r    )lenr7   r   rt   s   r&   r   z2Transmitter.testStartStopAllJail.<locals>.<lambda>%  s    s4;;3M3M/N+N r)   )r7   r;   r<   rL   r9   rM   r:   r   r   r   r   r   r   r   r   rt   s   `r&   testStartStopAllJailz Transmitter.testStartStopAllJail  s   ++k<0;;/0)=;;-.	;
 **U%%&//5>>r  4;;&&'899E//5>>#NPQRT4==$++"<"<=; : :;r)   c                 `   | j                  | j                  j                  d| j                  ddg      d       | j                  | j                  j                  d| j                  ddg      d       | j                  | j                  j                  d| j                  ddg      d   d	       y )
NrD   idleonr   Toffr   FCATr   r   r   rt   s    r&   testJailIdlezTransmitter.testJailIdle)  s    ;;t}}fd;< ;;t}}fe<= ;;t}}fe<=a@r)   c                 8   | j                  ddd| j                         | j                  ddd| j                         | j                  ddd| j                         | j                  dd	d
| j                         | j                  dd| j                         y )Nfindtime120x   rR   60<   30m  z-60iDogrU   r:   rX   rt   s    r&   testJailFindTimezTransmitter.testJailFindTime4  s{    //*eSt}}/=//*dBT]]/;//*eU/?//*eSt}}/=ZT]];r)   c                 8   | j                  ddd| j                         | j                  ddd| j                         | j                  ddd| j                         | j                  dd	d
| j                         | j                  dd| j                         y )Nbantimer   r   r   502   z-50iz
15d 5h 30mi Catr   rt   s    r&   testJailBanTimezTransmitter.testJailBanTime;  s{    //)UCdmm/<//)T2DMM/://)UCdmm/<//)\7/GYDMM:r)   c                 8   | j                  ddd| j                         | j                  ddd| j                         | j                  ddd| j                         | j                  dd	d
| j                         | j                  dd| j                         y )Ndatepattern%%%Y%m%d%H%M%S)r   z%YearMonthDay24hourMinuteSecondr   Epoch)Nr   z^Epoch)Nz{^LN-BEG}EpochTAI64N)Nr   z
%Cat%a%%%gr   rt   s    r&   testDatePatternzTransmitter.testDatePatternB  s    //-!18   //'?  @//(44==  J//(,4==  B]Lt}}Er)   c                 ~    | j                  ddd| j                         | j                  dd| j                         y )NlogtimezonezUTC+0400r   znot-a-time-zoner   rt   s    r&   testLogTimeZonezTransmitter.testLogTimeZoneN  s4    //-Zdmm/L]$5DMMJr)   c                 .   | j                  dd| j                         | j                  dd| j                         | j                  dd| j                         d}| j                  | j                  j	                  d| j                  d|g      d       y )	Nusednsr   r   warnr   FishrD   r   )rU   r:   rL   r9   rM   r#   rf   s     r&   testJailUseDNSzTransmitter.testJailUseDNSR  s{    //(E/6//(F/7//(Dt}}/5 %;;t}}h>?r)   c                    | j                   j                  | j                         | j                  | j                  j                  d| j                  ddddg      d       | j                  dddd	       | j                  | j                  j                  d| j                  dd
g      d       | j                  dd       | j                  | j                  j                  d| j                  dddddg      d       | j                  dddd	       | j                  dddd	       | j                          | j                  | j                  j                  d| j                  dddg      d   d       | j                  | j                  j                  d| j                  dddg      d       | j                  dddd	       y )NrD   banip	192.0.2.1	192.0.2.2)r   r   Ban 192.0.2.1Ban 192.0.2.2TallwaitBadgerr   r   z
Ban Badgerr   unbanipz192.0.2.255z192.0.2.254zUnban 192.0.2.1zUnban 192.0.2.2z192.0.2.255 is not bannedz192.0.2.254 is not bannedz--report-absentr   r   )r   r   )r7   	startJailr:   rL   r9   rM   r   r   rt   s    r&   testJailBanIPzTransmitter.testJailBanIP]  s   ++&;;t}}g{KQ\]^	 O_$TJ;;t}}gx@A	 Lt,;;
DMM9m[+}]_	 %'8dN/1LRV]ab--/;;
DMM9&7GIIJLLMO ;;
DMM9m]CEEKM /1LRV]abr)   c           
           j                   j                   j                          fd} j                  ddd j                         dD ]&  }dD ]  } j	                   ||d|z  g      d	       ! (  j                  d
ddd        j	                   |dD cg c]  }d|z  	 c}      d	        j                  dd        j                  dd        j                  d       y c c}w )Nc                 \    j                   j                  dj                  d| g|z         S )NrD   attempt)r9   rM   r:   )ipmatchesr#   s     r&   r  z.Transmitter.testJailAttemptIP.<locals>.attempt}  s*    
++

udmmYCgM
NNr)   maxretry5   r   )r   r   )r   r   ztest failure %dr   z192.0.2.1:2z192.0.2.2:2Tr   )r      r  z192.0.2.2:5r   r   r   )r7   r  r:   rU   rL   r   assertNotLogged)r#   r  ir  s   `   r&   testJailAttemptIPzTransmitter.testJailAttemptIPz  s    ++&O //*c14==/9 Ca' CrWR"3a"7!896BCC M=dF72wG! 1A 5GH&QM-O$/'	  Hs   C-c                 @    d} j                   j                  |t                j                   j                  |       d d dg f fd	} ||g         ||dddg        ||d	ddd
g        ||dg d        ||dd	dg        ||dd	g        ||d	g        y )NTestJailBanListr!   c                    |Ej                  j                  j                  d| d|g      d       j                  d|z  d       |Ej                  j                  j                  d| d|g      d       j                  d|z  d       j	                  j                  j                  d	| dgt        |      z         d
|fd       t        j                  t        j                         dz          y )NrD   r   r   zBan %sTr   r  zUnban %srE   r   F)
nestedOnlyr   )	rL   r9   rM   r   r^   r_   r   setTimer   )rR   r   r  r$   outListr#   s        r&   _getBanListTestz4Transmitter.testJailBanList.<locals>._getBanListTest  s    	[[%w67 	h&T2	[[%y':; 	j7*6KKg.tDz9:LU  $ 
>>&++-!#$r)   )r  	127.0.0.1)z--with-timez:127.0.0.1 	2005-08-14 12:00:01 + 600 = 2005-08-14 12:10:01)r   r$   r  192.168.0.1z<192.168.0.1 	2005-08-14 12:00:02 + 600 = 2005-08-14 12:10:02192.168.1.10)r  r  r  )r   r  )r  r  )r7   r;   r<   r  )r#   rR   r  s   `  r&   testJailBanListzTransmitter.testJailBanList  s    	$++dL)++ #'2r %& $$k0@IJL$m2BACEF $n79$>*,$?$r)   c                     | j                  ddd| j                         | j                  ddd| j                         | j                  ddd| j                         | j                  dd	| j                         y )
N
maxmatchesr
  r  r   2r   -2Duckr   rt   s    r&   testJailMaxMatcheszTransmitter.testJailMaxMatches  sc    //,QT]]/;//,QT]]/;//,bt}}/=\6>r)   c                     | j                  ddd| j                         | j                  ddd| j                         | j                  ddd| j                         | j                  dd	| j                         y )
Nr	  r
  r  r   r  r   r  r  r   r   rt   s    r&   testJailMaxRetryzTransmitter.testJailMaxRetry  sc    //*c14==/9//*c14==/9//*dBT]]/;Zdmm<r)   c                     | j                  ddd| j                         | j                  ddd| j                         | j                  dd| j                         | j                  dd| j                         y )	Nmaxlinesr
  r  r   r  r   r  r   r   rt   s    r&   testJailMaxLineszTransmitter.testJailMaxLines  sd    //*c14==/9//*c14==/9ZDMM:Zdmm<r)   c                     | j                  dd| j                         | j                  dd| j                         | j                  ddt        | j                         | j                  dd| j                         y )NlogencodingzUTF-8r   asciir   Monkey)rU   r:   r   rX   rt   s    r&   testJailLogEncodingzTransmitter.testJailLogEncoding  se    //-t}}/=//-t}}/=//-  ]H4==Ar)   c           
         | j                  dt        j                  j                  t        d      t        j                  j                  t        d      t        j                  j                  t        d      g| j
                         t        j                  j                  t        d      }| j                  | j                  j                  d| j
                  d|g      d|gf       | j                  | j                  j                  d| j
                  d|g      d|gf       | j                  | j                  j                  d	| j
                  dg      d|gf       | j                  | j                  j                  d| j
                  d
|g      dg f       | j                  | j                  j                  d| j
                  d|dg      d|gf       | j                  | j                  j                  d| j
                  d|dg      d|gf       | j                  | j                  j                  d| j
                  d|dg      d   d       | j                  | j                  j                  d| j
                  d|||g      d   d       y )Nlogpathtestcase01.logztestcase02.logztestcase03.logztestcase04.logrD   
addlogpathr   rE   
dellogpathtailheadbadgerr   )	rh   r   pathjoinTEST_FILES_DIRr:   rL   r9   rM   r   s     r&   testJailLogPathzTransmitter.testJailLogPath  sF   GGLL!12GGLL!12GGLL!12
 == '',,~'7
8%;;t}}lEBCw< ;;t}}lEBCw< ;;t}}i89w< ;;t}}lEBCr7 ;;
DMM<79w< ;;
DMM<79w< ;;
DMM<9;;<> ;;
DMM<u=??@Br)   c                     d}| j                   j                  d| j                  d|g      }| j                  t	        |d   t
                     y )Nzthis_file_shouldn't_existrD   r/  r   )r9   rM   r:   r   r   IOError)r#   rf   results      r&   testJailLogPathInvalidFilez&Transmitter.testJailLogPathInvalidFile  sB    
%%;;	4==,.0&//*VAY01r)   c                 &   t        j                  d      }|dz   }t        j                  ||       | j                  j                  d| j                  d|g      }| j                  t        |d   t                     t        j                  |       y )Ntmp_fail2ban_broken_symlink)prefixz.slinkrD   r/  r   )r   mktempr   symlinkr9   rM   r:   r   r   r9  r   )r#   namesnamer:  s       r&   testJailLogPathBrokenSymlinkz(Transmitter.testJailLogPathBrokenSymlink  so    	 =	>$
/%**T5;;	4==,.0&//*VAY01))Er)   c                 t   | j                  dg d| j                         d}| j                  | j                  j	                  d| j                  d|g      d|gf       | j                  | j                  j	                  d| j                  d|g      d|gf       | j                  | j                  j	                  d| j                  dg      d|gf       | j                  | j                  j	                  d| j                  d|g      dg f       | j                  | j                  j	                  d| j                  d	g      d
       | j                  | j                  j	                  d| j                  d	dg      d       | j                  | j                  j	                  d| j                  d	g      d       y )Nignoreip)r  z192.168.1.1z8.8.8.8r  rD   addignoreipr   rE   delignoreip
ignoreselfr   Fr   )rh   r:   rL   r9   rM   r   s     r&   testJailIgnoreIPzTransmitter.testJailIgnoreIP  s   
 == %;;t}}mUCDw< ;;t}}mUCDw< ;;t}}j9:w< ;;t}}mUCDr7 ;;t}}l;< ;;t}}lEBC ;;t}}l;<r)   c                 @    | j                  dd| j                         y )Nignorecommandzbin/ignore-command <ip>r   rU   r:   rt   s    r&   testJailIgnoreCommandz!Transmitter.testJailIgnoreCommand2  s    ///#<4==/Qr)   c                     | j                  ddg d| j                         | j                  ddd | j                         y )Nignorecachez%key="<ip>",max-time=1d,max-count=9999)z<ip>i'  iQ r    rL  rt   s    r&   testJailIgnoreCachezTransmitter.testJailIgnoreCache5  s<    //-*   //-T/>r)   c                 @    | j                  dd| j                         y )N	prefregexz^Testr   rL  rt   s    r&   testJailPrefRegexzTransmitter.testJailPrefRegex<  s    //+wT]]/;r)   c           
         | j                  dg ddt        j                  d      z  dt        j                  d      z  dt        j                  d      z  g| j                         | j	                  | j
                  j                  d| j                  dd	g      d
   d       | j	                  | j
                  j                  d| j                  ddg      d
   d       y )N	failregex)zuser john at <HOST>Admin user login from <HOST>z failed attempt from <HOST> againzuser john at %s<HOST>Admin user login from %szfailed attempt from %s againrD   addfailregexzNo host regexr   r   i  rl   r   _resolveHostTagr:   rL   r9   rM   rt   s    r&   testJailRegexzTransmitter.testJailRegex?  s    ; ..x89%"7"7"AB"e&;&;H&EF
 == ;;
DMM>?;==>@ ;;
DMM>3/1124r)   c           	      f   | j                  dg dddt        j                  d      z  dg| j                         | j	                  | j
                  j                  d| j                  dd	g      d
   d       | j	                  | j
                  j                  d| j                  ddg      d
   d       y )Nignoreregex)	user johnrW  Dont match me!r`  rY  rX  ra  rD   addignoreregexzInvalid [regexr   r   r   r[  rt   s    r&   testJailIgnoreRegexzTransmitter.testJailIgnoreRegexW  s    = %"7"7"AB
 == ;;
DMM+-=>@@AC ;;
DMM+R02235r)   c           	         | j                   g}| j                  | j                  j                  dg      ddt	        |      fddj                  |      fgf       | j                  j                  dt               |j                  d       | j                  | j                  j                  dg      ddt	        |      fddj                  |      fgf       y )Nr   r   zNumber of jailz	Jail listz, r   )
r:   rL   r9   rM   r   r5  r7   r;   r<   append)r#   jailss     r&   
testStatuszTransmitter.testStatuso  s    ==/%4;;&&z2	3u:&dii6F(GHIK++k<0,,{4;;&&z2	3u:&dii6F(GHIKr)   c           
          | j                  | j                  j                  d| j                  g      dddddg fgfddd	d
g fgfgf       y )Nr   r   FilterzCurrently failedr   zTotal failedr   	File listActionszCurrently bannedr   zTotal bannedr   Banned IP listr   rt   s    r&   testJailStatuszTransmitter.testJailStatusx  so    4;;&&$--'@AB 
  r)   c           
          | j                  | j                  j                  d| j                  dg      dddddg fgfdd	d
dg fgfgf       y )Nr   basicr   ri  rj  rk  rl  rm  rn  ro  rp  r   rt   s    r&   testJailStatusBasiczTransmitter.testJailStatusBasic  sq    4;;&&$--'IJB 
  r)   c           
          | j                  | j                  j                  d| j                  dg      dddddg fgfdd	d
dg fgfgf       y )Nr   INVALIDr   ri  rj  rk  rl  rm  rn  ro  rp  r   rt   s    r&   testJailStatusBasicKwargz$Transmitter.testJailStatusBasicKwarg  sq    4;;&&$--'KLB 
  r)   c                     t         j                  j                          	 dd l}dd l}g }| j                  | j                  j                  d| j                  dg      dddddg fgfd	d
ddg fd|fd|fd|fgfgf       y # t
        $ r dg}Y bw xY w)Nr   errorr   cymruri  rj  rk  rl  rm  rn  ro  rp  zBanned ASN listzBanned Country listzBanned RIR list)
r   r   SkipIfNoNetworkdns.exceptiondns.resolverImportErrorrL   r9   rM   r:   )r#   dnsrf   s      r&   testJailStatusCymruzTransmitter.testJailStatusCymru  s    
,,  54;;&&$--'IJB 
 % e$% "  
 95s   A> >BBc                    d}g d}g d}| j                  | j                  j                  d| j                  d|g      d|f       | j                  | j                  j                  d| j                  dg      d	   d   |       t	        ||      D ]B  \  }}| j                  | j                  j                  d| j                  d
|||g      d|f       D t	        ||      D ]A  \  }}| j                  | j                  j                  d| j                  d
||g      d|f       C | j                  | j                  j                  d| j                  d
|ddg      d       | j                  | j                  j                  d| j                  d
|dg      d       | j                  | j                  j                  d| j                  d
|dg      d   d	       | j                  | j                  j                  d| j                  d
|ddg      d       | j                  | j                  j                  d| j                  d
|dg      d       | j                  | j                  j                  d| j                  d|g      d       | j                  | j                  j                  d| j                  ddg      d   d	       y )NTestCaseAction)actionstart
actionstopactioncheck	actionbanactionunban)zAction StartzAction StopzAction Checkz
Action BanzAction UnbanrD   	addactionr   rE   r   r   actionKEYVALUE)r   r  
InvalidKeytimeout10)r   
   	delactionrx   zDoesn't exist)rL   r9   rM   r:   zip)r#   r  cmdListcmdValueListrN   rf   s         r&   
testActionzTransmitter.testAction  s   &', ;;t}}k6BCv; ;;
DMM9%''(**+-	 . jc5KKT]]Hfc59;J
 . jc5KKxEFJ ;;
DMM8VUG<> ;;
DMM8VU35 ;;
DMM8V\:<<=? ;;
DMM8VY=?
 ;;
DMM8VY79
 ;;t}}k6BC ;;
DMM;8::;==>@r)   c                    d}| j                   j                  d| j                  d|t        j                  j                  t        dd      dg      }| j                  |d|f       | j                  | j                   j                  d| j                  d	|g      d
   ddg       | j                  | j                   j                  d| j                  d|dg      d       | j                  | j                   j                  d| j                  d|dg      d       | j                  | j                   j                  d| j                  d|g      d
   g d       | j                  | j                   j                  d| j                  d|ddg      d       | j                  | j                   j                  d| j                  d|ddg      d       | j                  | j                   j                  d| j                  d|ddg      d       y )Nr  rD   r  action.dz	action.pyz{"opt1": "value"}r   rE   actionpropertiesr   opt1opt2r  )r   rf   rx   actionmethods)banrebanr   rw   
testmethodunbanr  z{"text": "world!"})r   zHello world! valueanother value)r   r  )r   zHello world! another value)	r9   rM   r:   r   r4  r5  r6  rL   r^   )r#   r  outs      r&   $testPythonActionMethodsAndPropertiesz0Transmitter.testPythonActionMethodsAndProperties  s    &	4==+vGGLL[9	# 3F$;;t}}  !!"$
F ;;t}}h
  ;;t}}h
  ;;t}}o
 ;= ;;t}}h&( ) ;;t}}h
O  ;;t}}h&( )$&r)   c                 d    | j                  | j                  j                  ddg      d   d       y )Nrv  COMMANDr   r   ry   rt   s    r&   testNOKzTransmitter.testNOK,  s+    4;;&&	9'=>qA!Dr)   c                 d    | j                  | j                  j                  g d      d   d       y )N)rD   rv  r  r   r   ry   rt   s    r&   
testSetNOKzTransmitter.testSetNOK/  *    ;;45a8<r)   c                 d    | j                  | j                  j                  g d      d   d       y )N)rE   rv  r  r   r   ry   rt   s    r&   
testGetNOKzTransmitter.testGetNOK3  r  r)   c                 d    | j                  | j                  j                  g d      d   d       y )N)r   rv  r  r   r   ry   rt   s    r&   testStatusNOKzTransmitter.testStatusNOK7  s*    ;;78;A?r)   c           	         t         st        j                  d      d}| j                  j	                  |d       g d}t        |      D ]K  \  }}| j                  | j                  j                  d|d|g      d|d |dz    D cg c]  }|g c}f       M t        |      D ]K  \  }}| j                  | j                  j                  d|d	|g      d||dz   d  D cg c]  }|g c}f       M d
}| j                  | j                  j                  d|d|g      d|ggf       | j                  | j                  j                  d|d|g      d|g|ggf       | j                  | j                  j                  d|d	|g      d|ggf       | j                  | j                  j                  d|d	|g      dg f       g d}| j                  | j                  j                  d|dg|z         dd
gddggf       | j                  | j                  j                  d|d	g|d d z         dddggf       | j                  | j                  j                  d|d	g|dd  z         dg f       d}| j                  j                  d|d|g      }| j                  t        |d   t                     d}| j                  j                  d|d	|g      }| j                  t        |d   t                     y c c}w c c}w )N&systemd python interface not availabler   systemd_SYSTEMD_UNIT=sshd.servicezTEST_FIELD1=ABCz_HOSTNAME=example.comrD   addjournalmatchr   r   deljournalmatch
_COMM=sshd)r  +r  _UID=0r  r  r   zThis isn't valid!zFIELD=NotPresent)r   r   SkipTestr7   r;   r]   rL   r9   rM   r   r   
ValueError)r#   r:   rb   re   rf   valr:  s          r&   testJournalMatchzTransmitter.testJournalMatch;  sP   				C	DD(++h	*&
 F# *haKKX(%02&!A#,'3#'(**
 F# *haKKX(%02&1,'3#'(** %;;
H'/1y> ;;
H'/1%
 ;;
H'/1y>
 ;;
H'/1r7
>%;;
H'(5025x@ABD ;;
H'(5!946	%x0124 ;;
H'(5946r7 %;;	8&.0&//*VAY
34 %;;	8&.0&//*VAY
34o 	(
 	(s   
K0
K5c           	         t         st        j                  d      | j                  d       d}| j                  j                  |d       g d}t        |      D ]K  \  }}| j                  | j                  j                  d|d|g      d|d |d	z    D cg c]  }|g c}f       M t        |      D ]K  \  }}| j                  | j                  j                  d|d
|g      d||d	z   d  D cg c]  }|g c}f       M y c c}w c c}w )Nr  Tr   zsystemd[journalflags=2]r  rD   r  r   r   r  )
r   r   r  r   r7   r;   r]   rL   r9   rM   )r#   r:   rb   re   rf   r  s         r&   testJournalFlagsMatchz!Transmitter.testJournalFlagsMatch  s   				C	DD//$(++h 9:&
 F# *haKKX(%02&!A#,'3#'(**
 F# *haKKX(%02&1,'3#'(** 	(
 	(s   
D-
DN)1r,   r-   r.   ru   rz   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r   r  r!  r#  r&  r+  r7  r;  rC  rI  rM  rQ  rT  r]  rc  rg  rq  rt  rw  r  r  r  r  r  r  r  r  r  r!   r)   r&   rp   rp      s   ,
=?K6	I.`;$
><$	<;
FK	c:(& ) )V?==B(T2#JR?<00K$$$<:@x"&HE<<?E5N*r)   rp   c                   L     e Zd ZeZ fdZd Zd Zd Zd Z	d Z
d Zd Z xZS )	TransmitterLoggingc                     t         t        |           | j                  j	                  d       | j                  j                  d       | j                  j                  d       y )N	/dev/nullCRITICALr   )r4   r  r5   r7   r+   r'   setSyslogSocketr=   s    r&   r5   zTransmitterLogging.setUp  sG    D')++;'++*%++f%r)   c                    g }t        d      D ]D  }t        j                  dd      }|j                  |d          t	        j
                  |d          F |D ]  }| j                  d|        d}| j                  d|       | j                  j                  g d       |D ]  }t	        j                  |        | j                  dd	d
       | j                  ddd       y )Nr   r   transmitterr   r   	logtarget/this/path/should/not/exist)rD   r  r  zSTDOUT[format="%(message)s"]STDOUTz!STDERR[datetime=off, padding=off]STDERR)ranger   r   re  r   r   rU   rX   r9   rM   remove)r#   
logTargets_tmpFile	logTargetrf   s         r&   testLogTargetz TransmitterLogging.testLogTarget  s    *8 aj-87WQZ 88GAJ  +i??;	*+ (%[%(++78 i99Y //+=xH//+BHMr)   c                 8   t         j                  j                  d      st        j                  d      | j                  | j                  j                         d       | j                  dd       | j                  | j                  j                         d       y )N/dev/logz'/dev/log' not presentr   r  SYSLOG)	r   r4  existsr   r  r   r7   getSyslogSocketrU   rt   s    r&   testLogTargetSYSLOGz&TransmitterLogging.testLogTargetSYSLOG  sh    	
	#			3	44//$++--/8//+x(//$++--/<r)   c                 (    | j                  dd       y )Nsyslogsocketz/dev/log/NEW/PATH)rU   rt   s    r&   testSyslogSocketz#TransmitterLogging.testSyslogSocket  s    //."56r)   c                 4   | j                  dd       | j                  dd       | j                  dd        | j                   di i t        dt        d      d	      d
t	        j
                         dv xr t        j                  j                  d          y )Nr  r  r  r  r  r   zFailed to change log targetT)rQ   rP   rI   )TF)Linux)r  r  )	rU   rX   dict	Exceptionplatformsystemr   r4  r  rt   s    r&   testSyslogSocketNOKz&TransmitterLogging.testSyslogSocketNOK  s    //."?@[(+//.*-$// 78" J&E277>>*+EGr)   c                    | j                  dd       | j                  dd       | j                  dd       | j                  dd       | j                  dd       | j                  dd       | j                  dd       | j                  dd	       | j                  dd
       | j                  ddd
       | j                  dd       y )Nloglevel
HEAVYDEBUG
TRACEDEBUG9DEBUGINFONOTICEWARNINGERRORr  cRiTiCaLBird)rU   rX   rt   s    r&   testLogLevelzTransmitterLogging.testLogLevel  s    //*l+//*l+//*c"//*g&//*f%//*h'//*i(//*g&//*j)//*j*5Z(r)   c                    | j                  | j                  j                  dg      d       	 t        j                  d      \  }}t        j                  |       | j                  j                  d       | j                  | j                  j                  dd|g      d|f       t        d      }|j                  d	       	 t        j                  d      \  }}t        j                  |       t        j                  ||       |j                  d
       | j                  | j                  j                  dg      d       |j                  d       t        |d      5 }t        |      }|j                  d      dk\  rt        |      }| j                  |j!                  d             t        |      }| j                  |j!                  d             	 t        |      }|j                  d      dk\  r!| j#                  t$        |j&                         n| j)                  d|z         d d d        t        |d      5 }t        |      }|j                  d      dk\  rt        |      }| j                  |j!                  d             | j#                  t$        |j&                         |j                          d d d        t        j*                  |       	 	 t        j*                  |       | j                  | j                  j                  g d      d       | j                  | j                  j                  dg      d       y # t$        $ r Y )w xY w# 1 sw Y   /xY w# 1 sw Y   xY w# t        j*                         w xY w# t,        $ r Y w xY w# 	 t        j*                         w # t,        $ r Y w w xY wxY w)N	flushlogs)r   zrolled overzfail2ban.logr  rD   r  r   r   zBefore file movedzAfter file movedzAfter flushlogsrzChanged logging target tozBefore file moved
zAfter file moved
zCommand: ['flushlogs']zCException StopIteration or Command: ['flushlogs'] expected. Got: %szrollover performed onzAfter flushlogs
)rD   r  r  )r   r  )r   flushed)rL   r9   rM   r   r   r   r   r7   r'   r   warningrenameopennextfindr   endswithassertRaisesStopIteration__next__failr  OSError)	r#   ffnlf2fn2line1line2re   s	            r&   testFlushLogsz TransmitterLogging.testFlushLogs  s   4;;&&}57IJ*	N+51b88A;;;9%DKK''R(@AAr7K199 !~.GBHHRLIIb#II !T[[((+79KLII 	c# !!WU

./141ge	__U^^$9:;!WU	__U^^$89:
q'a	
(	)A	-

3yyVYZZ[ 
b !WU

*+q01ge	__U^^$789	}ajj1WWY IIcN	IIbM 4;;&&'EFV4;;&&}5~F#  
   IIcN  			IIbM
 		s   BN BM1  A6MAM+M1 ?A;M%:M1 N N 	MMMMM"M1 %M.*M1 1NN 	NNON21O2	N>;O=N>>Oc                    | j                  ddd| j                         | j                  ddd| j                         | j                  dd	d
| j                         | j                  ddd| j                         | j                  dd| j                         | j                  ddd| j                         | j                  ddd| j                         y )Nzbantime.incrementtrueTr   zbantime.rndtime30minr   zbantime.maxtimez	1000 daysi \&zbantime.factorr  zbantime.formulazGban.Time * math.exp(float(ban.Count+1)*banFactor)/math.exp(1*banFactor)zbantime.multipliersz1 5 30 60 300 720 1440 2880zbantime.overalljailsrL  rt   s    r&   testBanTimeIncrz"TransmitterLogging.testBanTimeIncr  s    //%vt$--/H//#We$--/H//#[-dmm/T//"C4==/A//#%nuy  vC  vC/  D//')FHelplyly/z//(&&t}}/Mr)   )r,   r-   r.   r	   r6   r5   r  r  r  r  r  r  r  rm   rn   s   @r&   r  r    s4    &N(=7).G`Nr)   r  c                       e Zd Zd Zy)	JailTestsc                 V    d}t        |      }| j                  |j                  |       y )Nveryveryverylongname)r   rL   rA  )r#   longnamerR   s      r&   testLongNamezJailTests.testLongName  s$    #(	h$499h'r)   N)r,   r-   r.   r  r!   r)   r&   r  r    s    (r)   r  c                       e Zd Zd Zd Zd Zy)
RegexTestsc                     | j                  t        t        d       | j                  t        t        d       | j                  t        t        d       y )NrP   	)r  r   r   rt   s    r&   testInitzRegexTests.testInit"  s8    NE2.NE3/NE40r)   c                     | j                  t        t        d            j                  dd      d       | j	                  t        t        d            j                  d             y )Na"'z
Regex('a')rX  z
FailRegex()rL   ra   r   replacer   r   
startswithrt   s    r&   testStrzRegexTests.testStr(  sH    3uSz?**34lC//#i)*55lCDr)   c                 $   | j                  t        t        d       | j                  t        t        d       | j                  t        d             | j                  t        d             | j                  t        d             | j                  t        d             | j                  t        d             | j                  t        d             | j                  t        d	             t        d
      }| j	                  |j                                |j                  dg       | j                  |j                                | j                  t        |j                         t        d      }| j	                  |j                                |j                  dg       | j                  |j                                | j                  t        |j                         t        d      }| j	                  |j                                |j                  dg       | j                  |j                                | j                  |j                         d       |j                  dg       | j                  |j                                | j                  |j                         d       |j                  dg       | j                  |j                                | j                  |j                         d       t        d      }| j	                  |j                                |j                  dg       | j                  |j                                | j                  |j                         d       t        d      }|j                  dg       |j                         }| j                  ||j                  fd       |j                  dg       |j                         }| j                  ||j                  fd       |j                  dg       |j                         }| j                  ||j                  fd       |j                  dg       |j                         }| j                  ||j                  fd       t        d       }|j                  d!g       |j                         }| j                  ||j                  fd"       |j                  d#g       |j                         }| j                  ||j                  fd       |j                  d$g       |j                         }| j                  ||j                  fd%       |j                  d&g       |j                         }| j                  ||j                  fd'       y )(NrP  z^test no group$z^test <HOST> group$z^test <IP4> group$z^test <IP6> group$z^test <DNS> group$z<^test id group: ip:port = <F-ID><IP4>(?::<F-PORT/>)?</F-ID>$z-^test id group: user:\(<F-ID>[^\)]+</F-ID>\)$z#^test id group: anything = <F-ID/>$z	%%<HOST>?)z%%rP  rP  z#%%inet(?:=<F-IP4/>|inet6=<F-IP6/>)?)z%%inet=testrP  rP  z(%%(?:inet(?:=<IP4>|6=<IP6>)?|dns=<DNS>?))z%%inet=192.0.2.1rP  rP  r   )z%%inet6=2001:DB8::rP  rP  
2001:DB8::)z%%dns=example.comrP  rP  zexample.com)z%test id group: user:(test login name)rP  rP  ztest login namez%%net=<SUBNET>)z%%net=192.0.2.1rP  rP  )r   inet4)z%%net=192.0.2.1/24rP  rP  )z192.0.2.0/24r  )z%%net=2001:DB8:FF:FF::1rP  rP  )z2001:db8:ff:ff::1inet6)z%%net=2001:DB8:FF:FF::1/60rP  rP  )z2001:db8:ff:f0::/60r  z%%ip="<ADDR>", mask="<CIDR>?")z%%ip="192.0.2.2", mask=""rP  rP  )r   r  )z%%ip="192.0.2.2", mask="24"rP  rP  )z"%%ip="2001:DB8:2FF:FF::1", mask=""rP  rP  )z2001:db8:2ff:ff::1r  )z$%%ip="2001:DB8:2FF:FF::1", mask="60"rP  rP  )z2001:db8:2ff:f0::/60r  )r  r   r   r   rr   
hasMatchedsearchgetHostrL   	getFailIDgetIP	familyStr)r#   frr  s      r&   testHostzRegexTests.testHost.  s+   NIr2NI/@A//)234//)123//)123//)123//)[\]//)LMN//)BCD "2==?#))\N//"--/"NBJJ/78"2==?#))"#$//"--/"NBJJ/<="2==?#))'()//"--/"2::<-)))*+//"--/"2::<.))()*//"--/"2::</AB"2==?#))<=>//"--/"2<<>#45"#"))&'(	xxz"B%'=>)))*+	xxz"B%'@A))./0	xxz"B%'EF))123	xxz"B%'GH12"))012	xxz"B%'=>))234	xxz"B%'@A))9:;	xxz"B%'FG));<=	xxz"B%'HIr)   N)r,   r-   r.   r  r  r%  r!   r)   r&   r  r     s    1EDJr)   r  c                       e Zd Zd Zy)
_BadThreadc                     t        d      )Nzrun bad thread exception)r   rt   s    r&   runz_BadThread.runv  s    /00r)   N)r,   r-   r.   r)  r!   r)   r&   r'  r'  u  s    1r)   r'  c                       e Zd Zd Zd Zd Zy)LoggingTestsc                     t        d      }| j                  |j                  j                  d       | j                  |j                  d       y )Nzfail2ban.some.string.with.namer   zfail2ban.name)r   rL   parentrA  )r#   
testLogSyss     r&   testGetF2BLoggerzLoggingTests.testGetF2BLogger|  s=    9:*:$$)):6:??O4r)   c                     t         j                  }g fdt         _        	 t               }|j                          |j	                           j                  t        j                   fdd             |t         _         j                  d        j                  t              d        j                  d   d   t               y # |t         _        w xY w)Nc                  &    j                  |       S r    )re  )r$   rH   s    r&   r   z5LoggingTests.testFail2BanExceptHook.<locals>.<lambda>  s    QXXd^ r)   c                  @    t              xr  j                  d      S )NUnhandled exception)r   
_is_logged)r#   rH   s   r&   r   z5LoggingTests.testFail2BanExceptHook.<locals>.<lambda>  s    CF,]tG\7] r)   r   r3  r   r   )sys__excepthook__r'  r   r5  r   r   r   r   rL   r   r   )r#   prev_exchook	badThreadrH   s   `  @r&   testFail2BanExceptHookz#LoggingTests.testFail2BanExceptHook  s    ##,!3#%|9??>>??ENN$]_`ac$3)*3q611Q47L) %3s   AC Cc                    g }t        j                  dd      \  }}t        j                  |       |j	                  |       t        j                  dd      \  }}t        j                  |       |j	                  |       t               }	 |j                  ||d       | j                  |j                                | j                  d       |j                          |D ]7  }t        j                  j                  |      s#t        j                  |       9 y # |j                          |D ]7  }t        j                  j                  |      s#t        j                  |       9 w xY w)Nzfail2ban.sockzf2b-testzfail2ban.pidF)forcezServer already running)r   r   r   r   re  r   r   rr   rs   r   rA   r4  r  r  )r#   	tmp_filessock_fd	sock_name
pidfile_fdpidfile_namer7   r  s           r&   testStartFailedSockExistsz&LoggingTests.testStartFailedSockExists  s   )''D'9((79%--njI*l((:< <&	<<	<u<5F$$&'-.	;;= q	ww~~aYYq\ 
;;= q	ww~~aYYq\s   AD 5E+E+N)r,   r-   r.   r/  r9  rA  r!   r)   r&   r+  r+  z  s    5
*r)   r+  )ActionReaderJailsReader
CONFIG_DIRc                   l     e Zd Z fdZ fdZ fdZddZd Zd Zd Z	d Z
d	 Zd
 ZddZd Z xZS )ServerConfigReaderTestsc                 :    t        t        | 
  |i | i | _        y r    )r4   rF  __init__#_ServerConfigReaderTests__share_cfg)r#   r$   r%   r>   s      r&   rH  z ServerConfigReaderTests.__init__  s     /@@$r)   c                 8    t         t        |           g | _        y)r2   N)r4   rF  r5   _execCmdLstr=   s    r&   r5   zServerConfigReaderTests.setUp  s    ,.$r)   c                 *    t         t        |           yr@   )r4   rF  rB   r=   s    r&   rB   z ServerConfigReaderTests.tearDown  s    /1r)   c                     |j                  d      D ]?  }|j                  d      st        j                  d|       +t        j                  |       A y)N
#zexec-cmd: `%s`T)splitr  logSysdebug)r#   realCmdr  r  s       r&   _executeCmdz#ServerConfigReaderTests._executeCmd  sE    == a
,,s

LL!1%
LLO	
 
r)   c                     t        | d      sdt               }i | _        dD ]N  \  }}t        |      }|j	                  d       t
        j                  j                  ||      | j                  |<   P | j                  S )N__aInfos))ipv4r   )ipv6r  r   )hasattrr    _ServerConfigReaderTests__aInfosr   
setBanTime_actionsrm  
ActionInfo)r#   dmyjailtr  tickets        r&   _testActionInfosz(ServerConfigReaderTests._testActionInfos  ss    	z	"[74=? Duq"r]F
c''2267CDMM!D 
r)   c                 2   |j                   }| j                         }|D ]  }||   j                  D ]  }||   j                  |   }t        j	                  d       t        j	                  d|dz   |j
                  z          t        j	                  d       t        |t        j                        s| j                  |_
        t        j	                  d       | j                          |j                          t        j	                  d       | j                          |j                  |d          t        j	                  d       | j                          |j                  |d          t        j	                  d       | j                          |j                  |d	          t        j	                  d
       | j                          |j                  |d	          t        j	                  d       | j                          |j                            y )N4# ==================================================# == %-44s == - # === start ===# === ban-ipv4 ===rW  # === unban ipv4 ===# === ban ipv6 ===rX  # === unban ipv6 ===# === stop ===)r   ra  r   rQ  rR  _namer   r\  CommandActionrT  
executeCmdr   r   r  r  rw   )r#   r7   rf  aInfosrR   r  r  s          r&   _testExecActionsz(ServerConfigReaderTests._testExecActions  s|   


%  "& d$K q4[  #F
LL"#
LL$,"=>
LL"#fh445x((F
LL"#T]]_
LLN
LL%&
JJvf~
LL'($--/
LL 
LL%&
JJvf~
LL'($--/
LL 
LL!"DMMO
KKM5r)   c                    t         j                  j                  d       t        t        d| j
                        }| j                  |j                                | j                  |j                                |j                  d      }t               }|j                  }|j                  }|D ]  }|d   dk7  s|d   dk(  rd|d	<   nt        |      d
kD  r|d   dk(  ry|d	   dk(  rqt        j                  j!                  t"        d|d         }t        j                  j%                  |      s$t        j                  j!                  t"        d      }||d
<   nAt         j                  j&                  r't        |      d
kD  r|d   dv r|d	   dk(  r
d|d<   d|d
<   	  ||        t         j                  j&                  s| j-                  |       y y # t(        $ r"}| j+                  d|d|       Y d }~Hd }~ww xY w)NTstock)basedirforce_enableshare_config)allow_no_filesr   r   rZ   r   r   r   rD   r/  logsr   r.  )rD   z	multi-setrZ  zDUMMY-REGEX <HOST>zCommand z has failed. Received )r   r   SkipIfCfgMissingrC  rD  rI  r   read
getOptionsconvertr   r8   _Transmitter__commandHandlerr   r   r4  r5  r6  r  r   r  r  rp  )	r#   rf  streamr7   r9   
cmdHandlerrN   r  es	            r&   testCheckStockJailActionsz1ServerConfigReaderTests.testCheckStockJailActions  s   
,,d+
jt$JZJZ
[%//%**,//%""$%===-&<&!!&22*  @c	!f
1vSV 
SA#a&E/c!f.D
'',,~vs1v
6R GGNN277<<(89bSV 
		X\c!f 44Q>9QSV"SV@_/@@ 
		  
  @	YYsA>??@s   G	G>G99G>c                 ,   |j                  d|      }t        |      \  }}d|dgg}t        |||| j                  t              }| j                  |j                                |j                  i        |j                  |j                                |S )Nz%(__name__)srZ   r   )rv  rt  )
r  r   rB  rI  rD  r   rz  r{  extendr|  )r#   rR   actactNameactOptr~  r  s          r&   getDefaultJailStreamz,ServerConfigReaderTests.getDefaultJailStream  s    ND)#"3'/'6	4& 
D&  *6& //&++- B-- !	-r)   c                 *   t         j                  j                  d       t         j                  j                          dd l}t               }|j                  }|j	                  t        j                  j                  t        dd            D ]  }t        j                  j                  |      j                  dd      }| j                  d|z   |      }|D ](  }|j                  |      \  }}	| j                  |d       * | j!                  |        y )	NTrr  r   r  z*.confz.confrP  zj-)r   r   ry  
SkipIfFastglobr   r8   r   r4  r5  rD  basenamer  r  rM   rL   rp  )
r#   r  r7   r9   actCfgr  r~  rN   rg   ress
             r&   testCheckStockAllActionsz0ServerConfigReaderTests.testCheckStockAllActions+  s    
,,d+
,,<&!!&		"'',,z:xHI 	!f			&	!	)	)'2	63%%d3h46 s~~c"HCS!
  	!r)   c                    t         j                  j                  d       ddddddd	d
ddddddddfddddddddddddddddfd d!d"d#d$d%d&d'd(d)d*d+	fd,d-d"d#d.d/d0d1d2fd3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBfdCdDd5d6d7dEdFdGdHdIdJdKdLdMdNdBfdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]dBfd^d_d`dadSdbdcdddedfdgdhdidjdkdBfdldmd5d6dSdndodpdqdrdsdtdudvdwdBfdxdyd5d6dSdzd{d|d}d~ddddddBfddddddddddddddfddddddddddddddfddddddddddddddfdddddddddddddddfddddddddddddddfddddddddddddddfdddddddddddddל
fdddddddddddddל
fddddddddd2fddddddddd2ff}t               }|j                  }|j
                  }|D ]E  \  }}}| j                  ||      }|D ](  }	|j                  |	      \  }
}| j                  |
d       * G |j                  }| j                         }|D ]d  \  }}}||   j                  D ]J  }||   j                  |   }t        j                  d       t        j                  d|dz   |j                  z          t        j                  d       | j                  t!        |t"        j$                               | j&                  |_        | j+                  d       |j-                          |j/                  d      r | j0                  |d   ddi n=|j/                  d      r,|j/                  d      r | j2                  |d   |d   z   ddi | j+                  d       |j5                  |d          |j/                  d      r8 | j0                  |j/                  d|j/                  dd            |d   z   ddi |j/                  d      r | j2                  |d   ddi  | j0                  |d   ddi  | j2                  |d    ddi | j+                  d       |j7                  |d           | j0                  |d   ddi  | j2                  |d    ddi | j+                  d       |j5                  |d          |j/                  d      r8 | j0                  |j/                  d|j/                  dd            |d   z   ddi |j/                  d      r | j2                  |d   ddi  | j0                  |d   ddi  | j2                  |d   ddi | j+                  d       |j7                  |d           | j0                  |d   ddi  | j2                  |d   ddi |j/                  d	      r| j+                  d
       |j9                  |d   d           | j0                  |j/                  d|j/                  dd            |d	   z   ddi |j/                  d      r#|d   |d	   k7  r | j2                  |d   ddi |j/                  d      r| j+                  d       |j9                  |d   d           | j0                  |j/                  d|j/                  dd            |d   z   ddi |j/                  d	      r#|d	   |d   k7  r | j2                  |d	   ddi |j/                  d      r8| j+                  d       |j;                           | j0                  |d   ddi | j+                  d       |j=                          |j/                  d      s" | j0                  |j/                  dd      |d   z   ddi M g y (  NTrr  z
j-w-nft-mpzQnftables-multiport[name=%(__name__)s, port="http,https", protocol="tcp,udp,sctp"])zip 	ipv4_addrzaddr-)zip6 	ipv6_addrzaddr6-)`nft add table inet f2b-table`W`nft -- add chain inet f2b-table f2b-chain \{ type filter hook input priority -1 \; \}`9`for proto in $(echo 'tcp,udp,sctp' | sed 's/,/ /g'); do``done`)zG`nft add set inet f2b-table addr-set-j-w-nft-mp \{ type ipv4_addr\; \}`z`nft add rule inet f2b-table f2b-chain $proto dport \{ $(echo 'http,https' | sed s/:/-/g) \} ip saddr @addr-set-j-w-nft-mp reject`)zH`nft add set inet f2b-table addr6-set-j-w-nft-mp \{ type ipv6_addr\; \}`z`nft add rule inet f2b-table f2b-chain $proto dport \{ $(echo 'http,https' | sed s/:/-/g) \} ip6 saddr @addr6-set-j-w-nft-mp reject`)zG`{ nft flush set inet f2b-table addr-set-j-w-nft-mp 2> /dev/null; } || zH`{ nft flush set inet f2b-table addr6-set-j-w-nft-mp 2> /dev/null; } || )z`{ nft -a list chain inet f2b-table f2b-chain | grep -oP '@addr-set-j-w-nft-mp\s+.*\s+\Khandle\s+(\d+)$'; } | while read -r hdl; do`5`nft delete rule inet f2b-table f2b-chain $hdl; done`z3`nft delete set inet f2b-table addr-set-j-w-nft-mp`z`{ nft -a list chain inet f2b-table f2b-chain | grep -oP '@addr6-set-j-w-nft-mp\s+.*\s+\Khandle\s+(\d+)$'; } | while read -r hdl; do`r  z4`nft delete set inet f2b-table addr6-set-j-w-nft-mp`)zO`nft list chain inet f2b-table f2b-chain | grep -q '@addr-set-j-w-nft-mp[ \t]'`)zP`nft list chain inet f2b-table f2b-chain | grep -q '@addr6-set-j-w-nft-mp[ \t]'`)zD`nft add element inet f2b-table addr-set-j-w-nft-mp \{ 192.0.2.1 \}`)zG`nft delete element inet f2b-table addr-set-j-w-nft-mp \{ 192.0.2.1 \}`)zF`nft add element inet f2b-table addr6-set-j-w-nft-mp \{ 2001:db8:: \}`)zI`nft delete element inet f2b-table addr6-set-j-w-nft-mp \{ 2001:db8:: \}`)ip4ip6*-start	ip4-start	ip6-startflushrw   	ip4-check	ip6-checkip4-ban	ip4-unbanip6-ban	ip6-unbanz
j-w-nft-apz8nftables-allports[name=%(__name__)s, protocol="tcp,udp"])r  r  )zG`nft add set inet f2b-table addr-set-j-w-nft-ap \{ type ipv4_addr\; \}`zg`nft add rule inet f2b-table f2b-chain meta l4proto \{ tcp,udp \} ip saddr @addr-set-j-w-nft-ap reject`)zH`nft add set inet f2b-table addr6-set-j-w-nft-ap \{ type ipv6_addr\; \}`zi`nft add rule inet f2b-table f2b-chain meta l4proto \{ tcp,udp \} ip6 saddr @addr6-set-j-w-nft-ap reject`)zG`{ nft flush set inet f2b-table addr-set-j-w-nft-ap 2> /dev/null; } || zH`{ nft flush set inet f2b-table addr6-set-j-w-nft-ap 2> /dev/null; } || )z`{ nft -a list chain inet f2b-table f2b-chain | grep -oP '@addr-set-j-w-nft-ap\s+.*\s+\Khandle\s+(\d+)$'; } | while read -r hdl; do`r  z3`nft delete set inet f2b-table addr-set-j-w-nft-ap`z`{ nft -a list chain inet f2b-table f2b-chain | grep -oP '@addr6-set-j-w-nft-ap\s+.*\s+\Khandle\s+(\d+)$'; } | while read -r hdl; do`r  z4`nft delete set inet f2b-table addr6-set-j-w-nft-ap`)zO`nft list chain inet f2b-table f2b-chain | grep -q '@addr-set-j-w-nft-ap[ \t]'`)zP`nft list chain inet f2b-table f2b-chain | grep -q '@addr6-set-j-w-nft-ap[ \t]'`)zD`nft add element inet f2b-table addr-set-j-w-nft-ap \{ 192.0.2.1 \}`)zG`nft delete element inet f2b-table addr-set-j-w-nft-ap \{ 192.0.2.1 \}`)zF`nft add element inet f2b-table addr6-set-j-w-nft-ap \{ 2001:db8:: \}`)zI`nft delete element inet f2b-table addr6-set-j-w-nft-ap \{ 2001:db8:: \}`zj-dummyzodummy[name=%(__name__)s, init="=='<family>/<ip>'==bt:<bantime>==bc:<bancount>==", target="/tmp/fail2ban.dummy"])zfamily: inet4)zfamily: inet6)z$`printf %b "=='/'==bt:600==bc:0==\n"z7`echo "[j-dummy] dummy /tmp/fail2ban.dummy -- started"`)z9`echo "[j-dummy] dummy /tmp/fail2ban.dummy -- clear all"`)z7`echo "[j-dummy] dummy /tmp/fail2ban.dummy -- stopped"`)zP`echo "[j-dummy] dummy /tmp/fail2ban.dummy -- banned 192.0.2.1 (family: inet4)"`)zR`echo "[j-dummy] dummy /tmp/fail2ban.dummy -- unbanned 192.0.2.1 (family: inet4)"`)zQ`echo "[j-dummy] dummy /tmp/fail2ban.dummy -- banned 2001:db8:: (family: inet6)"`)zS`echo "[j-dummy] dummy /tmp/fail2ban.dummy -- unbanned 2001:db8:: (family: inet6)"`)	r  r  r   r  rw   r  r  r  r  zj-hostsdenyzPhostsdeny[name=%(__name__)s, actionstop="rm <file>", file="/tmp/fail2ban.dummy"])z5`printf %b "ALL: 192.0.2.1\n" >> /tmp/fail2ban.dummy`)z^`IP=$(echo "192.0.2.1" | sed 's/[][\.]/\\\0/g') && sed -i "/^ALL: $IP$/d" /tmp/fail2ban.dummy`)z8`printf %b "ALL: [2001:db8::]\n" >> /tmp/fail2ban.dummy`)za`IP=$(echo "[2001:db8::]" | sed 's/[][\.]/\\\0/g') && sed -i "/^ALL: $IP$/d" /tmp/fail2ban.dummy`)r  r  r  r  r  r  zj-w-iptables-mpzwiptables-multiport[name=%(__name__)s, bantime="10m", port="http,https", protocol="tcp,udp,sctp", chain="<known/chain>"])
`iptables icmp-port-unreachable)`ip6tables icmp6-port-unreachable)r  r  )z`{ iptables -w -C f2b-j-w-iptables-mp -j RETURN >/dev/null 2>&1; } || { iptables -w -N f2b-j-w-iptables-mp || true; iptables -w -A f2b-j-w-iptables-mp -j RETURN; }`z`{ iptables -w -C INPUT -p $proto -m multiport --dports http,https -j f2b-j-w-iptables-mp >/dev/null 2>&1; } || { iptables -w -I INPUT -p $proto -m multiport --dports http,https -j f2b-j-w-iptables-mp; }`)z`{ ip6tables -w -C f2b-j-w-iptables-mp -j RETURN >/dev/null 2>&1; } || { ip6tables -w -N f2b-j-w-iptables-mp || true; ip6tables -w -A f2b-j-w-iptables-mp -j RETURN; }`zq`{ ip6tables -w -C INPUT -p $proto -m multiport --dports http,https -j f2b-j-w-iptables-mp >/dev/null 2>&1; } || z]{ ip6tables -w -I INPUT -p $proto -m multiport --dports http,https -j f2b-j-w-iptables-mp; }`)$`iptables -w -F f2b-j-w-iptables-mp`%`ip6tables -w -F f2b-j-w-iptables-mp`)zX`iptables -w -D INPUT -p $proto -m multiport --dports http,https -j f2b-j-w-iptables-mp`r  z$`iptables -w -X f2b-j-w-iptables-mp`zY`ip6tables -w -D INPUT -p $proto -m multiport --dports http,https -j f2b-j-w-iptables-mp`r  z%`ip6tables -w -X f2b-j-w-iptables-mp`)zX`iptables -w -C INPUT -p $proto -m multiport --dports http,https -j f2b-j-w-iptables-mp`)zY`ip6tables -w -C INPUT -p $proto -m multiport --dports http,https -j f2b-j-w-iptables-mp`)za`iptables -w -I f2b-j-w-iptables-mp 1 -s 192.0.2.1 -j REJECT --reject-with icmp-port-unreachable`)z_`iptables -w -D f2b-j-w-iptables-mp -s 192.0.2.1 -j REJECT --reject-with icmp-port-unreachable`)zd`ip6tables -w -I f2b-j-w-iptables-mp 1 -s 2001:db8:: -j REJECT --reject-with icmp6-port-unreachable`)zb`ip6tables -w -D f2b-j-w-iptables-mp -s 2001:db8:: -j REJECT --reject-with icmp6-port-unreachable`)r  r  *-start-stop-checkr  r  r  rw   r  r  r  r  r  r  zj-w-iptables-apzciptables-allports[name=%(__name__)s, bantime="10m", protocol="tcp,udp,sctp", chain="<known/chain>"])z`{ iptables -w -C f2b-j-w-iptables-ap -j RETURN >/dev/null 2>&1; } || { iptables -w -N f2b-j-w-iptables-ap || true; iptables -w -A f2b-j-w-iptables-ap -j RETURN; }`zO`{ iptables -w -C INPUT -p $proto -j f2b-j-w-iptables-ap >/dev/null 2>&1; } || z;{ iptables -w -I INPUT -p $proto -j f2b-j-w-iptables-ap; }`)z`{ ip6tables -w -C f2b-j-w-iptables-ap -j RETURN >/dev/null 2>&1; } || { ip6tables -w -N f2b-j-w-iptables-ap || true; ip6tables -w -A f2b-j-w-iptables-ap -j RETURN; }`zP`{ ip6tables -w -C INPUT -p $proto -j f2b-j-w-iptables-ap >/dev/null 2>&1; } || z<{ ip6tables -w -I INPUT -p $proto -j f2b-j-w-iptables-ap; }`)$`iptables -w -F f2b-j-w-iptables-ap`%`ip6tables -w -F f2b-j-w-iptables-ap`)z7`iptables -w -D INPUT -p $proto -j f2b-j-w-iptables-ap`r  z$`iptables -w -X f2b-j-w-iptables-ap`z8`ip6tables -w -D INPUT -p $proto -j f2b-j-w-iptables-ap`r  z%`ip6tables -w -X f2b-j-w-iptables-ap`)z7`iptables -w -C INPUT -p $proto -j f2b-j-w-iptables-ap`)z8`ip6tables -w -C INPUT -p $proto -j f2b-j-w-iptables-ap`)za`iptables -w -I f2b-j-w-iptables-ap 1 -s 192.0.2.1 -j REJECT --reject-with icmp-port-unreachable`)z_`iptables -w -D f2b-j-w-iptables-ap -s 192.0.2.1 -j REJECT --reject-with icmp-port-unreachable`)zd`ip6tables -w -I f2b-j-w-iptables-ap 1 -s 2001:db8:: -j REJECT --reject-with icmp6-port-unreachable`)zb`ip6tables -w -D f2b-j-w-iptables-ap -s 2001:db8:: -j REJECT --reject-with icmp6-port-unreachable`zj-w-iptables-ipsetz\iptables-ipset-proto6[name=%(__name__)s, port="http", protocol="tcp", chain="<known/chain>"])z f2b-j-w-iptables-ipset )z f2b-j-w-iptables-ipset6 )z0`for proto in $(echo 'tcp' | sed 's/,/ /g'); do`r  )z?`ipset -exist create f2b-j-w-iptables-ipset hash:ip timeout 0 `aJ  `{ iptables -w -C INPUT -p $proto -m multiport --dports http -m set --match-set f2b-j-w-iptables-ipset src -j REJECT --reject-with icmp-port-unreachable >/dev/null 2>&1; } || { iptables -w -I INPUT -p $proto -m multiport --dports http -m set --match-set f2b-j-w-iptables-ipset src -j REJECT --reject-with icmp-port-unreachable; }`)zL`ipset -exist create f2b-j-w-iptables-ipset6 hash:ip timeout 0 family inet6`aP  `{ ip6tables -w -C INPUT -p $proto -m multiport --dports http -m set --match-set f2b-j-w-iptables-ipset6 src -j REJECT --reject-with icmp6-port-unreachable >/dev/null 2>&1; } || { ip6tables -w -I INPUT -p $proto -m multiport --dports http -m set --match-set f2b-j-w-iptables-ipset6 src -j REJECT --reject-with icmp6-port-unreachable; }`)$`ipset flush f2b-j-w-iptables-ipset`%`ipset flush f2b-j-w-iptables-ipset6`)z`iptables -w -D INPUT -p $proto -m multiport --dports http -m set --match-set f2b-j-w-iptables-ipset src -j REJECT --reject-with icmp-port-unreachable`r  z&`ipset destroy f2b-j-w-iptables-ipset`z`ip6tables -w -D INPUT -p $proto -m multiport --dports http -m set --match-set f2b-j-w-iptables-ipset6 src -j REJECT --reject-with icmp6-port-unreachable`r  z'`ipset destroy f2b-j-w-iptables-ipset6`)z`iptables -w -C INPUT -p $proto -m multiport --dports http -m set --match-set f2b-j-w-iptables-ipset src -j REJECT --reject-with icmp-port-unreachable`)z`ip6tables -w -C INPUT -p $proto -m multiport --dports http -m set --match-set f2b-j-w-iptables-ipset6 src -j REJECT --reject-with icmp6-port-unreachable`)z=`ipset -exist add f2b-j-w-iptables-ipset 192.0.2.1 timeout 0`)z3`ipset -exist del f2b-j-w-iptables-ipset 192.0.2.1`)z?`ipset -exist add f2b-j-w-iptables-ipset6 2001:db8:: timeout 0`)z5`ipset -exist del f2b-j-w-iptables-ipset6 2001:db8::`zj-w-iptables-ipset-apzHiptables-ipset-proto6-allports[name=%(__name__)s, chain="<known/chain>"])z f2b-j-w-iptables-ipset-ap )z f2b-j-w-iptables-ipset-ap6 )zB`ipset -exist create f2b-j-w-iptables-ipset-ap hash:ip timeout 0 `a  `{ iptables -w -C INPUT -p $proto -m set --match-set f2b-j-w-iptables-ipset-ap src -j REJECT --reject-with icmp-port-unreachable >/dev/null 2>&1; } || { iptables -w -I INPUT -p $proto -m set --match-set f2b-j-w-iptables-ipset-ap src -j REJECT --reject-with icmp-port-unreachable; })zO`ipset -exist create f2b-j-w-iptables-ipset-ap6 hash:ip timeout 0 family inet6`a  `{ ip6tables -w -C INPUT -p $proto -m set --match-set f2b-j-w-iptables-ipset-ap6 src -j REJECT --reject-with icmp6-port-unreachable >/dev/null 2>&1; } || { ip6tables -w -I INPUT -p $proto -m set --match-set f2b-j-w-iptables-ipset-ap6 src -j REJECT --reject-with icmp6-port-unreachable; })'`ipset flush f2b-j-w-iptables-ipset-ap`(`ipset flush f2b-j-w-iptables-ipset-ap6`)z`iptables -w -D INPUT -p $proto -m set --match-set f2b-j-w-iptables-ipset-ap src -j REJECT --reject-with icmp-port-unreachable`r  z)`ipset destroy f2b-j-w-iptables-ipset-ap`z`ip6tables -w -D INPUT -p $proto -m set --match-set f2b-j-w-iptables-ipset-ap6 src -j REJECT --reject-with icmp6-port-unreachable`r  z*`ipset destroy f2b-j-w-iptables-ipset-ap6`)z`iptables -w -C INPUT -p $proto -m set --match-set f2b-j-w-iptables-ipset-ap src -j REJECT --reject-with icmp-port-unreachable`)z`ip6tables -w -C INPUT -p $proto -m set --match-set f2b-j-w-iptables-ipset-ap6 src -j REJECT --reject-with icmp6-port-unreachable`)z@`ipset -exist add f2b-j-w-iptables-ipset-ap 192.0.2.1 timeout 0`)z6`ipset -exist del f2b-j-w-iptables-ipset-ap 192.0.2.1`)zB`ipset -exist add f2b-j-w-iptables-ipset-ap6 2001:db8:: timeout 0`)z8`ipset -exist del f2b-j-w-iptables-ipset-ap6 2001:db8::`zj-w-iptablesz^iptables[name=%(__name__)s, bantime="10m", port="http", protocol="tcp", chain="<known/chain>"])z`{ iptables -w -C f2b-j-w-iptables -j RETURN >/dev/null 2>&1; } || { iptables -w -N f2b-j-w-iptables || true; iptables -w -A f2b-j-w-iptables -j RETURN; }z`{ iptables -w -C INPUT -p $proto --dport http -j f2b-j-w-iptables >/dev/null 2>&1; } || { iptables -w -I INPUT -p $proto --dport http -j f2b-j-w-iptables; }`)z`{ ip6tables -w -C f2b-j-w-iptables -j RETURN >/dev/null 2>&1; } || { ip6tables -w -N f2b-j-w-iptables || true; ip6tables -w -A f2b-j-w-iptables -j RETURN; }z`{ ip6tables -w -C INPUT -p $proto --dport http -j f2b-j-w-iptables >/dev/null 2>&1; } || { ip6tables -w -I INPUT -p $proto --dport http -j f2b-j-w-iptables; }`)!`iptables -w -F f2b-j-w-iptables`"`ip6tables -w -F f2b-j-w-iptables`)zA`iptables -w -D INPUT -p $proto --dport http -j f2b-j-w-iptables`r  z!`iptables -w -X f2b-j-w-iptables`zB`ip6tables -w -D INPUT -p $proto --dport http -j f2b-j-w-iptables`r  z"`ip6tables -w -X f2b-j-w-iptables`)zA`iptables -w -C INPUT -p $proto --dport http -j f2b-j-w-iptables`)zB`ip6tables -w -C INPUT -p $proto --dport http -j f2b-j-w-iptables`)z^`iptables -w -I f2b-j-w-iptables 1 -s 192.0.2.1 -j REJECT --reject-with icmp-port-unreachable`)z\`iptables -w -D f2b-j-w-iptables -s 192.0.2.1 -j REJECT --reject-with icmp-port-unreachable`)za`ip6tables -w -I f2b-j-w-iptables 1 -s 2001:db8:: -j REJECT --reject-with icmp6-port-unreachable`)z_`ip6tables -w -D f2b-j-w-iptables -s 2001:db8:: -j REJECT --reject-with icmp6-port-unreachable`zj-w-iptables-newzbiptables-new[name=%(__name__)s, bantime="10m", port="http", protocol="tcp", chain="<known/chain>"])z`{ iptables -w -C f2b-j-w-iptables-new -j RETURN >/dev/null 2>&1; } || { iptables -w -N f2b-j-w-iptables-new || true; iptables -w -A f2b-j-w-iptables-new -j RETURN; }`z`{ iptables -w -C INPUT -m state --state NEW -p $proto --dport http -j f2b-j-w-iptables-new >/dev/null 2>&1; } || { iptables -w -I INPUT -m state --state NEW -p $proto --dport http -j f2b-j-w-iptables-new; }`)z`{ ip6tables -w -C f2b-j-w-iptables-new -j RETURN >/dev/null 2>&1; } || { ip6tables -w -N f2b-j-w-iptables-new || true; ip6tables -w -A f2b-j-w-iptables-new -j RETURN; }`z`{ ip6tables -w -C INPUT -m state --state NEW -p $proto --dport http -j f2b-j-w-iptables-new >/dev/null 2>&1; } || { ip6tables -w -I INPUT -m state --state NEW -p $proto --dport http -j f2b-j-w-iptables-new; }`)%`iptables -w -F f2b-j-w-iptables-new`&`ip6tables -w -F f2b-j-w-iptables-new`)zZ`iptables -w -D INPUT -m state --state NEW -p $proto --dport http -j f2b-j-w-iptables-new`r  z%`iptables -w -X f2b-j-w-iptables-new`z[`ip6tables -w -D INPUT -m state --state NEW -p $proto --dport http -j f2b-j-w-iptables-new`r  z&`ip6tables -w -X f2b-j-w-iptables-new`)zZ`iptables -w -C INPUT -m state --state NEW -p $proto --dport http -j f2b-j-w-iptables-new`)z[`ip6tables -w -C INPUT -m state --state NEW -p $proto --dport http -j f2b-j-w-iptables-new`)zb`iptables -w -I f2b-j-w-iptables-new 1 -s 192.0.2.1 -j REJECT --reject-with icmp-port-unreachable`)z``iptables -w -D f2b-j-w-iptables-new -s 192.0.2.1 -j REJECT --reject-with icmp-port-unreachable`)ze`ip6tables -w -I f2b-j-w-iptables-new 1 -s 2001:db8:: -j REJECT --reject-with icmp6-port-unreachable`)zc`ip6tables -w -D f2b-j-w-iptables-new -s 2001:db8:: -j REJECT --reject-with icmp6-port-unreachable`zj-w-iptables-xtrezPiptables-xt_recent-echo[name=%(__name__)s, bantime="10m", chain="<known/chain>"])r  z/f2b-j-w-iptables-xtre`)r  z/f2b-j-w-iptables-xtre6`)a"  `{ iptables -w -C INPUT -m recent --update --seconds 3600 --name f2b-j-w-iptables-xtre -j REJECT --reject-with icmp-port-unreachable >/dev/null 2>&1; } || { iptables -w -I INPUT -m recent --update --seconds 3600 --name f2b-j-w-iptables-xtre -j REJECT --reject-with icmp-port-unreachable; }`)a(  `{ ip6tables -w -C INPUT -m recent --update --seconds 3600 --name f2b-j-w-iptables-xtre6 -j REJECT --reject-with icmp6-port-unreachable >/dev/null 2>&1; } || { ip6tables -w -I INPUT -m recent --update --seconds 3600 --name f2b-j-w-iptables-xtre6 -j REJECT --reject-with icmp6-port-unreachable; }`)z4`echo / > /proc/net/xt_recent/f2b-j-w-iptables-xtre``if [ `id -u` -eq 0 ];then`z`iptables -w -D INPUT -m recent --update --seconds 3600 --name f2b-j-w-iptables-xtre -j REJECT --reject-with icmp-port-unreachable;``fi`z5`echo / > /proc/net/xt_recent/f2b-j-w-iptables-xtre6`r  z`ip6tables -w -D INPUT -m recent --update --seconds 3600 --name f2b-j-w-iptables-xtre6 -j REJECT --reject-with icmp6-port-unreachable;`r  )z`{ iptables -w -C INPUT -m recent --update --seconds 3600 --name f2b-j-w-iptables-xtre -j REJECT --reject-with icmp-port-unreachable; } && test -e /proc/net/xt_recent/f2b-j-w-iptables-xtre`)z`{ ip6tables -w -C INPUT -m recent --update --seconds 3600 --name f2b-j-w-iptables-xtre6 -j REJECT --reject-with icmp6-port-unreachable; } && test -e /proc/net/xt_recent/f2b-j-w-iptables-xtre6`)z=`echo +192.0.2.1 > /proc/net/xt_recent/f2b-j-w-iptables-xtre`)z=`echo -192.0.2.1 > /proc/net/xt_recent/f2b-j-w-iptables-xtre`)z?`echo +2001:db8:: > /proc/net/xt_recent/f2b-j-w-iptables-xtre6`)z?`echo -2001:db8:: > /proc/net/xt_recent/f2b-j-w-iptables-xtre6`)r  r  r  r  rw   r  r  r  r  r  r  zj-w-pfz2pf[name=%(__name__)s, actionstart_on_demand=false]r!   )zF`echo "table <f2b-j-w-pf> persist counters" | pfctl -a f2b/j-w-pf -f-`zport="<port>"z\`echo "block quick proto tcp from <f2b-j-w-pf> to any port $port" | pfctl -a f2b/j-w-pf -f-`),`pfctl -a f2b/j-w-pf -t f2b-j-w-pf -T flush`)zT`pfctl -a f2b/j-w-pf -sr 2>/dev/null | grep -v f2b-j-w-pf | pfctl -a f2b/j-w-pf -f-`r  z+`pfctl -a f2b/j-w-pf -t f2b-j-w-pf -T kill`)z.`pfctl -a f2b/j-w-pf -sr | grep -q f2b-j-w-pf`)z4`pfctl -a f2b/j-w-pf -t f2b-j-w-pf -T add 192.0.2.1`)z7`pfctl -a f2b/j-w-pf -t f2b-j-w-pf -T delete 192.0.2.1`)z5`pfctl -a f2b/j-w-pf -t f2b-j-w-pf -T add 2001:db8::`)z8`pfctl -a f2b/j-w-pf -t f2b-j-w-pf -T delete 2001:db8::`)r  r  r   r  rw   r  r  r  r  r  r  z	j-w-pf-mpz@pf[actiontype=<multiport>][name=%(__name__)s, port="http,https"])zL`echo "table <f2b-j-w-pf-mp> persist counters" | pfctl -a f2b/j-w-pf-mp -f-`zport="http,https"zb`echo "block quick proto tcp from <f2b-j-w-pf-mp> to any port $port" | pfctl -a f2b/j-w-pf-mp -f-`)2`pfctl -a f2b/j-w-pf-mp -t f2b-j-w-pf-mp -T flush`)z]`pfctl -a f2b/j-w-pf-mp -sr 2>/dev/null | grep -v f2b-j-w-pf-mp | pfctl -a f2b/j-w-pf-mp -f-`r  z1`pfctl -a f2b/j-w-pf-mp -t f2b-j-w-pf-mp -T kill`)z4`pfctl -a f2b/j-w-pf-mp -sr | grep -q f2b-j-w-pf-mp`)z:`pfctl -a f2b/j-w-pf-mp -t f2b-j-w-pf-mp -T add 192.0.2.1`)z=`pfctl -a f2b/j-w-pf-mp -t f2b-j-w-pf-mp -T delete 192.0.2.1`)z;`pfctl -a f2b/j-w-pf-mp -t f2b-j-w-pf-mp -T add 2001:db8::`)z>`pfctl -a f2b/j-w-pf-mp -t f2b-j-w-pf-mp -T delete 2001:db8::`z	j-w-pf-apzHpf[actiontype=<allports>, actionstart_on_demand=true][name=%(__name__)s])zL`echo "table <f2b-j-w-pf-ap> persist counters" | pfctl -a f2b/j-w-pf-ap -f-`zW`echo "block quick proto tcp from <f2b-j-w-pf-ap> to any" | pfctl -a f2b/j-w-pf-ap -f-`)2`pfctl -a f2b/j-w-pf-ap -t f2b-j-w-pf-ap -T flush`)z]`pfctl -a f2b/j-w-pf-ap -sr 2>/dev/null | grep -v f2b-j-w-pf-ap | pfctl -a f2b/j-w-pf-ap -f-`r  z1`pfctl -a f2b/j-w-pf-ap -t f2b-j-w-pf-ap -T kill`)z4`pfctl -a f2b/j-w-pf-ap -sr | grep -q f2b-j-w-pf-ap`)z:`pfctl -a f2b/j-w-pf-ap -t f2b-j-w-pf-ap -T add 192.0.2.1`)z=`pfctl -a f2b/j-w-pf-ap -t f2b-j-w-pf-ap -T delete 192.0.2.1`)z;`pfctl -a f2b/j-w-pf-ap -t f2b-j-w-pf-ap -T add 2001:db8::`)z>`pfctl -a f2b/j-w-pf-ap -t f2b-j-w-pf-ap -T delete 2001:db8::`)r  r  r  r  r  rw   r  r  r  r  r  r  zj-w-fwcmd-mpzqfirewallcmd-multiport[name=%(__name__)s, bantime="10m", port="http,https", protocol="tcp", chain="<known/chain>"])z ipv4 r  )z ipv6 r  )z@`firewall-cmd --direct --add-chain ipv4 filter f2b-j-w-fwcmd-mp`zN`firewall-cmd --direct --add-rule ipv4 filter f2b-j-w-fwcmd-mp 1000 -j RETURN`z`firewall-cmd --direct --add-rule ipv4 filter INPUT_direct 0 -m conntrack --ctstate NEW -p tcp -m multiport --dports http,https -j f2b-j-w-fwcmd-mp`)z@`firewall-cmd --direct --add-chain ipv6 filter f2b-j-w-fwcmd-mp`zN`firewall-cmd --direct --add-rule ipv6 filter f2b-j-w-fwcmd-mp 1000 -j RETURN`z`firewall-cmd --direct --add-rule ipv6 filter INPUT_direct 0 -m conntrack --ctstate NEW -p tcp -m multiport --dports http,https -j f2b-j-w-fwcmd-mp`)z`firewall-cmd --direct --remove-rule ipv4 filter INPUT_direct 0 -m conntrack --ctstate NEW -p tcp -m multiport --dports http,https -j f2b-j-w-fwcmd-mp`zC`firewall-cmd --direct --remove-rules ipv4 filter f2b-j-w-fwcmd-mp`zC`firewall-cmd --direct --remove-chain ipv4 filter f2b-j-w-fwcmd-mp`z`firewall-cmd --direct --remove-rule ipv6 filter INPUT_direct 0 -m conntrack --ctstate NEW -p tcp -m multiport --dports http,https -j f2b-j-w-fwcmd-mp`zC`firewall-cmd --direct --remove-rules ipv6 filter f2b-j-w-fwcmd-mp`zC`firewall-cmd --direct --remove-chain ipv6 filter f2b-j-w-fwcmd-mp`)zc`firewall-cmd --direct --get-chains ipv4 filter | sed -e 's, ,\n,g' | grep -q '^f2b-j-w-fwcmd-mp$'`)zc`firewall-cmd --direct --get-chains ipv6 filter | sed -e 's, ,\n,g' | grep -q '^f2b-j-w-fwcmd-mp$'`)z|`firewall-cmd --direct --add-rule ipv4 filter f2b-j-w-fwcmd-mp 0 -s 192.0.2.1 -j REJECT --reject-with icmp-port-unreachable`)z`firewall-cmd --direct --remove-rule ipv4 filter f2b-j-w-fwcmd-mp 0 -s 192.0.2.1 -j REJECT --reject-with icmp-port-unreachable`)z~`firewall-cmd --direct --add-rule ipv6 filter f2b-j-w-fwcmd-mp 0 -s 2001:db8:: -j REJECT --reject-with icmp6-port-unreachable`)z`firewall-cmd --direct --remove-rule ipv6 filter f2b-j-w-fwcmd-mp 0 -s 2001:db8:: -j REJECT --reject-with icmp6-port-unreachable`zj-w-fwcmd-apz]firewallcmd-allports[name=%(__name__)s, bantime="10m", protocol="tcp", chain="<known/chain>"])z@`firewall-cmd --direct --add-chain ipv4 filter f2b-j-w-fwcmd-ap`zN`firewall-cmd --direct --add-rule ipv4 filter f2b-j-w-fwcmd-ap 1000 -j RETURN`zQ`firewall-cmd --direct --add-rule ipv4 filter INPUT_direct 0 -j f2b-j-w-fwcmd-ap`)z@`firewall-cmd --direct --add-chain ipv6 filter f2b-j-w-fwcmd-ap`zN`firewall-cmd --direct --add-rule ipv6 filter f2b-j-w-fwcmd-ap 1000 -j RETURN`zQ`firewall-cmd --direct --add-rule ipv6 filter INPUT_direct 0 -j f2b-j-w-fwcmd-ap`)zT`firewall-cmd --direct --remove-rule ipv4 filter INPUT_direct 0 -j f2b-j-w-fwcmd-ap`zC`firewall-cmd --direct --remove-rules ipv4 filter f2b-j-w-fwcmd-ap`zC`firewall-cmd --direct --remove-chain ipv4 filter f2b-j-w-fwcmd-ap`zT`firewall-cmd --direct --remove-rule ipv6 filter INPUT_direct 0 -j f2b-j-w-fwcmd-ap`zC`firewall-cmd --direct --remove-rules ipv6 filter f2b-j-w-fwcmd-ap`zC`firewall-cmd --direct --remove-chain ipv6 filter f2b-j-w-fwcmd-ap`)zc`firewall-cmd --direct --get-chains ipv4 filter | sed -e 's, ,\n,g' | grep -q '^f2b-j-w-fwcmd-ap$'`)zc`firewall-cmd --direct --get-chains ipv6 filter | sed -e 's, ,\n,g' | grep -q '^f2b-j-w-fwcmd-ap$'`)z|`firewall-cmd --direct --add-rule ipv4 filter f2b-j-w-fwcmd-ap 0 -s 192.0.2.1 -j REJECT --reject-with icmp-port-unreachable`)z`firewall-cmd --direct --remove-rule ipv4 filter f2b-j-w-fwcmd-ap 0 -s 192.0.2.1 -j REJECT --reject-with icmp-port-unreachable`)z~`firewall-cmd --direct --add-rule ipv6 filter f2b-j-w-fwcmd-ap 0 -s 2001:db8:: -j REJECT --reject-with icmp6-port-unreachable`)z`firewall-cmd --direct --remove-rule ipv6 filter f2b-j-w-fwcmd-ap 0 -s 2001:db8:: -j REJECT --reject-with icmp6-port-unreachable`zj-w-fwcmd-ipsetzXfirewallcmd-ipset[name=%(__name__)s, port="http", protocol="tcp", chain="<known/chain>"])z f2b-j-w-fwcmd-ipset )z f2b-j-w-fwcmd-ipset6 )z<`ipset -exist create f2b-j-w-fwcmd-ipset hash:ip timeout 0 `z`firewall-cmd --direct --add-rule ipv4 filter INPUT_direct 0 -p tcp -m multiport --dports http -m set --match-set f2b-j-w-fwcmd-ipset src -j REJECT --reject-with icmp-port-unreachable`)zI`ipset -exist create f2b-j-w-fwcmd-ipset6 hash:ip timeout 0 family inet6`z`firewall-cmd --direct --add-rule ipv6 filter INPUT_direct 0 -p tcp -m multiport --dports http -m set --match-set f2b-j-w-fwcmd-ipset6 src -j REJECT --reject-with icmp6-port-unreachable`)!`ipset flush f2b-j-w-fwcmd-ipset`"`ipset flush f2b-j-w-fwcmd-ipset6`)z`firewall-cmd --direct --remove-rule ipv4 filter INPUT_direct 0 -p tcp -m multiport --dports http -m set --match-set f2b-j-w-fwcmd-ipset src -j REJECT --reject-with icmp-port-unreachable`r  z#`ipset destroy f2b-j-w-fwcmd-ipset`z`firewall-cmd --direct --remove-rule ipv6 filter INPUT_direct 0 -p tcp -m multiport --dports http -m set --match-set f2b-j-w-fwcmd-ipset6 src -j REJECT --reject-with icmp6-port-unreachable`r  z$`ipset destroy f2b-j-w-fwcmd-ipset6`)z:`ipset -exist add f2b-j-w-fwcmd-ipset 192.0.2.1 timeout 0`)z0`ipset -exist del f2b-j-w-fwcmd-ipset 192.0.2.1`)z<`ipset -exist add f2b-j-w-fwcmd-ipset6 2001:db8:: timeout 0`)z2`ipset -exist del f2b-j-w-fwcmd-ipset6 2001:db8::`)
r  r  r  r  r  rw   r  r  r  r  zj-w-fwcmd-ipset-apzbfirewallcmd-ipset[name=%(__name__)s, actiontype=<allports>, protocol="tcp", chain="<known/chain>"])z f2b-j-w-fwcmd-ipset-ap )z f2b-j-w-fwcmd-ipset-ap6 )z?`ipset -exist create f2b-j-w-fwcmd-ipset-ap hash:ip timeout 0 `z`firewall-cmd --direct --add-rule ipv4 filter INPUT_direct 0 -p tcp -m set --match-set f2b-j-w-fwcmd-ipset-ap src -j REJECT --reject-with icmp-port-unreachable`)zL`ipset -exist create f2b-j-w-fwcmd-ipset-ap6 hash:ip timeout 0 family inet6`z`firewall-cmd --direct --add-rule ipv6 filter INPUT_direct 0 -p tcp -m set --match-set f2b-j-w-fwcmd-ipset-ap6 src -j REJECT --reject-with icmp6-port-unreachable`)$`ipset flush f2b-j-w-fwcmd-ipset-ap`%`ipset flush f2b-j-w-fwcmd-ipset-ap6`)z`firewall-cmd --direct --remove-rule ipv4 filter INPUT_direct 0 -p tcp -m set --match-set f2b-j-w-fwcmd-ipset-ap src -j REJECT --reject-with icmp-port-unreachable`r  z&`ipset destroy f2b-j-w-fwcmd-ipset-ap`z`firewall-cmd --direct --remove-rule ipv6 filter INPUT_direct 0 -p tcp -m set --match-set f2b-j-w-fwcmd-ipset-ap6 src -j REJECT --reject-with icmp6-port-unreachable`r  z'`ipset destroy f2b-j-w-fwcmd-ipset-ap6`)z=`ipset -exist add f2b-j-w-fwcmd-ipset-ap 192.0.2.1 timeout 0`)z3`ipset -exist del f2b-j-w-fwcmd-ipset-ap 192.0.2.1`)z?`ipset -exist add f2b-j-w-fwcmd-ipset-ap6 2001:db8:: timeout 0`)z5`ipset -exist del f2b-j-w-fwcmd-ipset-ap6 2001:db8::`z
j-fwcmd-rrz4firewallcmd-rich-rules[port="22:24", protocol="tcp"])zfamily='ipv4'r  )zfamily='ipv6'r  )z`ports="22:24"; for p in $(echo $ports | tr ", " " "); do firewall-cmd --add-rich-rule="rule family='ipv4' source address='192.0.2.1' port port='$p' protocol='tcp' reject type='icmp-port-unreachable'"; done`)z`ports="22:24"; for p in $(echo $ports | tr ", " " "); do firewall-cmd --remove-rich-rule="rule family='ipv4' source address='192.0.2.1' port port='$p' protocol='tcp' reject type='icmp-port-unreachable'"; done`)z `ports="22:24"; for p in $(echo $ports | tr ", " " "); do firewall-cmd --add-rich-rule="rule family='ipv6' source address='2001:db8::' port port='$p' protocol='tcp' reject type='icmp6-port-unreachable'"; done`)z`ports="22:24"; for p in $(echo $ports | tr ", " " "); do firewall-cmd --remove-rich-rule="rule family='ipv6' source address='2001:db8::' port port='$p' protocol='tcp' reject type='icmp6-port-unreachable'"; done`z
j-fwcmd-rlz6firewallcmd-rich-logging[port="22:24", protocol="tcp"])a
  `ports="22:24"; for p in $(echo $ports | tr ", " " "); do firewall-cmd --add-rich-rule="rule family='ipv4' source address='192.0.2.1' port port='$p' protocol='tcp' log prefix='f2b-j-fwcmd-rl' level='info' limit value='1/m' reject type='icmp-port-unreachable'"; done`)a  `ports="22:24"; for p in $(echo $ports | tr ", " " "); do firewall-cmd --remove-rich-rule="rule family='ipv4' source address='192.0.2.1' port port='$p' protocol='tcp' log prefix='f2b-j-fwcmd-rl' level='info' limit value='1/m' reject type='icmp-port-unreachable'"; done`)a   `ports="22:24"; for p in $(echo $ports | tr ", " " "); do firewall-cmd --add-rich-rule="rule family='ipv6' source address='2001:db8::' port port='$p' protocol='tcp' log prefix='f2b-j-fwcmd-rl' level='info' limit value='1/m' reject type='icmp6-port-unreachable'"; done`)a  `ports="22:24"; for p in $(echo $ports | tr ", " " "); do firewall-cmd --remove-rich-rule="rule family='ipv6' source address='2001:db8::' port port='$p' protocol='tcp' log prefix='f2b-j-fwcmd-rl' level='info' limit value='1/m' reject type='icmp6-port-unreachable'"; done`r   rc  rd  re  rf  r   r   r  r  rg  rW  r  r  r  r  rh  r  ri  rX  r  r  rj  r  r  z# === check ipv4 ===familyz*-checkr  z# === check ipv6 ===r  z# === flush ===rk  rw   )r   r   ry  r   r8   r}  r  rM   rL   r   ra  r   rQ  rR  rl  r   r   r\  rm  rT  rn  r   r   rE   r   r  r  r  _invariantCheckr  rw   )r#   testJailsActionsr7   r9   r  rR   r  testsr~  rN   rg   r  rf  ro  r  r  s                   r&   testCheckStockCommandActionsz4ServerConfigReaderTests.testCheckStockCommandActions?  s9   
,,d+ e(1PY/h /b L(1PS,O ,\   E&8+G 4 e&8h     Q2;d
]1S 1f |2;d
]1 1f x(1O


Y/{ /b g+4U


Y/j /b t2;d
]1w 1f |2;d
]1 1f k4=h	C$n $L Bb

 EDJMKN)E . Sb

 KJPSQT)V . [b 
 KJPSQT)^ .   H.7[

G&J &P s.7[

G&v &P q%.I?"t "H ~(1O?"A "H H6?kK   J6?kM Y[x <&!!&22** 
dC%%dC06  s~~c"HCS!
 

%  "&* >jdC$K <jq4[  #F
LL"#
LL$,"=>
LL"#OOJvx'='=>?((FMM#$
LLNyyTg1D1	;	EIIk$:T5-eK.@@KdKMM&'
JJvf~yy0t00%))IuyyQegiGj2klqr}l~2~   J  EI   Jyy3t33U;5GRTRDuY'2T2D%,1D1MM()
LL Du[)4t4D%,1D1MM&'
JJvf~yy0t00%))IuyyQegiGj2klqr}l~2~   J  EI   Jyy3t33U;5GRTRDuY'2T2D%,1D1MM()
LL Du[)4t4D%,1D1yy	]])*F6N845T		)UYY7KR-PQRWXcRddojno		+5#5{9K#KdE+.9D9yy	]])*F6N845T		)UYY7KR-PQRWXcRddojno		+5#5{9K#KdE+.9D9yy	]]$%\\^Tg1D1MM"#
KKMyy+$++UYY7KR-PQVW]Q^-^idhiy<j>jr)   c                    |}t        |t              r|d   }t        j                  dd|      }t        j                  dd |d      }t        |t              r||d<   n|}t        j
                  j                  ||      S )Nr   z\)\s*\|\s*(\S*mail\b[^\n]*)z$) | cat; printf "\\n... | "; echo \1z\bADDRESSES=\$\(dig\s[^\n]+c                      y)Nz@ADDRESSES="abuse-1@abuse-test-server, abuse-2@abuse-test-server"r!   )ms    r&   r   z9ServerConfigReaderTests._executeMailCmd.<locals>.<lambda>  s    r)   r   )r  )r   r_   resubr\  rm  rn  )r#   rS  r  rN   s       r&   _executeMailCmdz'ServerConfigReaderTests._executeMailCmdv  s    #	3
-*C	1# 	-O	# 71:7				*	*7G	*	DDr)   c                     t         j                  j                  d       ddt        j                  j                  t        d      z   dz   dz   t        j                  j                  t        d      z   d	z   d
difddt        j                  j                  t        d      z   dz   dz   t        j                  j                  t        d      z   d	z   d
difddt        j                  j                  t        d      z   dz   dz   t        j                  j                  t        d      z   dz   dddfdddddff}t               }|j                  }|j                  }|D ]E  \  }}}| j                  ||      }|D ](  }	|j                  |	      \  }
}| j                  |
d       * G |j                  }t        d      }t        d      }t               }|D ];  \  }}}||   j                   D ]!  }||   j                   |   }t"        j%                  d       t"        j%                  d|dz   |j&                  z          t"        j%                  d       | j(                  |_        d
|fd|ffD ]  \  }}|j-                  |      s| j/                  d |z         t1        |      }|j3                  d!       |j5                  d"d#g       t6        j8                  j;                  ||      }|j=                  |        | j>                  ||   d$di  $ > y )%NTrr  zj-mail-whois-linesz\mail-whois-lines[name=%(__name__)s, grepopts="-m 1", grepmax=2, mailcmd="mail -s", logpath="r.  rN  z	         ztestcase01a.logz8", _whois_command="echo '-- information about <ip> --'"]r  );The IP 87.142.124.10 has just been banned by Fail2Ban afterz(100 attempts against j-mail-whois-lines..Here is more information about 87.142.124.10 :%-- information about 87.142.124.10 --2Lines containing failures of 87.142.124.10 (max 2)etestcase01.log:Dec 31 11:59:59 [sshd] error: PAM: Authentication failure for kevin from 87.142.124.10etestcase01a.log:Dec 31 11:55:01 [sshd] error: PAM: Authentication failure for test from 87.142.124.10zj-sendmail-whois-lineszxsendmail-whois-lines[name=%(__name__)s, grepopts="-m 1", grepmax=2, mailcmd='testmail -f "<sender>" "<dest>"', logpath=")r  z,100 attempts against j-sendmail-whois-lines.r  r  r  r  r  zj-complain-abusezcomplain[name=%(__name__)s, grepopts="-m 1", grepmax=2, mailcmd="mail -s 'Hostname: <ip-host>, family: <family>' - ",debug=1,logpath="z", ])6try to resolve 10.124.142.87.abuse-contacts.abusix.orgr  r  r  zymail -s Hostname: test-host, family: inet4 - Abuse from 87.142.124.10 abuse-1@abuse-test-server abuse-2@abuse-test-server)htry to resolve 1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.abuse-contacts.abusix.orgz0Lines containing failures of 2001:db8::1 (max 2)zwmail -s Hostname: test-host, family: inet6 - Abuse from 2001:db8::1 abuse-1@abuse-test-server abuse-2@abuse-test-server)r  r  zj-xarf-abusezIxarf-login-attack[name=%(__name__)s, mailcmd="mail", mailargs="",debug=1])r  z8We have detected abuse from the IP address 87.142.124.10VDec 31 11:59:59 [sshd] error: PAM: Authentication failure for kevin from 87.142.124.10UDec 31 11:55:01 [sshd] error: PAM: Authentication failure for test from 87.142.124.108mail abuse-1@abuse-test-server abuse-2@abuse-test-server)r  z6We have detected abuse from the IP address 2001:db8::1r  r   z87.142.124.10z2001:db8::1rc  rd  re  r  z# === %s ===r   r  r  r   ) r   r   ry  r   r4  r5  r6  r   r8   r}  r  rM   rL   r   r   r   r   rQ  rR  rl  r  rn  rE   r   r   
setAttempt
setMatchesr\  rm  r]  r  r   )r#   r  r7   r9   r  rR   r  r  r~  rN   rg   r  rf  rW  rX  r^  r  r  testr  r`  s                        r&   testComplexMailActionMultiLogz5ServerConfigReaderTests.testComplexMailActionMultiLog  sy   
,,d+  GGLL1ABC FJJ 	 WW\\.2CD	EH
	
  
(  GGLL1ABC FJJ 	 WW\\.2CD	EH
	
  
( 
 GGLL1ABC
 FJJ  WW\\.2CDEH

8 
M^~ <&!!&22** 
dC%%dC06  s~~c"HCS!
 

%		 $		$K'* /dC$K /q4[  #F
LL"#
LL$,"=>
LL"#,,F!4(9d*;< /
rIIdOX	]]>D()mVs^]  ))&':VZZTd..///r)   )r   )r,   r-   r.   rH  r5   rB   rT  ra  rp  r  r  r  r  r  r  rm   rn   s   @r&   rF  rF    sF    
2 D1!f!(ujnE$K/r)   rF  )A
__author____copyright____license__r   r   r   r   r  r5  r  server.failregexr   r   r   r7   r   r\  server.serverr	   server.ipdnsr
   r   server.jailr   server.jailthreadr   server.ticketr   server.utilsr   	dummyjailr   utilsr   r   r   helpersr   r   r   rP  r   r   r~  r4  r5  dirname__file__r6  r<   rQ  r   r0   rp   r  TestCaser  r  r'  r+  clientreadertestcaserB  rC  rD  rF  r!   r)   r&   <module>r     s@  . 
2    	 	 
  ? ? ( " +  * %     < < ; ; # bggooh7A	:	 [( [|u*/ u*p{N {N|(!! (RJ"" RJj1 1
'% 'T H Gm/0 m/i#  s   :E E
E