HOME


Mini Shell 1.0
Redirecting to https://devs.lapieza.net/iniciar-sesion Redirecting to https://devs.lapieza.net/iniciar-sesion.
DIR: /lib/python3/dist-packages/fail2ban/server/__pycache__/
Upload File :
Current File : //lib/python3/dist-packages/fail2ban/server/__pycache__/database.cpython-311.pyc
�

�Bdt��J�dZdZdZddlZddlZddlZddlZddlZddlZddl	m
Z
ddlmZddl
mZdd	lmZdd
lmZddlmZmZmZee��Zd
�Zejdkrd�Zd�Zn	d�Zd�Zd�Zejee��ej de��d�Z!Gd�de"��Z#dS)zSteven Hiscocksz"Copyright (c) 2013 Steven Hiscocks�GPL�N��wraps)�RLock�)�MyTime)�
FailTicket)�Utils�)�	getLogger�
uni_string�
PREFER_ENCc�h�t|t��rt|��}t|��S)z/Avoid errors on types unknown in json-adapters.)�
isinstance�set�listr
��xs �:/usr/lib/python3/dist-packages/fail2ban/server/database.py�
_json_defaultr*s+���q�#����
�1�g�g�!��1�
�
��)�c��	tj|dt����td��}nQ#t
$rD}t�d|t���dk���d}Yd}~nd}~wwxYw|S)NF��ensure_ascii�default�replace�json dumps failed: %r���exc_info�{})	�json�dumpsr�encoder�	Exception�logSys�error�getEffectiveLevel�r�es  r�_json_dumps_safer,1s�����z�!�%��?�?�?�F�F��	���1�1��	����	�<�<�'��V�5M�5M�5O�5O�ST�5T�<�U�U�U��1�1�1�1�1�1���������
�(s�58�
B�:B�Bc��	tj|�td����}nQ#t$rD}t
�d|t
���dk���i}Yd}~nd}~wwxYw|S�Nrzjson loads failed: %rrr �r#�loads�decoderr&r'r(r)r*s  r�_json_loads_safer2;���
��z�!�(�(�:�y�1�1�2�2�1�1��	�
�
�
�	�<�<�'��V�5M�5M�5O�5O�ST�5T�<�U�U�U�	�1�1�1�1�1�1�����
����
�(��-0�
A>�:A9�9A>c���t|t��r+td�|���D����St|ttf��rd�|D��St|t
��r3|�td���t��St|t
��r|�td��S|S)Nc3�XK�|]%\}}t|��t|��fV��&dS�N��
_normalize)�.0�k�vs   r�	<genexpr>z_normalize.<locals>.<genexpr>Fs7����D�D�$�!�Q�
�1�
�
�z�!�}�}�-�D�D�D�D�D�Drc�,�g|]}t|����S�r8)r:�elements  r�
<listcomp>z_normalize.<locals>.<listcomp>Hs ��
0�
0�
0�7�:�g���
0�
0�
0rr)	r�dict�itemsrr�strr%rr1rs rr9r9Ds�����4���*�
�D�D�!�'�'�)�)�D�D�D�
D�
D�D��!�d�C�[�!�!�*�
0�
0�a�
0�
0�
0�0��!�S���*�
�(�(�:�y�
)�
)�
0�
0��
<�
<�<��!�S���*�
�(�(�:�y�
)�
)�)�	
�(rc��	tjt|��dt���}nQ#t$rD}t
�d|t
���dk���d}Yd}~nd}~wwxYw|S)NFrrrr r")r#r$r9rr&r'r(r)r*s  rr,r,Ps�����z�*�Q�-�-�e�]�K�K�K�1�1��	����	�<�<�'��V�5M�5M�5O�5O�ST�5T�<�U�U�U��1�1�1�1�1�1���������
�(s�),�
A:�:A5�5A:c��	tj|�td����}nQ#t$rD}t
�d|t
���dk���i}Yd}~nd}~wwxYw|Sr.r/r*s  rr2r2Yr3r4�JSONc�<��t����fd���}|S)Nc�H��|j5|j5|j���}	�||g|�Ri|��|���cddd��cddd��S#|���wxYw#1swxYwY	ddd��dS#1swxYwYdSr7)�_lock�_db�cursor�close)�self�args�kwargs�cur�fs    �r�wrapperz"commitandrollback.<locals>.wrappergsP����z�������
�(�/�/�
�
�C��
�A�d�C�)�$�)�)�)�&�)�)��Y�Y�[�[�[�����������������	�Y�Y�[�[�[�[������������������������������������sJ�B�A>�A%�A>�B�%A;�;A>�>B	�B�B	�B�B�Br)rRrSs` r�commitandrollbackrTfs3�����(�(������(��	�rc�d�eZdZdZdZdZee��Zd,d�Zd-d�Z	d	�Z
ed
���Zd�Z
ed���Zed
���Zejd���Zd-d�Zed-d���Zd�Zed���Zed���Zed���Zed���Zed.d���Zed���Zd/d�Zed.d���Zed���Zd�Zed/d���Zed���Z ed ���Z!ed!���Z"ed0d"���Z#d#�Z$d0d$�Z%ed1d%���Z&d1d&�Z'		d2d(�Z(d)�Z)d*�Z*ed+���Z+dS)3�
Fail2BanDba�Fail2Ban database for storing persistent data.

	This allows after Fail2Ban is restarted to reinstated bans and
	to continue monitoring logs from the same point.

	This will either create a new Fail2Ban database, connect to an
	existing, and if applicable upgrade the schema in the process.

	Parameters
	----------
	filename : str
		File name for SQLite3 database, which will be created if
		doesn't already exist.
	purgeAge : int
		Purge age in seconds, used to remove old bans from
		database during purge.

	Raises
	------
	sqlite3.OperationalError
		Error connecting/creating a SQLite3 database.
	RuntimeError
		If exisiting database fails to update to new schema.

	Attributes
	----------
	filename
	purgeage
	r))�
fail2banDbz7CREATE TABLE IF NOT EXISTS fail2banDb(version INTEGER);)�jailsz�CREATE TABLE IF NOT EXISTS jails(name TEXT NOT NULL UNIQUE, enabled INTEGER NOT NULL DEFAULT 1);CREATE INDEX IF NOT EXISTS jails_name ON jails(name);)�logsaSCREATE TABLE IF NOT EXISTS logs(jail TEXT NOT NULL, path TEXT, firstlinemd5 TEXT, lastfilepos INTEGER DEFAULT 0, FOREIGN KEY(jail) REFERENCES jails(name) ON DELETE CASCADE, UNIQUE(jail, path),UNIQUE(jail, path, firstlinemd5));CREATE INDEX IF NOT EXISTS logs_path ON logs(path);CREATE INDEX IF NOT EXISTS logs_jail_path ON logs(jail, path);)�bansa�CREATE TABLE IF NOT EXISTS bans(jail TEXT NOT NULL, ip TEXT, timeofban INTEGER NOT NULL, bantime INTEGER NOT NULL, bancount INTEGER NOT NULL default 1, data JSON, FOREIGN KEY(jail) REFERENCES jails(name) );CREATE INDEX IF NOT EXISTS bans_jail_timeofban_ip ON bans(jail, timeofban);CREATE INDEX IF NOT EXISTS bans_jail_ip ON bans(jail, ip);CREATE INDEX IF NOT EXISTS bans_ip ON bans(ip);)�bipsaZCREATE TABLE IF NOT EXISTS bips(ip TEXT NOT NULL, jail TEXT NOT NULL, timeofban INTEGER NOT NULL, bantime INTEGER NOT NULL, bancount INTEGER NOT NULL default 1, data JSON, PRIMARY KEY(ip, jail), FOREIGN KEY(jail) REFERENCES jails(name) );CREATE INDEX IF NOT EXISTS bips_timeofban ON bips(timeofban);CREATE INDEX IF NOT EXISTS bips_ip ON bips(ip);�Qrc��d|_t��|_||_||_||_|���dS)N�
)�
maxMatchesrrJ�_dbFilename�	_purgeAge�_outDatedFactor�
_connectDB)rN�filename�purgeAge�outDatedFactors    r�__init__zFail2BanDb.__init__�sA���$�/��w�w�$�*��$���$�.�'�$���/�/�����rFc	�l	�|j}	tj|dtj���|_i|_t�d|��n?#tj$r-}t�	d||j
d���d}~wwxYw	ddl}d}n#t$rd}YnwxYw|j�
��}	|�d��|�d��|s|�d	��|�d
��|�d��|���d}|t jkry|�|��}|t jkrt�d||���nt�	d
t j||��t)d���n�#tj$r0t�d|�����Yn�tj$r{}t�	d||j
d��t.j�|��s�|���d}|���Yd}~nd}~wwxYw|r�t�d��|�|d���t�d��t�d��|�d��|���D]0}	t�dd�|	�����1|j� ��|r-|r|�d	��|���dSdS#|r�t�d��|�|d���t�d��t�d��|�d��|���D]0}	t�dd�|	�����1|j� ��|r,|r|�d	��|���wwxYw)NF)�check_same_thread�detect_typesz.Connected to fail2ban persistent database '%s'z9Error connecting to fail2ban persistent database '%s': %srTzPRAGMA foreign_keys = ONzPRAGMA synchronous = OFFzPRAGMA journal_mode = MEMORYzPRAGMA temp_store = MEMORY�&SELECT version FROM fail2banDb LIMIT 1z"Database updated from '%r' to '%r'zIDatabase update failed to achieve version '%r': updated from '%r' to '%r'zFailed to fully updatez"New database created. Version '%r'z3Error opening fail2ban persistent database '%s': %sz#  Create missing tables/indices ...)�incrementalz  -> okz  Check integrity ...zPRAGMA integrity_checkz  -> %s� )!r`�sqlite3�connect�PARSE_DECLTYPESrK�_bansMergedCacher'�info�OperationalErrorr(rO�__pypy__�ImportErrorrL�execute�fetchonerV�__version__�updateDb�warning�RuntimeError�createDb�Error�os�path�isfilerM�repairDB�debug�	_createDb�fetchall�join�commit)
rN�checkIntegrityrdr+rt�pypyrQ�version�
newversion�ss
          rrczFail2BanDb._connectDB�s���
�
�(�	��o����(�*�*�*�4�8��4��	�;�;�4�h�@�@�@�@��	�	!�	�	�	�	�<�<�?��a�f�Q�i����	�����		������?�?�?�
�4�4��	����
�4�4�4�����	
������#�3��;�;�)�*�*�*��;�;�)�*�*�*�
�0��K�K�.�/�/�/��;�;�+�,�,�,��;�;�7�8�8�8� �\�\�^�^�A�
�7�
��'�'�'����w�'�'�J��Z�+�+�+��^�^�9�
�z������\�\�$���g�z�3�3�3��0�1�1�1�(��!
�	!����	�>�>�6��M�M�O�O������	��
�
�
�	�<�<�9��a�f�Q�i����
�'�.�.��
"�
"�
�	��9�9�;�;�;�	
�3��=�=�?�?�?�?�?�?�?�?�����
����0��
�L�L�6�7�7�7��N�N�3�D�N�)�)�)�
�L�L�����
�L�L�(�)�)�)��K�K�(�)�)�)�
�\�\�^�^�*�*���\�\�)�S�X�X�a�[�[�)�)�)�)��H�O�O����	���1��[�[�/�0�0�0��I�I�K�K�K�K�K�	�����
�L�L�6�7�7�7��N�N�3�D�N�)�)�)�
�L�L�����
�L�L�(�)�)�)��K�K�(�)�)�)�
�\�\�^�^�*�*���\�\�)�S�X�X�a�[�[�)�)�)�)��H�O�O����	���1��[�[�/�0�0�0��I�I�K�K�K�K�	���sj�AA�B�!(B	�	B�B�B(�'B(�A+G�0B$N)�<J�N)�J� A1J�N)�J�N)�)D
R3c��t�d��|j���t�d��dS)Nz Close connection to database ...zConnection to database closed.)r'r�rKrMrr�rNs rrMzFail2BanDb.closes@���,�,�1�2�2�2��(�.�.�����+�+�.�/�/�/�/�/rc��	|jS#t$r@|jdztjdtj����z|_|jcYSwxYw)N�.z
%Y%m%d-%H%M%S)�_Fail2BanDb__dbBackupFilename�AttributeErrorr`�time�strftimer�gmtimer�s r�_dbBackupFilenamezFail2BanDb._dbBackupFilename#se��"�
�
!�!��	�"�"�"�!�-��3�d�m�O�U[�Ub�Ud�Ud�6e�6e�e�4��
�
!�!�!�!�"���s�	�AA�Ac
�f�Gd�dt��}|j}d|_	t�d|j��t
j�|j��s@tj
|j|j��t�d|j��n=t
j�|j��rtj|j��tj
d|j|jf��tj|j��j}|r2t�d|��|�d���n&t�d	|��|d
���n�#t$r�}t�d|j|jdt'||��ot���d
k���tj|j��|�d���Yd}~nd}~wwxYw||_dS#||_wxYw)Nc��eZdZdS)�,Fail2BanDb.repairDB.<locals>.RepairExceptionN)�__name__�
__module__�__qualname__r?rr�RepairExceptionr�,s�������4rr�zTrying to repair database %s�  Database backup created: %szHf2b_db=$0; f2b_dbbk=$1; sqlite3 "$f2b_dbbk" ".dump" | sqlite3 "$f2b_db" z5  Repair seems to be successful, restored %d byte(s).T)r�z1  Repair seems to be failed, restored %d byte(s).zRecreate ...z/  Error repairing of fail2ban database '%s': %srr^r )r&r�r'rrr`r~rr�r��shutil�move�remover
�
executeCmd�stat�st_sizercr(rOrr))rNr��	_repairDB�
dbFileSizer+s     rr�zFail2BanDb.repairDB+s;�������	�����m�)��$�-��	�;�;�-�t�/?�@�@�@�
�'�.�.��/�
0�
0� �
�K�� �$�"8�9�9�9�
�K�K�/��1G�H�H�H�H�
����t�'�(�(� ��I�d�������d���d�,�.�/�/�/����(�)�)�1�:��*�
�K�K�G��T�T�T��O�O�4�O�(�(�(�(�
�K�K�C�Z�P�P�P�
�/�.�
)�
)�)�)��
�(�(�(�	�<�<�A���a�f�Q�i��Q��0�0�0�U�V�5M�5M�5O�5O�SU�5U��X�X�X��9�T�
�����?�?�$�?�'�'�'�'�'�'�'�'�����
(�����4�=�=�=��9�4�=����s1�EE>�=H'�>
H�B	H�H'�H�H'�'	H0c��|jS)z&File name of SQLite3 database file.
		)r`r�s rrdzFail2BanDb.filenameNs
��
�	�rc��|jS)zPurge age in seconds.
		)rar�s r�purgeagezFail2BanDb.purgeageTs��
��rc�8�tj|��|_dSr7)r�str2secondsra)rN�values  rr�zFail2BanDb.purgeageZs���%�e�,�,�$�.�.�.rc���tjD]\}}|�|���|�dtjf��|�d��|���dS)z8Creates a new database, called during initialisation.
		z\INSERT INTO fail2banDb(version) SELECT ? WHERE NOT EXISTS (SELECT 1 FROM fail2banDb LIMIT 1)rkr)rV�_CREATE_SCRIPTS�
executescriptrvrxrw)rNrQrl�nr�s     rr�zFail2BanDb._createDb^s~���*���f�q�!����Q������+�+�C��������+�+�6�7�7�7�	������	�rc�.�|�||��Sr7)r�)rNrQrls   rr|zFail2BanDb.createDbks��	
����[�	)�	)�)rc�p�|�d|f��|���}|duo|dS)NzQselect 1 where exists (select 1 from sqlite_master WHERE type='table' AND name=?)r)rvrw)rNrQ�table�ress    r�_tableExistszFail2BanDb._tableExistsosF���+�+�@�BG��K�K�K������#�	�D��	#�S��V�#rc��|tjkrtd���	t�d|j|��tj�|j��s?tj
|j|j��t�d|j��|dkr>|�|d��r(|�
dtjdz��|dkr>|�|d��r(|�
d	tjdz��|d
kri|�|d��sS|�
dtjdz��|�|d��r|�d
��|�d��|���dS#t"$rh}t�d|j|jdt���dk���|���Yd}~dSd}~wwxYw)z�Update an existing database, called during initialisation.

		A timestamped backup is also created prior to attempting the update.
		zIAttempt to travel to future version of database ...how did you get here??z&Upgrade database: %s from version '%r'r�rrYz�BEGIN TRANSACTION;CREATE TEMPORARY TABLE logs_temp AS SELECT * FROM logs;DROP TABLE logs;%s;INSERT INTO logs SELECT * from logs_temp;DROP TABLE logs_temp;UPDATE fail2banDb SET version = 2;COMMIT;rrZz�BEGIN TRANSACTION;CREATE TEMPORARY TABLE bans_temp AS SELECT jail, ip, timeofban, -2 as bantime, 1 as bancount, data FROM bans;DROP TABLE bans;%s;
INSERT INTO bans SELECT * from bans_temp;DROP TABLE bans_temp;COMMIT;rr[z?BEGIN TRANSACTION;%s;
UPDATE fail2banDb SET version = 4;COMMIT;z�INSERT OR REPLACE INTO bips(ip, jail, timeofban, bantime, bancount, data)  SELECT ip, jail, timeofban, bantime, bancount, data FROM bans order by timeofbanrkrz#Failed to upgrade database '%s': %sr^r N)rVrx�NotImplementedErrorr'rrr�r~rr�r��copyfilerdr�r��_CREATE_TABSrvrwr&r(r`rOr)r�)rNrQr�r+s    rryzFail2BanDb.updateDbusW��
�z�%�%�%�	�Q�
S�
S�S�*�	�;�;�7��9O�QX�Y�Y�Y�
�'�.�.��/�
0�
0�I�
�O�D�M�4�#9�:�:�:�
�K�K�/��1G�H�H�H�
��k�k�d�'�'��V�4�4�k������*�6�2�3�4�4�4���k�k�d�'�'��V�4�4�k������*�6�2�
3�4�4�4���k�k�$�+�+�C��8�8�k������*�6�2�3�4�4�4�����f�%�%�]��[�[�\�]�]�]��;�;�7�8�8�8�

�,�,�.�.��
���	����	�<�<�5���a�f�Q�i�
�
%�
%�
'�
'�2�
-��/�/�/��=�=�?�?�?�?�?�?�?�?�?��������s�F)G�
H=�AH8�8H=c��|�d|jf��|jdkr|�d|jf��dSdS)zmAdds a jail to the database.

		Parameters
		----------
		jail : Jail
			Jail to be added to the database.
		z7INSERT OR IGNORE INTO jails(name, enabled) VALUES(?, 1)rz<UPDATE jails SET enabled = 1 WHERE name = ? AND enabled != 1N�rv�name�rowcount�rNrQ�jails   r�addJailzFail2BanDb.addJail�se���+�+�<��I�<����	�\�Q����;�;�B�	�Y�L�������rc�>�|�d|jf��dS)zvDeletes a jail from the database.

		Parameters
		----------
		jail : Jail
			Jail to be removed from the database.
		z'UPDATE jails SET enabled=0 WHERE name=?N)rvr�r�s   r�delJailzFail2BanDb.delJail�s-���+�+�,�t�y�m�=�=�=�=�=rc�0�|�d��dS)z'Deletes all jails from the database.
		zUPDATE jails SET enabled=0N�rv�rNrQs  r�delAllJailszFail2BanDb.delAllJails�s��
�+�+�*�+�+�+�+�+rNc���|�|�d��n%|�dt|������td�|���D����S)zGet name of jails in database.

		Currently only used for testing purposes.

		Returns
		-------
		set
			Set of jail names.
		NzSELECT name FROM jailsz%SELECT name FROM jails WHERE enabled=c3�&K�|]}|dV��
dS�rNr?�r:�rows  rr=z*Fail2BanDb.getJailNames.<locals>.<genexpr>��&����/�/��S��V�/�/�/�/�/�/r)rv�intr�	fetchmany)rNrQ�enableds   r�getJailNameszFail2BanDb.getJailNames�sl��
�_��;�;�'�(�(�(�(��;�;�;���\�\�\�����	�/�/�s�}�}���/�/�/�	/�	/�/rc��|�|||���|���|�����S)a7Adds a log to the database.

		Parameters
		----------
		jail : Jail
			Jail that log is being monitored by.
		container : FileContainer
			File container of the log file being added.

		Returns
		-------
		int
			If log was already present in database, value of last position
			in the log file; else `None`
		)�_addLog�getFileName�getPos�getHash�rNrQr��	containers    r�addLogzFail2BanDb.addLog�sB��"
���c�4��!6�!6�!8�!8�)�:J�:J�:L�:L�i�N_�N_�Na�Na�	b�	b�brrc��d}|�d|j|f��	|���\}}n#t$rd}YnwxYw|�#|s|�|�d|j|||f��|�||krd}|S)NzBSELECT firstlinemd5, lastfilepos FROM logs WHERE jail=? AND path=?�UINSERT OR REPLACE INTO logs(jail, path, firstlinemd5, lastfilepos) VALUES(?, ?, ?, ?))rvr�rw�	TypeError)rNrQr�r��pos�md5�lastLinePos�firstLineMD5s        rr�zFail2BanDb._addLog�s����+��+�+���I�t������"�|�|�~�~��<����	�����<�<�<�������s��c�o��;�;��!�Y��c�3�7�9�9�9�	�_���,�,��;�	�s�9�A�Ac���d}g}|�|dz
}|�|j��|�||��td�|���D����S)z�Gets all the log paths from the database.

		Currently only for testing purposes.

		Parameters
		----------
		jail : Jail
			If specified, will only reutrn logs belonging to the jail.

		Returns
		-------
		set
			Set of log paths.
		zSELECT path FROM logsNz
 WHERE jail=?c3�&K�|]}|dV��
dSr�r?r�s  rr=z)Fail2BanDb.getLogPaths.<locals>.<genexpr>r�r)�appendr�rvrr�)rNrQr��query�	queryArgss     r�getLogPathszFail2BanDb.getLogPathssm�� "�%��)�	���O��5����D�I�����+�+�e�Y����	�/�/�s�}�}���/�/�/�	/�	/�/rc��|�|||���|���|�����dS)z�Updates hash and last position in log file.

		Parameters
		----------
		jail : Jail
			Jail of which the log file belongs to.
		container : FileContainer
			File container of the log file being updated.
		N)�
_updateLogr�r�r�r�s    r�	updateLogzFail2BanDb.updateLogsH���/�/�#�t�Y�2�2�4�4�i�6F�6F�6H�6H�)�J[�J[�J]�J]�^�^�^�^�^rc��|�d|||j|f��|js!|�d|j|||f��dSdS)NzEUPDATE logs SET firstlinemd5=?, lastfilepos=? WHERE jail=? AND path=?r�r�)rNrQr�r�r�r�s      rr�zFail2BanDb._updateLog,st���+�+�� #�S�$�)�T�:�<�<�<�

��9��;�;��!�Y��c�3�7�9�9�9�9�9�9�9rc�4�|�|||||��S)aAGet journal position from database.

		Parameters
		----------
		jail : Jail
			Jail of which the journal belongs to.
		name, time, iso :
			Journal name (typically systemd-journal) and last known time.

		Returns
		-------
		int (or float)
			Last position (as time) if it was already present in database; else `None`
		)r��rNrQr�r�r��isos      r�
getJournalPoszFail2BanDb.getJournalPos6s�� 
���c�4��t�S�	1�	1�1rc�8�|�|||||��dS)z�Updates last position (as time) of journal.

		Parameters
		----------
		jail : Jail
			Jail of which the journal belongs to.
		name, time, iso :
			Journal name (typically systemd-journal) and last known time.
		N)r�r�s      r�
updateJournalzFail2BanDb.updateJournalHs$���/�/�#�t�T�4��-�-�-�-�-rc���t|�����}	|j||f=n#t$rYnwxYw	|j|df=n#t$rYnwxYw|���}|�d��}|jrB|r?t|��|jkr'|���}||jd�|d<n|r|���}|d=|�	d|j
|tt|�
������|�|j�����|���|f��|�	d||j
tt|�
������|�|j�����|���|f��dS)z�Add a ban to the database.

		Parameters
		----------
		jail : Jail
			Jail in which the ban has occurred.
		ticket : BanTicket
			Ticket of the ban to be added.
		N�matcheszWINSERT INTO bans(jail, ip, timeofban, bantime, bancount, data) VALUES(?, ?, ?, ?, ?, ?)zbINSERT OR REPLACE INTO bips(ip, jail, timeofban, bantime, bancount, data) VALUES(?, ?, ?, ?, ?, ?))rD�getIDrq�KeyError�getData�getr_�len�copyrvr�r��round�getTime�
getBanTime�actions�getBanCount)rNrQr��ticket�ip�datar�s       r�addBanzFail2BanDb.addBanUs����6�<�<�>�>���"����b�$�Z�(�(��	�����4��������b�$�Z�(�(��	�����4�����
���	�	�$��H�H�Y���'�	�_��
�1�#�g�,�,���0�0��9�9�;�;�D��t��.�/�/�0�D��O����
�)�)�+�+�4��I���+�+�\��I�r�3�u�V�^�^�-�-�.�.�/�/��1B�1B�4�<�CZ�CZ�C\�C\�1]�1]�_e�_q�_q�_s�_s��
�����+�+�g���	�3�u�V�^�^�-�-�.�.�/�/��1B�1B�4�<�CZ�CZ�C\�C\�1]�1]�_e�_q�_q�_s�_s��
�����s�
.�
;�;�
A
�

A�Ac�\�d}d}|jg}t|��s.|�||��|�||��dS|dz
}|dz
}|�d��|D]@}t	|��|d<|�||��|�||���AdS)z�Delete a single or multiple tickets from the database.

		Parameters
		----------
		jail : Jail
			Jail in which the ticket(s) should be removed.
		args : list of IP
			IPs to be removed, if not given all tickets of jail will be removed.
		zDELETE FROM bips WHERE jail = ?zDELETE FROM bans WHERE jail = ?Nz AND ip = ?�r)r�r�rvr�rD)rNrQr�rO�query1�query2r�r�s        r�delBanzFail2BanDb.delBan|s���-�&�,�&��y�k�)�	�T���
��;�;�v�y�!�!�!��;�;�v�y�!�!�!�	�6��M��&��M��&����2�����#�#�b��b�'�'�9�Q�<��;�;�v�y�!�!�!��;�;�v�y�!�!�!�!�#�#rc�Z�d}g}|�|dz
}|�|j��|�4|dkr.|dz
}|�tj��|z
��|�'|dz
}|�t	|����|dz
}t|�||����S)Nz,SELECT ip, timeofban, data FROM bans WHERE 1� AND jail=?r� AND timeofban > ?�	 AND ip=?z ORDER BY ip, timeofban desc)r�r�rr�rDrrv)rNrQr��bantimer�r�r�s       r�_getBanszFail2BanDb._getBans�s���
8�%��)�	���M��5����D�I������W��\�\�� � �5����F�K�M�M�G�+�,�,�,��^��K��5����C��G�G�����)�)�%�
�c�k�k�%��+�+�	,�	,�,rc��g}|jdi|��D]D\}}}|�t||����|d�|���E|S)a�Get bans from the database.

		Parameters
		----------
		jail : Jail
			Jail that the ban belongs to. Default `None`; all jails.
		bantime : int
			Ban time in seconds, such that bans returned would still be
			valid now.  Negative values are equivalent to `None`.
			Default `None`; no limit.
		ip : str
			IP Address to filter bans by. Default `None`; all IPs.

		Returns
		-------
		list
			List of `Ticket`s for bans stored in database.
		���r?)r
