HEX
Server: nginx/1.30.4
System: Linux d-twindigital-web-1.host-ed.eu 4.18.0-553.141.2.el8_10.x86_64 #1 SMP Wed Jul 8 10:28:18 EDT 2026 x86_64
User: u_twindigital_html (1009)
PHP: 8.3.30
Disabled: NONE
Upload Files
File: //lib/python3.6/site-packages/fail2ban/server/__pycache__/database.cpython-36.opt-1.pyc
3

=�Z]�V�@sdZdZdZddlZddlZddlZddlZddlZddlZddl	m
Z
ddlmZddl
mZdd	lmZdd
lmZddlmZmZmZee�Zd
d�Zejdkr�dd�Zdd�Zndd�Zdd�Zdd�Zejee�ej de�dd�Z!Gdd�de"�Z#dS)zSteven Hiscocksz"Copyright (c) 2013 Steven HiscocksZGPL�N)�wraps)�RLock�)�MyTime)�
FailTicket)�Utils�)�	getLogger�
uni_string�
PREFER_ENCcCst|t�rt|�}t|�S)z/Avoid errors on types unknown in json-adapters.)�
isinstance�set�listr
)�x�r�/usr/lib/python3.6/database.py�
_json_default*s
r�cCs`ytj|dtd�jtd�}Wn>tk
rZ}z"tjd|tj�dkd�d}WYdd}~XnX|S)NF)�ensure_ascii�default�replacezjson dumps failed: %r�)�exc_infoz{})	�json�dumpsr�encoder�	Exception�logSys�error�getEffectiveLevel)r�errr�_json_dumps_safe1sr!cCsZytj|jtd��}Wn>tk
rT}z"tjd|tj�dkd�i}WYdd}~XnX|S)Nrzjson loads failed: %rr)r)r�loads�decoderrrrr)rr rrr�_json_loads_safe;sr$cCsrt|t�r tdd�|j�D��St|ttf�r<dd�|D�St|t�rX|jtd�jt�St|t�rn|jtd�S|S)Ncss"|]\}}t|�t|�fVqdS)N)�
_normalize)�.0�k�vrrr�	<genexpr>Fsz_normalize.<locals>.<genexpr>cSsg|]}t|��qSr)r%)r&�elementrrr�
<listcomp>Hsz_normalize.<locals>.<listcomp>r)	r�dict�itemsrr
�strrrr#)rrrrr%Ds


r%cCs\ytjt|�dtd�}Wn>tk
rV}z"tjd|tj�dkd�d}WYdd}~XnX|S)NF)rrzjson dumps failed: %rr)rz{})rrr%rrrrr)rr rrrr!PscCsZytj|jtd��}Wn>tk
rT}z"tjd|tj�dkd�i}WYdd}~XnX|S)Nrzjson loads failed: %rr)r)rr"r#rrrrr)rr rrrr$YsZJSONcst���fdd��}|S)Ncs<|j�,|j��||jj�f|�|�SQRXWdQRXdS)N)�_lock�_db�cursor)�self�args�kwargs)�frr�wrappergsz"commitandrollback.<locals>.wrapper)r)r5r6r)r5r�commitandrollbackfsr7c@sZeZdZdZdZdJZee�ZdMd
d�ZdNdd�Z	dd�Z
edd��Zdd�Z
edd��Zedd��Zejdd��ZdOdd�ZedPdd ��Zd!d"�Zed#d$��Zed%d&��Zed'd(��Zed)d*��ZedQd,d-��Zed.d/��ZedRd0d1��Zed2d3��Zd4d5�Zed6d7��Zed8d9��ZedSd:d;��Z d<d=�Z!dTd>d?�Z"dUd@dA�Z#dVdBdC�Z$edDdE��Z%d+S)W�
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�
fail2banDb�7CREATE TABLE IF NOT EXISTS fail2banDb(version INTEGER);�jails��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);�logs�SCREATE 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);�bans�CCREATE TABLE IF NOT EXISTS bans(jail TEXT NOT NULL, ip TEXT, timeofban INTEGER NOT NULL, 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);��<cCs&d|_t�|_||_||_|j�dS)N�2)�
maxEntriesrr/�_dbFilename�	_purgeAge�
_connectDB)r2�filenameZpurgeAgerrr�__init__�s
zFail2BanDb.__init__Fc
0CsP|j}y*tj|dtjd�|_i|_tjd|�Wn:tjk
rj}ztj	d||j
d��WYdd}~XnXyddl}d}Wntk
r�d}YnX|jj
�}�zy:|jd�|jd�|s�|jd	�|jd
�|jd�Wn�tjk
�rtjd|j��Yn�tjk
�rb}z>tj	d
||j
d�tjj|��s>�|j�d}|j�WYdd}~XnZX|j�d}|tjk�r�|j|�}|tjk�r�tjd||�ntj	dtj||�td��Wd|�r,tjd�|j|dd�tjd�tjd�|jd�x$|j�D]}	tjddj|	���qW|jj �|�rJ|�rB|jd	�|j�XdS)NF)Zcheck_same_threadZ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 = MEMORYz&SELECT version FROM fail2banDb LIMIT 1z"New database created. Version '%r'z3Error opening fail2ban persistent database '%s': %sz"Database updated from '%r' to '%r'zIDatabase update failed to achieve version '%r': updated from '%r' to '%r'zFailed to fully updatez#  Create missing tables/indices ...)�incrementalz  -> okz  Check integrity ...zPRAGMA integrity_checkz  -> %s� )!rE�sqlite3ZconnectZPARSE_DECLTYPESr0�_bansMergedCacher�infoZOperationalErrorrr3�__pypy__�ImportErrorr1�executeZwarning�createDb�Error�os�path�isfile�close�repairDB�fetchoner8�__version__�updateDb�RuntimeError�debug�	_createDbZfetchall�joinZcommit)
r2�checkIntegrityrHr rOZpypy�cur�versionZ
newversion�srrrrG�sx













zFail2BanDb._connectDBcCs"tjd�|jj�tjd�dS)Nz Close connection to database ...zConnection to database closed.)rr]r0rWrN)r2rrrrWs

zFail2BanDb.closecCs>y|jStk
r8|jdtjdtj��|_|jSXdS)N�.z
%Y%m%d-%H%M%S)Z_Fail2BanDb__dbBackupFilename�AttributeErrorrE�timeZstrftimerZgmtime)r2rrr�_dbBackupFilenames
zFail2BanDb._dbBackupFilenamecCsGdd�dt�}|j}d|_z�y�tjd|j�tj|j|j�tjd|j�tj	d|j|jf�t
j|j�j}|r�tjd|�|j
dd�ntjd	|�|d
��Wnjtk
�r}zLtjd|j|jdt||�o�tj�d
kd�t
j|j�|j
dd�WYdd}~XnXWd||_XdS)Nc@seZdZdS)z,Fail2BanDb.repairDB.<locals>.RepairExceptionN)�__name__�
__module__�__qualname__rrrr�RepairExceptionsrkzTrying to repair database %sz  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': %sr�
)r)rrXrrNrE�shutilZmovergrZ
executeCmdrT�stat�st_sizerGrr3rr�remove)r2rkZ	_repairDBZ
dbFileSizer rrrrXs,"zFail2BanDb.repairDBcCs|jS)z&File name of SQLite3 database file.
		)rE)r2rrrrH9szFail2BanDb.filenamecCs|jS)zPurge age in seconds.
		)rF)r2rrr�purgeage?szFail2BanDb.purgeagecCstj|�|_dS)N)rZstr2secondsrF)r2�valuerrrrqEscCsDxtjD]\}}|j|�qW|jdtjf�|jd�|j�dS)z8Creates a new database, called during initialisation.
		z\INSERT INTO fail2banDb(version) SELECT ? WHERE NOT EXISTS (SELECT 1 FROM fail2banDb LIMIT 1)z&SELECT version FROM fail2banDb LIMIT 1r)r8�_CREATE_SCRIPTS�
executescriptrQrZrY)r2rarJ�nrcrrrr^Is

zFail2BanDb._createDbcCs|j||�S)N)r^)r2rarJrrrrRVszFail2BanDb.createDbcCs&|jd|f�|j�}|dk	o$|dS)NzQselect 1 where exists (select 1 from sqlite_master WHERE type='table' AND name=?)r)rQrY)r2ra�table�resrrr�_tableExistsZszFail2BanDb._tableExistscCs�|tjkrtd��yztjd|j|�tjj|j�sPt	j
|j|j�tjd|j�|dkrx|j|d�rx|j
dtjd�|jd�|j�dStk
r�}z*tjd	|j|jdtj�d
kd��WYdd}~XnXdS)
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'z  Database backup created: %srr=z�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;z&SELECT version FROM fail2banDb LIMIT 1rz#Failed to upgrade database '%s': %srl)rN)r8rZ�NotImplementedErrorrrNrgrTrUrVrmZcopyfilerHrxrt�_CREATE_TABSrQrYrrrEr3r)r2rarbr rrrr[`s$

