a =*fW(@s&dZdZdZddlmZmZmZz ddlZWneyJddl mZYn0z ddl Z Wneyvddl m Z Yn0ddl Z ddl Z ddl Z ddlZddlZddlZddlZd d lmZdd lmZdd lmZmZmZeeZGd ddejZdddZGddde jZ Gddde!Z"dS)z Cyril Jaquierz Copyright (c) 2004 Cyril JaquierZGPL)dumpsloadsHIGHEST_PROTOCOLN)asynchat)asyncore)Utils)CSPROTO)logging getLoggerformatExceptionInfoc@sLeZdZddZddZddZddZGd d d eZd d Z d dZ dS)RequestHandlercCs0tj||||_||_g|_|tjdSN) r async_chat__init___RequestHandler__conn_RequestHandler__transmitter_RequestHandler__bufferZset_terminatorr END)selfconn transmitterr?/usr/lib/python3.9/site-packages/fail2ban/server/asyncserver.pyr;s zRequestHandler.__init__cCsD|jr@|j}d|_z|tj|Wntjy>Yn0dSr)rshutdownsocket SHUT_RDWRcloseerror)rrrrrZ__closeCs  zRequestHandler.__closecCs|tj|dSr)_RequestHandler__closerr handle_closerrrrr!MszRequestHandler.handle_closecCs|j|dSr)rappend)rdatarrrcollect_incoming_dataQsz$RequestHandler.collect_incoming_datac@s eZdZdS)zRequestHandler.LoadErrorN__name__ __module__ __qualname__rrrr LoadErrorVsr*c Cs.z|j}g|_tj|}|tjkr2|WdSz t|}WnHty}z0tj d|t t j kdt |WYd}~n d}~00|jr|j|}ndg}t|t}||tjWnjty(}zPt|t jstj d|t t j kdtd|t}||tjWYd}~n d}~00dS)Nz$PROTO-error: load message failed: %sexc_infoZSHUTDOWNzCaught unhandled exception: %r ERROR: %s)rr ZEMPTYjoinZCLOSEclose_when_doner ExceptionlogSysrZgetEffectiveLevelr DEBUGrr*rZproceedrrpushr isinstance)rmessageerrrfound_terminator^s4        zRequestHandler.found_terminatorc CszPt\}}tdt|tttd|t}| |t j Wn$t yt}z WYd}~n d}~00| dS)Nz"Unexpected communication error: %sr-)r r1rstr traceback format_exc splitlinesrrr3r rr0r/)re1e2r5r6rrr handle_errors zRequestHandler.handle_errorN) r'r(r)rr r!r%r0r*r7r>rrrrr9s &rFc Cs|si}d|d<|durtj}tj}t|r2|}n2|rdtjrdttjdrdt dt |d}tj}|rz$|||dr|dd8<Wqdt y}z|sWYd}~q|dd7<|ddkr|j dt jt jfvrtd t|ntd t|np|ddkr2t|td nL|dd kr~|j dt jksdt|dkr~td |WYd}~qWYd}~qdd}~00qddS) 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) rlistenNpollz"Server listener (select) uses pollrz Server connection was closed: %sz0Too many errors - stop logging connection errorsd+Too many errors - critical count reached %r)r ZDEFAULT_SLEEP_TIMErr@callableZpoll2hasattrZselectr1debugfloatr0argserrnoZENOTCONNEBADFinfor8r exceptionEMFILEsumvaluescritical)Zactivetimeoutuse_poll err_countr@r6rrrloopsD     rUc@sbeZdZddZddZddZdd d Zd d Zd dZddZ ddZ ddZ e ddZ dS) AsyncServercCs:tj|||_d|_d|_d|_ddd|_d|_dS)Nz/var/run/fail2ban/fail2ban.sockFr)acceptr?) r dispatcherr_AsyncServer__transmitter_AsyncServer__sock_AsyncServer__init_AsyncServer__active_AsyncServer__errCountonstart)rrrrrrs  zAsyncServer.__init__cCsdS)NFrr"rrrwritableszAsyncServer.writablec Csz|\}}Wnty}z|jdd7<|jddkr\tjd||jddkdnl|jddkrvtdnR|jddkrt|tjr|jdt j kst |j d krt d |j|WYd}~dSd}~00|jdr|jdd8<t|t||jdS) NrWrrBzAccept socket error: %sr+z.Too many acceptor errors - stop logging errorsrCrrArD)rWr0r]r1warningrr4rrIrJrNrOrPrQstoprV_AsyncServer__markCloseOnExecrrY)rraddrr6rrr handle_accepts0     zAsyncServer.handle_acceptNFcst_|_tj|rFtd|r>t d nt d t jt jz|Wn tyt djYn0tj dd___jrĈtfdd||jd d _dS) Nz$Fail2ban seems to be already runningzForcing execution of the serverzServer already runningzUnable to bind socket %srTcsjSr)_AsyncServer__looprr"rrz#AsyncServer.start..)rRrSrTF) threadingcurrent_thread_AsyncServer__workerrZospathexistsr1rr` _remove_sockAsyncServerExceptionZ create_socketrZAF_UNIXZ SOCK_STREAMZset_reuse_addrZbindr0rVrbr?r[rer\r^rUr]ra)rsockforcerRrSrr"rstarts,        zAsyncServer.startcsd}jrpd_jr>zjtjWntjy<Yn0tjt j krlt fdddd}jrtjjrtdj|rtdd_dS)NFcsj Srr\rr"rrrf%rgz#AsyncServer.close..rTzRemoved socket file zSocket shutdown)r\rerrrrrrXrrhrirjr wait_forr[rkrlrmrZrnr1rG)rZstopflgrr"rrs$  zAsyncServer.closecCs|jrtdd|_dS)NzStop communication, shutdown)rYr1rGr"rrrstop_communication2s zAsyncServer.stop_communicationcCs||dSr)rurr"rrrra:szAsyncServer.stopcCs|jSrrsr"rrrisActive?szAsyncServer.isActivec CsHzt|jWn2tyB}z|jtjkr.WYd}~n d}~00dSr)rkremoverZOSErrorrJENOENT)rr6rrrrnEs  zAsyncServer._remove_sockcCs0|}t|tj}t|tj|tjBdSr)filenofcntlZF_GETFDZF_SETFDZ FD_CLOEXEC)rpfdflagsrrrZ__markCloseOnExecRszAsyncServer.__markCloseOnExec)NF)r'r(r)rr_rdrrrrurarvrn staticmethodrbrrrrrVs   rVc@s eZdZdS)roNr&rrrrro\sro)NFN)# __author__Z __copyright__Z __license__picklerrrr ImportErrorcompatrrJr{rkrsysrhr9Zutilsr Zprotocolr Zhelpersr r r r'r1rrrUrXrVr0rorrrrs6      X 6