o ;s*b'@sdZdZdZddlmZmZmZddlZddlZddl Z ddl Z ddl Z ddl Z ddl Z ddlZddlZddlmZdd lmZdd lmZmZmZeeZGd d d ejZdddZGdddejZGdddeZ dS)z Cyril Jaquierz Copyright (c) 2004 Cyril JaquierGPL)dumpsloadsHIGHEST_PROTOCOLN)Utils)CSPROTO)logging getLoggerformatExceptionInfoc@sLeZdZddZddZddZddZGd d d eZd d Z d dZ dS)RequestHandlercCs0tj||||_||_g|_|tjdSN) asynchat async_chat__init___RequestHandler__conn_RequestHandler__transmitter_RequestHandler__bufferset_terminatorr END)selfconn transmitterr=/usr/lib/python3/dist-packages/fail2ban/server/asyncserver.pyr5s zRequestHandler.__init__cCsH|jr"|j}d|_z |tj|WdStjy!YdSwdSr)rshutdownsocket SHUT_RDWRcloseerror)rrrrr__close=s zRequestHandler.__closecCs|tj|dSr)_RequestHandler__closerr handle_closerrrrr#GszRequestHandler.handle_closecCs|j|dSr)rappend)rdatarrrcollect_incoming_dataKsz$RequestHandler.collect_incoming_datac@ eZdZdS)zRequestHandler.LoadErrorN__name__ __module__ __qualname__rrrr LoadErrorPr-c Cs zZ|j}g|_tj|}|tjkr|WdSzt|}Wnty=}ztj d|t t j kdt |d}~ww|jrH|j|}ndg}t|t}||tjWdSty}z)t|t jsutj d|t t j kdtd|t}||tjWYd}~dSd}~ww)Nz$PROTO-error: load message failed: %sexc_infoSHUTDOWNzCaught unhandled exception: %r ERROR: %s)rr EMPTYjoinCLOSEclose_when_doner ExceptionlogSysr getEffectiveLevelr DEBUGr r-rproceedrrpushr isinstance)rmessageerrrfound_terminatorXs<        zRequestHandler.found_terminatorc Csz(t\}}tdt|tttd|t}| |t j Wnt y:}zWYd}~nd}~ww| dS)Nz"Unexpected communication error: %sr2)r r8r str traceback format_exc splitlinesrrr<r rr7r6)re1e2r>r?rrr handle_error~s   zRequestHandler.handle_errorN) r*r+r,rr"r#r'r7r-r@rGrrrrr 3s  &r Fc Cs|si}d|d<|durtj}tj}t|r|}n|r2tjr2ttjdr2t dt |d}tj}|rz|||drF|dd8<Wn{t y}zo|sYWYd}~dS|dd7<|ddkr|j dt jt jfvr{td t|n=td t|n4|ddkrt|td n#|dd kr|j dt jkst|dkrtd |WYd}~dSWYd}~nd}~ww|s5dSdS) 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)rDEFAULT_SLEEP_TIMEasyncorerIcallablepoll2hasattrselectr8debugfloatr7argserrnoENOTCONNEBADFinforAr exceptionEMFILEsumvaluescritical)activetimeoutuse_poll err_countrIr?rrrloopsH        rdc@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)acceptrH) rO dispatcherr_AsyncServer__transmitter_AsyncServer__sock_AsyncServer__init_AsyncServer__active_AsyncServer__errCountonstart)rrrrrrs   zAsyncServer.__init__cCsdSNFrr$rrrwritableszAsyncServer.writablec Csz|\}}Wngtyo}z[|jdd7<|jddkr.tjd||jddkdn6|jddkr;tdn)|jddkrdt|tjrP|jdt j ksYt |j d krdt d |j|WYd}~dSd}~ww|jdr~|jdd8<t|t||jdS) NrfrrKzAccept socket error: %sr/z.Too many acceptor errors - stop logging errorsrLrrJrM)rfr7rlr8warningr r=rrVrWr\r]r^r_stopre_AsyncServer__markCloseOnExecr rh)rraddrr?rrr handle_accepts0     zAsyncServer.handle_acceptNFcst_|_tj|r#td|rt d nt d t jt jz|WntyDt djwtj 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$rr sz#AsyncServer.start..)rarbrcF) threadingcurrent_thread_AsyncServer__workerriospathexistsr8r rp _remove_sockAsyncServerException create_socketrAF_UNIX SOCK_STREAMset_reuse_addrbindr7rerrrHrjrurkrmrdrlrq)rsockforcerarbrr$rstarts.         zAsyncServer.startcsd}jr8d_jrz jtjWn tjyYnwtjt j kr6t fdddd}jrNtjjrNtdj|rUtdd_dS)NFcsj Srrkrr$rrrvsz#AsyncServer.close..rTzRemoved socket file zSocket shutdown)rkrurrrr rOrgrrwrxryrwait_forrjrzr{r|rir}r8rT)rstopflgrr$rrs&   zAsyncServer.closecCs|jr tdd|_dSdS)NzStop communication, shutdown)rhr8rTr$rrrstop_communication,s  zAsyncServer.stop_communicationcCs||dSr)rrr$rrrrq4s zAsyncServer.stopcCs|jSrrr$rrrisActive9szAsyncServer.isActivec CsHz t|jWdSty#}z|jtjkrWYd}~dSd}~wwr)rzremoveriOSErrorrWENOENT)rr?rrrr}?s zAsyncServer._remove_sockcCs0|}t|tj}t|tj|tjBdSr)filenofcntlF_GETFDF_SETFD FD_CLOEXEC)rfdflagsrrr__markCloseOnExecLszAsyncServer.__markCloseOnExecrn)r*r+r,rrortrrrrqrr} staticmethodrrrrrrres   rec@r()r~Nr)rrrrr~Vr.r~)NFN)! __author__ __copyright__ __license__picklerrrrrOrWrrzrsysrwrButilsrprotocolr helpersr r r r*r8rr rdrgrer7r~rrrrs,   X6