HEX
Server: Apache/2.4.65 (Debian)
System: Linux kubikelcreative 5.10.0-35-amd64 #1 SMP Debian 5.10.237-1 (2025-05-19) x86_64
User: www-data (33)
PHP: 8.4.13
Disabled: NONE
Upload Files
File: //usr/lib/python3/dist-packages/fail2ban/server/__pycache__/server.cpython-39.pyc
a

���`�q�@sTdZdZdZddlZddlmZmZddlZddlZddlZddl	Z	ddl
Z
ddlmZm
Z
ddlmZdd	lmZmZdd
lmZddlmZmZdd
lmZddlmZmZmZmZmZm Z m!Z!ee"�Z#dZ$dZ%dZ&zddl'm(Z(Wne)y�dZ(Yn0dd�Z*ze+Wne,�y(e-Z+Yn0dd�Z.Gdd�d�Z/Gdd�de0�Z1dS)z
Cyril Jaquierz Copyright (c) 2004 Cyril JaquierZGPL�N)�Lock�RLock�)�	Observers�ObserverThread)�Jails)�
FileFilter�
JournalFilter)�Transmitter)�AsyncServer�AsyncServerException�)�version)�	getLogger�_as_bool�extractOptions�str2LogLevel�getVerbosityFormat�
excepthook�prctl_set_th_name�auto�INFO�STDOUT)�
Fail2BanDbcCst��jjS�N)�	threadingZcurrent_thread�	__class__�__name__�rr�8/usr/lib/python3/dist-packages/fail2ban/server/server.py�_thread_name:sr c
Cs`tj�|�}tj�|�r\zt�|�Wn4ttfyZ}z|jdkrF�WYd}~n
d}~00dS)z0Creates path of file (last level only) on demand�N)�os�path�dirname�isabs�mkdir�OSError�FileExistsError�errno)�name�errr�_make_file_pathBs
r,c@s�eZdZd�dd�Zdd�Zdd�Zdd	�Zdd
ifdd�Zd
d�Zdd�Z	d�dd�Z
dd�Zdd�Zdd�Z
dd�Zdd�Zdd�Zdd �Zd!d"�Zd#d$�Zd%d&�Zd'd(�Zd�d)d*�Zd+d,�Zd-d.�Zd/d0�Zd1d2�Zd3d4�Zd5d6�Zd7d8�Zd9d:�Zd;d<�Zd=d>�Z d?d@�Z!dAdB�Z"dCdD�Z#dEdF�Z$dGdH�Z%dIdJ�Z&dKdL�Z'dMdN�Z(dOdP�Z)d�dQdR�Z*d�dTdU�Z+dVdW�Z,d�dXdY�Z-dZd[�Z.d\d]�Z/d^d_�Z0d`da�Z1dbdc�Z2ddde�Z3dfdg�Z4dhdi�Z5djdk�Z6dldm�Z7dndo�Z8dpdq�Z9drds�Z:dtdu�Z;dvdw�Z<dxdy�Z=dzd{�Z>d�d|d}�Z?d�d~d�Z@d�d��ZAd�d�d��ZBd�d��ZCd�d��ZDd�d��ZEd�d�d��ZFd�d��ZGd�d�d��ZHd�d��ZId�d��ZJd�d��ZKd�d��ZLd�d��ZMd�d��ZNd�d��ZOd�d��ZPd�d��ZQd�d��ZRd�d��ZSd�d��ZTdSS)��ServerFcCsjt�|_t�|_t�|_d|_||_t|�|_	i|_
d|_d|_d|_
d|_d|_dddd�|_i|_dS)Nz/var/run/syslogz/var/run/logz/dev/log)ZDarwinZFreeBSDZLinux)r�_Server__loggingLockr�
_Server__lockr�_Server__jails�_Server__db�_Server__daemonr
�_Server__transm�_Server__reload_state�_Server__asyncServer�_Server__logLevel�_Server__logTarget�_Server__verbose�_Server__syslogSocket�_Server__autoSyslogSocketPaths�_Server__prev_signals)�selfZdaemonrrr�__init__Qs"
�zServer.__init__cCst�d|�|��dS)NzCaught signal %d. Exiting)�logSys�debug�quit)r<�signum�framerrrZ__sigTERMhandlerfszServer.__sigTERMhandlercCst�d|�|��dS)NzCaught signal %d. Flushing logs)r>r?�	flushLogs)r<rA�fnamerrrZ__sigUSR1handlerjszServer.__sigUSR1handlercCs t�|�|j|<t�||�dS)z>Bind new signal handler while storing old one in _prev_signalsN)�signal�	getsignalr;)r<�s�newrrr�
_rebindSignalnszServer._rebindSignalTc
Cs�t�d�|jrXt�d�|��}|dur.dS|dsXd|dd�f}t�|�t|��t|�	dd��|�	d	d�|_
|�|�	d
|jdur�|jnt
��|�|�	d|jdur�|jnt��|�|�	d|jdur�|jnt��t�d
�t�dtj�|j�rt�d�t�dk�rDtjtjfD]}|�||j��q|�tj|j�tt_z<t�d|�t |�t!|d�}	|	�"dt�#��|	�$�Wn6t%t&f�y�}
zt�d|
�WYd}
~
n
d}
~
00|�r�t'j(du�r�t)�t'_(t'j(�*�t�d�z4t |�t+|j,�|_-|�	d�|j-_.|j-�*||�Wn2t/�yR}
zt�d|
�WYd}
~
n
d}
~
00|�0�zt�d|�t�1|�Wn6t%t&f�y�}
zt�d|
�WYd}
~
n
d}
~
00dS)N�?zStarting in daemon modeFrzCould not create daemon %srZpnamezfail2ban-server�verbose�syslogsocketZloglevelZ	logtargetz2--------------------------------------------------zStarting Fail2ban v%szDaemon started�_MainThreadzCreating PID file %s�wz%s
zUnable to create PID file: %szStarting communication�onstartzCould not start server: %szRemove PID file %szUnable to remove PID file: %s)2r"�umaskr2r>�info�_Server__createDaemon�error�ServerInitializationErrorr�getr8�setSyslogSocketr9�DEF_SYSLOGSOCKET�setLogLevelr6�DEF_LOGLEVEL�setLogTargetr7�
DEF_LOGTARGETrr rE�SIGTERM�SIGINTrI�_Server__sigTERMhandler�SIGUSR1�_Server__sigUSR1handlerr�sysr?r,�open�write�getpid�closer'�IOErrorr�Mainr�startrr3r5rOrr@�remove)r<ZsockZpidfileZforce�observerZconf�ret�errrGZpidFiler+rrrrhssp



