
    Bdq                       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* n# e+$ r dZ*Y nw xY wej,        -                    e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j7                  Z8 G d! d"ej7                  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@dS )*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dS )
TestServerc                     d S N selfargskwargss      ?/usr/lib/python3/dist-packages/fail2ban/tests/servertestcase.pysetLogLevelzTestServer.setLogLevel<       $    c                     d S r    r!   r"   s      r&   setLogTargetzTestServer.setLogTarget?   r(   r)   N)__name__
__module____qualname__r'   r+   r!   r)   r&   r   r   ;   s2              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        | _        d| _        | j                            | j        t                     dS )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   sg    $$&&&##%%$++$+ $-+dm\22222r)   c                     | j                                          t          t          |                                            dS zCall after every test case.N)r7   quitr4   r0   tearDownr=   s    r&   rB   zTransmitterBase.tearDownQ   s;     +'')))))r)   r    r   NFc                    d||g}d|g}|,|                     d|           |                     d|           |dk    r|}fd}	|                      |	| j                            |                     |	||f                     |sD|                      |	| j                            |                     |	d|f                     dS dS )zoProcess set/get commands and compare both return values 
		with outValue if it was given otherwise with inValuesetgetNr   r    c                 *    rt          |           n| S )zPrepare value for comparison)repr)xrepr_s    r&   vz%TransmitterBase.setGetTest.<locals>.vd   s    "4777#r)   r   )insertassertEqualr9   proceed)
r#   cmdinValueoutValueoutCodejailrI   setCmdgetCmdrJ   s
         `   r&   
setGetTestzTransmitterBase.setGetTestW   s    3 &3<&		==D	==D 8$ $ $ $ $ 11T[((001111gx5H3I3IJJJ	 FAAdk))&1122AAq(m4D4DEEEEEF Fr)   c                 |   d||g}d|g}|,|                     d|           |                     d|           | j                            |          d         }|                     | j                            |          d         d           |                     | j                            |          d|f           d S )NrD   rE   r   r   )rK   r9   rM   rL   )r#   rN   rO   rR   rS   rT   	initValues          r&   setGetTestNOKzTransmitterBase.setGetTestNOKm   s    3 &3<&		==D	==D k!!&))!,)4;&&v..q115554;&&v..I?????r)   c                 `   d|z   }d|z   }|                      | j                            d||g          dg f           t          |          D ]'\  }}| j                            d|||g          }|                     |d         t          t          t          |d                             fdt          t          t          |d |dz                                fd           | j                            d||g          }|                     |d         t          t          t          |d                             fdt          t          t          |d |dz                                fd           )t          |          D ]'\  }}| j                            d|||g          }|                     |d         t          t          t          |d                             fdt          t          t          ||dz   d                              fd           | j                            d||g          }|                     |d         t          t          t          |d                             fdt          t          t          ||dz   d                              fd           )d S )	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 5 5F## h hha			eT659	:	:33q64CQ(8(8#9#9:QSfUYVWXYVYUYlE[E[@\@\<]efggg			eT3/	0	033q64CQ(8(8#9#9:QSfUYVWXYVYUYlE[E[@\@\<]efggggF## h hha			eT659	:	:33q64CQ(8(8#9#9:QSfUVWXUXUYUYlE[E[@\@\<]efggg			eT3/	0	033q64CQ(8(8#9#9:QSfUVWXUXUYUYlE[E[@\@\<]efgggg	h hr)   c           	         d|z   }d|z   }|                      | j                            d||g          dg f           t          |          D ]\  }}|                      | j                            d|||g          d|d |dz            f           |                      | j                            d||g          d|d |dz            f           t          |          D ]\  }}|                      | j                            d||dg          d||dz   d          f           |                      | j                            d||g          d||dz   d          f           d S )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 5 5H%%  haKfe455	$1Q3$   Kc*++	$1Q3$    H%%  haKfa011	!A#$$   K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 3 3 3 3* * * * *F F F F,@ @ @ @h h 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- Z0d.S )/Transmitterc                 ^    |                      | j                                                   d S r    )assertFalser7   	isStartedr#   s    r&   testServerIsNotStartedz"Transmitter.testServerIsNotStarted   s,     4;((**+++++r)   c                 d    |                      | j                            dg          d           d S )Nstopr   NrL   r9   rM   rt   s    r&   testStopServerzTransmitter.testStopServer   s0    4;&&x00)<<<<<r)   c                 d    |                      | j                            dg          d           d S )Nping)r   pongry   rt   s    r&   testPingzTransmitter.testPing   s0    4;&&x00+>>>>>r)   c                 |    |                      | j                            dg          dt          j        f           d S )Nr   r   )rL   r9   rM   r   rt   s    r&   testVersionzTransmitter.testVersion   s7    4;&&	{33a5IJJJJJr)   c                 r   	 |                      | j                            g d          d           |                     t	          j                               |                     d           |                                  |                      | j                            g d          d           |                     t	          j                               |                     d           |                                  |                      | j                            g d          d           |                     d	           |                                  d S # |                      | j                            g d          d           |                     d	           |                                  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DK''(C(C(CDDjQQQ??8)++,,,\"""DMMOOODK''(B(B(BCCYOOOH*,,---]###T]]___ DK''(D(D(DEE{SSS^$$$dmmooooo DK''(D(D(DEE{SSS^$$$dmmoooos   C>E AF6c                    t           j        j        st          j                    }|                     | j                            ddg          d           t          j                    }||z
  }|                     d|cxk     odk     nc d|z             d S |                     | j                            ddg          d           d S )	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    		 I	2DK''%(8999EEE	2
R2??4"????s????(:R(??@@@@@DK''((;<<iHHHHHr)   c                    t           j        j        st          j        dd          \  }}nd}|                     d|           | j                            | j                   | 	                    d|           | 	                    d|           | 	                    ddd           |                     dd           | 	                    d	d
d           |                     d	d           | j        
                    | j        t                     | 	                    d|           | j                            | j                   |                     | j                            g d          d           |                     | j                            ddg          d           |                     | j                            g d          d           |                     | j                            ddg          d           |                     | j                            g d          d           |                     | j                            dd	g          d           | j        
                    | j        t                     |                     | j                            g d          d           t           j        j        s*t          j        |           t          j        |           d S d S )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   s
   		 &uk::3;X{++++dm$$$//(K(((//(K(((//.%---^X...//,s+++\8,,,+dm\222//(K(((+dm$$$ 4;&&    4;&&	8    4;&&!!!# #   4;&&	>    4;&&! !   4;&&	<    +dm\2224;&&    
	 8C===9[ r)   c                    d}d}d}|                      | j                            d|dg          d|f           |                      | j                            d|g          d|f           |                      | j                            d|dg          d         d           |                      | j                            d|d	g          d|f           |                      | j                            d| j        dg          d         d           |                      | j                            g d
          d         d           d S )N	TestJail2	TestJail3	TestJail4rZ   r   r   zinvalid backendr   r   )rZ   --allr   rL   r9   rM   r:   )r#   jail2jail3jail4s       r&   testAddJailzTransmitter.testAddJail   sq   
