
    Bd'                         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j                  ZddZ G d dej                  Z G d de          Z dS )zCyril Jaquierz Copyright (c) 2004 Cyril JaquierGPL    )dumpsloadsHIGHEST_PROTOCOLN   )Utils   )CSPROTO)logging	getLoggerformatExceptionInfoc                   N    e Zd Zd Zd Zd Zd Z G d de          Zd Z	d Z
d	S )
RequestHandlerc                     t           j                            | |           || _        || _        g | _        |                     t          j                   d S N)	asynchat
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__5   sM    
tT***$+"$$-gk"""""    c                     | j         rZ| j         }d | _         	 |                    t          j                   |                                 d S # t          j        $ r Y d S w xY wd S r   )r   shutdownsocket	SHUT_RDWRcloseerror)r   r   s     r   __closezRequestHandler.__close=   ss    	[ 	
+44;	MM&"###JJLLLLL
, 	 	 	DD		 	s   3A AAc                 l    |                                   t          j                            |            d S r   )_RequestHandler__closer   r   handle_closer   s    r   r(   zRequestHandler.handle_closeG   s,    ,,...
""4(((((r   c                 :    | j                             |           d S r   )r   append)r   datas     r   collect_incoming_dataz$RequestHandler.collect_incoming_dataK   s    -tr   c                       e Zd ZdS )RequestHandler.LoadErrorN__name__
__module____qualname__ r   r   	LoadErrorr/   P   s        $r   r5   c                    	 | j         }g | _         t          j                            |          }|t          j        k    r|                                  d S 	 t          |          }nn# t          $ ra}t          	                    d|t          
                                t          j        k                t                              |          d }~ww xY w| j        r| j                            |          }ndg}t#          |t$                    }|                     |t          j        z              d S # t          $ r}t+          |t          j                  sBt          	                    d|t          
                                t          j        k               t#          d|z  t$                    }|                     |t          j        z              Y d }~d S 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_terminatorX   s    $]74=]((7
F&GnnGG
 & & &
LL7&&((6  8 8 8

"
"1
%
%%&
   ((11GGlG7,--799Ww{"#####	 $ $ $
Q0
1
1 9
LL11&&(('-7  9 9 9 ;?$455799Ww{"#########$s?   AD2 A& %D2 &
C0ACCAD2 2
G<BGGc                    	 t                      \  }}t                              dt          |          z             t                              t	          j                                                               t          d|z  t                    }| 	                    |t          j        z              n# t          $ r
}Y d }~nd }~ww xY w|                                  d S )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	<<4s2ww>???	<<	$&&1133444;#%566799Ww{"####	   4444s   B2B5 5
C	C	N)r1   r2   r3   r   r'   r(   r-   r?   r5   rH   rP   r4   r   r   r   r   3   s        # # #	 	 	) ) )  
       !$ !$ !$L
 
 
 
 
r   r   Fc                 ~   |si }d|d<   |t           j        }t          j        }t	          |          r|}n`|r^t          j        rRt          t          j        d          r8t          	                    d           t          |          dz  }t          j        } |             r	  ||           |d         r|dxx         dz  cc<   ni# t          $ r[} |             sY d}~dS |dxx         dz  cc<   |d         dk     rw|j        d         t          j        t          j        fv r)t                              d	t#          |                     nt                              d	t#          |                     n|d         dk    r5t                              |           t                              d
           nm|d         dk    ra|j        d         t          j        k    s%t+          |                                          dk    r!t                              d|           Y d}~dS Y d}~nd}~ww xY w |             dS dS )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> ghov&F&F ,,3444'NNT!'	$vxx 4=== h1	   
&(( 
	EEEEEX!B 	vayU^U[111[[3SVV<<<<\\4c!ff====(r!!
Q
LLCDDDD(c!!	q	U\!!I$&&__BINNN
UUUUU) vxx     s   "#C H-
H("D;H((H-c                   \    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dS )AsyncServerc                     t           j                            |            || _        d| _        d| _        d| _        ddd| _        d | _        d S )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__   sP    
t$$$"$1$+$+$- A..$/$,,,r   c                     dS NFr4   r)   s    r   writablezAsyncServer.writable   s    	r   c                 T   	 |                                  \  }}n<# t          $ r.}| j        dxx         dz  cc<   | j        d         dk     r-t                              d|| j        d         dk               n| j        d         dk    rt                              d           n| j        d         dk    rt          |t          j                  r|j        d         t          j
        k    s*t          | j                                                  d	k    r4t                              d
| j                   |                                  Y d }~d S d }~ww xY w| j        d         r| j        dxx         dz  cc<   t                              |           t#          || j                   d S )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	 
 
 
?8!
oh"$$
NN,ax(A-  0 0 0 0!R''
LLABBBB!C''1fl##()q	U\(A(ADO""$$%%,,__BDOTTT	YY[[[	66666
 
_X #?8!%%% t)*****s    ED#EENFc                 `    t          j                     _        | _        t          j                            |          rZt                              d           |r/t          	                    d            
                                 nt          d                               t          j        t          j                                                     	                      |           n%# t$          $ r t          d j        z            w xY wt&                               j                                        d           dx _        x _         _         j        r                                  t5           fd|| j                   d	 _                                          d S )
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   *,,$-$+W^^D 9	<<6777 9
NN4555
7
8
88V^V%7888H99T????	 H H H	84;F	G	GGH,,,++a....22$+2dm	\ <<>>>Gh$/ZZZZ$-))+++++s   C/ /"Dc                 ^    d} j         rd _         j        r;	  j                            t          j                   n# t          j        $ r Y nw xY wt          j                                        t          j
                     j        k    rt          j         fdd           d} j        rZt          j                             j                  r6                                  t(                              d j        z              |rt(                              d           d _         d S )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;
k 

	[&*++++< 
 
 
	T
 T"""   DM11	N,,,,a0007	[ 6RW^^DK00 6	<<&4555 #	<<!"""$---s   $? AAc                 Z    | j         r#t                              d           d | _         d S d S )NzStop communication, shutdown)rt   r@   r^   r)   s    r   stop_communicationzAsyncServer.stop_communication,  s8    	 	<<.///4 r   c                 V    |                                   |                                  d S r   )r   r#   r)   s    r   r   zAsyncServer.stop4  s%    **,,,,,r   c                     | j         S r   r   r)   s    r   isActivezAsyncServer.isActive9  s
    	r   c                     	 t          j        | j                   d S # t          $ r!}|j        t          j        k    r Y d }~d S d }~ww xY wr   )r   removeru   OSErrorra   ENOENT)r   rG   s     r   r   zAsyncServer._remove_sock?  sd    
9T[	 
 
 
g	 
s    
AAAc                     |                                  }t          j        |t          j                  }t          j        |t          j        |t          j        z             d S r   )filenofcntlF_GETFDF_SETFD
FD_CLOEXEC)r   fdflagss      r   __markCloseOnExeczAsyncServer.__markCloseOnExecL  sF    {{}}"
+b%-
(
(%+b%-u'7!788888r   r{   )r1   r2   r3   r   r|   r   r   r#   r   r   r   r   staticmethodr   r4   r   r   rp   rp      s            + + +>   >  8    
  
 
 
 9 9 ,9 9 9r   rp   c                       e Zd ZdS )r   Nr0   r4   r   r   r   r   V  s        r   r   )NFN)!
__author____copyright____license__pickler   r   r   r   rY   ra   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 1 1 1 1 1 1 1 1     				  



                     = = = = = = = = = = 
8		U U U U UX( U U Up- - - -lO9 O9 O9 O9 O9(% O9 O9 O9j    9     r   