HEX
Server: LiteSpeed
System: Linux 112.webhostingindonesia.co.id 5.14.0-570.62.1.el9_6.x86_64 #1 SMP PREEMPT_DYNAMIC Tue Nov 11 10:10:59 EST 2025 x86_64
User: iyfwylsv (10313)
PHP: 8.2.30
Disabled: NONE
Upload Files
File: //usr/lib/python3.9/site-packages/fail2ban/tests/__pycache__/servertestcase.cpython-39.opt-2.pyc
a

UJ�Y�VY�@s�dZdZdZddlZddlZddlZddlZddlZddlZddl	Z	ddl
mZmZm
Z
ddlmZddlmZdd	lmZmZdd
lmZddlmZddlmZdd
lmZddlmZddl m!Z!m"Z"m#Z#ddl$m%Z%m&Z&m'Z'ddl(m)Z)zddlm*Z*Wne+�ydZ*Yn0ej,�-ej,�.e/�d�Z0dZ1e%d�Z2Gdd�de�Z3Gdd�de!�Z4Gdd�de4�Z5Gdd�de4�Z6Gdd �d ej7�Z8Gd!d"�d"ej7�Z9Gd#d$�d$e�Z:Gd%d&�d&e!�Z;dd'l<m=Z=m>Z>m?Z?Gd(d)�d)e!�Z@dS)*z
Cyril Jaquierz Copyright (c) 2004 Cyril JaquierZGPL�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@seZdZdd�Zdd�ZdS)�
TestServercOsdS�N���self�args�kwargsrr�A/usr/lib/python3.9/site-packages/fail2ban/tests/servertestcase.py�setLogLevel<szTestServer.setLogLevelcOsdSrrrrrr"�setLogTarget?szTestServer.setLogTargetN)�__name__�
__module__�__qualname__r#r$rrrr"r;srcsPeZdZeZ�fdd�Z�fdd�Zdd	d
�Zddd�Zd
d�Z	dd�Z
�ZS)�TransmitterBasecs<tt|���|��|_|jj|_d|_|j�|jt	�dS)�Call before every test case.�	TestJail1N)
�superr(�setUp�TEST_SRV_CLASS�server�_Server__transm�transm�jailName�addJail�FAST_BACKEND�r��	__class__rr"r,Gs


zTransmitterBase.setUpcs|j��tt|���dS�zCall after every test case.N)r.�quitr+r(�tearDownr4r5rr"r9Qs
zTransmitterBase.tearDownrrNFc
s�d||g}d|g}|dur2|�d|�|�d|�|dkr>|}�fdd�}	|�|	|j�|��|	||f��|s�|�|	|j�|��|	d|f��dS)	zoProcess set/get commands and compare both return values 
		with outValue if it was given otherwise with inValue�set�getNrrcs�rt|�S|S)zPrepare value for comparison)�repr��x��repr_rr"�vdsz%TransmitterBase.setGetTest.<locals>.vr)�insert�assertEqualr0�proceed)
r�cmd�inValue�outValue�outCode�jailr@�setCmd�getCmdrArr?r"�
setGetTestWs
 zTransmitterBase.setGetTestcCsvd||g}d|g}|dur2|�d|�|�d|�|j�|�d}|�|j�|�dd�|�|j�|�d|f�dS)Nr:r;rr)rBr0rDrC)rrErFrIrJrKZ	initValuerrr"�
setGetTestNOKms
zTransmitterBase.setGetTestNOKc	Cs�d|}d|}|�|j�d||g�dgf�t|�D]�\}}|j�d|||g�}|j|dttt|d��fdttt|d|d���fdd�|j�d||g�}|j|dttt|d��fdttt|d|d���fdd�q6t|�D]�\}}|j�d|||g�}|j|dttt|d��fdttt||dd���fdd�|j�d||g�}|j|dttt|d��fdttt||dd���fdd�q�dS)	N�add�delr;rr:rr)�level)rCr0rD�	enumerate�assertSortedEqual�list�map�str)	rrE�valuesrI�cmdAdd�cmdDel�n�value�retrrr"�jailAddDelTestzs�@B@zTransmitterBase.jailAddDelTestc		Csd|}d|}|�|j�d||g�dgf�t|�D]^\}}|�|j�d|||g�d|d|d�f�|�|j�d||g�d|d|d�f�q6t|�D]^\}}|�|j�d||dg�d||dd�f�|�|j�d||g�d||dd�f�q�dS)NrNrOr;rr:r)rCr0rDrQ)	rrEZinValuesZ	outValuesrIrWrXrYrZrrr"�jailAddDelRegexTest�s.�����z#TransmitterBase.jailAddDelRegexTest)rrNF)N)r%r&r'rr-r,r9rLrMr\r]�
__classcell__rrr5r"r(Cs



