HEX
Server: Apache
System: Linux srv1.prosuiteplus.com 5.4.0-216-generic #236-Ubuntu SMP Fri Apr 11 19:53:21 UTC 2025 x86_64
User: prosuiteplus (1001)
PHP: 8.3.20
Disabled: NONE
Upload Files
File: //lib/python3/dist-packages/fail2ban/tests/__pycache__/servertestcase.cpython-38.pyc
U

]^�P�@s�dZdZdZddlZddlZddlZddlZddlZddlZddl	Z	ddl
mZmZm
Z
ddlmZddlmZdd	lmZdd
lmZddlmZddlmZdd
lmZddlmZddlm Z m!Z!m"Z"ddl#m$Z$m%Z%m&Z&ddl'm(Z(zddlm)Z)Wne*k
�rdZ)YnXej+�,ej+�-e.�d�Z/dZ0e$d�Z1Gdd�de�Z2Gdd�de �Z3Gdd�de3�Z4Gdd�de3�Z5Gdd �d ej6�Z7Gd!d"�d"ej6�Z8Gd#d$�d$e�Z9Gd%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)�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�?/usr/lib/python3/dist-packages/fail2ban/tests/servertestcase.py�setLogLevel<szTestServer.setLogLevelcOsdSrrrrrr!�setLogTarget?szTestServer.setLogTargetN)�__name__�
__module__�__qualname__r"r#rrrr!r;srcsLeZdZ�fdd�Z�fdd�Zdd	d
�Zddd�Zd
d�Zdd�Z�Z	S)�TransmitterBasecs2tt|���|jj|_d|_|j�|jt�dS)�Call before every test case.Z	TestJail1N)	�superr'�setUp�server�_Server__transm�transm�jailName�addJail�FAST_BACKEND�r��	__class__rr!r*Es
zTransmitterBase.setUpcs|j��tt|���dS�zCall after every test case.N)r+�quitr)r'�tearDownr1r2rr!r6Ns
zTransmitterBase.tearDownrrNFc
s�d||g}d|g}|dk	r2|�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�getNr
rcs�rt|�S|S)zPrepare value for comparison)�repr��x��repr_rr!�vasz%TransmitterBase.setGetTest.<locals>.vr)�insert�assertEqualr-�proceed)
r�cmd�inValue�outValue�outCode�jailr=�setCmd�getCmdr>rr<r!�
setGetTestTs
 zTransmitterBase.setGetTestcCsvd||g}d|g}|dk	r2|�d|�|�d|�|j�|�d}|�|j�|�dd�|�|j�|�d|f�dS)Nr7r8r
r)r?r-rAr@)rrBrCrFrGrHZ	initValuerrr!�
setGetTestNOKjs
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�delr8rr7r
r)�level)r@r-rA�	enumerate�assertSortedEqual�list�map�str)	rrB�valuesrF�cmdAdd�cmdDel�n�value�retrrr!�jailAddDelTestws �@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)NrKrLr8rr7r
)r@r-rArN)	rrBZinValuesZ	outValuesrFrTrUrVrWrrr!�jailAddDelRegexTest�s0�����z#TransmitterBase.jailAddDelRegexTest)rrNF)N)
r$r%r&r*r6rIrJrYrZ�
__classcell__rrr2r!r'Cs	