�
�
�


"

"zServer.startcCs�dd�|_t�d�|jdur(|j��t�dkrR|j��D]\}}t�||�q<t	j
}|durv|jdd�rpd}dt	_
|��|dur�|��|j
r�|j
��d|_
|jdur�|j��d|_t�d�dS)NcSsdS)NFrrrrr�<lambda>��zServer.quit.<locals>.<lambda>zShutdown in progress...rMF)Z	forceQuitzExiting Fail2ban)r@r>rQr5Zstop_communicationr r;�itemsrErrg�stop�stopAllJailr1re)r<rGZshZobsMainrrrr@�s,







zServer.quitcCs�d}|j�|�rt|j�|�rt|j|}|j|krLd}t�d|�d|j|<n(t�d||j|�|j|dd�|j|=|r�|j�|||j	�|j	dur�|j	�
|j|�dS)NTFzReload jail %rz"Restart jail %r (reason: %r != %r)�rp)r4rUr0�exists�backendr>rQ�delJail�addr1�addJail)r<r*rtZaddflg�jailrrrrw�s


zServer.addJailcCsJ|j|}|s|��r$|j||d�|rF|jdur>|j�|�|j|=dS)N�rp�join)r0�isAliverpr1ru)r<r*rprzrxrrrrus

zServer.delJailcCsp|j�V|j|}|��s$|��n||jvrBt�d|�|j|=|jrNd|_Wd�n1sb0YdS)NzJail %r reloadedF)r/r0r{rhr4r>rQ�idle)r<r*rxrrr�	startJails