r(c@s�eZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dd�Zdd�Zdd�Z
dd�Zdd�Zdd�Zdd�Zdd �Zd!d"�Zd#d$�Zed%d&��Zd'd(�Zd)d*�Zd+d,�Zd-d.�Zd/d0�Zd1d2�Zd3d4�Zd5d6�Zd7d8�Zd9d:�Z d;d<�Z!d=d>�Z"d?d@�Z#dAdBdCdDgfgfdEdFdGdHgfgfgZ$dIdJ�Z%dKdL�Z&dMdN�Z'dOdP�Z(dQdR�Z)dSdT�Z*dUdV�Z+dWdX�Z,dYdZ�Z-d[d\�Z.d]d^�Z/d_d`�Z0dadb�Z1dcS)d�TransmittercCs|�|j���dSr)�assertFalser.�	isStartedr4rrr"�testServerIsNotStarted�sz"Transmitter.testServerIsNotStartedcCs|�|j�dg�d�dS)N�stop�rN�rCr0rDr4rrr"�testStopServer�szTransmitter.testStopServercCs|�|j�dg�d�dS)NZping)rZpongrer4rrr"�testPing�szTransmitter.testPingcCs |�|j�dg�dtjf�dS)Nrr)rCr0rDrr4rrr"�testVersion�szTransmitter.testVersioncCs�z�|�|j�gd��d�|�t���|�d�|��|�|j�gd��d�|�t���|�d�|��W|�|j�gd��d�|�d	�|��n,|�|j�gd��d�|�d	�|��0dS)
N)r:�	allowipv6�yes)rrjz
IPv6 is on)r:ri�no�rrkzIPv6 is off)r:ri�auto)rrmzIPv6 is auto)	rCr0rD�
assertTruerZ
IPv6IsAllowed�assertLogged�pruneLogr`r4rrr"�testSetIPv6�s�zTransmitter.testSetIPv6cCs|tjjs`t��}|�|j�ddg�d�t��}||}|jd|koNdknd|d�n|�|j�ddg�d�dS)	N�sleepz0.1rdg
ףp=
�?g�������?zSleep was %g sec)�msgz0.0001)�unittest�F2B�fast�timerCr0rDrn)rZt0�t1Zdtrrr"�	testSleep�s(zTransmitter.testSleepcCs�tjjst�dd�\}}nd}|�d|�|j�|j�|�	d|�|�	d|�|�	ddd�|�dd�|�	d	d
d�|�d	d�|j�
|jt�|�	d|�|j�|j�|�|j
�gd��d
�|�|j
�ddg�d
�|�|j
�gd��d
�|�|j
�ddg�d
�|�|j
�gd��d
�|�|j
�dd	g�d
�|j�
|jt�|�|j
�gd��d
�tjj�s�t�|�t�|�dS)Nz.dbZ	fail2ban_z:memory:�dbfile�dbmaxmatches�100�dZLIZARD�
dbpurgeage�600�X)r:rz�Nonerdr;)r:r{r|)r:r~�500)rtruZ	memory_db�tempfile�mkstemprMr.ZdelJailr1rLr2r3rCr0rD�os�close�unlink)r�tmpZtmpFilenamerrr"�testDatabase�sj
��
��
��
��
��
��
��

zTransmitter.testDatabasecCs�d}d}d}|�|j�d|dg�d|f�|�|j�d|g�d|f�|�|j�d|dg�dd�|�|j�d|d	g�d|f�|�|j�d|jdg�dd�|�|j�gd
��dd�dS)N�	TestJail2�	TestJail3Z	TestJail4rNrrzinvalid backendrrm)rN�--allr�rCr0rDr1)rZjail2Zjail3Zjail4rrr"�testAddJail�s&�����zTransmitter.testAddJailcsp���j�d�jg�d�t�tj���t�	�fdd�d�����j�d�jg�d���
�j�jj�dS)N�startrdcs&�j�d�o$t�j�d�jg�t�S)Nr�status�r.ZisAlive�
isinstancer0rDr1�RuntimeErrorrr4rr"�<lambda>�z/Transmitter.testStartStopJail.<locals>.<lambda>�rc)
rCr0rDr1rwrrr
�DEFAULT_SLEEP_TIMErn�wait_for�assertNotInr.�_Server__jailsr4rr4r"�testStartStopJails�
��zTransmitter.testStartStopJailcs��j�dt����j�d�jg�d����j�ddg�d�t�t	j
���t	��fdd�d�����j�ddg�d���t	��fd	d�d����
�j�jj���
d�jj�dS)
Nr�r�rdcs&�j�d�o$t�j�d�jg�t�S)Nrr�r�rr4rr"r�"r�z2Transmitter.testStartStopAllJail.<locals>.<lambda>r�rcr�cst�jj�Sr)�lenr.r�rr4rr"r�%r�)r.r2r3rCr0rDr1rwrrr
r�rnr�r�r�r4rr4r"�testStartStopAllJails ��
�z Transmitter.testStartStopAllJailcCsb|�|j�d|jddg�d�|�|j�d|jddg�d�|�|j�d|jddg�dd	�dS)
Nr:Zidle�on�rT�off�rFZCATrrr�r4rrr"�testJailIdle)s���zTransmitter.testJailIdlecCsf|jddd|jd�|jddd|jd�|jddd|jd�|jdd	d
|jd�|jdd|jd�dS)NZfindtimeZ120�x�rIZ60�<Z30m�z-60i���ZDog�rLr1rMr4rrr"�testJailFindTime4s
zTransmitter.testJailFindTimecCsf|jddd|jd�|jddd|jd�|jddd|jd�|jdd	d
|jd�|jdd|jd�dS)NZbantimerr�r�Z50�2z-50i���z
15d 5h 30mi�ZCatr�r4rrr"�testJailBanTime;s
zTransmitter.testJailBanTimecCsf|jddd|jd�|jddd|jd�|jddd|jd�|jdd	d
|jd�|jdd|jd�dS)NZdatepattern�%%%Y%m%d%H%M%S)r�z%YearMonthDay24hourMinuteSecondr��Epoch)Nr�z^Epoch)Nz{^LN-BEG}Epoch�TAI64N)Nr�z
%Cat%a%%%gr�r4rrr"�testDatePatternBs�
�
�
�zTransmitter.testDatePatterncCs*|jddd|jd�|jdd|jd�dS)NZlogtimezonezUTC+0400r�znot-a-time-zoner�r4rrr"�testLogTimeZoneNszTransmitter.testLogTimeZonecCs\|jdd|jd�|jdd|jd�|jdd|jd�d}|�|j�d|jd|g�d�dS)	NZusednsrjr��warnrkZFishr:rl)rLr1rCr0rD�rrZrrr"�testJailUseDNSRs�zTransmitter.testJailUseDNScCs|j�|j�|�|j�d|jddddg�d�|jddddd	�|�|j�d|jdd
g�d�|jddd
�|�|j�d|jdddddg�d�|jddddd	�|jddddd	�|��|�|j�d|jdddg�dd�|�|j�d|jdddg�d�|jddddd	�dS)Nr:�banip�	192.0.2.1�	192.0.2.2)rr�
Ban 192.0.2.1�
Ban 192.0.2.2T��all�waitZBadger�rrz
Ban Badger�r��unbanipz192.0.2.255z192.0.2.254zUnban 192.0.2.1zUnban 192.0.2.2z192.0.2.255 is not bannedz192.0.2.254 is not bannedz--report-absentrr�rr)r.�	startJailr1rCr0rDrorpr4rrr"�
testJailBanIP]sF���������zTransmitter.testJailBanIPcs��j��j��fdd�}�jddd�jd�dD]&}dD]}��||d	|g�d
�q:q2�jddd
d
d���||dd�dD��d
��jdd
d��jdd
d���d�dS)Ncs�j�d�jd|g|�S)Nr:�attempt)r0rDr1)�ipZmatchesr4rr"r�}sz.Transmitter.testJailAttemptIP.<locals>.attempt�maxretry�5�r�)rr)r�r��test failure %dr�z192.0.2.1:2z192.0.2.2:2Tr�cSsg|]}d|�qS)r�r)�.0�irrr"�
<listcomp>�r�z1Transmitter.testJailAttemptIP.<locals>.<listcomp>)r��r�z192.0.2.2:5r�r�r�)r.r�r1rLrCro�assertNotLogged)rr�r�r�rr4r"�testJailAttemptIPzszTransmitter.testJailAttemptIPcs�d}�j�|t��j�|�dddgf�fdd�	}||gd�||dddgd	�||d
dddgd	�||dgd
�d�||dd
dgd�||dd
gd�||d
gd�dS)NZTestJailBanListrcs�|dur6���j�d|d|g�d��jd|dd�|durl���j�d|d|g�d��jd|dd��j�j�d	|dgt|��d
|fdd�t�t��d
�dS)Nr:r�r�zBan %sTr�r�zUnban %sr;rF)Z
nestedOnlyr)	rCr0rDrorRrSrZsetTimerw)rIr�r�r �outListr4rr"�_getBanListTest�s"���z4Transmitter.testJailBanList.<locals>._getBanListTest)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�)r.r2r3r�)rrIr�rr4r"�testJailBanList�s6��������zTransmitter.testJailBanListcCsR|jddd|jd�|jddd|jd�|jddd|jd�|jdd	|jd�dS)
NZ
maxmatchesr�r�r��2r�-2����Duckr�r4rrr"�testJailMaxMatches�szTransmitter.testJailMaxMatchescCsR|jddd|jd�|jddd|jd�|jddd|jd�|jdd	|jd�dS)
Nr�r�r�r�r�rr�r�r�r�r4rrr"�testJailMaxRetry�szTransmitter.testJailMaxRetrycCsP|jddd|jd�|jddd|jd�|jdd|jd�|jdd|jd�dS)	NZmaxlinesr�r�r�r�rr�r�r�r4rrr"�testJailMaxLines�szTransmitter.testJailMaxLinescCsN|jdd|jd�|jdd|jd�|jddt|jd�|jdd|jd�dS)NZlogencodingzUTF-8r��asciirmZMonkey)rLr1rrMr4rrr"�testJailLogEncoding�s
�zTransmitter.testJailLogEncodingc
Csh|�dtj�td�tj�td�tj�td�g|j�tj�td�}|�|j�d|jd|g�d|gf�|�|j�d|jd|g�d|gf�|�|j�d	|jdg�d|gf�|�|j�d|jd
|g�dgf�|�|j�d|jd|dg�d|gf�|�|j�d|jd|dg�d|gf�|�|j�d|jd|d
g�dd�|�|j�d|jd|||g�dd�dS)NZlogpath�testcase01.logztestcase02.logztestcase03.logztestcase04.logr:�
addlogpathrr;Z
dellogpath�tail�headZbadgerr)	r\r��path�join�TEST_FILES_DIRr1rCr0rDr�rrr"�testJailLogPath�sj��
��������������zTransmitter.testJailLogPathcCs2d}|j�d|jd|g�}|�t|dt��dS)Nzthis_file_shouldn't_existr:r�r)r0rDr1rnr��IOError)rrZ�resultrrr"�testJailLogPathInvalidFile�s
�z&Transmitter.testJailLogPathInvalidFilecCsXtjdd�}|d}t�||�|j�d|jd|g�}|�t|dt	��t�
|�dS)NZtmp_fail2ban_broken_symlink)�prefixz.slinkr:r�r)r��mktempr��symlinkr0rDr1rnr�r�r�)r�nameZsnamer�rrr"�testJailLogPathBrokenSymlinks�z(Transmitter.testJailLogPathBrokenSymlinkcCs�|�dgd�|j�d}|�|j�d|jd|g�d|gf�|�|j�d|jd|g�d|gf�|�|j�d|jdg�d|gf�|�|j�d|jd|g�dgf�|�|j�d|jd	g�d
�|�|j�d|jd	dg�d�|�|j�d|jd	g�d�dS)
NZignoreip)r�z192.168.1.1z8.8.8.8r�r:Zaddignoreiprr;ZdelignoreipZ
ignoreselfr�Fr�)r\r1rCr0rDr�rrr"�testJailIgnoreIP
sD��������zTransmitter.testJailIgnoreIPcCs|jdd|jd�dS)NZ
ignorecommandzbin/ignore-command <ip>r��rLr1r4rrr"�testJailIgnoreCommand2sz!Transmitter.testJailIgnoreCommandcCs0|jddgd�|jd�|jddd|jd�dS)NZignorecachez%key="<ip>",max-time=1d,max-count=9999)z<ip>i'i�Qr��r�r4rrr"�testJailIgnoreCache5s�zTransmitter.testJailIgnoreCachecCs|jdd|jd�dS)NZ	prefregexz^Testr�r�r4rrr"�testJailPrefRegex<szTransmitter.testJailPrefRegexc
Cs�|�dgd�dt�d�dt�d�dt�d�g|j�|�|j�d|jdd	g�d
d�|�|j�d|jddg�d
d�dS)
NZ	failregex)zuser john at <HOST>�Admin user login from <HOST>z failed attempt from <HOST> againzuser john at %s�<HOST>�Admin user login from %szfailed attempt from %s againr:�addfailregexz
No host regexrri��r]rZ_resolveHostTagr1rCr0rDr4rrr"�
testJailRegex?s0��������zTransmitter.testJailRegexc	Csn|�dgd�ddt�d�dg|j�|�|j�d|jdd	g�d
d�|�|j�d|jddg�d
d�dS)
NZignoreregex)�	user johnr��Dont match me!r�r�r�r�r:ZaddignoreregexzInvalid [regexrrr�r�r4rrr"�testJailIgnoreRegexWs0��������zTransmitter.testJailIgnoreRegex�Filter�zCurrently failedr�zTotal failedr�	File list�Actions�zCurrently bannedr�zTotal bannedr�Banned IP listc	Cs�|jg}|�|j�dg�ddt|�fdd�|�fgf�|j�dt�|�	d�|�|j�dg�ddt|�fdd�|�fgf�|�|j�ddg�ddt|�fdd�|�f|j
|j
d�gf�|�|j�d	g�dtd
d
gtd
d
gd�f�dS)Nr�rzNumber of jailz	Jail listz, r�r�)r*r�Zstatsr�)r1rCr0rDr�r�r.r2r3�append�_JAIL_STATUS)r�jailsrrr"�
testStatus|s(�
�����zTransmitter.testStatuscCs$|�|j�d|jg�d|jf�dS)Nr�r�rCr0rDr1rr4rrr"�testJailStatus�s�zTransmitter.testJailStatuscCs&|�|j�d|jdg�d|jf�dS)Nr�Zbasicrrr4rrr"�testJailStatusBasic�s�zTransmitter.testJailStatusBasiccCs&|�|j�d|jdg�d|jf�dS)Nr��INVALIDrrr4rrr"�testJailStatusBasicKwarg�s�z$Transmitter.testJailStatusBasicKwargc
Cs�tj��zddl}ddl}Wnty6dg}Yn0g}|�|j�d|j	dg�dddddgfgfd	d
ddgfd
|fd|fd|fgfgf�dS)Nr�errorr�Zcymrur�r�r�r�r�rrrzBanned ASN listzBanned Country listzBanned RIR list)
rtruZSkipIfNoNetworkZ
dns.exceptionZdns.resolver�ImportErrorrCr0rDr1)rZdnsrZrrr"�testJailStatusCymru�s2
�����zTransmitter.testJailStatusCymrucCs�d}gd�}gd�}|�|j�d|jd|g�d|f�|�|j�d|jdg�d	d|�t||�D].\}}|�|j�d|jd
|||g�d|f�qdt||�D],\}}|�|j�d|jd
||g�d|f�q�|�|j�d|jd
|ddg�d
�|�|j�d|jd
|dg�d
�|�|j�d|jd
|dg�dd	�|�|j�d|jd
|ddg�d�|�|j�d|jd
|dg�d�|�|j�d|jd|g�d�|�|j�d|jddg�dd	�dS)N�TestCaseAction)ZactionstartZ
actionstopZactioncheckZ	actionbanZactionunban)zAction StartzAction StopzAction Checkz
Action BanzAction Unbanr:�	addactionrr;rr�actionZKEY�VALUE)rrZ
InvalidKey�timeoutZ10)r�
Z	delactionrdz
Doesn't exist)rCr0rDr1�zip)rrZcmdListZcmdValueListrErZrrr"�
testAction�s��
����������������������zTransmitter.testActioncCs0d}|j�d|jd|tj�tdd�dg�}|�|d|f�|�|j�d|jd	|g�d
ddg�|�|j�d|jd
|dg�d�|�|j�d|jd
|dg�d�|�|j�d|jd|g�d
gd��|�|j�d|jd
|ddg�d�|�|j�d|jd
|ddg�d�|�|j�d|jd
|ddg�d�dS)Nrr:r�action.dz	action.pyz{"opt1": "value"}rr;ZactionpropertiesrZopt1Zopt2r)rrZrdZ
actionmethods)�banZrebanr�rc�
testmethod�unbanrz{"text": "world!"})rzHello world! value�
another value)rr)rzHello world! another value)	r0rDr1r�r�r�r�rCrR)rr�outrrr"�$testPythonActionMethodsAndProperties�sl
������������������z0Transmitter.testPythonActionMethodsAndPropertiescCs |�|j�ddg�dd�dS)Nr
�COMMANDrrrer4rrr"�testNOKszTransmitter.testNOKcCs |�|j�gd��dd�dS)N)r:r
rrrrer4rrr"�
testSetNOKs�zTransmitter.testSetNOKcCs |�|j�gd��dd�dS)N)r;r
rrrrer4rrr"�
testGetNOK"s�zTransmitter.testGetNOKcCs |�|j�gd��dd�dS)N)r�r
rrrrer4rrr"�
testStatusNOK&s�zTransmitter.testStatusNOKc
Cs6tst�d��d}|j�|d�gd�}t|�D]>\}}|�|j�d|d|g�ddd	�|d|d
�D�f�q0t|�D]>\}}|�|j�d|d|g�ddd	�||d
d�D�f�qxd
}|�|j�d|d|g�d|ggf�|�|j�d|d|g�d|g|ggf�|�|j�d|d|g�d|ggf�|�|j�d|d|g�dgf�gd�}|�|j�d|dg|�dd
gddggf�|�|j�d|dg|dd
��dddggf�|�|j�d|dg|dd��dgf�d}|j�d|d|g�}|�	t
|d
t��d}|j�d|d|g�}|�	t
|d
t��dS)N�&systemd python interface not availabler�Zsystemd��_SYSTEMD_UNIT=sshd.servicezTEST_FIELD1=ABCz_HOSTNAME=example.comr:�addjournalmatchrcSsg|]
}|g�qSrr�r��valrrr"r�8r�z0Transmitter.testJournalMatch.<locals>.<listcomp>r�deljournalmatchcSsg|]
}|g�qSrrr'rrr"r�=r��
_COMM=sshd)r*�+r%�_UID=0r%r,rzThis isn't valid!zFIELD=NotPresent)rrt�SkipTestr.r2rQrCr0rDrnr��
ValueError)rr1rVrYrZr�rrr"�testJournalMatch*s�

��
��
�
�
��
�
�
��������
�
�zTransmitter.testJournalMatchc
Cs�tst�d��|�d�d}|j�|d�gd�}t|�D]>\}}|�|j�	d|d|g�dd	d
�|d|d�D�f�q:t|�D]>\}}|�|j�	d|d|g�dd
d
�||dd�D�f�q�dS)Nr#Tr�zsystemd[journalflags=2]r$r:r&rcSsg|]
}|g�qSrrr'rrr"r��r�z5Transmitter.testJournalFlagsMatch.<locals>.<listcomp>rr)cSsg|]
}|g�qSrrr'rrr"r��r�)
rrtr-rnr.r2rQrCr0rD)rr1rVrYrZrrr"�testJournalFlagsMatchqs(


��
��z!Transmitter.testJournalFlagsMatchN)2r%r&r'rbrfrgrhrqryr�r�r�r�r�r�r�r�r�r�r�r�rr�r�r�r�r�r�r�r�r�r�r�r�r�r�rrrr	rrrrrr r!r"r/r0rrrr"r_�sr
0
+*
%���
<$Gr_csXeZdZeZ�fdd�Zdd�Zdd�Zdd�Zd	d
�Z	dd�Z
d
d�Zdd�Z�Z
S)�TransmitterLoggingcs6tt|���|j�d�|j�d�|j�d�dS)N�	/dev/null�CRITICALrm)r+r1r,r.r$r#ZsetSyslogSocketr4r5rr"r,�szTransmitterLogging.setUpcCs�g}td�D],}t�dd�}|�|d�t�|d�q|D]}|�d|�q>d}|�d|�|j�	gd��|D]}t�
|�qt|�dd	d
�|�ddd�dS)
Nr�rZtransmitterrr�	logtarget�/this/path/should/not/exist)r:r4r2zSTDOUT[format="%(message)s"]�STDOUTz!STDERR[datetime=off, padding=off]�STDERR)�ranger�r�rr�r�rLrMr0rD�remove)rZ
logTargets�_ZtmpFileZ	logTargetrZrrr"�
testLogTarget�sz TransmitterLogging.testLogTargetcCsJtj�d�st�d��|�|j��d�|�dd�|�|j��d�dS)N�/dev/logz'/dev/log' not presentrmr4�SYSLOG)	r�r��existsrtr-rnr.ZgetSyslogSocketrLr4rrr"�testLogTargetSYSLOG�s