zFail2BanDb.updateDbcCs.|jd|jf�|jdkr*|jd|jf�dS)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)rQ�nameZrowcount)r2ra�jailrrr�addJail�s	

zFail2BanDb.addJailcCs|jd|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)rQr{)r2rar|rrr�delJail�s
zFail2BanDb.delJailcCs|jd�dS)z'Deletes all jails from the database.
		zUPDATE jails SET enabled=0N)rQ)r2rarrr�delAllJails�szFail2BanDb.delAllJailsNcCs>|dkr|jd�n|jdt|�f�tdd�|j�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=%scss|]}|dVqdS)rNr)r&�rowrrrr)�sz*Fail2BanDb.getJailNames.<locals>.<genexpr>)rQ�intr
�	fetchmany)r2raZenabledrrr�getJailNames�s
zFail2BanDb.getJailNamescCszd}|jd|j|j�f�y|j�\}}Wntk
rBd}YnX|jd|j|j�|j�|j�f�|j�|krvd}|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`
		NzBSELECT firstlinemd5, lastfilepos FROM logs WHERE jail=? AND path=?FzUINSERT OR REPLACE INTO logs(jail, path, firstlinemd5, lastfilepos) VALUES(?, ?, ?, ?))rQr{�getFileNamerY�	TypeError�getHash�getPos)r2rar|�	containerZlastLinePosZfirstLineMD5rrr�addLog�s

zFail2BanDb.addLogcCsFd}g}|dk	r$|d7}|j|j�|j||�tdd�|j�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=?css|]}|dVqdS)rNr)r&r�rrrr)�sz)Fail2BanDb.getLogPaths.<locals>.<genexpr>)�appendr{rQr
r�)r2rar|�query�	queryArgsrrr�getLogPaths�szFail2BanDb.getLogPathscOs|j|f|�|�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)�
_updateLog)r2rar3r4rrr�	updateLog�szFail2BanDb.updateLogcCs&|jd|j�|j�|j|j�f�dS)NzEUPDATE logs SET firstlinemd5=?, lastfilepos=? WHERE jail=? AND path=?)rQr�r�r{r�)r2rar|r�rrrr�szFail2BanDb._updateLogcCs�t|j��}y|j||f=Wntk
r0YnXy|j|df=Wntk
rVYnX|j�}|jd�}|r�t|�|jkr�||jd�|d<|jd|j	|t
t|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�matchesz>INSERT INTO bans(jail, ip, timeofban, data) VALUES(?, ?, ?, ?))
r.ZgetIPrM�KeyErrorZgetData�get�lenrDrQr{r��roundZgetTime)r2rar|�ticket�ip�datar�rrr�addBan	s 
zFail2BanDb.addBancGs`d}|jg}t|�s$|j||�dS|d7}|jd�x$|D]}t|�|d<|j||�q<WdS)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 bans WHERE jail = ?Nz AND ip = ?�r)r{r�rQr�r.)r2rar|r3r�r�r�rrr�delBan&s