%
%
%;ui011Au:? ? ?4;&&u~66E
CCC;u&7899!<aA A A;uf-..E
< < < ;t}i899!<aA A A ;22233A6; ; ; ; ;r)   c                                            j                            d j        g          d           t	          j        t          j                                        t          j	         fdd                                            j                            d j        g          d            
                     j         j        j                   d S )Nstartrx   c                       j                             d          o4t           j                            d j        g          t                     S )Nr   statusr7   isAlive
isinstancer9   rM   r:   RuntimeErrorrt   s   r&   <lambda>z/Transmitter.testStartStopJail.<locals>.<lambda>  C    4;q!!r*T[5H5H(TXTaIb5c5ceq*r*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0)= = =*U%&&&//5>rrrr     ;.//< < <4=$+"<=====r)   c                      j                             dt                                           j                            d j        g          d                                 j                            ddg          d           t          j        t          j
                                        t          j         fdd                                           j                            ddg          d                                t          j         fdd                                           j         j         j                                        d j         j                   d S )	Nr   r   rx   c                       j                             d          o4t           j                            d j        g          t                     S )Nr   r   r   rt   s   r&   r   z2Transmitter.testStartStopAllJail.<locals>.<lambda>"  r   r)   r   rw   r   c                  8    t           j        j                   S r    )lenr7   r   rt   s   r&   r   z2Transmitter.testStartStopAllJail.<locals>.<lambda>%  s    s4;3M/N/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0;/00)= = =;-..	; ; ;
 *U%&&&//5>rrrr     4;&&'8999EEE//5>#N#N#N#NPQRRTTT4=$+"<===; :;;;;;r)   c                 \   |                      | j                            d| j        ddg          d           |                      | j                            d| j        ddg          d           |                      | j                            d| j        ddg          d         d	           d S )
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                 0   |                      ddd| j                   |                      ddd| j                   |                      ddd| j                   |                      dd	d
| j                   |                     dd| j                   d S )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                 0   |                      ddd| j                   |                      ddd| j                   |                      ddd| j                   |                      dd	d
| j                   |                     dd| j                   d S )Nbantimer   r   r   502   z-50iz
15d 5h 30mi Catr   rt   s    r&   testJailBanTimezTransmitter.testJailBanTime;  s    //)UCdm/<<<//)T2DM/::://)UCdm/<<<//)\7/GGGYDM:::::r)   c                 0   |                      ddd| j                   |                      ddd| j                   |                      ddd| j                   |                      dd	d
| j                   |                     dd| j                   d S )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 J J//(,4=  B B B]Lt}EEEEEr)   c                 |    |                      ddd| j                   |                     dd| j                   d S )NlogtimezonezUTC+0400r   znot-a-time-zoner   rt   s    r&   testLogTimeZonezTransmitter.testLogTimeZoneN  sB    //-Zdm/LLL]$5DMJJJJJr)   c                 &   |                      dd| j                   |                      dd| j                   |                      dd| j                   d}|                     | j                            d| j        d|g          d           d S )	Nusednsr   r   warnr   FishrD   r   )rU   r:   rL   r9   rM   r#   rf   s     r&   testJailUseDNSzTransmitter.testJailUseDNSR  s    //(E/666//(F/777//(Dt}/555 %;t}h>??    r)   c                    | j                             | j                   |                     | j                            d| j        ddddg          d           |                     dddd	           |                     | j                            d| j        dd
g          d           |                     dd           |                     | j                            d| j        dddddg          d           |                     dddd	           |                     dddd	           |                                  |                     | j                            d| j        dddg          d         d           |                     | j                            d| j        dddg          d           |                     dddd	           d S )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JJ;t}gx@AA	   Lt,,,;
DM9m[+}]_ _	   %'8dNNN/1LRV]abbb--///;
DM9&7GI IIJLLMO O O ;
DM9m]CE EEKM M M /1LRV]abbbbbr)   c           	           j                              j                    fd}                     ddd j                   dD ]+}dD ]&}                      ||d|z  g          d	           ',                     d
ddd                                 ||d dD                       d	                                dd                                dd                                d           d S )Nc                 P    j                             dj        d| g|z             S )NrD   attempt)r9   rM   r:   )ipmatchesr#   s     r&   r  z.Transmitter.testJailAttemptIP.<locals>.attempt}  s)    
+

udmYCgM
N
NNr)   maxretry5   r   )r   r   )r   r   test failure %dr   z192.0.2.1:2z192.0.2.2:2Tr   c                     g | ]}d |z  S )r  r!   ).0is     r&   
<listcomp>z1Transmitter.testJailAttemptIP.<locals>.<listcomp>  s    GGG! 1A 5GGGr)   )r      r  z192.0.2.2:5r   r   r   )r7   r  r:   rU   rL   r   assertNotLogged)r#   r  r  r  s   `   r&   testJailAttemptIPzTransmitter.testJailAttemptIPz  sG   +&&&O O O O O //*c14=/999 C Ca' C CrWWR"3a"7!8996BBBBCM=dFFF772GGwGGGHH&QQQM---O$///'''''r)   c                 j    d} j                             |t                      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            d S )NTestJailBanListr!   c                    |L                     j                            d| d|g          d                               d|z  d           |L                     j                            d| d|g          d                               d|z  d                               j                            d	| dgt          |          z             d
|fd           t          j        t          j                    dz              d S )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7   	h&T222	[%y':;;   	j7*666Kg.tDzz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  sr   	$+dL)))+ #'2r % % % % % %& /$   /$k0@IJL L L L/$m2BACEF F F F /$n7779 9 9 9/$>*, , , ,/$?   /$     r)   c                     |                      ddd| j                   |                      ddd| j                   |                      ddd| j                   |                     dd	| j                   d S )
N
maxmatchesr
  r  r   2r   -2Duckr   rt   s    r&   testJailMaxMatcheszTransmitter.testJailMaxMatches  sy    //,QT]/;;;//,QT]/;;;//,bt}/===\6>>>>>r)   c                     |                      ddd| j                   |                      ddd| j                   |                      ddd| j                   |                     dd	| j                   d S )