z&TransmitterLogging.testLogTargetSYSLOGcCs|�dd�dS)N�syslogsocketz/dev/log/NEW/PATH)rLr4rrr"�testSyslogSocket�sz#TransmitterLogging.testSyslogSocketc	Csd|�dd�|�dd�|�dd�|jdiitdtd�dd	�d
�t��dvoXtj�d���dS)
Nr@r5r4r=r<rzFailed to change log targetT)rHrGr@)TF)ZLinux)r4r=)	rLrM�dict�	Exception�platform�systemr�r�r>r4rrr"�testSyslogSocketNOK�s����z&TransmitterLogging.testSyslogSocketNOKcCs�|�dd�|�dd�|�dd�|�dd�|�dd�|�dd�|�dd�|�dd	�|�dd
�|�ddd
�|�dd�dS)
NZloglevelZ
HEAVYDEBUGZ
TRACEDEBUG�9�DEBUG�INFOZNOTICE�WARNING�ERRORr3ZcRiTiCaLZBird)rLrMr4rrr"�testLogLevel�szTransmitterLogging.testLogLevelc	Cs�|�|j�dg�d��zt�d�\}}t�|�|j�d�|�|j�dd|g�d|f�t	d�}|�
d	��z�t�d�\}}t�|�t�||�|�
d
�|�|j�dg�d�|�
d�t|d���}t
|�}|�d
�dkr�t
|�}|�|�d��t
|�}|�|�d��z:t
|�}|�d�dk�r<|�t|j�n|�d|�Wnt�y`Yn0Wd�n1�sx0Yt|d��V}t
|�}|�d�dk�r�t
|�}|�|�d��|�t|j�|��Wd�n1�s�0YWt�|�nt�|�0Wzt�|�Wnt�y2Yn0n&zt�|�Wnt�yXYn00|�|j�gd��d�|�|j�dg�d�dS)NZ	flushlogs)rzrolled overzfail2ban.logrJr:r4rrzBefore file movedzAfter file movedzAfter flushlogs�rzChanged logging target tozBefore file moved
zAfter file moved
zCommand: ['flushlogs']zCException StopIteration or Command: ['flushlogs'] expected. Got: %szrollover performed onzAfter flushlogs
)r:r4r7)rr7)rZflushed)rCr0rDr�r�r�r�r.r#rZwarning�rename�open�next�findrn�endswith�assertRaises�
StopIteration�__next__�failr9�OSError)	r�f�fn�l�f2Zfn2Zline1Zline2rYrrr"�
testFlushLogs�s^




&*�z TransmitterLogging.testFlushLogscCs�|jddd|jd�|jddd|jd�|jdd	d
|jd�|jddd|jd�|jd
d|jd�|jddd|jd�|jddd|jd�dS)Nzbantime.increment�trueTr�zbantime.rndtimeZ30minr�zbantime.maxtimez	1000 daysi\&zbantime.factorr�zbantime.formulazGban.Time * math.exp(float(ban.Count+1)*banFactor)/math.exp(1*banFactor)zbantime.multipliersz1 5 30 60 300 720 1440 2880zbantime.overalljailsr�r4rrr"�testBanTimeIncr�sz"TransmitterLogging.testBanTimeIncr)r%r&r'rr-r,r;r?rArFrLr\r^r^rrr5r"r1�s
0r1c@seZdZdd�ZdS)�	JailTestscCsd}t|�}|�|j|�dS)NZveryveryverylongname)r
rCr�)rZlongnamerIrrr"�testLongNameszJailTests.testLongNameN)r%r&r'r`rrrr"r_sr_c@s$eZdZdd�Zdd�Zdd�ZdS)�
RegexTestscCs.|�ttd�|�ttd�|�ttd�dS)Nr�� �	)rSrrr4rrr"�testInitszRegexTests.testInitcCs8|�ttd���dd�d�|�ttd���d��dS)N�a�"�'z
Regex('a')r�z
FailRegex()rCrUr�replacernr�
startswithr4rrr"�testStrszRegexTests.testStrcCs|�ttd�|�ttd�|�td��|�td��|�td��|�td��|�td��|�td��|�td	��td
�}|�|���|�dg�|�|���|�t|j�td�}|�|���|�d
g�|�|���|�t|j�td�}|�|���|�dg�|�|���|�|��d�|�dg�|�|���|�|��d�|�dg�|�|���|�|��d�td�}|�|���|�dg�|�|���|�|�	�d�td�}|�dg�|�
�}|�||jfd�|�dg�|�
�}|�||jfd�|�dg�|�
�}|�||jfd�|�dg�|�
�}|�||jfd�td �}|�d!g�|�
�}|�||jfd"�|�d#g�|�
�}|�||jfd�|�d$g�|�
�}|�||jfd%�|�d&g�|�
�}|�||jfd'�dS)(Nr�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%%r�r�z#%%inet(?:=<F-IP4/>|inet6=<F-IP6/>)?)z%%inet=testr�r�z(%%(?:inet(?:=<IP4>|6=<IP6>)?|dns=<DNS>?))z%%inet=192.0.2.1r�r�r�)z%%inet6=2001:DB8::r�r��
2001:DB8::)z%%dns=example.comr�r�zexample.com)z%test id group: user:(test login name)r�r�ztest login namez%%net=<SUBNET>)z%%net=192.0.2.1r�r�)r��inet4)z%%net=192.0.2.1/24r�r�)z192.0.2.0/24rl)z%%net=2001:DB8:FF:FF::1r�r�)z2001:db8:ff:ff::1�inet6)z%%net=2001:DB8:FF:FF::1/60r�r�)z2001:db8:ff:f0::/60rmz%%ip="<ADDR>", mask="<CIDR>?")z%%ip="192.0.2.2", mask=""r�r�)r�rl)z%%ip="192.0.2.2", mask="24"r�r�)z"%%ip="2001:DB8:2FF:FF::1", mask=""r�r�)z2001:db8:2ff:ff::1rm)z$%%ip="2001:DB8:2FF:FF::1", mask="60"r�r�)z2001:db8:2ff:f0::/60rm)rSrrrnr`Z
hasMatched�searchZgetHostrCZ	getFailIDZgetIPZ	familyStr)r�frr�rrr"�testHostszzRegexTests.testHostN)r%r&r'rdrjrprrrr"rasrac@seZdZdd�ZdS)�
_BadThreadcCstd��dS)Nzrun bad thread exception)r�r4rrr"�runesz_BadThread.runN)r%r&r'rrrrrr"rqdsrqc@s$eZdZdd�Zdd�Zdd�ZdS)�LoggingTestscCs*td�}|�|jjd�|�|jd�dS)Nzfail2ban.some.string.with.namerz
fail2ban.name)rrC�parentr�)rZ
testLogSysrrr"�testGetF2BLoggerkszLoggingTests.testGetF2BLoggercs�tj}g��fdd�t_z<t�}|��|����t���fdd�d��W|t_n|t_0��d���	t
��d���	�ddt�dS)Ncs
��|�Sr)r)r r=rr"r�sr�z5LoggingTests.testFail2BanExceptHook.<locals>.<lambda>cst��o��d�S)N�Unhandled exception)r�Z
_is_loggedr�rr>rr"r�xr�r�rvrr)�sys�__excepthook__rqr�r�rnr
r�rorCr�r�)rZprev_exchookZ	badThreadrrwr"�testFail2BanExceptHookps
z#LoggingTests.testFail2BanExceptHookc
Cs�g}t�dd�\}}t�|�|�|�t�dd�\}}t�|�|�|�t�}zT|j||dd�|�|���|�	d�W|�
�|D]}tj�|�r�t�
|�q�n*|�
�|D]}tj�|�r�t�
|�q�0dS)Nz
fail2ban.sockzf2b-testzfail2ban.pidF)�forcezServer already running)r�r�r�r�rrr�r`raror8r�r>r9)rZ	tmp_filesZsock_fdZ	sock_nameZ
pidfile_fdZpidfile_namer.rXrrr"�testStartFailedSockExistss(



�z&LoggingTests.testStartFailedSockExistsN)r%r&r'rurzr|rrrr"rsisrs)�ActionReader�JailsReader�
CONFIG_DIRcs�eZdZ�fdd�Z�fdd�Z�fdd�Zddd	�Zd
d�Zdd
�Zdd�Z	dd�Z
dd�Zdd�Zddd�Z
dd�Z�ZS)�ServerConfigReaderTestscs tt|�j|i|��i|_dSr)r+r��__init__�#_ServerConfigReaderTests__share_cfgrr5rr"r��sz ServerConfigReaderTests.__init__cstt|���g|_dS)r)N)r+r�r,Z_execCmdLstr4r5rr"r,�szServerConfigReaderTests.setUpcstt|���dSr7)r+r�r9r4r5rr"r9�sz ServerConfigReaderTests.tearDownr�cCs6|�d�D]&}|�d�s&t�d|�q
t�|�q
dS)N�
�#zexec-cmd: `%s`T)�splitri�logSys�debug)r�realCmdrrZrrr"�_executeCmd�s

z#ServerConfigReaderTests._executeCmdcCsPt|d�sJt�}i|_dD].\}}t|�}|�d�tj�||�|j|<q|jS)NZ__aInfos))�ipv4r�)�ipv6rkr�)�hasattrrZ _ServerConfigReaderTests__aInfosrZ
setBanTime�_actionsr��
ActionInfo)r�dmyjail�tr��ticketrrr"�_testActionInfos�s

z(ServerConfigReaderTests._testActionInfoscCs2|j}|��}|D�]}||jD�]}||j|}t�d�t�d|d|j�t�d�t|tj�snq"|j	|_
t�d�|��|��t�d�|��|�
|d�t�d�|��|�|d�t�d�|��|�
|d	�t�d
�|��|�|d	�t�d�|��|��q"qdS)N�4# ==================================================�
# == %-44s ==� - �# === start ===�# === ban-ipv4 ===r��# === unban ipv4 ===�# === ban ipv6 ===r��# === unban ipv6 ===�# === stop ===)r�r�rr�r��_namer�r��
CommandActionr��
executeCmdrpr�rrrc)rr.r�aInfosrIrerrrr"�_testExecActions�s,


z(ServerConfigReaderTests._testExecActionsc	Cs�tjjdd�ttd|jd�}|�|���|�|���|j	dd�}t
�}|j}|j}|D�]}|ddkr\|ddkr�d|d	<n�t
|�d
kr�|ddkr�|d	dkr�tj�td
|d�}tj�|�s�tj�td�}||d
<nDtjj�r$t
|�d
k�r$|ddv�r$|d	dk�r$d|d<d|d
<z||�Wq\t�yh}z|�d||f�WYd}~q\d}~00q\tjj�s�|�|�dS)NT�Zstock)�basedirZforce_enable�share_config)Zallow_no_filesrr�rNrrr�r:r�Zlogsrr�)r:z	multi-setr�zDUMMY-REGEX <HOST>z"Command %r has failed. Received %r)rtru�SkipIfCfgMissingr~rr�rn�read�
getOptions�convertrr/�_Transmitter__commandHandlerr�r�r�r�r�r>rvrCrVr�)	rr�streamr.r0�
cmdHandlerrErY�errr"�testCheckStockJailActions�s@

$


�
�
�*
z1ServerConfigReaderTests.testCheckStockJailActionscCsb|�d|�}t|�\}}d|dgg}t||||jtd�}|�|���|�i�|�|�	��|S)Nz%(__name__)srNr)r�r�)
rhrr}r�rrnr�r��extendr�)rrI�actZactNameZactOptr�rrrr"�getDefaultJailStreams��
z,ServerConfigReaderTests.getDefaultJailStreamc
Cs�tjjdd�tj��ddl}t�}|j}|�tj�	t
dd��D]V}tj�|��dd�}|�
d||�}|D]}|�|�\}}	|�|d�qn|�|�qBdS)	NTr�rrz*.confz.confr�zj-)rtrur�Z
SkipIfFast�globrr/r�r�r�r�basenamerhr�rDrCr�)
rr�r.r0ZactCfgr�r�rEr[�resrrr"�testCheckStockAllActionss
z0ServerConfigReaderTests.testCheckStockAllActionscCs>tjjdd�ddddddd	d
ddd
ddddd�
fdddddddddddddddd�
fd d!d"d#d$d%d&d'd(d)d*d+�	fd,d-d"d#d.d/d0d1d2�fd3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdB�
fdCdDd5d6d7dEdFdGdHdIdJdKdLdMdNdB�
fdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]dB�
fd^d_d`dadSdbdcdddedfdgdhdidjdkdB�
fdldmd5d6dSdndodpdqdrdsdtdudvdwdB�
fdxdyd5d6dSdzd{d|d}d~dd�d�d�d�dB�
fd�d�d�d�d�d�d�d�d�d�d�d�d�d��fd�d�d�d�d�d�d�d�d�d�d�d�d�d��fd�d�d�d�d�d�d�d�d�d�d�d�d�d��fd�d�d�d�d�d�d�d�d�d�d�d�d�d�d��fd�d�d�d�d�d�d�d�d�d�d�d�d�d��fd�d�d�d�d�d�d�d�d�d�d�d�d�d��fd�d�d�d�d�d�d�d�d�d�d�d�dל
fd�d�d�d�d�d�d�d�d�d�d�d�dל
fd�d�d�d�d�d�d�d�d2�fd�d�d�d�d�d�d�d�d2�ff}t�}|j}|j}|D]>\}}}|�||�}|D] }	|�|	�\}
}|�|
d��q��q�|j	}|�
�}
|D�]@\}}}||jD�]&}||j|}t�
d�t�
d�|d�|j�t�
d�|�t|tj��|j|_|�d��|��|�d���r�|j|d�d�di�n4|�d���r�|�d���r�|j|d�|d�d�di�|�d��|�|
d��|�d���r|j|�d�|�d�d���|d�d�di�|�d���r8|j|d�d�di�|j|d�d�di�|j|�dd�di�|��d�|�|
d��|j|�dd�di�|j|�dd�di�|��d�|�|
�d�|�d���r�|j|�d�|�d�d���|d�d�di�|�d���r|j|d�d�di�|j|�dd�di�|j|�dd�di�|��d�|�|
�d�|j|�dd�di�|j|�dd�di�|��d	��r |��d
�|�|
d��d�|j|��d|�d�d���|�d	d�di�|��d
��r |�d
|�d	k�r |j|�d
d�di�|��d
��r�|��d�|�|
�d�d�|j|��d|�d�d���|�d
d�di�|��d	��r�|�d	|�d
k�r�|j|�d	d�di�|��d��r�|��d�|��|j|�dd�di�|��d�|��|��d��r|j|�d�d��|�dd�di��q�q�dS(NTr�z
j-w-nft-mpzQnftables-multiport[name=%(__name__)s, port="http,https", protocol="tcp,udp,sctp"])zip Z	ipv4_addrzaddr-)zip6 Z	ipv6_addrzaddr6-)�`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�flushrc�	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:: \}`zj-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�rcr�r�r�r�zj-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�zj-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�rcr�r�r�r�r�r�zj-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`zj-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�)zM`ipset -exist create f2b-j-w-iptables-ipset hash:ip timeout 0 maxelem 65536 `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; }`)zZ`ipset -exist create f2b-j-w-iptables-ipset6 hash:ip timeout 0 maxelem 65536 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::`zj-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 )zP`ipset -exist create f2b-j-w-iptables-ipset-ap hash:ip timeout 0 maxelem 65536 `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; })z]`ipset -exist create f2b-j-w-iptables-ipset-ap6 hash:ip timeout 0 maxelem 65536 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`zj-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`zj-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�rcr�r�r�r�r�r�zj-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 $protocol 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�rcr�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-`zport="http,https"zb`echo "block quick $protocol 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 $protocol 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�rcr�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`zj-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 )zJ`ipset -exist create f2b-j-w-fwcmd-ipset hash:ip timeout 0 maxelem 65536 `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`)zW`ipset -exist create f2b-j-w-fwcmd-ipset6 hash:ip timeout 0 maxelem 65536 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�rcr�r�r�r�zj-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 )zM`ipset -exist create f2b-j-w-fwcmd-ipset-ap hash:ip timeout 0 maxelem 65536 `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`)zZ`ipset -exist create f2b-j-w-fwcmd-ipset-ap6 hash:ip timeout 0 maxelem 65536 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`rr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�z# === check ipv4 ===Zfamilyz*-checkr�z# === check ipv6 ===r�z# === flush ===r�rc)rtrur�rr/r�r�rDrCr�r�rr�r�r�rnr�r�r�r�r�rpr�r;ror�rrZ_invariantCheckr�rc)r�testJailsActionsr.r0r�rIr��testsr�rEr[r�rr�rerrrr"�testCheckStockCommandActions.sr	�1�.���3�3�1�1�3�3
�&����(�(�$�$��������a



4 4 ,$,$z4ServerConfigReaderTests.testCheckStockCommandActionscCs`|}t|t�r|d}t�dd|�}t�ddd�|d�}t|t�rL||d<n|}tjj||d�S)	Nrz\)\s*\|\s*(\S*mail\b[^\n]*)z$) | cat; printf "\\n... | "; echo \1z\bADDRESSES=\$\(dig\s[^\n]+cSsdS)Nz@ADDRESSES="abuse-1@abuse-test-server, abuse-2@abuse-test-server"r)�mrrr"r�nr�z9ServerConfigReaderTests._executeMailCmd.<locals>.<lambda>r)r)r�rS�re�subr�r�r�)rr�rrErrr"�_executeMailCmdes
��

z'ServerConfigReaderTests._executeMailCmdcCstjjdd�ddtj�td�ddtj�td�d	d
difdd
tj�td�ddtj�td�d	d
difddtj�td�ddtj�td�dddd�fddddd�ff}t�}|j}|j	}|D]:\}}}|�
||�}|D]}	|�|	�\}
}|�|
d�q�q�|j
}td�}
td�}t�}|D]�\}}}||jD]�}||j|}t�d�t�d|d|j�t�d�|j|_d
|
fd|ffD]t\}}|�|��s��q�|�d |�t|�}|�d!�|�d"d#g�tj�||�}|�|�|j||d$di��q��qD�q0dS)%NTr�zj-mail-whois-linesz\mail-whois-lines[name=%(__name__)s, grepopts="-m 1", grepmax=2, mailcmd="mail -s", logpath="r�r�z	         ztestcase01a.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.10�etestcase01a.log:Dec 31 11:55:01 [sshd] error: PAM: Authentication failure for test from 87.142.124.10zj-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�zj-complain-abusez�complain[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.10�VDec 31 11:59:59 [sshd] error: PAM: Authentication failure for kevin from 87.142.124.10�UDec 31 11:55:01 [sshd] error: PAM: Authentication failure for test from 87.142.124.10�8mail abuse-1@abuse-test-server abuse-2@abuse-test-server)r�z6We have detected abuse from the IP address 2001:db8::1r�rz
87.142.124.10z2001:db8::1r�r�r�r�z# === %s ===r}r�r�r�) rtrur�r�r�r�r�rr/r�r�rDrCr�r	rrr�r�r�r�r�r;rprZ
setAttemptZ
setMatchesr�r�r�rro)rr�r.r0r�rIr�r�r�rEr[r�rr�r�r�rer�testr�r�rrr"�testComplexMailActionMultiLogws��������������������		��	���_


�
z5ServerConfigReaderTests.testComplexMailActionMultiLog)r�)r�)r%r&r'r�r,r9r�r�r�r�r�r�r�r�r�r^rrr5r"r��s$

"3=
r�)A�
__author__Z
__copyright__Z__license__rtrwr�r�r�rxrDZserver.failregexrrrr.rr�Z
server.serverrZserver.ipdnsrr	Zserver.jailr
Zserver.jailthreadrZ
server.ticketrZserver.utilsr
Z	dummyjailrZutilsrrrZhelpersrrrr�rrr
r�r��dirname�__file__r�r3r�rr(r_r1ZTestCaser_rarqrsZclientreadertestcaser}r~rr�rrrr"�<module>sV
^l~	U*