r'csxeZdZ�fdd�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#dAdB�Z$dCdD�Z%dEdF�Z&dGdH�Z'dIdJ�Z(dKdL�Z)dMdN�Z*dOdP�Z+dQdR�Z,dSdT�Z-dUdV�Z.dWdX�Z/�Z0S)Y�Transmittercst�|_tt|���dSr)rr+r)r\r*r1r2rr!r*�szTransmitter.setUpcCs|�|j���dSr)�assertFalser+�	isStartedr1rrr!�testServerIsNotStarted�sz"Transmitter.testServerIsNotStartedcCs|�|j�dg�d�dS)N�stop�rN�r@r-rAr1rrr!�testStopServer�szTransmitter.testStopServercCs|�|j�dg�d�dS)NZping)rZpongrbr1rrr!�testPing�szTransmitter.testPingcCs |�|j�dg�dtjf�dS)Nrr)r@r-rArr1rrr!�testVersion�szTransmitter.testVersioncCs|tjjs`t��}|�|j�ddg�d�t��}||}|jd|koNdknd|d�n|�|j�ddg�d�dS)	N�sleepz0.1rag
ףp=
�?g�������?zSleep was %g sec)�msgz0.0001)�unittest�F2B�fast�timer@r-rA�
assertTrue)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
�ddd
g�d�|�|j
�ddg�d�|�|j
�dddg�d�|�|j
�ddg�d�|�|j
�dd	dg�d�|�|j
�dd	g�d�|j�
|jt�|�|j
�ddd
g�d�tjj�s�t�|�t�|�dS)Nz.dbZ	fail2ban_z:memory:ZdbfileZdbmaxmatchesZ100�dZLIZARDZ
dbpurgeage�600�Xr7�Nonerar8�500)rhriZ	memory_db�tempfile�mkstemprJr+ZdelJailr.rIr/r0r@r-rA�os�close�unlink)rZtmpZtmpFilenamerrr!�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�dd
dg�dd�dS)N�	TestJail2�	TestJail3Z	TestJail4rKrrzinvalid backendr
�auto�--all�r@r-rAr.)rZjail2Zjail3Zjail4rrr!�testAddJail�s0�����zTransmitter.testAddJailcsp���j�d�jg�d�t�tj���t�	�fdd�d�����j�d�jg�d���
�j�jj�dS)N�startracs&�j�d�o$t�j�d�jg�t�S)Nr
�status�r+ZisAlive�
isinstancer-rAr.�RuntimeErrorrr1rr!�<lambda>�z/Transmitter.testStartStopJail.<locals>.<lambda>�r`)
r@r-rAr.rkrfr�DEFAULT_SLEEP_TIMErl�wait_for�assertNotInr+�_Server__jailsr1rr1r!�testStartStopJail�s�
��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)
Nrzr�racs&�j�d�o$t�j�d�jg�t�S)Nrr�r�rr1rr!r�r�z2Transmitter.testStartStopAllJail.<locals>.<lambda>r�r`r}cst�jj�Sr)�lenr+r�rr1rr!r�r�)r+r/r0r@r-rAr.rkrfrr�rlr�r�r�r1rr1r!�testStartStopAllJails$��
�z Transmitter.testStartStopAllJailcCsb|�|j�d|jddg�d�|�|j�d|jddg�d�|�|j�d|jddg�dd	�dS)
Nr7ZidleZon�rTZoff�rFZCATrr
r~r1rrr!�testJailIdles���zTransmitter.testJailIdlecCsf|jddd|jd�|jddd|jd�|jddd|jd�|jdd	d
|jd�|jdd|jd�dS)NZfindtimeZ120�x�rFZ60�<Z30m�z-60i���ZDog�rIr.rJr1rrr!�testJailFindTime(s
zTransmitter.testJailFindTimecCsf|jddd|jd�|jddd|jd�|jddd|jd�|jdd	d
|jd�|jdd|jd�dS)NZbantimerprqr�Z50�2z-50i���z
15d 5h 30mi�ZCatr�r1rrr!�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�r1rrr!�testDatePattern6s.����zTransmitter.testDatePatterncCs*|jddd|jd�|jdd|jd�dS)NZlogtimezonezUTC+0400r�znot-a-time-zoner�r1rrr!�testLogTimeZoneBszTransmitter.testLogTimeZonecCs\|jdd|jd�|jdd|jd�|jdd|jd�d}|�|j�d|jd|g�d�dS)	NZusednsZyesr��warn�noZFishr7)rr�)rIr.r@r-rA�rrWrrr!�testJailUseDNSFs�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)Nr7�banip�	192.0.2.1�	192.0.2.2)rr�
Ban 192.0.2.1�
Ban 192.0.2.2T��all�waitZBadger�rr
z
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+�	startJailr.r@r-rA�assertLogged�pruneLogr1rrr!�
testJailBanIPQsF���������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)Nr7�attempt)r-rAr.)�ipZmatchesr1rr!r�qsz.Transmitter.testJailAttemptIP.<locals>.attempt�maxretry�5�r�)r
r)r�r��test failure %dr�z192.0.2.1:2z192.0.2.2:2Tr�cSsg|]}d|�qS)r�r)�.0�irrr!�
<listcomp>{sz1Transmitter.testJailAttemptIP.<locals>.<listcomp>)r��r�z192.0.2.2:5r�r�r�)r+r�r.rIr@r��assertNotLogged)rr�r�r�rr1r!�testJailAttemptIPnszTransmitter.testJailAttemptIPcs�d}�j�|t��j�|�dddgf�fdd�	}||gd�||dddgd	�||d
dddgd	�||ddd
dgd
�||dd
dgd�||dd
gd�||d
gd�dS)NZTestJailBanListrcs�|dk	r6���j�d|d|g�d��jd|dd�|dk	rl���j�d|d|g�d��jd|dd��j�j�d	|dgt|��d
|fdd�t�t��d
�dS)Nr7r�r�zBan %sTr�r�zUnban %sr8rF)Z
nestedOnlyr
)	r@r-rAr�rOrPrZsetTimerk)rFr�r�r�outListr1rr!�_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�rr�z192.168.0.1z<192.168.0.1 	2005-08-14 12:00:02 + 600 = 2005-08-14 12:10:02z192.168.1.10)r�r�)r�r�)r+r/r0r�)rrFr�rr1r!�testJailBanList�s6��������zTransmitter.testJailBanListcCsR|jddd|jd�|jddd|jd�|jddd|jd�|jdd	|jd�dS)
NZ
maxmatchesr�r�r��2r�-2����Duckr�r1rrr!�testJailMaxMatches�szTransmitter.testJailMaxMatchescCsR|jddd|jd�|jddd|jd�|jddd|jd�|jdd	|jd�dS)
Nr�r�r�r�r�rr�r�r�r�r1rrr!�testJailMaxRetry�szTransmitter.testJailMaxRetrycCsP|jddd|jd�|jddd|jd�|jdd|jd�|jdd|jd�dS)	NZmaxlinesr�r�r�r�rr�r�r�r1rrr!�testJailMaxLines�szTransmitter.testJailMaxLinescCsN|jdd|jd�|jdd|jd�|jddt|jd�|jdd|jd�dS)NZlogencodingzUTF-8r��asciir|ZMonkey)rIr.rrJr1rrr!�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.logr7�
addlogpathrr8Z
dellogpath�tail�headZbadgerr
)	rYrv�path�join�TEST_FILES_DIRr.r@r-rAr�rrr!�testJailLogPath�sj��
��������������zTransmitter.testJailLogPathcCs2d}|j�d|jd|g�}|�t|dt��dS)Nzthis_file_shouldn't_existr7r�r
)r-rAr.rlr��IOError)rrW�resultrrr!�testJailLogPathInvalidFile�s
�z&Transmitter.testJailLogPathInvalidFilecCsXtjdd�}|d}t�||�|j�d|jd|g�}|�t|dt	��t�
|�dS)NZtmp_fail2ban_broken_symlink)�prefixz.slinkr7r�r
)rtZmktemprv�symlinkr-rAr.rlr�r�rx)r�nameZsnamer�rrr!�testJailLogPathBrokenSymlink�s�z(Transmitter.testJailLogPathBrokenSymlinkcCs|�ddddg|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
dg�d
�|�|j�d|jd
g�d
�dS)NZignoreipr�z192.168.1.1z8.8.8.8r7Zaddignoreiprr8ZdelignoreipZ
ignoreselfr�Fr�)rYr.r@r-rAr�rrr!�testJailIgnoreIPsJ���������zTransmitter.testJailIgnoreIPcCs|jdd|jd�dS)NZ
ignorecommandzbin/ignore-command <ip>r��rIr.r1rrr!�testJailIgnoreCommand&sz!Transmitter.testJailIgnoreCommandcCs2|jdddddg|jd�|jddd|jd�dS)NZignorecachez%key="<ip>",max-time=1d,max-count=9999z<ip>i'i�Qr��r�r1rrr!�testJailIgnoreCache)s�zTransmitter.testJailIgnoreCachec
Cs�|�ddddgdt�d�dt�d�dt�d�g|j�|�|j�d	|jd
dg�dd
�|�|j�d	|jd
dg�dd
�dS)NZ	failregexzuser 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 againr7�addfailregexz
No host regexrr
i��rZrZ_resolveHostTagr.r@r-rAr1rrr!�
testJailRegex0s6���������zTransmitter.testJailRegexc	Csp|�ddddgddt�d�dg|j�|�|j�d|jdd	g�d
d�|�|j�d|jddg�d
d�dS)
NZignoreregexz	user johnr�zDont match me!r�r�r7ZaddignoreregexzInvalid [regexrr
r�r�r1rrr!�testJailIgnoreRegexHs6���������zTransmitter.testJailIgnoreRegexc	Cs�|jg}|�|j�dg�ddt|�fdd�|�fgf�|j�dt�|�	d�|�|j�dg�ddt|�fdd�|�fgf�dS)Nr�rzNumber of jailz	Jail listz, rz)
r.r@r-rAr�r�r+r/r0�append)r�jailsrrr!�
testStatus`s�
�zTransmitter.testStatusc
CsB|�|j�d|jg�dddddgfgfddd	d
gfgfgf�dS)Nr�r�Filter�zCurrently failedr�zTotal failedr�	File list�Actions�zCurrently bannedr�zTotal bannedr�Banned IP listr~r1rrr!�testJailStatusis�����zTransmitter.testJailStatusc
CsD|�|j�d|jdg�dddddgfgfdd	d
dgfgfgf�dS)Nr�Zbasicrr�r�r�r�r�r�r�r�r~r1rrr!�testJailStatusBasic{s�����zTransmitter.testJailStatusBasicc
CsD|�|j�d|jdg�dddddgfgfdd	d
dgfgfgf�dS)Nr��INVALIDrr�r�r�r�r�r�r�r�r~r1rrr!�testJailStatusBasicKwarg�s�����z$Transmitter.testJailStatusBasicKwargc
Cs�tj��zddl}ddl}Wntk
r8dg}YnXg}|�|j�d|j	dg�dddddgfgfd	d
ddgfd
|fd|fd|fgfgf�dS)Nr�errorr�Zcymrur�r�r�r�r�r�r�r�zBanned ASN listzBanned Country listzBanned RIR list)
rhriZSkipIfNoNetworkZ
dns.exceptionZdns.resolver�ImportErrorr@r-rAr.)rZdnsrWrrr!�testJailStatusCymru�s2
�����zTransmitter.testJailStatusCymrucCs�d}dddddg}ddd	d
dg}|�|j�d|jd
|g�d|f�|�|j�d|jdg�dd|�t||�D].\}}|�|j�d|jd|||g�d|f�qpt||�D],\}}|�|j�d|jd||g�d|f�q�|�|j�d|jd|ddg�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�TestCaseActionZactionstartZ
actionstopZactioncheckZ	actionbanZactionunbanzAction StartzAction StopzAction Checkz
Action BanzAction Unbanr7�	addactionrr8rr
�actionZKEY�VALUE)rr�Z
InvalidKey�timeoutZ10)r�
Z	delactionraz
Doesn't exist)r@r-rAr.�zip)rr�ZcmdListZcmdValueListrBrWrrr!�
testAction�s����
����������������������zTransmitter.testActioncCs�d}z:|j�d|jd|tj�tdd�dg�}|�|d|f�WnZtk
r�dt	j
krdd	kr�nn*d
|dkr�ddl}|�dt	j
�YdS�YnX|�|j�d
|jd|g�dddg�|�|j�d
|jd|dg�d�|�|j�d
|jd|dg�d�|�|j�d
|jd|g�dddddddg�|�|j�d|jd|ddg�d�|�|j�d|jd|ddg�d�|�|j�d|jd|ddg�d�dS) Nr�r7r��action.dz	action.pyz{"opt1": "value"}r)r�)rrr�z#__init__() keywords must be stringsr
z�Your version of Python %s seems to experience a known issue forbidding correct operation of Fail2Ban: http://bugs.python.org/issue2646  Upgrade your Python and meanwhile other intestPythonActionMethodsAndProperties will be skippedr8ZactionpropertiesZopt1Zopt2r�)rrWraZ
actionmethods�banZrebanr�r`Z
testmethod�unbanz{"text": "world!"})rzHello world! value�
another value)rr)rzHello world! another value)r-rAr.rvr�r�r�r@�AssertionError�sys�version_info�warningsr�rrO)rr��outrrrr!�$testPythonActionMethodsAndProperties�s�
��
�������������������z0Transmitter.testPythonActionMethodsAndPropertiescCs |�|j�ddg�dd�dS)Nr��COMMANDrr
rbr1rrr!�testNOK-szTransmitter.testNOKcCs"|�|j�dddg�dd�dS)Nr7r�rrr
rbr1rrr!�
testSetNOK0s�zTransmitter.testSetNOKcCs"|�|j�dddg�dd�dS)Nr8r�rrr
rbr1rrr!�
testGetNOK4s�zTransmitter.testGetNOKcCs"|�|j�dddg�dd�dS)Nr�r�rrr
rbr1rrr!�
testStatusNOK8s�zTransmitter.testStatusNOKc
Cs<tst�d��d}|j�|d�dddg}t|�D]>\}}|�|j�d|d|g�d	d
d�|d|d�D�f�q2t|�D]>\}}|�|j�d|d
|g�d	dd�||dd�D�f�qzd}|�|j�d|d|g�d	|ggf�|�|j�d|d|g�d	|g|ggf�|�|j�d|d
|g�d	|ggf�|�|j�d|d
|g�d	gf�ddddg}|�|j�d|dg|�d	dgddggf�|�|j�d|d
g|dd��d	ddggf�|�|j�d|d
g|dd��d	gf�d}|j�d|d|g�}|�	t
|dt��d}|j�d|d
|g�}|�	t
|dt��dS)N�&systemd python interface not availablerzZsystemd�_SYSTEMD_UNIT=sshd.service�TEST_FIELD1=ABC�_HOSTNAME=example.comr7�addjournalmatchrcSsg|]
}|g�qSrr�r��valrrr!r�Jsz0Transmitter.testJournalMatch.<locals>.<listcomp>r
�deljournalmatchcSsg|]
}|g�qSrrrrrr!r�Osz
_COMM=sshd�+z_UID=0rzThis isn't valid!zFIELD=NotPresent)rrh�SkipTestr+r/rNr@r-rArlr��
ValueError)rr.rSrVrWr�rrr!�testJournalMatch<s�
�
��
��
�
�
��
�
�
���������
�
�zTransmitter.testJournalMatchc
Cs�tst�d��|�d�d}|j�|d�dddg}t|�D]>\}}|�|j�	d|d	|g�d
dd�|d|d
�D�f�q<t|�D]>\}}|�|j�	d|d|g�d
dd�||d
d�D�f�q�dS)NrTr{zsystemd[journalflags=2]rrrr7rrcSsg|]
}|g�qSrrrrrr!r��sz5Transmitter.testJournalFlagsMatch.<locals>.<listcomp>r
rcSsg|]
}|g�qSrrrrrr!r��s)
rrhrrlr+r/rNr@r-rA)rr.rSrVrWrrr!�testJournalFlagsMatch�s.