Nr	  r
  r  r   r!  r   r"  r#  r$  r   rt   s    r&   testJailMaxRetryzTransmitter.testJailMaxRetry  sy    //*c14=/999//*c14=/999//*dBT]/;;;Zdm<<<<<r)   c                     |                      ddd| j                   |                      ddd| j                   |                     dd| j                   |                     dd| j                   d S )	Nmaxlinesr
  r  r   r!  r   r"  r$  r   rt   s    r&   testJailMaxLineszTransmitter.testJailMaxLines  sz    //*c14=/999//*c14=/999ZDM:::Zdm<<<<<r)   c                     |                      dd| j                   |                      dd| j                   |                      ddt          | j                   |                     dd| j                   d S )NlogencodingzUTF-8r   asciir   Monkey)rU   r:   r   rX   rt   s    r&   testJailLogEncodingzTransmitter.testJailLogEncoding  s    //-t}/===//-t}/===//-    ]H4=AAAAAr)   c           
         |                      dt          j                            t          d          t          j                            t          d          t          j                            t          d          g| j                   t          j                            t          d          }|                     | j                            d| j        d|g          d|gf           |                     | j                            d| j        d|g          d|gf           |                     | j                            d	| j        dg          d|gf           |                     | j                            d| j        d
|g          dg f           |                     | j                            d| j        d|dg          d|gf           |                     | j                            d| j        d|dg          d|gf           |                     | j                            d| j        d|dg          d         d           |                     | j                            d| j        d|||g          d         d           d S )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  s   GLL!122GLL!122GLL!122
 =   ',,~'7
8
8%;t}lEBCCw<   ;t}lEBCCw<   ;t}i899w<   ;t}lEBCCr7   ;
DM<79 9w<   ;
DM<79 9w<   ;
DM<9; ;;<>   ;
DM<u=? ??@B    r)   c                     d}| j                             d| j        d|g          }|                     t	          |d         t
                               d S )Nzthis_file_shouldn't_existrD   r3  r   )r9   rM   r:   r   r   IOError)r#   rf   results      r&   testJailLogPathInvalidFilez&Transmitter.testJailLogPathInvalidFile  sR    
%%;	4=,.0 0&//*VAY0011111r)   c                 .   t          j        d          }|dz   }t          j        ||           | j                            d| j        d|g          }|                     t          |d         t                               t          j
        |           d S )Ntmp_fail2ban_broken_symlink)prefixz.slinkrD   r3  r   )r   mktempr   symlinkr9   rM   r:   r   r   r=  r   )r#   namesnamer>  s       r&   testJailLogPathBrokenSymlinkz(Transmitter.testJailLogPathBrokenSymlink  s    	 =	>	>	>$
/%*T5;	4=,.0 0&//*VAY00111)Er)   c                 X   |                      dg d| j                   d}|                     | j                            d| j        d|g          d|gf           |                     | j                            d| j        d|g          d|gf           |                     | j                            d| j        dg          d|gf           |                     | j                            d| j        d|g          dg f           |                     | j                            d| j        d	g          d
           |                     | j                            d| j        d	dg          d           |                     | j                            d| j        d	g          d           d S )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Dw<   ;t}mUCDDw<   ;t}j9::w<   ;t}mUCDDr7   ;t}l;<<   ;t}lEBCC   ;t}l;<<    r)   c                 @    |                      dd| j                   d S )Nignorecommandzbin/ignore-command <ip>r   rU   r:   rt   s    r&   testJailIgnoreCommandz!Transmitter.testJailIgnoreCommand2  s#    ///#<4=/QQQQQr)   c                     |                      ddg d| j                   |                      ddd | j                   d S )Nignorecachez%key="<ip>",max-time=1d,max-count=9999)z<ip>i'  iQ r    rP  rt   s    r&   testJailIgnoreCachezTransmitter.testJailIgnoreCache5  sT    //-*     //-T/>>>>>r)   c                 @    |                      dd| j                   d S )N	prefregexz^Testr   rP  rt   s    r&   testJailPrefRegexzTransmitter.testJailPrefRegex<  s"    //+wT]/;;;;;r)   c           
         |                      dg ddt          j        d          z  dt          j        d          z  dt          j        d          z  g| j                   |                     | j                            d| j        dd	g          d
         d           |                     | j                            d| j        ddg          d
         d           d S )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89%"7"A"AB"e&;H&E&EF
 =   ;
DM>?;= ==>@   ;
DM>3/1 1124    r)   c           	      h   |                      dg dddt          j        d          z  dg| j                   |                     | j                            d| j        dd	g          d
         d           |                     | j                            d| j        ddg          d
         d           d S )Nignoreregex)	user johnr[  Dont match me!rd  r]  r\  re  rD   addignoreregexzInvalid [regexr   r   r   r_  rt   s    r&   testJailIgnoreRegexzTransmitter.testJailIgnoreRegexW  s    =   %"7"A"AB
 =   ;
DM+-=>@ @@AC   ;
DM+R02 2235    r)   c           	         | j         g}|                     | j                            dg          ddt	          |          fdd                    |          fgf           | j                            dt                     |	                    d           |                     | j                            dg          ddt	          |          fdd                    |          fgf           d S )Nr   r   zNumber of jailz	Jail listz, r   )
r:   rL   r9   rM   r   r9  r7   r;   r<   append)r#   jailss     r&   
testStatuszTransmitter.testStatuso  s    =/%4;&&z22	3u::&dii6F6F(GHIK K K+k<000,,{4;&&z22	3u::&dii6F6F(GHIK K K K Kr)   c           
          |                      | j                            d| j        g          dddddg fgfddd	d
g fgfgf           d S )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  s    4;&&$-'@AAB 
      r)   c           
          |                      | j                            d| j        dg          dddddg fgfdd	d
dg fgfgf           d S )Nr   basicr   rm  rn  ro  rp  rq  rr  rs  rt  r   rt   s    r&   testJailStatusBasiczTransmitter.testJailStatusBasic  s    4;&&$-'IJJB 
      r)   c           
          |                      | j                            d| j        dg          dddddg fgfdd	d
dg fgfgf           d S )Nr   INVALIDr   rm  rn  ro  rp  rq  rr  rs  rt  r   rt   s    r&   testJailStatusBasicKwargz$Transmitter.testJailStatusBasicKwarg  s    4;&&$-'KLLB 
      r)   c                 "   t           j                                         	 dd l}dd l}g }n# t
          $ r dg}Y nw xY w|                     | 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           d S )Nr   errorr   cymrurm  rn  ro  rp  rq  rr  rs  rt  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    
