ogfoG`dZdZddlZddlZddlZddlZddlZddlZddlZddl m Z ddl m Z ddl Z ddlZejdZej"at$j'droej(rRej(j*ejpd*ejxZ?d+Z@d,ZAd-ZBejpd.ZC d6d/ZDerd0ZEnd1ZEGd2d3e!ZFy#dZYWxYw#e($re)Z'Y*wxYw)7zr0s Z!299Q<: % Zs!#)LANGUAGELC_ALLLC_CTYPELANGzUTF-8c`tjj}|dk(rY|tjk7rAt}t |ds ddlm}|dd}t |dr|j|yyyy#t$r"tjtt}YKwxYw)NASCIIsetdefaultencodingr) load_dynamic_syssys) rgetdefaultencodingupper PREFER_ENChasattrimpr ImportError importlibreloadr)encodingoder__ldms r__resetDefaultEncodingr'8s  &&(#G^z//11 4 $, -* &% Td()H%*2^ c TsB(B-,B-strictc t|tr|j||S|S#ttf$r|dk7r|j|dcYSwxYwNr(replace) isinstancebytesdecodeUnicodeDecodeErrorUnicodeEncodeErrorxencerrorss r uni_decoder5YsX#E 88C  8 0 1#  ((3 ""#!&&'AAcdt|ts t|S|jtdSNr+)r,r-strr.rr2s r uni_stringr;bs& Au  a&= *i ((c t|tr|j||S|S#ttf$r|dk7r|j|dcYSwxYwr*)r,r9encoder/r0r1s rr5r5gsX#C 88C  8 0 1#  ((3 ""#r6cdt|ts t|S|jtdSr8)r,r9r>rr:s rr;r;qs& Q  q6M ((:y ))r<c\t|ts t|S|jdvS)N)1ontrueyes)r,r9boollower)vals r_as_boolrHys+#C-S 1 yy{001r<cdtjdd\}}|jt|fS)z+ Consistently format exception information N)rexc_info__name__r;)claexcs rformatExceptionInforO~s+ LLN2A c z#''r<ctjj|}|jdr|dd}|t ddgvrBtjjtjj |dz|z}|S)zaCustom function to include directory name if filename is too common Also strip .py at the end z.pyNbase__init__.)r pathbasenameendswithsetdirname)srRs r mbasenamer[sq MM% cr$C$ %%   "''//!, - 3d :$ r<ceZdZdZddZdZy) TraceBackz7Customized traceback to be included in debug messages c d|_||_y)zInitialize TrackBack metric Parameters ---------- compress : bool if True then prefix common with previous invocation gets replaced with ... r N)_TraceBack__prev_TraceBack__compress)selfcompresss rrSzTraceBack.__init__s$+$/r<c tjddd}|Dcgc]?}t|dtjj |dt |dgA}}|Dcgc]'}|ddvs|djds |d|dg)}}|dg}|ddD]8}|d|d dk(r|d dxxd |dzz cc<(|j|:d j|Dcgc]}t|dd |dc}}|jra|}tjj|j|f} tjd d| } | dk7rd|t| dz}||_ |Scc}wcc}wcc}w)Nd)limitrr)unittestzlogging.__init__z /unittestrJz,%s>:z>[^>]*$r z...) traceback extract_stackr[r rUrYr9rWappendjoinr` commonprefixr_resublen) raftbr2entriese entries_outentrysftb prev_next common_prefixcommon_prefix2s r__call__zTraceBack.__call__sc*3B/#@C E; 4N+,- -D4; +3 E '%sAE>(,F+FN)F)rL __module__ __qualname____doc__rSr|r<rr]r]s r<r]ceZdZdZdZdZy)FormatterWithTraceBackz}Custom formatter which expands %(tb) and %(tbc) with tracebacks TODO: might need locking in case of compressed tracebacks cxtjj|g|d|i|d|v}t||_y)Nfmtz%(tbc)s)rb)logging FormatterrSr]_tb)rarargskwargsrbs rrSzFormatterWithTraceBack.__init__s; Tz!__stopOnIOError..r<cyrrras rrz!__stopOnIOError..rr<) rrhandlers removeHandlercloser StreamHandlerflush exitOnIOErrorrstderrexit)logSyslogHndlrs r__stopOnIOErrorrsy s6??#vq)* (.0 ::((1+ s 'BB c \ t||||fi|y#ttf$r }|jdk(r t |d}~wt $rc} d|t |ffd|Dcgc] }t |ncc}wc}fffD]} t||g|#YxYwn #YnxYwYd}~yYd}~yd}~wwxYw)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: %r) __origLogBrokenPipeErrorIOErrorerrnor Exceptionr;)ralevelmsgrrruas r __safeLogrs D%d-f- '"WW]4  !Z_!56D1qZ]1134 t tU"T"   4  sTB+< B+ BA/ .B> B  B BBB&BB&&B+c t|y#ttf$r!}|jdk(r t d|d}~wwxYw)zQSafe flush inject stopping endless logging on closed streams (redirected pipe). rN)__origLogFlushrrrr)rarus r__safeLogFlushr s< '"WW]4s >9>cbd|vrd|jddz}tj|S)zBGet logging.Logger instance with Fail2Ban logger name convention rTz fail2ban.%srh) rpartitionr getLoggernames rrrs44K -b1 1$$r<c t|ts|jr t|}|Stt|j } |S#t $rtd|zwxYw)NzInvalid log level %r)r,intisdigitgetattrrrAttributeError ValueError)valuells r str2LogLevelrsf3su}} E 2  '2  3)E1223s+AAA(c|dkDr"|dkDrd|z}|dkDrd|z}nd|z}|rd|z}n d|z}|rd |z}|stjd d |}|S) z(Custom log format for the verbose runs rrz6 | %(module)15.15s-%(levelno)-2d: %(funcName)-20.20s |rJzB +%(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+)?scy)NrZr)ms rrz$getVerbosityFormat..8rr<)rprq) verbosityraddtimepaddings rgetVerbosityFormatr&swM] AC G3] MPS S3 (3 .3 c !C3c9# # 3 )=#># r<chtdjddtj|||S)z>Except hook used to log unhandled exceptions to Fail2Ban log fail2banz Unhandled exception in Fail2Ban:T)rK)rcriticalr__excepthook__)exctyperrks r excepthookr<s6 :$t 5 7E955r<c |sgSttttjd|Dcgc]}|j c}Scc}w)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 z[ , ]+)listfilterrErpsplitstrip)rZr s r splitwordsrCs= ) VDbhhy!.DE1779E FGGEsA)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} execcP|}|r!|j}|j||S)zHelper to merge dicts. copyupdater2yrs r _merge_dictsr\s'!vvx188A; (r<cL|j}|r|j||S)zCHelper to merge dicts to guarantee a copy result (r is never x). rrs r_merge_copy_dictsrds"ffh!88A; (r<z^([^\[]+)(?:\[(.*)\])?\s*$zf\s*([\w\-_\.]+)=(?:"([^"]*)"|\'([^\']*)\'|([^,\]]*))(?:,|\]\s*\[|$|(?P.+))|,?\s*$|(?P.+)zs(?:[^\[\s]+(?:\s*\[\s*(?:[\w\-_\.]+=(?:"[^"]*"|\'[^\']*\'|[^,\]]*)\s*(?:,|\]\s*\[)?\s*)*\])?\s*|\S+)(?=\n\s*|\s+|$)c tj|}|s td|j\}}t }|r t j |D]}|jdrAtd|jd|jd|jdddfz|jdr1td|jd|jdddfz|jd}|s|jd d d Dcgc]}|| c}d}|j||j<||fScc}w) Nzunexpected option syntaxwrngAz+unexpected syntax at %d after option %r: %srrwrngBz'expected option, wrong syntax at %d: %srJr) OPTION_CREmatchrgroupsdictOPTION_EXTRACT_CREfinditergroupstartr) optionr option_nameoptstr option_optsoptmatchoptrGrs rextractOptionsr|sX   & ! -..||~fv $--f5 ,hnnW B ^^GhnnQ/1H21NFPP QQnnW > ^^GhnnW5a;B== >>  3 x>>!Aa( = COC ==> @5#kkm;syy{ , [   =s E Ec,tj|Sr)OPTION_SPLIT_CREfindall)rs rsplitWithOptionsrs  ((r<rz <([^ <>]+)>c 4tj}|}t|}t}t|d}i} d} |j D]} | |vs| |vr |rt |j | r*t|| x} } || } |j| i}| r| jd}||vr|| | j} 0|| k(s|j|dtkDrtd| d|d|d| d }|r|j|d z|z}||j|}| |||}||| | j} t|ts t|}| jd |z|} |j|d dz||<|| | j!} | r| | k7r;|| r||| <d} t#|t#|k(r|j%}| || <d | vs|j'| | s |S)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. getRawItemTFrzRproperties contain self referencing definitions and cannot be resolved, fail tag: z , found: z in z , value: N?z<%s>r<)TAG_CREsearchrXrkeyscallablerr;getrendMAX_TAG_REPLACE_COUNTrr,r9r+ridradd)inptags conditionalignoreaddrepl tre_searchtagsdone noRecRepl repCountsrepFlagtagrorgvalrrplcrtagrepls rsubstituteRecursiveTagsrs-,nn f+  T< (  ' YY[;&c Vmsd{HHT__S12HtCy))56%1 --R 4 771:D v~ E1557 #Q  s{dhhtQ'*??  D$   D HHTCZ+- .T | HHTNT , T]d | E1557 #Q dC D)9$ MM&4- .E$"Q&DJ5!'')$AI N o%Ys^W $x2g; LLNTDI  w;&z  E r<c tjdk\r|j}n t|}tj d|y#YyxYw)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-_libcapprctlrs rprctl_set_th_namersA  $ ;;=D ;D ==Ts AAA cyrrrs rrrsr<cBeZdZdZeZdZfdZdZddZ xZ S) BgServicez{Background servicing Prevents memory leak on some platforms/python versions, using forced GC in periodical intervals. Ncd|jstt|||_|jSr) _instancesuperr__new__)cls __class__s rrzBgService.__new__s*  )S!#&= r<cd|_d|_d|_|j|_t t drt j dyy)Nird set_thresholdr)_BgService__serviceTime_BgService__periodTime_BgService__threshold_BgService__countrgcr"rs rrSzBgService.__init__$sD"$$$!!$, R!A"r<cr|xjdzc_|s1|jdkDs!tj|jkrytj j |sy tj|jkr tj jytjtj|jz|_|j|_ tj jy#tj jwxYw)NrrFT) r&rtimer#r_mutexacquirereleaser'collectr$r%)raforcewaits rservicezBgService.service/s,,!, DLL1$ 8J8J(J     ! !$ '   kkmd(((    ::< (9(994""4<  9s*!D+A D D6)FF) rLr}r~rrr*rrrSr0 __classcell__)rs@rrrs% &  r<r)NN)z %(message)sTT)r rN)G __author__ __license__r'localerr rprrk threadingr server.mytimerr"ctypesCDLLrgetpreferredencodingr startswithstdoutr$allrr'r5r;rrr9rHrOr[objectr]rrrrr NameErrorrLogger_logrrrrrrrrrrrevalcompile__file__rrDOTALLrrrrrrrrrrrr<rrEs(L   ! 6;;} % )V ( ( *  !JJ3::&&23::;N;N;Y;YZa;bzz""* Z/Y Z[* d&  #t!(#) "(#C""$/* *1 (  ++\ 0W.. 0 " NN   < &&,,-   ,6Hug     RZZ5ryy A  RZZjlnluluw2::wy{zCzCD!*) "**^ $13` F  ,,] zsJJ"J"J-,J-