zFail2BanDb.delBancCs�d}g}|dk	r$|d7}|j|j�|dk	rN|dkrN|d7}|jtj�|�|dk	rl|d7}|jt|��|d7}t|j||��S)Nz,SELECT ip, timeofban, data FROM bans WHERE 1z AND jail=?rz AND timeofban > ?z	 AND ip=?z ORDER BY ip, timeofban desc)r�r{rrfr.rrQ)r2rar|�bantimer�r�r�rrr�_getBans<szFail2BanDb._getBanscKsBg}x8|jf|�D](\}}}|jt||��|dj|�qW|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�rZsetData)r2r4�ticketsr��	timeofbanr�rrr�getBansOs
zFail2BanDb.getBansc
Cs�|j��zd}|dks|dkr:||f}||jkr:|j|Sg}d}t|j|||d��}|�rR|dd}g}	d}
i}x�|D]�\}}
}||kr�t|||	�}|j|
�|j|�|}g}	d}
i}|jdg�}|jt	|	�}|dk�rt	|�|kr�||	}	n||d�|	}	|
|jdd�7}
|
|d<|	|d<|j
|�|
}qzWt|||d�}|j|�|�rp|dk�rf|n||j|<|dk�r~|S|SQRXdS)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�)r/rMrr�rZ
setAttemptr�r�rDr��update)r2r�r|r�ZcacheKeyr�r��resultsZ
prev_banipr�r�Ztickdata�banipr�r�Zprev_timeofban�mZmaxaddrrr�
getBansMergedisN