,    55 
   9555
 4;&&$-'IJJB 
 % e$% "     s   + ;;c                 z   d}g d}g d}|                      | j                            d| j        d|g          d|f           |                      | j                            d| j        dg          d	         d         |           t	          ||          D ]@\  }}|                      | j                            d| j        d
|||g          d|f           At	          ||          D ]?\  }}|                      | j                            d| j        d
||g          d|f           @|                      | j                            d| j        d
|ddg          d           |                      | j                            d| j        d
|dg          d           |                      | j                            d| j        d
|dg          d         d	           |                      | j                            d| j        d
|ddg          d           |                      | j                            d| j        d
|dg          d           |                      | j                            d| j        d|g          d           |                      | j                            d| j        ddg          d         d	           d S )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  sk   &  '  , ;t}k6BCCv;   ;
DM9%' ''(**+-	   ..  jc5KT]Hfc59; ;J    ..  jc5KxEFFJ    ;
DM8VUG<> >   ;
DM8VU35 5   ;
DM8V\:< <<=?   ;
DM8VY=? ?
   ;
DM8VY79 9
   ;t}k6BCC   ;
DM;8: ::;==>@ @ @ @ @r)   c                    d}| j                             d| j        d|t          j                            t          dd          dg          }|                     |d|f           |                     | j                             d| j        d	|g          d
         ddg           |                     | j                             d| j        d|dg          d           |                     | j                             d| j        d|dg          d           |                     | j                             d| j        d|g          d
         g d           |                     | j                             d| j        d|ddg          d           |                     | j                             d| j        d|ddg          d           |                     | j                             d| j        d|ddg          d           d S )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   r8  r9  r:  rL   r^   )r#   r  outs      r&   $testPythonActionMethodsAndPropertiesz0Transmitter.testPythonActionMethodsAndProperties  se   &	4=+vGLL[99	 	# 3F$$$;t}  ! !!"$
F   ;t}h
     ;t}h
     ;t}o
  ;;;= = = ;t}h&( ) )   ;t}h
O     ;t}h&( ) )$& & & & &r)   c                 r    |                      | j                            ddg          d         d           d S )Nrz  COMMANDr   r   ry   rt   s    r&   testNOKzTransmitter.testNOK,  s8    4;&&	9'=>>qA!DDDDDr)   c                 r    |                      | j                            g d          d         d           d S )N)rD   rz  r  r   r   ry   rt   s    r&   
testSetNOKzTransmitter.testSetNOK/  E    ;44455a8< < < < <r)   c                 r    |                      | j                            g d          d         d           d S )N)rE   rz  r  r   r   ry   rt   s    r&   
testGetNOKzTransmitter.testGetNOK3  r  r)   c                 r    |                      | j                            g d          d         d           d S )N)r   rz  r  r   r   ry   rt   s    r&   testStatusNOKzTransmitter.testStatusNOK7  sE    ;77788;A? ? ? ? ?r)   c           
      ^   t           st          j        d          d}| j                            |d           g d}t          |          D ]N\  }}|                     | j                            d|d|g          dd |d |d	z            D             f           Ot          |          D ]N\  }}|                     | j                            d|d
|g          dd ||d	z   d          D             f           Od}|                     | j                            d|d|g          d|ggf           |                     | j                            d|d|g          d|g|ggf           |                     | j                            d|d
|g          d|ggf           |                     | j                            d|d
|g          dg f           g d}|                     | j                            d|dg|z             ddgddggf           |                     | j                            d|d
g|d d	         z             dddggf           |                     | j                            d|d
g|dd          z             dg f           d}| j                            d|d|g          }| 	                    t          |d	         t                               d}| j                            d|d
|g          }| 	                    t          |d	         t                               d S )N&systemd python interface not availabler   systemd_SYSTEMD_UNIT=sshd.servicezTEST_FIELD1=ABCz_HOSTNAME=example.comrD   addjournalmatchr   c                     g | ]}|gS r!   r!   r  vals     r&   r  z0Transmitter.testJournalMatch.<locals>.<listcomp>I      '''3#'''r)   r   deljournalmatchc                     g | ]}|gS r!   r!   r  s     r&   r  z0Transmitter.testJournalMatch.<locals>.<listcomp>N  r  r)   
_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   r>  s         r&   testJournalMatchzTransmitter.testJournalMatch;  s   	 E		C	D	DD(+h	***  &
 F## * *haKX(%02 2''&!A#,'''(* * * * F## * *haKX(%02 2''&1,'''(* * * * %;
H'/1 1y>   ;
H'/1 1%  
 ;
H'/1 1y>  
 ;
H'/1 1r7  
> > >%;
H'(502 25x@ABD D D ;
H'(5!946 6	%x0124 4 4 ;
H'(5946 6r7   %;	8&.0 0&//*VAY
33444 %;	8&.0 0&//*VAY
3344444r)   c           
          t           st          j        d          |                     d           d}| j                            |d           g d}t          |          D ]N\  }}|                     | j        	                    d|d|g          dd	 |d |d
z            D             f           Ot          |          D ]N\  }}|                     | j        	                    d|d|g          dd ||d
z   d          D             f           Od S )Nr  Tr   zsystemd[journalflags=2]r  rD   r  r   c                     g | ]}|gS r!   r!   r  s     r&   r  z5Transmitter.testJournalFlagsMatch.<locals>.<listcomp>  r  r)   r   r  c                     g | ]}|gS r!   r!   r  s     r&   r  z5Transmitter.testJournalFlagsMatch.<locals>.<listcomp>  r  r)   )
r   r   r  r   r7   r;   r]   rL   r9   rM   )r#   r:   rb   re   rf   s        r&   testJournalFlagsMatchz!Transmitter.testJournalFlagsMatch  sf   	 E		C	D	DD//$(+h 9:::  &
 F## * *haKX(%02 2''&!A#,'''(* * * * F## * *haKX(%02 2''&1,'''(* * * ** *r)   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/  r;  r?  rG  rM  rQ  rU  rX  ra  rg  rk  ru  rx  r{  r  r  r  r  r  r  r  r  r  r!   r)   r&   rp   rp      s       , , ,