�
��
��z!Transmitter.testJournalFlagsMatch)1r$r%r&r*r_rcrdrernryrr�r�r�r�r�r�r�r�r�r�rr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r
rr
rrrrr[rrr2r!r\�sZ0
+*
%	<4Gr\csTeZdZ�fdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
�ZS)�TransmitterLoggingcs>t�|_tt|���|j�d�|j�d�|j�d�dS)N�	/dev/null�CRITICALr|)rr+r)rr*r#r"ZsetSyslogSocketr1r2rr!r*�s
zTransmitterLogging.setUpcCs�g}td�D],}t�dd�}|�|d�t�|d�q|D]}|�d|�q>d}|�d|�|j�	ddd	g�|D]}t�
|�qv|�dd
d�|�ddd
�dS)Nr�rZtransmitterr
r�	logtarget�/this/path/should/not/existr7rzSTDOUT[format="%(message)s"]ZSTDOUTz!STDERR[datetime=off, padding=off]�STDERR)�rangertrur�rvrwrIrJr-rA�remove)rZ
logTargets�_ZtmpFileZ	logTargetrWrrr!�
testLogTarget�sz TransmitterLogging.testLogTargetcCsJtj�d�st�d��|�|j��d�|�dd�|�|j��d�dS)N�/dev/logz'/dev/log' not presentr|r �SYSLOG)	rvr��existsrhrrlr+ZgetSyslogSocketrIr1rrr!�testLogTargetSYSLOG�s

