
    =*fW(                     h   S r SrSrSSKJrJrJr   SSKr SSK
r
SSKrSSKrSSKrSSKrSSKrSSKrSSKrS	S
KJr  SSKJr  SSKJrJrJr  \" \5      r " S S\R8                  5      rSS jr " S S\
R>                  5      r  " S S\!5      r"g! \ a	    SSK	Jr   Nf = f! \ a	    SSK	J
r
   Nf = f)zCyril Jaquierz Copyright (c) 2004 Cyril JaquierGPL    )dumpsloadsHIGHEST_PROTOCOLN   )asynchat)asyncore   )Utils)CSPROTO)logging	getLoggerformatExceptionInfoc                   N    \ rS rSrS rS rS rS r " S S\5      r	S r
S	 rS
rg)RequestHandler9   c                     [         R                  R                  X5        Xl        X l        / U l        U R                  [        R                  5        g N)	r   
async_chat__init___RequestHandler__conn_RequestHandler__transmitter_RequestHandler__bufferset_terminatorr   END)selfconntransmitters      =/usr/lib/python3/dist-packages/fail2ban/server/asyncserver.pyr   RequestHandler.__init__;   s:    
t*+"$-gkk"    c                     U R                   (       aD  U R                   nS U l          UR                  [        R                  5        UR	                  5         g g ! [        R
                   a     g f = fr   )r   shutdownsocket	SHUT_RDWRcloseerror)r   r   s     r   __closeRequestHandler.__closeC   sV    	[[
++44;	MM&""#JJL  ,, 		s   /A A.-A.c                 b    U R                  5         [        R                  R                  U 5        g r   )_RequestHandler__closer   r   handle_closer   s    r   r,   RequestHandler.handle_closeM   s    ,,.
""4(r!   c                 :    U R                   R                  U5        g r   )r   append)r   datas     r   collect_incoming_data$RequestHandler.collect_incoming_dataQ   s    --tr!   c                       \ rS rSrSrg)RequestHandler.LoadErrorV    N__name__
__module____qualname____firstlineno____static_attributes__r7   r!   r   	LoadErrorr5   V   s    r!   r>   c                     U R                   n/ U l         [        R                  R                  U5      nU[        R                  :X  a  U R                  5         g  [        U5      nU R                  (       a  U R                  R!                  U5      nOS/n[#        U[$        5      nU R'                  U[        R(                  -   5        g ! [         aR  n[        R                  SU[        R                  5       [        R                  :  S9  [        R                  U5      eS nAff = f! [         a  n[+        U[        R                  5      (       d8  [        R                  SU[        R                  5       [        R                  :*  S9  [#        SU-  [$        5      nU R'                  U[        R(                  -   5         S nAg S nAff = f)Nz$PROTO-error: load message failed: %sexc_infoSHUTDOWNzCaught unhandled exception: %r	ERROR: %s)r   r   EMPTYjoinCLOSEclose_when_doner   	ExceptionlogSysr'   getEffectiveLevelr   DEBUGr   r>   r   proceedr   r   pushr   
isinstance)r   messagees      r   found_terminatorRequestHandler.found_terminator^   sf    $]]74=]](7
&GnG   ((1GlG7,-799Ww{{"#  &
LL7&&(6  8

"
"1
%%& 
 $
Q00
1
1
LL11&&('--7  9 ;?$45799Ww{{"##$s?   AD' C %A"D' 
D$ADD$$D' '
G1BGGc                     [        5       u  p[        R                  S[        U5      -  5        [        R                  [        R
                  " 5       R                  5       5        [        SU-  [        5      nU R                  U[        R                  -   5        U R                  5         g ! [         a
  n S nAN S nAff = f)Nz"Unexpected communication error: %srC   )r   rI   r'   str	traceback
format_exc
splitlinesr   r   rM   r   r   rH   rG   )r   e1e2rO   rP   s        r   handle_errorRequestHandler.handle_error   s    !62	<<4s2w>?	<<	$$&1134;#%56799Ww{{"#  
 s   BB+ +
B?:B?)__buffer__conn__transmitterN)r9   r:   r;   r<   r   r+   r,   r2   rH   r>   rQ   rZ   r=   r7   r!   r   r   r   9   s-    #	)
 !$L
r!   r   c                    U(       d  0 nSUS'   Uc  [         R                  n[        R                  n[	        U5      (       a  UnOnU(       ag  [        R
                  (       aR  [        [        R                  S5      (       a3  [        R                  S5        [        U5      S-  n[        R
                  nU " 5       (       a/   U" U5        US   (       a  US==   S-  ss'   U " 5       (       a  M.  gg! [         GaE  nU " 5       (       d   SnAgUS==   S-  ss'   US   S:  ay  UR                  S   [        R                  [        R                  4;   a$  [        R!                  S	[#        U5      5         SnAN[        R%                  S	[#        U5      5         SnANUS   S:X  a/  [        R'                  U5        [        R%                  S
5         SnANUS   S:  aY  UR                  S   [        R(                  :X  d  [+        UR-                  5       5      S:  a  [        R/                  SU5         SnAg SnAGN[SnAff = f)zCustom event loop implementation

Uses poll instead of loop to respect `active` flag,
to avoid loop timeout mistake: different in poll and poll2 (sec vs ms),
and to prevent sporadic errors like EBADF 'Bad file descriptor' etc. (see gh-161)
r   listenNpollz"Server listener (select) uses poll  r
      z Server connection was closed: %sz0Too many errors - stop logging connection errorsd   +Too many errors - critical count reached %r)r   DEFAULT_SLEEP_TIMEr	   ra   callablepoll2hasattrselectrI   debugfloatrH   argserrnoENOTCONNEBADFinforT   r'   	exceptionEMFILEsumvaluescritical)activetimeoutuse_poll	err_countra   rP   s         r   loopr{      s    	R98O$$'X	$8>>ghoov&F&F,,34'NT!'	$xx=h1	 xx
 
 
((	X!B 	vvayU^^U[[11[[3SV<<\\4c!f==(r!
Q
LLCDD(c!	q	U\\!I$&__BIN
)s2    C/ /H?:H:A&H:6H:3H:AH::H?c                   ^    \ rS rSrS rS rS rSS jrS rS r	S	 r
S
 rS r\S 5       rSrg)AsyncServer   c                     [         R                  R                  U 5        Xl        SU l        SU l        SU l        SSS.U l        S U l        g )Nz/var/run/fail2ban/fail2ban.sockFr   )acceptr`   )	r	   
dispatcherr   _AsyncServer__transmitter_AsyncServer__sock_AsyncServer__init_AsyncServer__active_AsyncServer__errCountonstart)r   r   s     r   r   AsyncServer.__init__   sD    
t$"1$+$+$- A.$/$,r!   c                     gNFr7   r-   s    r   writableAsyncServer.writable   s    	r!   c                 J    U R                  5       u  pU R                  S   (       a  U R                  S==   S-  ss'   [        R!                  U5        [#        XR$                  5        g ! [         Ga-  nU R                  S==   S-  ss'   U R                  S   S:  a&  [        R	                  SUU R                  S   S:*  S9  OU R                  S   S:X  a  [        R                  S5        OU R                  S   S:  a  [        U[        R
                  5      (       a!  UR                  S   [        R                  :X  d'  [        U R                  R                  5       5      S	:  a0  [        R                  S
U R                  5        U R                  5          S nAg S nAff = f)Nr   r
   rc   zAccept socket error: %sr@   z.Too many acceptor errors - stop logging errorsrd   r   rb   re   )r   rH   r   rI   warningr'   rN   r$   rm   rn   rs   rt   ru   rv   stopr}   _AsyncServer__markCloseOnExecr   r   )r   r   addrrP   s       r   handle_acceptAsyncServer.handle_accept   s>   
:4  
__X??8!% ))*) 
 
??8!
ooh"$
NN,ax(A-  0!R'
LLAB!C'1fll##q	U\\(ADOO""$%,__BDOOT	YY[	
s   A* *F"5D#FF"Nc                 B  ^  [         R                  " 5       T l        UT l        [        R
                  R                  U5      (       aM  [        R                  S5        U(       a&  [        R                  S5        T R                  5         O[        S5      eT R                  [        R                  [        R                  5        T R!                  5          T R#                  U5        [&        R)                  T R                  5        T R+                  S5        S=T l        =T l        T l        T R2                  (       a  T R3                  5         [5        U 4S jX4T R6                  S9  S	T l        T R9                  5         g ! [$         a    [        ST R                  -  5      ef = f)
Nz$Fail2ban seems to be already runningzForcing execution of the serverzServer already runningzUnable to bind socket %sr
   Tc                     > T R                   $ r   )_AsyncServer__loopr-   s   r   <lambda>#AsyncServer.start.<locals>.<lambda>  s	    t{{r!   )rx   ry   rz   F)	threadingcurrent_thread_AsyncServer__workerr   ospathexistsrI   r'   r   _remove_sockAsyncServerExceptioncreate_socketr$   AF_UNIXSOCK_STREAMset_reuse_addrbindrH   r}   r   r`   r   r   r   r   r{   r   r   )r   sockforcerx   ry   s   `    r   startAsyncServer.start   s&   **,$-$+WW^^D	<<67
NN45
7
88V^^V%7%78H99T? ,++a..22$+2dm	\\<<>G$//Z$-))+ 
 H	84;;F	GGHs   E; ;#Fc                   ^  SnT R                   (       a  ST l        T R                  (       a*   T R                  R                  [        R                  5        [        R                  R                  T 5        [        R                  " 5       T R                  :w  a  [        R                  " U 4S jS5        SnT R                  (       a`  [        R                   R#                  T R$                  5      (       a2  T R'                  5         [(        R+                  ST R$                  -   5        U(       a  [(        R+                  S5        ST l         g ! [        R
                   a     GNf = f)NFc                  &   > T R                   (       + $ r   r   r-   s   r   r   #AsyncServer.close.<locals>.<lambda>%  s    t}},r!   r
   TzRemoved socket file zSocket shutdown)r   r   r$   r#   r%   r'   r	   r   r&   r   r   r   r   wait_forr   r   r   r   r   r   rI   rk   )r   stopflgs   ` r   r&   AsyncServer.close  s    '	]]4;
kk
	[[&**+ T"  DMM1	NN,a07	[[RWW^^DKK00	<<&45	<<!"$- << 
	
s   )E E#"E#c                 `    U R                   (       a  [        R                  S5        S U l         g g )NzStop communication, shutdown)r   rI   rk   r-   s    r   stop_communicationAsyncServer.stop_communication2  s%    		<<./4 r!   c                 D    U R                  5         U R                  5         g r   )r   r&   r-   s    r   r   AsyncServer.stop:  s    **,r!   c                     U R                   $ r   r   r-   s    r   isActiveAsyncServer.isActive?  s    	r!   c                      [         R                  " U R                  5        g ! [         a)  nUR                  [        R
                  :w  a  e  S nAg S nAff = fr   )r   remover   OSErrorrn   ENOENT)r   rP   s     r   r   AsyncServer._remove_sockE  s?    
99T[[	 
gg	 
s    # 
AAAc                     U R                  5       n[        R                  " U[        R                  5      n[        R                  " U[        R                  U[        R                  -  5        g r   )filenofcntlF_GETFDF_SETFD
FD_CLOEXEC)r   fdflagss      r   __markCloseOnExecAsyncServer.__markCloseOnExecR  s@    {{}"
++b%--
(%++b%--u'7'7!78r!   )__active
__errCount__init__loop__sockr^   __workerr   r   )r9   r:   r;   r<   r   r   r   r   r&   r   r   r   r   staticmethodr   r=   r7   r!   r   r}   r}      sC    +>>8

 9 9r!   r}   c                       \ rS rSrSrg)r   i\  r7   Nr8   r7   r!   r   r   r   \  s    r!   r   )NFN)#
__author____copyright____license__pickler   r   r   r   ImportErrorcompatr	   rn   r   r   r$   sysr   rU   utilsr   protocolr   helpersr   r   r   r9   rI   r   r   r{   r   r}   rH   r   r7   r!   r   <module>r      s   . 
2 1 1   	  
     = = 
8	UX(( Up-lO9(%% O9j9 }	    s"   B B" BB"B10B1