= = =? ? ?K K K6 6 6	I 	I 	I. . .`; ; ;$
> 
> 
>< < <$	 	 	< < <; ; ;
F 
F 
FK K K	 	 	c c c:( ( (& ) ) -)V? ? ?= = == = =B B B( ( (T2 2 2  # # #JR R R? ? ?< < <  0  0K K K  $  $  $  <:@ :@ :@x"& "& "&HE E E< < << < <? ? ?E5 E5 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                            d           | j                            d           | j                            d           d S )N	/dev/nullCRITICALr   )r4   r  r5   r7   r+   r'   setSyslogSocketr=   s    r&   r5   zTransmitterLogging.setUp  sh    D!!'')))+;'''+*%%%+f%%%%%r)   c                    g }t          d          D ]L}t          j        dd          }|                    |d                    t	          j        |d                    M|D ]}|                     d|           d}|                     d|           | j        	                    g d           |D ]}t	          j
        |           |                     dd	d
           |                     ddd           d S )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   ri  r   r   rU   rX   r9   rM   remove)r#   
logTargets_tmpFile	logTargetrf   s         r&   testLogTargetz TransmitterLogging.testLogTarget  s   *88  aj-887WQZ   8GAJ + +i??;	**** (%[%(((+777888  i9Y//+=xHHH//+BHMMMMMr)   c                 L   t           j                            d          st          j        d          |                     | j                                        d           |                     dd           |                     | j                                        d           d S )N/dev/logz'/dev/log' not presentr   r  SYSLOG)	r   r8  existsr   r  r   r7   getSyslogSocketrU   rt   s    r&   testLogTargetSYSLOGz&TransmitterLogging.testLogTargetSYSLOG  s    	
	#	# 5		3	4	44//$+--//888//+x(((//$+--//<<<<<r)   c                 2    |                      dd           d S )Nsyslogsocketz/dev/log/NEW/PATH)rU   rt   s    r&   testSyslogSocketz#TransmitterLogging.testSyslogSocket  s    //."566666r)   c                 T   |                      dd           |                     dd           |                      dd            | j         di i t          dt          d          d	          d
t	          j                    dv ot          j                            d                    d S )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   r8  r  rt   s    r&   testSyslogSocketNOKz&TransmitterLogging.testSyslogSocketNOK  s    //."?@@@[(+++//.*---$/  788" " "  J&E27>>*+E+EG    r)   c                    |                      dd           |                      dd           |                      dd           |                      dd           |                      dd           |                      dd           |                      dd           |                      dd	           |                      dd
           |                      ddd
           |                     dd           d S )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55Z(((((r)   c                 f   |                      | j                            dg          d           	 t          j        d          \  }}t          j        |           | j                            d           |                      | j                            dd|g          d|f           t          d          }|
                    d	           	 t          j        d          \  }}t          j        |           t          j        ||           |
                    d
           |                      | j                            dg          d           |
                    d           t          |d          5 }t          |          }|                    d          dk    rt          |          }|                     |                    d                     t          |          }|                     |                    d                     	 t          |          }|                    d          dk    r!|                     t$          |j                   n|                     d|z             n# t$          $ r Y nw xY wd d d            n# 1 swxY w Y   t          |d          5 }t          |          }|                    d          dk    rt          |          }|                     |                    d                     |                     t$          |j                   |                                 d d d            n# 1 swxY w Y   t          j        |           n# t          j        |           w xY w	 	 t          j        |           n:# t,          $ r Y n.w xY w# 	 t          j        |           w # t,          $ r Y w w xY wxY w|                      | j                            g d          d           |                      | j                            dg          d           d S )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  sS   4;&&}557IJJJ*	N++51b8A;;;;9%%%DK''R(@AAAr7KKK199 !!!~..GBHRLLLIb#II !!!T[((+779KLLLII   	c# !!WWU

.//1441gge	__U^^$9::;;;!WWU	__U^^$899:::
q''a	
(	)	)A	-	-
3333yyVYZZ[[[   
d               
b !WWU

*++q001gge	__U^^$788999	}aj111WWYYY               IcNNNNBIcNNNNN	IbMMMM
 	 	 	D		IbMMMM
 	 	 	D	4;&&'E'E'EFFVVV4;&&}55~FFFFFs   BN( B)M( 7BJA!I10J1
I>;J=I>>JM( JM( JM( (BM<M( MM( MM( N( (M>>N( N 
N%$N%(O*N?>O?
O	OOOc                    |                      ddd| j                   |                      ddd| j                   |                      dd	d
| j                   |                      ddd| j                   |                      dd| j                   |                      ddd| j                   |                      ddd| j                   d S )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.overalljailsrP  rt   s    r&   testBanTimeIncrz"TransmitterLogging.testBanTimeIncr  s    //%vt$-/HHH//#We$-/HHH//#[-dm/TTT//"C4=/AAA//#%nuy  vC/  D  D  D//')FHelply/zzz//(&&t}/MMMMMr)   )r,   r-   r.   r	   r6   r5   r  r  r  r  r  r  r  rm   rn   s   @r&   r  r    s        & & & & &N N N(= = =7 7 7  ) ) ).G .G .G`N N N N N N Nr)   r  c                       e Zd Zd ZdS )	JailTestsc                 ^    d}t          |          }|                     |j        |           d S )Nveryveryverylongname)r   rL   rE  )r#   longnamerR   s      r&   testLongNamezJailTests.testLongName  s0    #(	h$49h'''''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dS )
RegexTestsc                     |                      t          t          d           |                      t          t          d           |                      t          t          d           d S )NrT   	)r   r   r   rt   s    r&   testInitzRegexTests.testInit"  sP    NE2...NE3///NE400000r)   c                    |                      t          t          d                                        dd          d           |                     t          t          d                                        d                     d S )Na"'z
Regex('a')r\  z
FailRegex()rL   ra   r   replacer   r   
startswithrt   s    r&   testStrzRegexTests.testStr(  sj    3uSzz??**344lCCC//#i))**55lCCDDDDDr)   c                 ^   |                      t          t          d           |                      t          t          d           |                     t          d                     |                     t          d                     |                     t          d                     |                     t          d                     |                     t          d                     |                     t          d                     |                     t          d	                     t          d
          }|                     |                                           |                    dg           |                     |                                           |                      t          |j                   t          d          }|                     |                                           |                    dg           |                     |                                           |                      t          |j                   t          d          }|                     |                                           |                    dg           |                     |                                           |                     |                                d           |                    dg           |                     |                                           |                     |                                d           |                    dg           |                     |                                           |                     |                                d           t          d          }|                     |                                           |                    dg           |                     |                                           |                     |	                                d           t          d          }|                    dg           |
                                }|                     ||j        fd           |                    dg           |
                                }|                     ||j        fd           |                    dg           |
                                }|                     ||j        fd           |                    dg           |
                                }|                     ||j        fd           t          d           }|                    d!g           |
                                }|                     ||j        fd"           |                    d#g           |
                                }|                     ||j        fd           |                    d$g           |
                                }|                     ||j        fd%           |                    d&g           |
                                }|                     ||j        fd'           d S )(NrT  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%%rT  rT  z#%%inet(?:=<F-IP4/>|inet6=<F-IP6/>)?)z%%inet=testrT  rT  z(%%(?:inet(?:=<IP4>|6=<IP6>)?|dns=<DNS>?))z%%inet=192.0.2.1rT  rT  r   )z%%inet6=2001:DB8::rT  rT  
