o ;s*bE@sdZdZddlZddlZddlZddlZddlZddlZddlZddl m Z ddl m Z ddl Z z ddlZedZWndZYeatdrkejr`ejjdur`ejjds`ejjan ed d d Drkd aejd kryddZet[ejd krtdfddZddZntdfddZed krddZneZddZddZddZ Gddde!Z"Gdd d ej#Z$d!e_%dMd"d#Z&ze'Z'Wn e(ye)Z'Ynwej*j+Z,d$d%Z-e-ej*_+ej.j/Z0d&d'Z1e1ej._/d(d)Z2d*d+Z3dNd.d/Z4d0d1Z5d2d3Z6ejd4kre7e8d5e9d6nd7d8Z:d9d:Z;e8d;ej<Z=e8de8d=ej<Z?d>d?Z@d@dAZAdBZBe8dCZC D dOdFdGZDerLdHdIZEndJdIZEGdKdLdLe!ZFdS)Pz0sr)LANGUAGELC_ALLLC_CTYPELANGzUTF-8cCst}|dkrA|tkrCt}t|ds5z ddlm}|dd}Wnty4t tt}Ynwt|drE| |dSdSdSdS)NASCIIsetdefaultencodingr) load_dynamic_syssys) rgetdefaultencodingupper PREFER_ENChasattrimpr ImportError importlibreloadr)encodingoder__ldmr r r__resetDefaultEncoding8s       r&strictc CLzt|tr |||WS|WSttfy%|dkr||dYSwNr'replace) isinstancebytesdecodeUnicodeDecodeErrorUnicodeEncodeErrorxencerrorsr r r uni_decodeY r4cCst|ts t|S|tdSNr*)r+r,strr-rr1r r r uni_stringb  r9c Cr(r))r+r7encoder.r/r0r r rr4gr5cCst|ts t|S|tdSr6)r+r7r;rr8r r rr9qr:cCst|ts t|S|dvS)N)1ontrueyes)r+r7boollower)valr r r_as_boolys rCcCs"tdd\}}|jt|fS)z+ Consistently format exception information N)rexc_info__name__r9)claexcr r rformatExceptionInfo~srIcCsRtj|}|dr|dd}|tddgvr'tjtj|d|}|S)zaCustom function to include directory name if filename is too common Also strip .py at the end z.pyNbase__init__.)rpathbasenameendswithsetdirname)srKr r r mbasenames   rTc@s"eZdZdZdddZddZdS) TraceBackz7Customized traceback to be included in debug messages FcCsd|_||_dS)zInitialize TrackBack metric Parameters ---------- compress : bool if True then prefix common with previous invocation gets replaced with ... rN)_TraceBack__prev_TraceBack__compress)selfcompressr r rrLs zTraceBack.__init__c Cstjdddd}dd|D}dd|D}|dg}|ddD] }|d|d dkr>|d dd |d7<q#||q#d d d|D}|jrt|}tj|j|f}t d d|}|dkrqd|t |d}||_|S)Nd)limitcSs2g|]}t|dtj|dt|dgqS)rr)rTrrNrRr7r r1r r r s&z&TraceBack.__call__..cSs6g|]}|ddvs|dds|d|dgqS)r)unittestzlogging.__init__rz /unittestrD)rP)r er r rr^s   rrz,%s>cSs$g|]}dt|d|dfqS)z%s:%srr)rTr]r r rr^s   z>[^>]*$rz...) traceback extract_stackappendjoinrWrrN commonprefixrVresublen) rXftbentries entries_outentrysftb prev_next common_prefixcommon_prefix2r r r__call__s*   zTraceBack.__call__N)F)rF __module__ __qualname____doc__rLrsr r r rrUs  rUc@s eZdZdZddZddZdS)FormatterWithTraceBackz}Custom formatter which expands %(tb) and %(tbc) with tracebacks TODO: might need locking in case of compressed tracebacks cOs6tjj|g|Rd|i|d|v}t|d|_dS)Nfmtz%(tbc)s)rY)logging FormatterrLrU_tb)rXrxargskwargsrYr r rrLszFormatterWithTraceBack.__init__cCs||_|_tj||SN)r{tbctbryrzformat)rXrecordr r rrszFormatterWithTraceBack.formatN)rFrtrurvrLrr r r rrws rwFcCsh|rt|jr||jd|rdd|_ddtj_tjr2ztj WnYt ddSdS)NrcSdSr~r r r r rz!__stopOnIOError..cSrr~r rXr r rrr) rjhandlers removeHandlerclosery StreamHandlerflush exitOnIOErrorrstderrexit)logSyslogHndlrr r r__stopOnIOErrors  rc Kszt||||fi|WdSttfy&}z |jdkr!t|d}~wtyk}z:z'd|t|ffddd|DfffD]}z t||g|RWq@Yq@Wn YWYd}~dSWYd}~dSd}~ww)aSafe log inject to avoid possible errors by unsafe log-handlers, concat, str. conversion, representation fails, etc. Used to intrude exception-safe _log-method instead of _log-method of Logger class to be always safe by logging and to get more-info about. See testSafeLogging test-case for more information. At least the errors covered in phase 3 seems to affected in all known pypy/python versions until now. Nzlogging failed: %r on %sz args: %rcSsg|]}t|qSr )r9)r ar r rr^z__safeLog..) __origLogBrokenPipeErrorIOErrorerrnor Exceptionr9)rXlevelmsgr|r}r`r r r __safeLogs,  rc CsBzt|WdSttfy }z |jdkrtd|d}~ww)zQSafe flush inject stopping endless logging on closed streams (redirected pipe). rN)__origLogFlushrrrr)rXr`r r r__safeLogFlush s  rcCs$d|vr d|dd}t|S)zBGet logging.Logger instance with Fail2Ban logger name convention rMz fail2ban.%sra) rpartitionry getLoggernamer r rrs rcCsPzt|ts |rt|}W|Stt|}W|Sty'td|w)NzInvalid log level %r)r+intisdigitgetattrryrAttributeError ValueError)valuellr r r str2LogLevels  r %(message)sTcCsn|dkr |dkr d|}|dkrd|}nd|}|rd|}n d|}|r*d |}|s5td d d |}|S) z(Custom log format for the verbose runs rrz6 | %(module)15.15s-%(levelno)-2d: %(funcName)-20.20s |rDzB +%(relativeCreated)5d %(thread)X %(name)-25.25s %(levelname)-5.5sz %(thread)X %(levelname)-5.5sz %(asctime)-15sz)%(name)-24s[%(process)d]: %(levelname)-7sz %(asctime)s z(?<=\))-?\d+(?:\.\d+)?scSsdS)NrSr )mr r rr8rz$getVerbosityFormat..)rhri) verbosityrxaddtimepaddingr r rgetVerbosityFormat&s rcCs tdjdddt|||S)z>Except hook used to log unhandled exceptions to Fail2Ban log fail2banz Unhandled exception in Fail2Ban:T)rE)rcriticalr__excepthook__)exctyperrcr r r excepthook<srcCs(|sgStttddtd|DS)zHelper to split words on any comma, space, or a new line Returns empty list if input is empty (or None) and filters out empty entries cSsg|]}|qSr )stripr r r rr^Krzsplitwords..z[ , ]+)listfilterr@rhsplit)rSr r r splitwordsCs r)rzif 1: def _merge_dicts(x, y): """Helper to merge dicts. """ if y: return {**x, **y} return x def _merge_copy_dicts(x, y): """Helper to merge dicts to guarantee a copy result (r is never x). """ return {**x, **y} execcCs|}|r |}|||S)zHelper to merge dicts. copyupdater1yrr r r _merge_dicts\s  rcCs|}|r |||S)zCHelper to merge dicts to guarantee a copy result (r is never x). rrr r r_merge_copy_dictsds rz^([^\[]+)(?:\[(.*)\])?\s*$z@([\w\-_\.]+)=(?:"([^"]*)"|\'([^\']*)\'|([^,\]]*))(?:,|\]\s*\[|$)zs(?:[^\[\s]+(?:\s*\[\s*(?:[\w\-_\.]+=(?:"[^"]*"|\'[^\']*\'|[^,\]]*)\s*(?:,|\]\s*\[)?\s*)*\])?\s*|\S+)(?=\n\s*|\s+|$)cCsvt|}|s dS|\}}t}|r7t|D]}|d}dd|dddDd}|||<q||fS) NNNrcSsg|]}|dur|qSr~r )r rBr r rr^sz"extractOptions..rDrr) OPTION_CREmatchgroupsdictOPTION_EXTRACT_CREfinditergroupr)optionr option_nameoptstr option_optsoptmatchoptrr r rextractOptions|s    rcCs t|Sr~)OPTION_SPLIT_CREfindall)rr r rsplitWithOptionss rz <([^ <>]+)>rr cCstj}|}t|}t}t|d}i} d} |D]} | |vs$| |vr%q|r/t|| r/qt|| } } || } || i}| r| d}||vrT|| | } qA|| ks`||dt krjt d| ||| fd}|rw||d|}|dur||}|dur|dur||}|dur|| | } qAt |tst|}| d||} ||d d||<|| | } | sC| | kr|| r||| <d} t|t|kr|}| || <d | vr|| q| s |Sq) a|Sort out tag definitions within other tags. Since v.0.9.2 supports embedded interpolation (see test cases for examples). so: becomes: a = 3 a = 3 b = _3 b = 3_3 Parameters ---------- inptags : dict Dictionary of tags(keys) and their values. Returns ------- dict Dictionary of tags(keys) and their values, with tags within the values recursively replaced. getRawItemTFrzpproperties contain self referencing definitions and cannot be resolved, fail tag: %s, found: %s in %s, value: %sN?z<%s>r<)TAG_CREsearchrQrkeyscallablerr9getrendMAX_TAG_REPLACE_COUNTrr+r7r*startidradd)inptags conditionalignoreaddrepl tre_searchtagsdone noRecRepl repCountsrepFlagtagrorgvalrrplcrtagreplr r rsubstituteRecursiveTagssj      'rcCs<ztjdkr |}nt|}td|WdSYdS)zHelper to set real thread name (used for identification and diagnostic purposes). Side effect: name can be silently truncated to 15 bytes (16 bytes with NTS zero) rN)r version_infor;r,_libcapprctlrr r rprctl_set_th_names  rcCrr~r rr r rr scs<eZdZdZeZdZfddZddZd dd Z Z S) BgServicez{Background servicing Prevents memory leak on some platforms/python versions, using forced GC in periodical intervals. Ncs|js tt|||_|jSr~) _instancesuperr__new__)cls __class__r rrszBgService.__new__cCs6d|_d|_d|_|j|_ttdrtddSdS)NirZ set_thresholdr)_BgService__serviceTime_BgService__periodTime_BgService__threshold_BgService__countrgcrrr r rrLs zBgService.__init__FcCs|jd8_|s|jdkst|jkrdStj|sdSz't|jkr/WtjdSt t|j |_|j |_WtjdStjw)NrrFT) rrtimerr_mutexacquirereleasercollectrr)rXforcewaitr r rservice)s zBgService.service)FF) rFrtrurvrr rrrLr __classcell__r r rrrs  rr)rTT)rr N)G __author__ __license__rlocaleryrrhrrc threadingr server.mytimerr!ctypesCDLLrgetpreferredencodingr startswithstdoutr#allrr&r4r9rrr7rCrIrTobjectrUrzrwrrr NameErrorrLogger_logrrrrrrrrrrrevalcompile__file__rrDOTALLrrrrrrrrrrr r r rs           .         c