zFail2BanDb.getBansMergedcCs�|dkrtj�}g}|dk	r.d}|j|j�nd}|dk	rL|d7}|j|�|dkrj|d7}|j||�|dkrz|d7}|jj�}|j||�S)	Nz1SELECT ip, timeofban, data FROM bans WHERE jail=?z1SELECT ip, max(timeofban), data FROM bans WHERE 1z	 AND ip=?rz AND timeofban > ?z( GROUP BY ip ORDER BY ip, timeofban DESCr�)Nr�)rrfr�r{r0r1rQ)r2rar|r��
forbantime�fromtimer�r�rrr�_getCurrentBans�s"

zFail2BanDb._getCurrentBanscCsxg}d}|j�$t|j|jj�||||d��}WdQRX|rhx*|D]"\}}	}
t||	|
d�}|j|�qBW|dkrt|S|S)N)r|r�r�r�)r�)r/rr�r0r1rr�)r2r|r�r�r�r�r�r�r�r�r�rrr�getCurrentBans�szFail2BanDb.getCurrentBanscCs,i|_|jdtj�|jf�|jd�dS)z5Purge old bans, jails and log files from database.
		z$DELETE FROM bans WHERE timeofban < ?z^DELETE FROM jails WHERE enabled = 0 AND NOT EXISTS(SELECT * FROM bans WHERE jail = jails.name)N)rMrQrrfrF)r2rarrr�purge�szFail2BanDb.purge�r9r:�r;r<�r=r>�r?r@)r�r�r�r�i��Q)r�)F)F)F)N)N)NNN)NNN)NNNN)NNNN)&rhrirj�__doc__rZrsr,rzrIrGrW�propertyrgrXrHrq�setterr^r7rRrxr[r}r~rr�r�r�r�r�r�r�r�r�r�r�r�r�rrrrr8osN

Q!

"
$

G

r8)r)$�
__author__Z
__copyright__Z__license__rrTrmrL�sysrf�	functoolsrZ	threadingrZmytimerr�rZutilsrZhelpersr	r
rrhrr�version_infor!r$r%Zregister_adapterr,Zregister_converterr7�objectr8rrrr�<module>s4