2001:DB8::)z%%dns=example.comrT  rT  zexample.com)z%test id group: user:(test login name)rT  rT  ztest login namez%%net=<SUBNET>)z%%net=192.0.2.1rT  rT  )r   inet4)z%%net=192.0.2.1/24rT  rT  )z192.0.2.0/24r&  )z%%net=2001:DB8:FF:FF::1rT  rT  )z2001:db8:ff:ff::1inet6)z%%net=2001:DB8:FF:FF::1/60rT  rT  )z2001:db8:ff:f0::/60r'  z%%ip="<ADDR>", mask="<CIDR>?")z%%ip="192.0.2.2", mask=""rT  rT  )r   r&  )z%%ip="192.0.2.2", mask="24"rT  rT  )z"%%ip="2001:DB8:2FF:FF::1", mask=""rT  rT  )z2001:db8:2ff:ff::1r'  )z$%%ip="2001:DB8:2FF:FF::1", mask="60"rT  rT  )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22NI/@AAA//)233444//)122333//)122333//)122333//)[\\]]]//)LMMNNN//)BCCDDD "2==??###))\N//"--//"""NBJ///788"2==??###))"#$$$//"--//"""NBJ///<=="2==??###))'()))//"--//"""2::<<---)))*+++//"--//"""2::<<...))()***//"--//"""2::<<///ABB"2==??###))<=>>>//"--//"""2<<>>#4555"##"))&'(((	xxzz"B%'=>>>)))*+++	xxzz"B%'@AAA))./000	xxzz"B%'EFFF))12333	xxzz"B%'GHHH122"))01222	xxzz"B%'=>>>))23444	xxzz"B%'@AAA))9:;;;	xxzz"B%'FGGG));<===	xxzz"B%'HIIIIIr)   N)r,   r-   r.   r  r#  r/  r!   r)   r&   r  r     sN        1 1 1E E EDJ DJ DJ DJ DJr)   r  c                       e Zd Zd ZdS )
_BadThreadc                      t          d          )Nzrun bad thread exception)r   rt   s    r&   runz_BadThread.runv  s    /000r)   N)r,   r-   r.   r3  r!   r)   r&   r1  r1  u  s#        1 1 1 1 1r)   r1  c                        e Zd Zd Zd Zd ZdS )LoggingTestsc                     t          d          }|                     |j        j        d           |                     |j        d           d S )Nzfail2ban.some.string.with.namer   zfail2ban.name)r   rL   parentrE  )r#   
testLogSyss     r&   testGetF2BLoggerzLoggingTests.testGetF2BLogger|  sJ    9::*:$):666:?O44444r)   c                     t           j        }g fdt           _        	 t                      }|                                 |                                                      t          j         fdd                     |t           _        n# |t           _        w xY w                     d            	                    t                    d            	                    d         d         t                     d S )Nc                  .                         |           S r    )ri  )r$   rH   s    r&   r   z5LoggingTests.testFail2BanExceptHook.<locals>.<lambda>  s    QXXd^^ r)   c                  L    t                    o                     d          S )NUnhandled exception)r   
_is_logged)r#   rH   s   r&   r   z5LoggingTests.testFail2BanExceptHook.<locals>.<lambda>  s    CFF,]tG\7]7] r)   r   r=  r   r   )sys__excepthook__r1  r   r9  r   r   r   r   rL   r   r   )r#   prev_exchook	badThreadrH   s   `  @r&   testFail2BanExceptHookz#LoggingTests.testFail2BanExceptHook  s    #,!3333#%||9??>>??EN$]$]$]$]$]_`aaccc$33$$$$)***3q6611Q47L)))))s   A"B Bc                    g }t          j        dd          \  }}t          j        |           |                    |           t          j        dd          \  }}t          j        |           |                    |           t                      }	 |                    ||d           |                     |                                           | 	                    d           |
                                 |D ]5}t          j                            |          rt          j        |           6d S # |
                                 |D ]5}t          j                            |          rt          j        |           6w xY w)Nzfail2ban.sockzf2b-testzfail2ban.pidF)forcezServer already running)r   r   r   r   ri  r   r   rr   rs   r   rA   r8  r  r  )r#   	tmp_filessock_fd	sock_name