r�r	�setData)rNrP�ticketsr��	timeofbanr�s      r�getBanszFail2BanDb.getBans�sm��&
�'�*�T�]�4�4�V�4�4����b�)�T�
�>�>�*�R��+�+�,�,�,�
�2�;���t�����	�.rc�j�|j5d}|�|dkr&||f}||jvr|j|cddd��Sg}d}t|�|||�����}|�r!|dd}g}	d}
i}|D]�\}}
}||krCt	|||	��}|�|
��|�|��|}g}	d}
i}|�dg��}|jt|	��z
}|dkr't|��|kr||	z}	n||d�|	z}	|
|�dd��z
}
|
|d<|	|d<|�
|��|
}��t	|||���}|�|��|r|�|n||j|<|�|n|cddd��S#1swxYwYdS)a}Get bans from the database, merged into single ticket.

		This is the same as `getBans`, but bans merged into single
		ticket.

		Parameters
		----------
		jail : Jail
			Jail that the ban belongs to. Default `None`; all jails.
		bantime : int
			Ban time in seconds, such that bans returned would still be
			valid now. Negative values are equivalent to `None`.
			Default `None`; no limit.
		ip : str
			IP Address to filter bans by. Default `None`; all IPs.

		Returns
		-------
		list or Ticket
			Single ticket representing bans stored in database per IP
			in a list. When `ip` argument passed, a single `Ticket` is
			returned.
		Nr)r�r�r	r��failuresr�r�)rJrqrr
r	�
setAttemptr�r�r_r��update)rNr�r�r	�cacheKeyrr��results�
prev_banipr�r�tickdata�baniprr��prev_timeofban�m�maxadds                  r�
getBansMergedzFail2BanDb.getBansMerged�sy��0�z�-,�-,��8�
�o��1����D�z�H��4�(�(�(��!�(�+�-,�-,�-,�-,�-,�-,�-,�-,��7��6�
�$�-�-�2�D�'�-�B�B�
C�
C�7�
�����A��J��G��H��H�")� � ���y�$�
�����*�n�g�>�>�f�����!�!�!�
�n�n�V�����j��g��h��h�	
���)�R�	 �	 �Q��o��G���,�V���
�
�	�Q���6�	�	��W��w�w��F�7�8�8��w�&�w�
����*�a�(�(�(�X� �T�*���T�)�_�
�_�_�T�����^�^�
��~�H�
=�
=�
=�F��N�N�6�����H�13��g�g��D��(�#��Z�'�'�V�[-,�-,�-,�-,�-,�-,�-,�-,�-,�-,�-,�-,����-,�-,�-,�-,�-,�-,s�$F(�E"F(�(F,�/F,c�t�t|��}|sd}nd}|dz
}|g}|s!|�|dz
}|�|j��|�.|dz
}|�tj��|z
��|�|dz
}|�|��|s|�|dz
}t|�||����S)Nz-SELECT bancount, timeofban, bantime FROM bipsz<SELECT sum(bancount), max(timeofban), sum(bantime) FROM bipsz
 WHERE ip = ?rrz, GROUP BY ip ORDER BY timeofban DESC LIMIT 1)rDr�r�rr�rrv)	rNrQr�r��
forbantime�overalljails�fromtimer�r�s	         r�getBanzFail2BanDb.getBan
s���
�2�w�w�"�	�J�:�5�5�I�5��?��%��d�)�	��$�*��M��5����D�I������� � �5����F�K�M�M�J�.�/�/�/�
��� � �5����H�����;�T�\��:�:�5�	
�c�k�k�%��+�+�	,�	,�,rc�<�g}|�d}|�|j��nd}|�|dz
}|�|��|dz
}|�|��|dvr|dz
}|�||z
��|�|dz
}n|dz
}|�||��S)	NzDSELECT ip, timeofban, bantime, bancount, data FROM bips WHERE jail=?zDSELECT ip, max(timeofban), bantime, bancount, data FROM bips WHERE 1rz/ AND (timeofban + bantime > ? OR bantime <= -1))Nrrz( GROUP BY ip ORDER BY ip, timeofban DESCz  ORDER BY timeofban DESC LIMIT 1)r�r�rv)rNrQr�r�r r"r�r�s        r�_getCurrentBanszFail2BanDb._getCurrentBans!s����)�	��Q�5����D�I�����Q�5��^��K��5����B�����<�<�%����8�����z�!�!�� � �5����H�z�)�*�*�*��Z��6�6�5�5��.�.�5�	���U�I�	&�	&�&rTc���|j���}	|�tj��}g}d}	|dur |�|���nd}|dkrd}|j5|�|||||���}
ddd��n#1swxYwY|
D�]�}		|	\}}}
}}|�|dkrtd|�����|
dkr"|�|j�	��n|r|nd}
n|r|d	kr|
dks|
|kr|}
|
dkr+||
z|kr"t�d
|
||
z||	����n3#t$r&}t�d|	|��Yd}~��d}~wwxYwt|||���}	|�|j
}|rH|	���}|r1t|��|kr|	�||d���n|	�d��|	�|
��|	�|��|�|	c|���S|�|	�����	|���n#|���wxYw|S)
a�Reads tickets (with merged info) currently affected from ban from the database.
		
		There are all the tickets corresponding parameters jail/ip, forbantime,
		fromtime (normally now).
		
		If correctBanTime specified (default True) it will fix the restored ban-time 
		(and therefore endOfBan) of the ticket (normally it is ban-time of jail as maximum)
		for all tickets with ban-time greater (or persistent).
		NTr)r�r�r r"rzunexpected value ���iXrzFignore ticket (with new max ban-time %r): too old %r <= %r, ticket: %rz$get current bans: ignore row %r - %sr)rKrLrr��
getMaxBanTimerJr%�
ValueErrorr�r�r'r�r	r_�
getMatchesr��
setMatches�
setBanTime�setBanCountrMr�)rNr�r�r r"�correctBanTime�
maxmatchesrQrr�rZrrr	�bancountr�r+r�s                  r�getCurrentBanszFail2BanDb.getCurrentBans6s)��	
������#�7����{�}�}�H�
�7��6�����-1�-=�T�'�'�)�)�)�4�N�����d�^��
�������$�2��X� ���D��������������������'�'�v��17�.�U�I�w��$�
�
��"����J���7�8�8�8��2�
�
�-1�-=���'�'�)�)�)�'�0�~�~�S��g�
� �^�q�0�0�	�B���'�N�2�2��w��2�
�
�)�g�-��9�9��l�l�[��	�G�#�X�v�7�7�7���������\�\�8�&�!�D�D�D�
�X�X�X�X�����������y�t�
4�
4�
4�F����/�Z���� � �"�"�W��/�C��L�L�:�-�-���������-�.�.�.�����t����
���g����
���x� � � �	�~�f�}�}��9�9�;�;�;�;��N�N�6�����O'�R�9�9�;�;�;�;��3�9�9�;�;�;�;����	�.sb�AI�B�:I�B
�
I�
B
�I�BD)�'I�)
E�3E�I�E�B,I�I�Ic�0�|�d��dS)z8Remove empty jails jails and log files from database.
		z�DELETE FROM jails WHERE enabled = 0 AND NOT EXISTS(SELECT * FROM bans WHERE jail = jails.name) AND NOT EXISTS(SELECT * FROM bips WHERE jail = jails.name)Nr�r�s  r�_cleanjailszFail2BanDb._cleanjails~s/���+�+�A�B�B�B�B�Brc	���|�dttj����|jz
|jttj����|jz
f��dS)z�Purge old bad ips (jails and log files from database).
		Currently it is timed out IP, whose time since last ban is several times out-dated (outDatedFactor is default 3).
		Permanent banned ips will be never removed.
		zZDELETE FROM bips WHERE timeofban < ? and bantime != -1 and (timeofban + (bantime * ?)) < ?N)rvr�rr�rarbr�s  r�_purge_bipszFail2BanDb._purge_bips�se��
�+�+�_����
�
�����'��)=�s�6�;�=�=�?Q�?Q�TX�Tb�?b�c�e�e�e�e�erc���i|_|�dtj��|jz
f��|�|��|�|��dS)z5Purge old bans, jails and log files from database.
		z$DELETE FROM bans WHERE timeofban < ?N)rqrvrr�rar5r3r�s  r�purgezFail2BanDb.purge�sh���$���+�+�)�
�K�M�M�D�N�"�%�'�'�'����3�������3�����r)r\r)Fr7r�)NNN)NNNN)NNNNTN),r�r�r��__doc__rxr�rBr�rgrcrM�propertyr�r�rdr��setterr�rTr|r�ryr�r�r�r�r�r�r�r�r�r�r�r�rr
rrr#r%r1r3r5r7r?rrrVrVss���������:��.��^��_�%�%������O�O�O�O�b0�0�0�
�"�"��(�"�!�!�!�F����(��
����(��
�/�-�-��/�-������+�+�+���+�$�$�$��2�2���2�h������ �
=�
=���
=��,�,���,��0�0�0���0�"�c�c���c�$����&�0�0�0���0�.�
_�
_���
_�9�9�9��3�3�3���3�"�
/�
/���
/��$�$���$�L�#�#���#�2�-�-�-���-�$���4E,�E,�E,�E,�N�-�-�-���-�,'�'�'�'�*IM�"&�F�F�F�F�PB�B�B�e�e�e��������rrV)$�
__author__�
__copyright__�__license__r#r~r�rn�sysr��	functoolsr�	threadingr�mytimerr�r	�utilsr
�helpersrr
rr�r'r�version_infor,r2r9�register_adapterrB�register_converterrT�objectrVr?rr�<module>rHs���(�
�4�
�������	�	�	�	�
�
�
�
�����
�
�
�
�����������������������������������7�7�7�7�7�7�7�7�7�7�
��8�	�	�������t����������
�
�
�����������/�0�0�0����6�#3�4�4�4�
�
�
�e�e�e�e�e��e�e�e�e�er