z&TransmitterLogging.testLogTargetSYSLOGcCs|�dd�dS)N�syslogsocketz/dev/log/NEW/PATH)rIr1rrr!�testSyslogSocket�sz#TransmitterLogging.testSyslogSocketcCs`|�dd�|�dd�|�dd�|jditdtd�dd	�d
�t��dkoVtj�d��dS)
Nr+r!r r(r'r
zFailed to change log targetT)rErDr=)TF)ZLinux)r r()	rIrJ�dict�	Exception�platform�systemrvr�r)r1rrr!�testSyslogSocketNOK�s����z&TransmitterLogging.testSyslogSocketNOKcCs�|�dd�|�dd�|�dd�|�dd�|�dd�|�dd�|�dd�|�dd	�|�dd
�|�ddd
�|�dd�dS)
NZloglevelZ
HEAVYDEBUGZ
TRACEDEBUG�9�DEBUG�INFOZNOTICE�WARNINGZERRORrZcRiTiCaLZBird)rIrJr1rrr!�testLogLevel�szTransmitterLogging.testLogLevelc	Cs:|�|j�dg�d��z�t�d�\}}t�|�|j	�
d�|�|j�dd|g�d|f�td�}|�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|�Wntk
�rbYnXW5QRXt|d��L}t|�}|�d�dk�r�t|�}|�|�d��|�t|j�|��W5QRXW5t�|�XW5zt�|�Wntk
�rYnXX|�|j�dddg�d�|�|j�dg�d�dS)NZ	flushlogs)rzrolled overzfail2ban.logr5r7r rrzBefore 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")rr")rZflushed)r@r-rArvr$�OSErrorrtrurwr+r"rZwarning�rename�open�next�findrl�endswith�assertRaises�
StopIteration�__next__�fail)	r�fn�f�lZfn2�f2Zline1Zline2rVrrr!�
testFlushLogs�sV




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�r1rrr!�testBanTimeIncr
sz"TransmitterLogging.testBanTimeIncr)r$r%r&r*r&r*r,r1r6rFrHr[rrr2r!r�s
0rc@seZdZdd�ZdS)�	JailTestscCsd}t|�}|�|j|�dS)NZveryveryverylongname)r	r@r�)rZlongnamerFrrr!�testLongNameszJailTests.testLongNameN)r$r%r&rJrrrr!rIsrIc@s$eZdZdd�Zdd�Zdd�ZdS)�
RegexTestscCs.|�ttd�|�ttd�|�ttd�dS)Nr�� �	)r>rrr1rrr!�testInit"szRegexTests.testInitcCs8|�ttd���dd�d�|�ttd���d��dS)N�a�"�'z
Regex('a')r�z
FailRegex()r@rRr�replacerlr�
startswithr1rrr!�testStr(szRegexTests.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/24rV)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::/60rWz%%ip="<ADDR>", mask="<CIDR>?")z%%ip="192.0.2.2", mask=""r�r�)r�rV)z%%ip="192.0.2.2", mask="24"r�r�)z"%%ip="2001:DB8:2FF:FF::1", mask=""r�r�)z2001:db8:2ff:ff::1rW)z$%%ip="2001:DB8:2FF:FF::1", mask="60"r�r�)z2001:db8:2ff:f0::/60rW)r>rrrlr]Z
hasMatched�searchZgetHostr@Z	getFailIDZgetIPZ	familyStr)r�frr�rrr!�testHost.szzRegexTests.testHostN)r$r%r&rNrTrZrrrr!rK srKc@seZdZdd�ZdS)�
_BadThreadcCstd��dS)Nzrun bad thread exception)r�r1rrr!�runvsz_BadThread.runN)r$r%r&r\rrrr!r[usr[c@s$eZdZdd�Zdd�Zdd�ZdS)�LoggingTestscCs*td�}|�|jjd�|�|jd�dS)Nzfail2ban.some.string.with.namerz
fail2ban.name)rr@�parentr�)rZ
testLogSysrrr!�testGetF2BLogger|szLoggingTests.testGetF2BLoggercs�tj}g��fdd�t_z6t�}|��|����t���fdd�d��W5|t_X��d���	t
��d���	�ddt�dS)Ncs
��|�Sr)r�)rr:rr!r��r�z5LoggingTests.testFail2BanExceptHook.<locals>.<lambda>cst��o��d�S)N�Unhandled exception)r�Z
_is_loggedr�rr;rr!r��r�r�r`r
r)r�__excepthook__r[r�r�rlrr�r�r@r�r�)rZprev_exchookZ	badThreadrrar!�testFail2BanExceptHook�s 
z#LoggingTests.testFail2BanExceptHookc
Cs�g}t�dd�\}}t�|�|�|�t�dd�\}}t�|�|�|�t�}z,|j
||dd�|�|���|�
d�W5|��|D]}tj�|�r�t�	|�q�XdS)Nz
fail2ban.sockzf2b-testzfail2ban.pidF)ZforcezServer already running)rtrurvrwr�rr5r�r)r$r�r]r^r�)rZ	tmp_filesZsock_fdZ	sock_nameZ
pidfile_fdZpidfile_namer+rCrrr!�testStartFailedSockExists�s 



z&LoggingTests.testStartFailedSockExistsN)r$r%r&r_rcrdrrrr!r]zsr])�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)�ServerConfigReaderTestscstt|�j||�i|_dSr)r)rh�__init__�#_ServerConfigReaderTests__share_cfgrr2rr!ri�sz ServerConfigReaderTests.__init__cstt|���g|_dS)r(N)r)rhr*Z_execCmdLstr1r2rr!r*�szServerConfigReaderTests.setUpcstt|���dSr4)r)rhr6r1r2rr!r6�sz ServerConfigReaderTests.tearDownr�cCs6|�d�D]&}|�d�s&t�d|�q
t�|�q
dS)N�
�#zexec-cmd: `%s`T)�splitrS�logSys�debug)r�realCmdr�rDrrr!�_executeCmd�s

z#ServerConfigReaderTests._executeCmdcCsPt|d�sJt�}i|_dD].\}}t|�}|�d�tj�||�|j|<q|jS)NZ__aInfos))�ipv4r�)�ipv6rUrq)�hasattrrZ _ServerConfigReaderTests__aInfosrZ
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 ===rr�# === unban ipv4 ===�# === ban ipv6 ===rs�# === unban ipv6 ===�# === stop ===)r�rzrrnro�_namer�ru�
CommandActionrq�
executeCmdr�r�rrr`)rr+r��aInfosrFrOr�rrr!�_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$|ddk�r$|d	dk�r$d|d<d|d
<z||�Wq\tk
�rf}z|�d||f�W5d}~XYq\Xq\tjj�s~|�|�dS)NT�Zstock)�basedirZforce_enable�share_config)Zallow_no_filesrr�rKrrr�r7r�Zlogsr
r�)r7z	multi-setr�zDUMMY-REGEX <HOST>z"Command %r has failed. Received %r)rhri�SkipIfCfgMissingrfrgrjrl�read�
getOptions�convertrr,�_Transmitter__commandHandlerr�rvr�r�r�r)rjr.rAr�)	rr��streamr+r-�
cmdHandlerrBrB�errr!�testCheckStockJailActions�s@