zServer.startJailcCs8|j�|j|dd�Wd�n1s*0YdS)NTrr)r/ru�r<r*rrr�stopJailszServer.stopJailcCs|t�d�|j�Xt|j���D]}|j|ddd�q t|j���D]}|j|ddd�qDWd�n1sn0YdS)NzStopping all jailsTFry)r>rQr/�listr0�keysrur~rrrrqs
zServer.stopAllJailcCs�|�r4|jr(|dks |j�|�r(td��t�d|dkr>d|nd�|j��|dkr�d}d|vsn|j�|�rx|j|}|r�d|vr�|�|�d|vr�|�	|�n d|vr�|��d|vr�|�
�|j��D]D\}}|dks�||kr�d	|_||j|<|j
jd	d
�|jjd	d
�q�Wd�n1�s(0Yn�|j�tg}|j��D]>\}}||jv�rj|�|�n|j
jdd
�|jjdd
��qJ|D]}|�|��q�Wd�n1�s�0Yi|_t�d�dS)
Nz--allzReload already in progresszReload zjail %sz	all jailsz--if-existsz--unbanz	--restartT)�beginFzReload finished.)r4rU�
ValueErrorr>rQr/r0rs�
setUnbanIPrrqror|�filter�reload�actions�appendru)r<r*Zoptsr�rxZjnZdeljailsrrr�reloadJails(sH


".zServer.reloadJailscCs||j|_dS)NT�r0r|�r<r*�valuerrr�setIdleJail]szServer.setIdleJailcCs|j|jSrr�r~rrr�getIdleJailaszServer.getIdleJailcCst|�|j|j_dSr)rr0r��
ignoreSelfr�rrr�
setIgnoreSelfeszServer.setIgnoreSelfcCs|j|jjSr)r0r�r�r~rrr�
getIgnoreSelfhszServer.getIgnoreSelfcCs|j|j�|�dSr)r0r��addIgnoreIP�r<r*�iprrrr�kszServer.addIgnoreIPcCs|j|j�|�dSr)r0r��delIgnoreIPr�rrrr�nszServer.delIgnoreIPcCs|j|j��Sr)r0r��getIgnoreIPr~rrrr�qszServer.getIgnoreIPcCs&|j|j}t|t�r"|�||�dSr)r0r��
isinstancer�
addLogPath)r<r*�fileName�tail�filter_rrrr�ts
zServer.addLogPathcCs$|j|j}t|t�r |�|�dSr)r0r�r�r�
delLogPath)r<r*r�r�rrrr�ys
zServer.delLogPathcCs4|j|j}t|t�r|��St�d|�gSdS)Nz$Jail %s is not a FileFilter instance)r0r�r�rZgetLogPathsr>rQ�r<r*r�rrr�
getLogPath~s

zServer.getLogPathcCs$|j|j}t|t�r |�|�dSr)r0r�r�r	�addJournalMatch�r<r*�matchr�rrrr��s
zServer.addJournalMatchcCs$|j|j}t|t�r |�|�dSr)r0r�r�r	�delJournalMatchr�rrrr��s
zServer.delJournalMatchcCs4|j|j}t|t�r|��St�d|�gSdS)Nz'Jail %s is not a JournalFilter instance)r0r�r�r	�getJournalMatchr>rQr�rrrr��s