pidfile_fdpidfile_namer7   r  s           r&   testStartFailedSockExistsz&LoggingTests.testStartFailedSockExists  sm   )'DD'9(79%-njII*l(:<   <<&	<<	<u<555F$$&&'''-...	;;===  q	w~~a Yq\\\  
;;===  q	w~~a Yq\\\s   AD6 6AFN)r,   r-   r.   r9  rC  rK  r!   r)   r&   r5  r5  z  sA        5 5 5
* * *    r)   r5  )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                 V     t          t          |           j        |i | i | _        d S r    )r4   rP  __init__#_ServerConfigReaderTests__share_cfg)r#   r$   r%   r>   s      r&   rR  z ServerConfigReaderTests.__init__  s4    /%&&/@@@@$r)   c                 d    t          t          |                                            g | _        dS )r2   N)r4   rP  r5   _execCmdLstr=   s    r&   r5   zServerConfigReaderTests.setUp  s.    &&,,...$r)   c                 V    t          t          |                                            dS r@   )r4   rP  rB   r=   s    r&   rB   z ServerConfigReaderTests.tearDown  s&    &&//11111r)   r   c                     |                     d          D ]M}|                    d          st                              d|           3t                              |           NdS )N
#zexec-cmd: `%s`T)splitr"  logSysdebug)r#   realCmdr  r  s       r&   _executeCmdz#ServerConfigReaderTests._executeCmd  s_    ==  a
,,s

 
LL!1%%%%
LLOOOO	r)   c                    t          | d          sit                      }i | _        dD ]Q\  }}t          |          }|                    d           t
          j                            ||          | j        |<   R| j        S )N__aInfos))ipv4r   )ipv6r%  r   )hasattrr    _ServerConfigReaderTests__aInfosr   
setBanTime_actionsrq  
ActionInfo)r#   dmyjailtr  tickets        r&   _testActionInfosz(ServerConfigReaderTests._testActionInfos  s    	z	"	" D[[74=? D Duq"r]]F
c'2267CCDM!	r)   c                    |j         }|                                 }|D ]Q}||         j        D ]?}||         j        |         }t                              d           t                              d|dz   |j        z              t                              d           t          |t          j                  s| j	        |_
        t                              d           |                                  |                                 t                              d           |                                  |                    |d                    t                              d           |                                  |                    |d                    t                              d           |                                  |                    |d	                    t                              d
           |                                  |                    |d	                    t                              d           |                                  |                                 ASd S )N4# ==================================================# == %-44s == - # === start ===# === ban-ipv4 ===ra  # === unban ipv4 ===# === ban ipv6 ===rb  # === unban ipv6 ===# === stop ===)r   rk  r   r[  r\  _namer   rf  CommandActionr^  
executeCmdr   r   r  r  rw   )r#   r7   rj  aInfosrR   r  r  s          r&   _testExecActionsz(ServerConfigReaderTests._testExecActions  s   

%  ""&  d$K  q4[ #F
LL"###
LL$,"=>>>
LL"###fh455?x(F
LL"###T]]___
LLNNN
LL%&&&
JJvf~
LL'((($--///
LL   
LL%&&&
JJvf~
LL'((($--///
LL   
LL!"""DMMOOO
KKMMMM5 r)   c                 f   t           j                            d           t          t          d| j                  }|                     |                                           |                     |                                           |	                    d          }t                      }|j        }|j        }|D ]H}|d         dk    r8|d         dk    rd|d	<   nt          |          d
k    r|d         dk    r|d	         dk    rvt          j                            t"          d|d                   }t          j                            |          s%t          j                            t"          d          }||d
<   nDt           j        j        r3t          |          d
k    r |d         dv r|d	         dk    r
d|d<   d|d
<   	  ||           # t(          $ r&}|                     d|d|           Y d }~@d }~ww xY wJt           j        j        s|                     |           d S d S )NTstock)basedirforce_enableshare_config)allow_no_filesr   r   rZ   r   r   r   rD   r3  logsr   r2  )rD   z	multi-setr^  zDUMMY-REGEX <HOST>zCommand z has failed. Received )r   r   SkipIfCfgMissingrM  rN  rS  r   read
getOptionsconvertr   r8   _Transmitter__commandHandlerr   r   r8  r9  r:  r  r   r  r  rz  )	r#   rj  streamr7   r9   
cmdHandlerrN   r  es	            r&   testCheckStockJailActionsz1ServerConfigReaderTests.testCheckStockJailActions  s:   
,d+++
jt$JZ
[
[
[%//%**,,//%""$$%%%===--&<<&!&2*  @ @c	!f
1vSVV 
SA#a&E//c!f.D.D
',,~vs1v
6
6R GNN2 :7<<(899bSVV 
	 #XX\\c!f 444Q>9Q9QSV"SV@Z____ @ @ @	YYYsssAA>????????@/ > 
	 !     ! !s   G
HG??Hc                 d   |                     d|          }t          |          \  }}d|dgg}t          |||| j        t                    }|                     |                                           |                    i            |                    |	                                           |S )Nz%(__name__)srZ   r   )r  r~  )
r!  r   rL  rS  rN  r   r  r  extendr  )r#   rR   actactNameactOptr  r  s          r&   getDefaultJailStreamz,ServerConfigReaderTests.getDefaultJailStream  s    ND))#"3''/'6	4& 
D& *6 6 6& //&++--   B--  !!!	-r)   c                 T   t           j                            d           t           j                                         dd l}t                      }|j        }|                    t          j        	                    t          dd                    D ]}t          j                            |                              dd          }|                     d|z   |          }|D ]0}|                    |          \  }}	|                     |d           1|                     |           d S )	NTr|  r   r  z*.confz.confrT  zj-)r   r   r  
SkipIfFastglobr   r8   r   r8  r9  rN  basenamer!  r  rM   rL   rz  )
r#   r  r7   r9   actCfgr  r  rN   rg   ress
             r&   testCheckStockAllActionsz0ServerConfigReaderTests.testCheckStockAllActions+  s   
,d+++
,+++<<&!&		"',,z:xHHII 	! 	!f			&	!	!	)	)'2	6	63%%d3h446  s~~c""HCS!    	! 	!r)   c                    t           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 ]O\  }}}|                     ||          }|D ]0}	|                    |	          \  }
}|                     |
d           1P|j	        }| 
                                }|D ]	\  }}}||         j        D ]}||         j        |         }t                              d           t                              d|dz   |j        z              t                              d           |                     t!          |t"          j                             | j        |_        |                     d           |                                 |                    d          r | j        |d         ddi nF|                    d          r1|                    d          r | j        |d         |d         z   ddi |                     d           |                    |d                    |                    d          r> | j        |                    d|                    dd                    |d         z   ddi |                    d          r | j        |d         ddi  | j        |d         ddi  | j        |d          ddi |                     d           |                    |d                     | j        |d         ddi  | j        |d          ddi |                     d           |                    |d                    |                    d          r> | j        |                    d|                    dd                    |d         z   ddi |                    d          r | j        |d         ddi  | j        |d         ddi  | j        |d         ddi |                     d           |                    |d                     | j        |d         ddi  | j        |d         ddi |                    d	          r|                     d
           |                    |d         d                     | j        |                    d|                    dd                    |d	         z   ddi |                    d          r(|d         |d	         k    r | j        |d         ddi |                    d          r|                     d           |                    |d         d                     | j        |                    d|                    dd                    |d         z   ddi |                    d	          r(|d	         |d         k    r | j        |d	         ddi |                    d          r>|                     d           |                                  | j        |d         ddi |                     d           |                                 |                    d          r+ | j        |                    dd          |d         z   ddi d S (  NTr|  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   rm  rn  ro  rp  r   r   r  r  rq  ra  r  r  r  r  rr  r  rs  rb  r  r  rt  r  r  z# === check ipv4 ===familyz*-checkr  z# === check ipv6 ===r  z# === flush ===ru  rw   )r   r   r  r   r8   r  r  rM   rL   r   rk  r   r[  r\  rv  r   r   rf  rw  r^  rx  r   r   rE   r   r  r  r  _invariantCheckr  rw   )r#   testJailsActionsr7   r9   r  rR   r  testsr  rN   rg   r  rj  ry  r  r  s                   r&   testCheckStockCommandActionsz4ServerConfigReaderTests.testCheckStockCommandActions?  s   
,d+++ e(1PY/h /h /b L(1PS,O ,O ,\   E&8+G G 4 e&8h h     Q2;d
]1S 1S 1f |2;d
]1 1 1f x(1O


Y/{ /{ /b g+4U


Y/j /j /b t2;d
]1w 1w 1f |2;d
]1 1 1f k4=h	C$n $n $L Bb

 EDJMKN)E E . Sb

 KJPSQT)V V . [b 
 KJPSQT)^ ^ .   H.7[

G&J &J &P s.7[

G&v &v &P q%.I?"t "t "H ~(1O?"A "A "H H6?kK K   J6?kM M Y[x <<&!&2** 
 
dC%%dC006   s~~c""HCS!
 
%  ""&* >j >jdC$K <j <jq4[ #F
LL"###
LL$,"=>>>
LL"###OOJvx'=>>???(FMM#$$$
LLNNNyy LTg1D1111	;		 LEIIk$:$: LT5-eK.@@KdKKKMM&'''
JJvf~yy  J0t0%))IuyyQegiGjGj2k2klqr}l~2~   J  EI   J   J   JyyR3t3U;5GRTRRRDuY'2T222D%,1D111MM()))
LL   Du[)4t444D%,1D111MM&'''
JJvf~yy  J0t0%))IuyyQegiGjGj2k2klqr}l~2~   J  EI   J   J   JyyR3t3U;5GRTRRRDuY'2T222D%,1D111MM()))
LL   Du[)4t444D%,1D111yy :	]])***F6N84555T		)UYY7KR-P-PQQRWXcRddojnooo		+ :5#5{9K#K#KdE+.9D999yy :	]])***F6N84555T		)UYY7KR-P-PQQRWXcRddojnooo		+ :5#5{9K#K#KdE+.9D999yy 2	]]$%%%\\^^^Tg1D111MM"###
KKMMMyyi+$+UYY7KR-P-PQVW]Q^-^idhiiiy<j>j >jr)   c                    |}t          |t                    r|d         }t          j        dd|          }t          j        dd |d          }t          |t                    r||d<   n|}t          j                            ||          S )Nr   z\)\s*\|\s*(\S*mail\b[^\n]*)z$) | cat; printf "\\n... | "; echo \1z\bADDRESSES=\$\(dig\s[^\n]+c                     dS )Nz@ADDRESSES="abuse-1@abuse-test-server, abuse-2@abuse-test-server"r!   )ms    r&   r   z9ServerConfigReaderTests._executeMailCmd.<locals>.<lambda>  s    O r)   r   )r  )r   r_   resubrf  rw  rx  )r#   r]  r  rN   s       r&   _executeMailCmdz'ServerConfigReaderTests._executeMailCmdv  s    # 	3
-*C	1 	1# 	-OO	 	#  71::7			*	*7G	*	D	DDr)   c                 h   t           j                            d           ddt          j                            t          d          z   dz   dz   t          j                            t          d          z   d	z   d
difddt          j                            t          d          z   dz   dz   t          j                            t          d          z   d	z   d
difddt          j                            t          d          z   dz   dz   t          j                            t          d          z   dz   dddfdddddff}t                      }|j        }|j	        }|D ]O\  }}}| 
                    ||          }|D ]0}	|                    |	          \  }
}|                     |
d           1P|j        }t          d          }t          d          }t                      }|D ]Q\  }}}||         j        D ];}||         j        |         }t"                              d           t"                              d|dz   |j        z              t"                              d           | j        |_        d
|fd|ffD ]\  }}|                    |          s|                     d |z             t1          |          }|                    d!           |                    d"d#g           t6          j                            ||          }|                    |            | j        ||         d$di =Sd S )%NTr|  zj-mail-whois-linesz\mail-whois-lines[name=%(__name__)s, grepopts="-m 1", grepmax=2, mailcmd="mail -s", logpath="r2  rX  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::1rm  rn  ro  r  z# === %s ===r   r  r  r   ) r   r   r  r   r8  r9  r:  r   r8   r  r  rM   rL   r   r   r   r   r[  r\  rv  r  rx  rE   r   r   
setAttempt
setMatchesrf  rq  rg  r  r   )r#   r  r7   r9   r  rR   r  r  r  rN   rg   r  rj  ra  rb  rh  r  r  testr  rj  s                        r&   testComplexMailActionMultiLogz5ServerConfigReaderTests.testComplexMailActionMultiLog  s   
,d+++  GLL1ABBC FJJ 	 W\\.2CDD	EH
	
  
(  GLL1ABBC FJJ 	 W\\.2CDD	EH
	
  
( 
 GLL1ABBC
 FJJ  W\\.2CDDEH

 8 
 M^~ <<&!&2** 
 
dC%%dC006   s~~c""HCS!
 
%		 	 $			$KK'* / /dC$K / /q4[ #F
LL"###
LL$,"=>>>
LL"###,F!4(9d*;< / /
rIIdOO%X	]]>D()))mmVs^]    ))&'::VZZTd...../// /r)   )r   )r,   r-   r.   rR  r5   rB   r^  rk  rz  r  r  r  r  r  r  rm   rn   s   @r&   rP  rP    s               
2 2 2 2 2          D1! 1! 1!f  ! ! !(uj uj ujnE E E E$K/ K/ K/ K/ K/ K/ K/r)   rP  )A
__author____copyright____license__r   r   r   r   r  r?  r  server.failregexr   r   r   r7   r   rf  server.serverr	   server.ipdnsr
   r   server.jailr   server.jailthreadr   server.ticketr   server.utilsr   	dummyjailr   utilsr   r   r   helpersr   r   r   rT  r   r   r  r8  r9  dirname__file__r:  r<   r[  r   r0   rp   r  TestCaser  r  r1  r5  clientreadertestcaserL  rM  rN  rP  r!   r)   r&   <module>r     s  . 
2    				 				 



  ? ? ? ? ? ? ? ? ? ? ( ( ( ( ( ( " " " " " " + + + + + + + +       * * * * * * % % % % % %                         < < < < < < < < < < ; ; ; ; ; ; ; ; ; ;      #######    bgooh77AA	:		       [ [ [ [ [( [ [ [|u* u* u* u* u*/ u* u* u*p{N {N {N {N {N {N {N {N|( ( ( ( (! ( ( (RJ RJ RJ RJ RJ" RJ RJ RJj1 1 1 1 1 1 1 1
' ' ' ' '% ' ' 'T H G G G G G G G G Gm/ m/ m/ m/ m/0 m/ m/ m/ m/ m/s   :B B
B