$


�
�
�&
z1ServerConfigReaderTests.testCheckStockJailActionscCsb|�d|�}t|�\}}d|dgg}t||||jtd�}|�|���|�i�|�|�	��|S)Nz%(__name__)srKr)r�r�)
rRrrerjrgrlr�r��extendr�)rrF�actZactNameZactOptr�r�rrr!�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-)rhrir�Z
SkipIfFast�globrr,rvr�r�rg�basenamerRr�rAr@r�)
rr�r+r-ZactCfgr�r�rBrX�resrrr!�testCheckStockAllActions+s
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@dA�fdBdCd5d6dDdEdFdGdHdIdJdKdLdMdA�fdNdOdPdQdRdSdTdUdVdWdXdYdZ�
fd[d\d]d^d_d`dadbdcdddedfdZ�
fdgdhd5d6didjdkdldmdndodpdqdrdA�fdsdtd5d6dudvdwdxdydzd{d|d}d~dA�fdd�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�dA�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�dZ�
fd�d�d�d�d�d�d�d�d�d�d�d�dZ�
ff}t�}|j}|j}|D]>\}}}|�||�}|D] }	|�|	�\}
}|�|
dݡ�q~�qd|j	}|�
�}
|D�]\}}}||jD�]�}||j|}t�
dޡt�
d�|d�|j�t�
dޡ|�t|tj��|j|_|�d�|��|�d��rX|j|d�d�di�n4|�d��r�|�d��r�|j|d�|d�d�di�|�d�|�|
d��|�d��r�|j|�d�d��|d�d�di�|�d��r�|j|d�d�di�|j|�d�d��|d�d�di�|j|d�d�di�|�d�|�|
d��|j|�d�d��|d�d�di�|j|d�d�di�|�d�|�|
d��|�d��r�|j|�d�d��|d�d�di�|�d��r�|j|d�d�di�|j|�d�d��|d�d�di�|j|d�d�di�|�d�|�|
d��|j|�d�d��|d�d�di�|j|d�d�di�|�d���r�|�d��|��|j|d�d�di�|�d��|��|�d���r�|j|d�d�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 \; \}`z9`for proto in $(echo 'tcp,udp,sctp' | sed 's/,/ /g'); do`z`done`)zG`nft add set inet f2b-table addr-set-j-w-nft-mp \{ type ipv4_addr\; \}`zj`nft add rule inet f2b-table f2b-chain $proto dport \{ http,https \} 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\; \}`zl`nft add rule inet f2b-table f2b-chain $proto dport \{ http,https \} 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�flushr`�	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-dummyzAdummy[name=%(__name__)s, init="==", target="/tmp/fail2ban.dummy"])z
family: inet4)z
family: inet6)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�r`r�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-mpzniptables-multiport[name=%(__name__)s, bantime="10m", port="http,https", protocol="tcp", chain="<known/chain>"])�
`iptables �icmp-port-unreachable)�`ip6tables �icmp6-port-unreachable)z$`iptables -w -N f2b-j-w-iptables-mp`z.`iptables -w -A f2b-j-w-iptables-mp -j RETURN`zU`iptables -w -I INPUT -p tcp -m multiport --dports http,https -j f2b-j-w-iptables-mp`)z%`ip6tables -w -N f2b-j-w-iptables-mp`z/`ip6tables -w -A f2b-j-w-iptables-mp -j RETURN`zV`ip6tables -w -I INPUT -p tcp -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`)zU`iptables -w -D INPUT -p tcp -m multiport --dports http,https -j f2b-j-w-iptables-mp`r�z$`iptables -w -X f2b-j-w-iptables-mp`zV`ip6tables -w -D INPUT -p tcp -m multiport --dports http,https -j f2b-j-w-iptables-mp`r�z%`ip6tables -w -X f2b-j-w-iptables-mp`)z>`iptables -w -n -L INPUT | grep -q 'f2b-j-w-iptables-mp[ \t]'`)z?`ip6tables -w -n -L INPUT | grep -q 'f2b-j-w-iptables-mp[ \t]'`)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�r�r�r�r`r�r�r�r�r�r�zj-w-iptables-apzZiptables-allports[name=%(__name__)s, bantime="10m", protocol="tcp", chain="<known/chain>"])z$`iptables -w -N f2b-j-w-iptables-ap`z.`iptables -w -A f2b-j-w-iptables-ap -j RETURN`z4`iptables -w -I INPUT -p tcp -j f2b-j-w-iptables-ap`)z%`ip6tables -w -N f2b-j-w-iptables-ap`z/`ip6tables -w -A f2b-j-w-iptables-ap -j RETURN`z5`ip6tables -w -I INPUT -p tcp -j f2b-j-w-iptables-ap`)�$`iptables -w -F f2b-j-w-iptables-ap`�%`ip6tables -w -F f2b-j-w-iptables-ap`)z4`iptables -w -D INPUT -p tcp -j f2b-j-w-iptables-ap`r�z$`iptables -w -X f2b-j-w-iptables-ap`z5`ip6tables -w -D INPUT -p tcp -j f2b-j-w-iptables-ap`r�z%`ip6tables -w -X f2b-j-w-iptables-ap`)z>`iptables -w -n -L INPUT | grep -q 'f2b-j-w-iptables-ap[ \t]'`)z?`ip6tables -w -n -L INPUT | grep -q 'f2b-j-w-iptables-ap[ \t]'`)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, bantime="10m", default-timeout=0, port="http", protocol="tcp", chain="<known/chain>"])z f2b-j-w-iptables-ipset )z f2b-j-w-iptables-ipset6 )z7`ipset create f2b-j-w-iptables-ipset hash:ip timeout 0`z�`iptables -w -I INPUT -p tcp -m multiport --dports http -m set --match-set f2b-j-w-iptables-ipset src -j REJECT --reject-with icmp-port-unreachable`)zE`ipset create f2b-j-w-iptables-ipset6 hash:ip timeout 0 family inet6`z�`ip6tables -w -I INPUT -p tcp -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 tcp -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 tcp -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?`ipset add f2b-j-w-iptables-ipset 192.0.2.1 timeout 600 -exist`)z3`ipset del f2b-j-w-iptables-ipset 192.0.2.1 -exist`)zA`ipset add f2b-j-w-iptables-ipset6 2001:db8:: timeout 600 -exist`)z5`ipset del f2b-j-w-iptables-ipset6 2001:db8:: -exist`)
r�r�r�r�r�r`r�r�r�r�zj-w-iptables-ipset-apzjiptables-ipset-proto6-allports[name=%(__name__)s, bantime="10m", default-timeout=0, chain="<known/chain>"])z f2b-j-w-iptables-ipset-ap )z f2b-j-w-iptables-ipset-ap6 )z:`ipset create f2b-j-w-iptables-ipset-ap hash:ip timeout 0`zu`iptables -w -I INPUT -m set --match-set f2b-j-w-iptables-ipset-ap src -j REJECT --reject-with icmp-port-unreachable`)zH`ipset create f2b-j-w-iptables-ipset-ap6 hash:ip timeout 0 family inet6`zx`ip6tables -w -I INPUT -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`)zu`iptables -w -D INPUT -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`zx`ip6tables -w -D INPUT -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`)zB`ipset add f2b-j-w-iptables-ipset-ap 192.0.2.1 timeout 600 -exist`)z6`ipset del f2b-j-w-iptables-ipset-ap 192.0.2.1 -exist`)zD`ipset add f2b-j-w-iptables-ipset-ap6 2001:db8:: timeout 600 -exist`)z8`ipset del f2b-j-w-iptables-ipset-ap6 2001:db8:: -exist`zj-w-iptablesz^iptables[name=%(__name__)s, bantime="10m", port="http", protocol="tcp", chain="<known/chain>"])z!`iptables -w -N f2b-j-w-iptables`z+`iptables -w -A f2b-j-w-iptables -j RETURN`z>`iptables -w -I INPUT -p tcp --dport http -j f2b-j-w-iptables`)z"`ip6tables -w -N f2b-j-w-iptables`z,`ip6tables -w -A f2b-j-w-iptables -j RETURN`z?`ip6tables -w -I INPUT -p tcp --dport http -j f2b-j-w-iptables`)�!`iptables -w -F f2b-j-w-iptables`�"`ip6tables -w -F f2b-j-w-iptables`)z>`iptables -w -D INPUT -p tcp --dport http -j f2b-j-w-iptables`r�z!`iptables -w -X f2b-j-w-iptables`z?`ip6tables -w -D INPUT -p tcp --dport http -j f2b-j-w-iptables`r�z"`ip6tables -w -X f2b-j-w-iptables`)z;`iptables -w -n -L INPUT | grep -q 'f2b-j-w-iptables[ \t]'`)z<`ip6tables -w -n -L INPUT | grep -q 'f2b-j-w-iptables[ \t]'`)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 -N f2b-j-w-iptables-new`z/`iptables -w -A f2b-j-w-iptables-new -j RETURN`zW`iptables -w -I INPUT -m state --state NEW -p tcp --dport http -j f2b-j-w-iptables-new`)z&`ip6tables -w -N f2b-j-w-iptables-new`z0`ip6tables -w -A f2b-j-w-iptables-new -j RETURN`zX`ip6tables -w -I INPUT -m state --state NEW -p tcp --dport http -j f2b-j-w-iptables-new`)�%`iptables -w -F f2b-j-w-iptables-new`�&`ip6tables -w -F f2b-j-w-iptables-new`)zW`iptables -w -D INPUT -m state --state NEW -p tcp --dport http -j f2b-j-w-iptables-new`r�z%`iptables -w -X f2b-j-w-iptables-new`zX`ip6tables -w -D INPUT -m state --state NEW -p tcp --dport http -j f2b-j-w-iptables-new`r�z&`ip6tables -w -X f2b-j-w-iptables-new`)z?`iptables -w -n -L INPUT | grep -q 'f2b-j-w-iptables-new[ \t]'`)z@`ip6tables -w -n -L INPUT | grep -q 'f2b-j-w-iptables-new[ \t]'`)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`)z�`if [ `id -u` -eq 0 ];then iptables -w -I INPUT -m recent --update --seconds 3600 --name f2b-j-w-iptables-xtre -j REJECT --reject-with icmp-port-unreachable;fi`)z�`if [ `id -u` -eq 0 ];then ip6tables -w -I INPUT -m recent --update --seconds 3600 --name f2b-j-w-iptables-xtre6 -j REJECT --reject-with icmp6-port-unreachable;fi`)z4`echo / > /proc/net/xt_recent/f2b-j-w-iptables-xtre`z�`if [ `id -u` -eq 0 ];then 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`z�`if [ `id -u` -eq 0 ];then ip6tables -w -D INPUT -m recent --update --seconds 3600 --name f2b-j-w-iptables-xtre6 -j REJECT --reject-with icmp6-port-unreachable;fi`)z3`test -e /proc/net/xt_recent/f2b-j-w-iptables-xtre`)z4`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�r`r�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 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�r`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-`zport="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::`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-ipsetzzfirewallcmd-ipset[name=%(__name__)s, bantime="10m", default-timeout=0, port="http", protocol="tcp", chain="<known/chain>"])z f2b-j-w-fwcmd-ipset )z f2b-j-w-fwcmd-ipset6 )z4`ipset 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`)zB`ipset 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 add f2b-j-w-fwcmd-ipset 192.0.2.1 timeout 600 -exist`)z0`ipset del f2b-j-w-fwcmd-ipset 192.0.2.1 -exist`)z>`ipset add f2b-j-w-fwcmd-ipset6 2001:db8:: timeout 600 -exist`)z2`ipset del f2b-j-w-fwcmd-ipset6 2001:db8:: -exist`zj-w-fwcmd-ipset-apzqfirewallcmd-ipset[name=%(__name__)s, bantime="10m", actiontype=<allports>, protocol="tcp", chain="<known/chain>"])z f2b-j-w-fwcmd-ipset-ap )z f2b-j-w-fwcmd-ipset-ap6 )z9`ipset create f2b-j-w-fwcmd-ipset-ap hash:ip timeout 600`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`)zG`ipset create f2b-j-w-fwcmd-ipset-ap6 hash:ip timeout 600 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 add f2b-j-w-fwcmd-ipset-ap 192.0.2.1 timeout 600 -exist`)z3`ipset del f2b-j-w-fwcmd-ipset-ap 192.0.2.1 -exist`)zA`ipset add f2b-j-w-fwcmd-ipset-ap6 2001:db8:: timeout 600 -exist`)z5`ipset del f2b-j-w-fwcmd-ipset-ap6 2001:db8:: -exist`rr{r|r}r~r�r�r�r�rrrr�r�r�r�r�r�r�rsr�r�r�r�r�r�z# === flush ===r�r`)rhrir�rr,r�r�rAr@r�rzrrnror�rlr�rur�rqr�r�r�r8r�r�rrr�r`)r�testJailsActionsr+r-r�rFr��testsr�rBrXr�r�r�rOr�rrr!�testCheckStockCommandActions?sV	�1�.���,�,�$�$�,�,�"����(�(�$������



  
 
  
 

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�r�z9ServerConfigReaderTests._executeMailCmd.<locals>.<lambda>r
)r�)r�rP�re�subrur�r�)rrpr�rBrrr!�_executeMailCmds 
��

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�rkz	         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 ===ror�r�r�) rhrir�rvr�r�r�rr,r�r�rAr@r�rrrrnror�r�r�r8r�rZ
setAttemptZ
setMatchesrur�rvrr�)rr�r+r-r�rFr�r�r�rBrXr�r�rrrsrwrOr�Ztestr�ryrrr!�testComplexMailActionMultiLog s��������������������		��	���_


�
z5ServerConfigReaderTests.testComplexMailActionMultiLog)r�)r�)r$r%r&rir*r6rqrzr�r�r�r�r�r�r�r[rrr2r!rh�s"

"3T
rh)@�
__author__Z
__copyright__Z__license__rhrkrtrvr�rr/Zserver.failregexrrrr+rruZ
server.serverrZserver.ipdnsrZserver.jailr	Zserver.jailthreadr
Z
server.ticketrZserver.utilsrZ	dummyjailrZutilsrrrZhelpersrrrr�rrr�r�r��dirname�__file__r�r0rnrr'r\rZTestCaserIrKr[r]Zclientreadertestcasererfrgrhrrrr!�<module>sX
[}	U*