
    ogf(                     >   d Z dZdZddlmZmZmZ ddlZ	 ddlZddlZddlZddlZddlZddlZddlZddlZdd	lmZ dd
lmZ ddlmZmZmZ  ee      Z G d dej8                        ZddZ G d dej>                        Z  G d de!      Z"y# e	$ r	 ddl
mZ Y w xY w)zCyril Jaquierz Copyright (c) 2004 Cyril JaquierGPL    )dumpsloadsHIGHEST_PROTOCOLN   )asynchat   )Utils)CSPROTO)logging	getLoggerformatExceptionInfoc                   F    e Zd Zd Zd Zd Zd Z G d de      Zd Z	d Z
y	)
RequestHandlerc                     t         j                  j                  | |       || _        || _        g | _        | j                  t        j                         y 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   zRequestHandler.__init__8   s@    
tT*$+"$$-gkk"    c                     | j                   rD| j                   }d | _         	 |j                  t        j                         |j	                          y y # t        j
                  $ r Y y w xY wr   )r   shutdownsocket	SHUT_RDWRcloseerror)r   r   s     r   __closezRequestHandler.__close@   sV    	[[
++44;	MM&""#JJL  ,, 		s   /A A('A(c                 b    | j                          t        j                  j                  |        y r   )_RequestHandler__closer   r   handle_closer   s    r   r(   zRequestHandler.handle_closeJ   s    ,,.
""4(r   c                 :    | j                   j                  |       y r   )r   append)r   datas     r   collect_incoming_dataz$RequestHandler.collect_incoming_dataN   s    --tr   c                       e Zd Zy)RequestHandler.LoadErrorN__name__
__module____qualname__ r   r   	LoadErrorr/   S   s    r   r5   c                    	 | j                   }g | _         t        j                  j                  |      }|t        j                  k(  r| j                          y 	 t        |      }| j                  r| j                  j!                  |      }ndg}t#        |t$              }| j'                  |t        j(                  z          y # t        $ rU}t        j                  d|t        j                         t        j                  k         t        j                  |      d }~ww xY w# t        $ r}t+        |t        j                        s;t        j                  d|t        j                         t        j                  k         t#        d|z  t$              }| j'                  |t        j(                  z          Y d }~y d }~ww xY w)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   r5   r   proceedr   r   pushr   
isinstance)r   messagees      r   found_terminatorzRequestHandler.found_terminator[   sc    $]]74=]](7
&GnG   ((1GlG7,-799Ww{{"#  &
LL7&&(6  8

"
"1
%%& 
 $
Q00
1
LL11&&('--7  9 ;?$45799Ww{{"##$s?   AD# C $AD# 	D ADD  D# #	G ,B
F;;G c                    	 t               \  }}t        j                  dt        |      z         t        j                  t	        j
                         j                                t        d|z  t              }| j                  |t        j                  z          | j                          y # t        $ r
}Y d }~d }~ww xY w)Nz"Unexpected communication error: %sr:   )r   r@   r$   str	traceback
format_exc
splitlinesr   r   rD   r   r   r?   r>   )r   e1e2rF   rG   s        r   handle_errorzRequestHandler.handle_error   s    !62r	<<4s2w>?	<<	$$&1134;#%56799Ww{{"#  
 s   BB+ +	B>9B>N)r1   r2   r3   r   r'   r(   r-   r?   r5   rH   rP   r4   r   r   r   r   6   s-    #	)
 !$L
r   r   c                    |si }d|d<   |t         j                  }t        j                  }t	        |      r|}n_|r]t        j
                  rMt        t        j                  d      r3t        j                  d       t        |      dz  }t        j
                  } |        r$	  ||       |d   r|dxx   dz  cc<    |        r#yy# t        $ r-} |        sY d}~y|dxx   dz  cc<   |d   dk  ro|j                  d   t        j                  t        j                  fv r t        j!                  d	t#        |             nt        j%                  d	t#        |             n|d   dk(  r+t        j'                  |       t        j%                  d
       n_|d   dkD  rW|j                  d   t        j(                  k(  st+        |j-                               dkD  rt        j/                  d|       Y d}~yY d}~<d}~ww xY w)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_TIMEasyncorerS   callablepoll2hasattrselectr@   debugfloatr?   argserrnoENOTCONNEBADFinforJ   r$   	exceptionEMFILEsumvaluescritical)activetimeoutuse_poll	err_countrS   rG   s         r   looprn      s    	R98O$$'X	$8>>ghoov&F,,34'NT!'	$x=h1	 x
 
 