zServer.getJournalMatchcCs|j|j}|�|�dSr)r0r��setLogEncoding)r<r*�encodingr�rrrr��szServer.setLogEncodingcCs|j|j}|��Sr)r0r��getLogEncodingr�rrrr��szServer.getLogEncodingcCs|j|j�|�dSr)r0r��setFindTimer�rrrr��szServer.setFindTimecCs|j|j��Sr)r0r��getFindTimer~rrrr��szServer.getFindTimecCs|j|j�|�dSr)r0r��setDatePattern)r<r*�patternrrrr��szServer.setDatePatterncCs|j|j��Sr)r0r��getDatePatternr~rrrr��szServer.getDatePatterncCs|j|j�|�dSr)r0r��setLogTimeZone)r<r*Ztzrrrr��szServer.setLogTimeZonecCs|j|j��Sr)r0r��getLogTimeZoner~rrrr��szServer.getLogTimeZonecCs||j|j_dSr�r0r�Z
ignoreCommandr�rrr�setIgnoreCommand�szServer.setIgnoreCommandcCs|j|jjSrr�r~rrr�getIgnoreCommand�szServer.getIgnoreCommandcCs&td|d�\}}||j|j_dS)Nzcache[�])rr0r��ignoreCache)r<r*r�Zoptionsrrr�setIgnoreCache�szServer.setIgnoreCachecCs|j|jjSr)r0r�r�r~rrr�getIgnoreCache�szServer.getIgnoreCachecCs"|j|j}t�d|�||_dS)Nz  prefregex: %r)r0r�r>r?�	prefRegex)r<r*r��fltrrr�setPrefRegex�szServer.setPrefRegexcCs|j|jjSr)r0r�r�r~rrr�getPrefRegex�szServer.getPrefRegexcCs:|j|j}|s|f}|D]}t�d|�|�|�qdS)Nz  failregex: %r)r0r�r>r?�addFailRegex�r<r*r�Zmultipler�rrrr��s

zServer.addFailRegexNcCs|j|j�|�dSr)r0r��delFailRegex�r<r*�indexrrrr��szServer.delFailRegexcCs|j|j��Sr)r0r��getFailRegexr~rrrr��szServer.getFailRegexcCs:|j|j}|s|f}|D]}t�d|�|�|�qdS)Nz  ignoreregex: %r)r0r�r>r?�addIgnoreRegexr�rrrr��s

zServer.addIgnoreRegexcCs|j|j�|�dSr)r0r��delIgnoreRegexr�rrrr��szServer.delIgnoreRegexcCs|j|j��Sr)r0r��getIgnoreRegexr~rrrr��szServer.getIgnoreRegexcCs|j|j�|�dSr)r0r��	setUseDnsr�rrrr��szServer.setUseDnscCs|j|j��Sr)r0r��	getUseDnsr~rrrr��szServer.getUseDnscCs||j|jj_dSr�r0r�ZfailManagerZ
maxMatchesr�rrr�
setMaxMatches�szServer.setMaxMatchescCs|j|jjjSrr�r~rrr�
getMaxMatches�szServer.getMaxMatchescCs|j|j�|�dSr)r0r��setMaxRetryr�rrrr��szServer.setMaxRetrycCs|j|j��Sr)r0r��getMaxRetryr~rrrr��szServer.getMaxRetrycCs|j|j�|�dSr)r0r��setMaxLinesr�rrrr��szServer.setMaxLinescCs|j|j��Sr)r0r��getMaxLinesr~rrrr��szServer.getMaxLinescGs*|j|jj|g|�Rd||jvi�dS)Nr�)r0r�rvr4)r<r*r��argsrrr�	addAction�s�zServer.addActioncCs|j|jSr�r0r�r~rrr�
getActions�szServer.getActionscCs|j|j|=dSrr�r�rrr�	delActionszServer.delActioncCs|j|j|Srr�r�rrr�	getActionszServer.getActioncCs|j|j�|�dSr)r0r��
setBanTimer�rrrr�szServer.setBanTimecGs|j|jj|�Sr)r0r�Z
addAttempt)r<r*r�rrr�addAttemptIPszServer.addAttemptIPcCs|j|j�|�Sr)r0r�ZaddBannedIPr�rrr�setBanIPszServer.setBanIPcCsV|dur|j|g}nt|j���}d}||duO}|D]}||jj||d�7}q8|S)Nr)�ifexists)r0r��valuesr�ZremoveBannedIP)r<r*r�r��jailsZcntrxrrrr�szServer.setUnbanIPcCs�|dur|j|g}nt|j���}g}|durr|rr|D]6}g}|D]}|j�|g�rD|�|j�qD|�|�q8n6|D]0}|j�|�}|dur�|S|�|j|i�qv|Sr)r0r�r�r�Z	getBannedr�r*)r<r*Zidsr��resr�rkrxrrr�banneds$z
Server.bannedcCs|j|j��Sr)r0r��
getBanTimer~rrrr�9szServer.getBanTimecCs|j|j�|�S)z�Returns the list of banned IP addresses for a jail.

		Parameters
		----------
		name : str
			The name of a jail.

		Returns
		-------
		list
			The list of banned IP addresses.
		)r0r��
getBanList)r<r*ZwithTimerrrr�<s
zServer.getBanListcCs|j|�||�dSr)r0�setBanTimeExtra)r<r*�optr�rrrr�KszServer.setBanTimeExtracCs|j|�|�Sr)r0�getBanTimeExtra)r<r*r�rrrr�NszServer.getBanTimeExtracCs|jduo|j��Sr)r5ZisActive�r<rrr�	isStartedQszServer.isStartedcCs@|durt|j�|krdSt|j���D]}|��s(dSq(dS)Nrr)�lenr0r�r�r{)r<Zjailnumrxrrrr{TszServer.isAlivecCs^zL|j��t|j�}|��d�|�}dt|j�fd|fg}|W|j��S|j��0dS)Nz, zNumber of jailz	Jail list)r/�acquirer�r0�sortrzr��release)r<r�ZjailListrkrrr�status]s


�
�z
Server.status�basiccCs|j|j|d�S)N)�flavor)r0r�)r<r*r�rrr�
statusJailiszServer.statusJailcCs~|��}|j�\|j|kr*Wd�dSt|�}td��tdksL|tjkrP|nt	�||_Wd�n1sp0YdS)N�fail2ban�	INHERITED)
�upperr.r6rrZsetLevelr[�logging�DEBUGrY)r<r�ZllrrrrXys
�zServer.setLogLevelcCs0|j�|jWd�S1s"0YdSr)r.r6r�rrr�getLogLevel�szServer.getLogLevelc
Cs�t|�\}}|��}|j���|j|kr8Wd�dS|dkrV||_Wd�dS|�d�}|dk�rX|�dd���}|dur�d}zttjjd|�}Wn.t	y�t
�d	|�d��tjjj}Yn0|j
d
kr�ddl}|j�|���|_
|j
du�r6tj�|j
��r6t�t�|j
�j��r6tjj|j
|d�}n t
�d
|j
�Wd�dSn�|dv�rpt�tj�}nt|dk�r�t�tj�}n\zt|d���tj�|�}Wn<t�y�t
�d|�t
�d|j�YWd�dS0t d�}|jddd�D]h}	|�!|	�z|	�"�|	��WnBt#t$f�y`dtj%k�rLdk�sZndtj%k�r\�Yn0�q�|�&�tj'k�r�|j(du�r�tj'|�&�d|_(|�d�}
|
du�r�t)|
�}
n|dv}
|du�r�t)|�}nd}|�dd�dk�r�|�d�}n4d}|j(du�r|j(dk�r|j(d}t*||
|d�}|�+t�,|��|�-|�|jdu�r�t
�d t.j.�t
�d!|dk�rn|nd"||j
ft.j.f�||_Wd�dS1�s�0YdS)#NTr��padding�SYSLOG�facilityZDAEMON�0ZLOG_z)Unable to set facility %r, using 'DAEMON'rr)r�z9Syslog socket file: %s does not exists or is not a socketF)r�SYSOUT�STDERR�azUnable to log to %rzLogging to previous target %rr����)r
��)r�)r�r
rZdatetime)r�r��format�r
)�addtimer�zStart Fail2ban v%sz-Changed logging target to %s for Fail2ban v%sz%s (%s))/rr�r.r7rU�getattrr��handlersZ
SysLogHandler�AttributeErrorr>rSZ
LOG_DAEMONr9�platformr:�systemr"r#rs�stat�S_ISSOCK�st_modeZ
StreamHandlerra�stdout�stderrrbreZRotatingFileHandlerrfrQrZ
removeHandler�flushr��KeyError�version_infoZgetEffectiveLevelr�r8rrZsetFormatterZ	FormatterZ
addHandlerr)
r<�targetZ
logOptionsZ	systargetr�r�r�ZhdlrZlogger�handlerr�ZfmtrKrrrrZ�s�




�������


�






�����zServer.setLogTargetcCs\|j�0|j|kr"Wd�dS||_Wd�n1s<0Y|jdkpZ|�|j�S)NTr�)r.r9r7rZ)r<rLrrrrVs
$

�zServer.setSyslogSocketcCs0|j�|jWd�S1s"0YdSr)r.r7r�rrr�getLogTargetszServer.getLogTargetcCs0|j�|jWd�S1s"0YdSr)r.r9r�rrr�getSyslogSocketszServer.getSyslogSocketc	Cs�|jdvrftd�jD]L}z|��t�d|j�Wqty^|��t�d|j�Yq0qdStd�jD]}|��t�d|j�qpdSdS)N)r�rr�r�zrollover performed on %szflush performed on %szrolled overZflushed)r7rr�Z
doRolloverr>rQr�r)r<r	rrrrCs
zServer.flushLogscCs>|��D]0\}}|dkr,t�t|�d�qtd|��qdS)N�	stacksize�zunknown option %r)ror�
stack_size�intr)r<r��o�vrrr�setThreadOptions&szServer.setThreadOptionscCsdt��diS)Nrr
)rrr�rrr�getThreadOptions-szServer.getThreadOptionscCs�|jr|jj|krdS|js,|��dkr,dSt|j�dkrBtd��|��dkrVd|_n0tdur|t|�t|�|_|j��n
t	�
d�tjdur�tj�
|j�dS)NZnonerz3Cannot change database when there are jails presentzEUnable to import fail2ban database module as sqlite is not available.)r1�filename�lowerr�r0�RuntimeErrorrr,ZdelAllJailsr>rSrrgZdb_set)r<rrrr�setDatabase0s&�
�
zServer.setDatabasecCs|jSr)r1r�rrr�getDatabaseGszServer.getDatabasec
Cs�|�tjtj�zt��}Wn4tyP}zd|j|jffWYd}~Sd}~00|dkr�t�	�zt��}Wn4ty�}zd|j|jffWYd}~Sd}~00|dkr�t�
d�q�t�d�ndSzt�d�}Wnt
tf�y�d}Yn0tjdd�dk�rht�d	tj�}td|�D]:}ztj�||��s@t�|�Wnt�yVYn0�q t�|�nt�d|�t�d
tj�t�d
tj�t�d
tj�dS)z� Detach a process from the controlling terminal and run it in the
			background as a daemon.
		
			http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/278731
		FNr�/�SC_OPEN_MAX�r�)r��rz/dev/urandomz	/dev/null)T)rIrE�SIGHUP�SIG_IGNr"�forkr'r)�strerror�setsid�chdir�_exit�sysconfr�r�rarrb�O_RDONLY�ranger#�sameopenfilere�
closerange�O_RDWR)r<�pidr+ZmaxfdZ
urandom_fd�fdrrrZ__createDaemonJsB
&	&

zServer.__createDaemon)F)TT)F)F)N)F)NNT)NN)F)N)r�)Ur�
__module__�__qualname__r=r^r`rIrhr@rwrur}rrqr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r{r�r�rXr�rZrVr
rrCrrrrrRrrrrr-Os�
P/
	
5







	

q	r-c@seZdZdS)rTN)rr,r-rrrrrT�srT)2�
__author__Z
__copyright__Z__license__rrrr�r"rErrarjrrr�rr�rr	Ztransmitterr
Zasyncserverrrr�rZhelpersrrrrrrrrr>rWrYr[Zdatabaser�ImportErrorr r(�	NameErrorr'r,r-�	ExceptionrTrrrr�<module>sL$


W