(	X!B 	vvayU^^U[[11[[3SV<\\4c!f=(r!
Q
LLCD(c!	q	U\\!I$&__BIN
)s   !C 
G<G7DG77G<c                   T    e Zd Zd Zd Zd ZddZd Zd Zd Z	d	 Z
d
 Zed        Zy)AsyncServerc                     t         j                  j                  |        || _        d| _        d| _        d| _        ddd| _        d | _        y )Nz/var/run/fail2ban/fail2ban.sockFr   )acceptrR   )	rY   
dispatcherr   _AsyncServer__transmitter_AsyncServer__sock_AsyncServer__init_AsyncServer__active_AsyncServer__errCountonstart)r   r   s     r   r   zAsyncServer.__init__   sF    
t$"$1$+$+$- A.$/$,r   c                      yNFr4   r)   s    r   writablezAsyncServer.writable   s    	r   c                 4   	 | j                         \  }}| j                  d   r| j                  dxx   dz  cc<   t        j!                  |       t#        || j$                         y # t        $ r&}| j                  dxx   dz  cc<   | j                  d   dk  r)t        j	                  d|| j                  d   dk         n| j                  d   dk(  rt        j                  d       n| j                  d   dkD  rt        |t        j
                        r |j                  d   t        j                  k(  s&t        | j                  j                               d	kD  r0t        j                  d
| j                         | j                          Y d }~y d }~ww xY w)Nrr   r	   rU   zAccept socket error: %sr7   z.Too many acceptor errors - stop logging errorsrV   r   rT   rW   )rr   r?   rx   r@   warningr$   rE   r!   r`   ra   rf   rg   rh   ri   stoprp   _AsyncServer__markCloseOnExecr   rt   )r   r   addrrG   s       r   handle_acceptzAsyncServer.handle_accept   s?   
:4  
__X??8!% t))*) 
 
??8!
ooh"$
NN,ax(A-  0!R'
LLAB!C'1fll#q	U\\(ADOO""$%,__BDOOT	YY[	
s   A' '
F1DFFNc                 &    t        j                          _        | _        t        j
                  j                  |      rHt        j                  d       |r&t        j                  d        j                          nt        d       j                  t        j                  t        j                          j!                          	  j#                  |       t&        j)                   j                          j+                  d       dx _        x _         _         j2                  r j3                          t5         fd|| j6                         d	 _         j9                          y # t$        $ r t        d j                  z        w xY w)
Nz$Fail2ban seems to be already runningzForcing execution of the serverzServer already runningzUnable to bind socket %sr	   Tc                       j                   S r   )_AsyncServer__loopr)   s   r   <lambda>z#AsyncServer.start.<locals>.<lambda>  s    t{{ r   )rk   rl   rm   F)	threadingcurrent_thread_AsyncServer__workerru   ospathexistsr@   r$   r~   _remove_sockAsyncServerExceptioncreate_socketr!   AF_UNIXSOCK_STREAMset_reuse_addrbindr?   rp   r   rR   rv   r   rw   ry   rn   rx   r   )r   sockforcerk   rl   s   `    r   startz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	\\<<>Gh$//Z$-))+ 
 H	84;;F	GGHs   E. ."Fc                     d} j                   rd _         j                  r*	  j                  j                  t        j                         t        j                  j                          t        j                          j                  k7  rt        j                   fdd       d} j                  r[t        j                   j#                   j$                        r2 j'                          t(        j+                  d j$                  z          |rt(        j+                  d       d _         y # t        j
                  $ r Y w xY w)NFc                       j                    S r   rw   r)   s   r   r   z#AsyncServer.close.<locals>.<lambda>"  s    t}}, r   r	   TzRemoved socket file zSocket shutdown)rw   r   r!   r    r"   r$   rY   rs   r#   r   r   r   r
   wait_forrv   r   r   r   ru   r   r@   r^   )r   stopflgs   ` r   r#   zAsyncServer.close  s    '	]]4;
kk
	[[&**+ T"  DMM1	NN,a07	[[RWW^^DKK0	<<&45	<<!"$- << 
	
s   )D. .EEc                 V    | j                   rt        j                  d       d | _         y y )NzStop communication, shutdown)rt   r@   r^   r)   s    r   stop_communicationzAsyncServer.stop_communication/  s%    		<<./4 r   c                 D    | j                          | j                          y r   )r   r#   r)   s    r   r   zAsyncServer.stop7  s    **,r   c                     | j                   S r   r   r)   s    r   isActivezAsyncServer.isActive<  s    	r   c                     	 t        j                  | j                         y # t        $ r(}|j                  t        j
                  k7  r Y d }~y d }~ww xY wr   )r   removeru   OSErrorra   ENOENT)r   rG   s     r   r   zAsyncServer._remove_sockB  s?    
99T[[	 
gg	 
s   " 	AAAc                     | j                         }t        j                  |t        j                        }t        j                  |t        j                  |t        j                  z         y r   )filenofcntlF_GETFDF_SETFD
FD_CLOEXEC)r   fdflagss      r   __markCloseOnExeczAsyncServer.__markCloseOnExecO  s@    {{}"
++b%--
(%++b%--u'7'7!78r   r{   )r1   r2   r3   r   r|   r   r   r#   r   r   r   r   staticmethodr   r4   r   r   rp   rp      sC    +>>8

 9 9r   rp   c                       e Zd Zy)r   Nr0   r4   r   r   r   r   Y  s    r   r   )NFN)#
__author____copyright____license__pickler   r   r   rY   r   ImportErrorcompatra   r   r   r!   sysr   rK   utilsr
   protocolr   helpersr   r   r   r1   r@   r   r   rn   rs   rp   r?   r   r4   r   r   <module>r      s   . 
2 1 1    	  
     = = 
8	UX(( Up-lO9(%% O9j9 u	  s   B BB