
    =*fv                        S r SrSrSrSSKrSSKrSSKrSSKrSSKrSSK	r	SSK
r
SSKrSSKrSSKrSSKJrJr  SSKJrJrJr   SS	KJr  SS
KJrJr  SSKJrJrJr  SSKJ r J!r!J"r"  SSK#J$r$J%r%  SSK&J'r'J(r(J)r)J*r*J+r+J,r,  \*" S5      r-S#S jr.S r/S$S jr0S%S jr1S r2S r3S r4 " S S\5      r5S r6 " S S\75      r8 " S S\75      r9 " S S \75      r:S! r;S" r<g! \ a    Sr Nf = f)&z
Fail2Ban  reads log file that contains password failure report
and bans the corresponding IP addresses using firewall rules.

This tools can test regular expressions for "fail2ban".
zFail2Ban DevelopersaI  Copyright (c) 2004-2008 Cyril Jaquier, 2008- Fail2Ban Contributors
Copyright of modifications held by their respective authors.
Licensed under the GNU General Public License v2 (GPL).

Written by Cyril Jaquier <cyril.jaquier@fail2ban.org>.
Many contributions by Yaroslav O. Halchenko, Steven Hiscocks, Sergey G. Brester (sebres).GPL    N)OptionParserOption)NoOptionErrorNoSectionErrorMissingSectionHeaderError   )FilterSystemd)versionnormVersion   )FilterReader
JailReaderNoJailError)FilterFileContainerMyTime)RegexRegexException)str2LogLevelgetVerbosityFormatFormatterWithTraceBack	getLoggerextractOptions
PREFER_ENCfail2banc                     [         R                  " XS9U SS.nU(       a  SUS'   S[        R                  R	                  U5      -   $ )N)useDnspython)restrflavormflagszhttps://www.debuggex.com/?)r   _resolveHostTagurllibparse	urlencode)sampleregex	multiliner   argss        ?/usr/lib/python3/dist-packages/fail2ban/client/fail2banregex.pydebuggexURLr.   ?   sD    e3		
 stG}$v||'='=d'CCC    c                     [        U 5        g N)printr,   s    r-   outputr4   H   s	    tr/   c                 :    [        U 5      U:  a  U SUS-
   S-   $ U $ )z Return shortened string
        N   ...)len)sls     r-   shortstrr;   K   s(     FQJ	
4AaC5	r/   c                     [        U 5      (       d  g U(       a  SU-  nOSn[        US-   SR                  U 5      -   S-   5        g )Nz|- %s
 z|  z
|  z
`-)r8   r4   join)r:   headerr9   s      r-   pprint_listr@   R   s>    A
&!!UW\\!_	$v	-/r/   c              #      #      UR                  5       nU(       d  g U R                  U5      v   M.  ! [         a     M<  f = f7fr1   )get_nextOSErrorformatJournalEntry)flt	myjournalentrys      r-   journal_lines_genrH   [   sL     5 
u%%  
 s#   A2 A
A AA  Ac                  V    [        [        5       5        [        R                  " S5        g Nr   )r4   r   sysexitr3   s    r-   dumpNormVersionrM   e   s    !r/   c                  .    S[         R                  S   -  $ )Nz(%s [OPTIONS] <LOG> <REGEX> [IGNOREREGEX]r   )rK   argv r/   r-   <lambda>rQ   i   s    :SXXa[Hr/   c                       \ rS rSrS rSrg)_f2bOptParserk   c                     SU l         S[        5       -   S-   [        -   S-   [        R                  " U /UQ70 UD6-   S-   [        -   S-   $ )z+Overwritten format helper with full ussage.r=   zUsage: 
a  
LOG:
  string                a string representing a log line
  filename              path to a log file (/var/log/auth.log)
  systemd-journal       search systemd journal (systemd-python required),
                        optionally with backend parameters, see `man jail.conf`
                        for usage and examples (systemd-journal[journalflags=1]).

REGEX:
  string                a string representing a 'failregex'
  filter                name of filter, optionally with options (sshd[mode=aggressive])
  filename              path to a filter file (filter.d/sshd.conf)

IGNOREREGEX:
  string                a string representing an 'ignoreregex'
  filename              path to a filter file (filter.d/sshd.conf)

z>

Report bugs to https://github.com/fail2ban/fail2ban/issues

)usage__doc__r   format_help__copyright__)selfr,   kwargss      r-   rY   _f2bOptParser.format_helpl   si    $*	UW	t	#g	- 1 
  	  777!
8 ;!
$ %
$ %
 r/   )rW   N)__name__
__module____qualname____firstlineno__rY   __static_attributes__rP   r/   r-   rS   rS   k   s    r/   rS   c                  x   [        [        5       S[        -   S9n U R                  [	        SSSSS9[	        SS	S
S9[	        SSSS SS9[	        SS[
        SS9[	        SSSSSS9[	        SSS SS9[	        SS[        SSS9[	        S S!S"S9[	        S#S$S%S&S'S(9[	        S)S*[        S+S,9[	        S-S.S/S0SS1S29[	        S3SS0[        S4S59[	        S6S7SS8S99[	        S:S;SS<S99[	        S=S>S?S@SAS29[	        SBSCSSDS SES29[	        SFSSGS99[	        SHSSIS99[	        SJSSKS99[	        SLSSMS99[	        SNSSOS99[	        SPSQSSRS99[	        SSSSTS99/5        U $ )UNz%prog )rW   r   z-cz--configz/etc/fail2banzset alternate config directory)defaulthelpz-dz--datepatternz+set custom pattern used to match date/times)re   z
--timezonez--TZstorez)set time-zone used by convert time format)actionrd   re   z-ez
--encodingz%File encoding. Default: system localez-rz--raw
store_trueFzRaw hosts, don't resolve dnsz--usednszpDNS specified replacement of tags <HOST> in regexp ('yes' - matches all form of hosts, 'no' - IP addresses only)z-Lz
--maxlinesr   zmaxlines for multi-line regex.)typerd   re   z-mz--journalmatchzGjournalctl style matches overriding filter file. "systemd-journal" onlyz-lz--log-level	log_levelcriticalz(Log level for the Fail2Ban logger to use)destrd   re   z-Vcallbackz,get version in machine-readable short format)rg   rm   re   z-vz	--verbosecountverbosezIncrease verbosity)rg   rl   rd   re   z--verbosityz'Set numerical level of verbosity (0..4))rg   rl   ri   re   z--verbose-datez--VDz%Verbose date patterns/regex in output)rg   re   z-Dz
--debuggexz-Produce debuggex.com urls for debugging therez--no-check-allstore_falsecheckAllRegexTzDisable check for all regex'sz-oz--outoutzaSet token to print failure information only (row, id, ip, msg, host, ip4, ip6, dns, matches, ...)z--print-no-missedzDo not print any missed linesz--print-no-ignoredzDo not print any ignored linesz--print-all-matchedzPrint all matched linesz--print-all-missedz*Print all missed lines, no matter how manyz--print-all-ignoredz+Print all ignored lines, no matter how manyz-tz--log-tracebackz.Enrich log-messages with compressed tracebacksz--full-tracebackzBEither to make the tracebacks full, not compressed (as by default))rS   rW   r   add_optionsr   r   intrM   )ps    r-   get_opt_parserrv      s   
'w  z?+-8:vgt68|Z24w|U)+GTKL 	|#q+-!" 	}57 	j?9;{7! 	wYS46	6,24|L:<	-ot*,wwUDnp	\*,	l+-	|$&	l79	|8: ;=	LOQe4 4l 	
r/   c                   >    \ rS rSrS rS rS rS rS rS r	S r
S	rg
)	RegexStat   c                 <    SU l         Xl        [        5       U l        g rJ   )_stats
_failregexlist_ipList)r[   	failregexs     r-   __init__RegexStat.__init__   s    $+/$,r/   c                 d    SU R                   U R                  U R                  U R                  4-  $ )Nz%s(%r) %d failed: %s)	__class__r|   r{   r~   r[   s    r-   __str__RegexStat.__str__   s-    	~~tT\\B
C Cr/   c                 .    U =R                   S-  sl         g Nr   r{   r   s    r-   incRegexStat.inc   s    +++r/   c                     U R                   $ r1   r   r   s    r-   getStatsRegexStat.getStats   s    	r/   c                     U R                   $ r1   )r|   r   s    r-   getFailRegexRegexStat.getFailRegex   s    	r/   c                 :    U R                   R                  U5        g r1   )r~   append)r[   values     r-   appendIPRegexStat.appendIP   s    ,,er/   c                     U R                   $ r1   )r~   r   s    r-   	getIPListRegexStat.getIPList   s    	r/   )r|   r~   r{   N)r^   r_   r`   ra   r   r   r   r   r   r   r   rb   rP   r/   r-   rx   rx      s&    
Cr/   rx   c                   *    \ rS rSrSrS rS rS rSrg)	LineStats   z/Just a convenience container for stats
        c                     S=U l         U l        / U l        SU l        / U l        SU l        / U l        UR                  (       a  / U l        / U l	        / U l
        g g rJ   )testedmatchedmatched_linesmissedmissed_linesignoredignored_linesdebuggexmatched_lines_timeextractedmissed_lines_timeextractedignored_lines_timeextracted)r[   optss     r-   r   LineStats.__init__   sZ      $+$$+$$,$	]]&(4#%'4"&(4# r/   c                     SU -  $ )NzM%(tested)d lines, %(ignored)d ignored, %(matched)d matched, %(missed)d missedrP   r   s    r-   r   LineStats.__str__   s    	X[_	__r/   c                 <    [        X5      (       a  [        X5      $ S$ )Nr=   )hasattrgetattr)r[   keys     r-   __getitem__LineStats.__getitem__   s    &t11	9r9r/   )
r   r   r   r   r   r   r   r   r   r   N)	r^   r_   r`   ra   rX   r   r   r   rb   rP   r/   r-   r   r      s    
)`:r/   r   c                   r    \ rS rSrS rS rS rS rS rS r	S r
S	 rS
 rSS jrS rS rS rS rS rSrg)Fail2banRegex   c                 6   U R                   R                  [        S UR                   R                  5        5       5      5        Xl        SU l        SU l        S U l        [        5       U l        [        S 5      U l
        SU l        [        5       U l        [        5       U l        [        5       U l        S U l        [#        U5      U l        UR&                  (       a  U R)                  UR&                  5        OSU l        UR,                  b/  U R/                  [0        R2                  " UR,                  5      5        UR4                  (       a%  U R                  R7                  UR4                  5        SU R                  l         [:        R<                  " S5        SSKJ n  U" 5         URB                  (       a  U RE                  URB                  5        URF                  (       a%  U R                  RI                  URF                  5        URJ                  U R                  l&        URN                  =(       a    URP                  (       + U R                  l'        [S        URP                  5      U R                  l*        U RV                  U R                  l,        SU l-        g )Nc              3   4   #    U  H  u  pS U-   U4v   M     g7f)_NrP   ).0ovs      r-   	<genexpr>)Fail2banRegex.__init__.<locals>.<genexpr>   s     G1F#!SU1I1Fs   Fr      r	   )_updateTimeREauto).__dict__updatedictitems_opts_maxlines_set_datepattern_set_journalmatchshare_configr   _filter_prefREMatchedr}   _prefREGroups_ignoreregexr|   _time_elapsedr   _line_statsmaxlinessetMaxLines	_maxlinesjournalmatchsetJournalMatchshlexsplittimezonesetLogTimeZonecheckFindTimer   setAlternateNowserver.strptimer   datepatternsetDatePatternusedns	setUseDnsrawreturnRawHostrq   rr   boolignorePending_onIgnoreRegexonIgnoreRegex_backend)r[   r   r   s      r-   r   Fail2banRegex.__init__   s   --tG1D1D1FGGH*$$$F$$,$v$f$F$/$t_$	]]DMM"4>	"D$5$567	]]<<t}}-$$,,		!.?	t''(	[[<<$++&#xx$,,#11B$((l$,,#DHH~$,,#22$,,$-r/   c                 R    U R                   R                  (       d  [        U5        g g r1   )r   rr   r4   r[   lines     r-   r4   Fail2banRegex.output!  s    	r/   c                 :    UR                  U R                  S5      $ )Nignore)encode	_encodingr   s     r-   encode_lineFail2banRegex.encode_line$  s    	T^^X	..r/   c                     U R                   (       d[  U R                  R                  U5        SU l         Ub5  U R                  SU< SU R                  R	                  5       S   < 35        g g g )NTzUse      datepattern : z : r   )r   r   r   r4   getDatePattern)r[   patterns     r-   r   Fail2banRegex.setDatePattern'  s]    			<<w'4KKdll))+A.2 4  
r/   c                     U R                   (       dX  U R                  R                  [        U5      5        SU l         U R	                  SU R                  R                  5       -  5        g g )NTzUse         maxlines : %d)r   r   r   rt   r4   getMaxLinesr[   r   s     r-   r   Fail2banRegex.setMaxLines/  sM    			<<CF#4;;+dll.F.F.HHJ 
r/   c                     Xl         g r1   )r   r   s     r-   r   Fail2banRegex.setJournalMatch5  s    r/   c                 T  ^ 0 nTR                  5       n[        T[        5      (       a  U4S jnOTR                  (       a  U4S jnOS nSS/[	        UR                  5       5      -    H  n Xd;   a  XF   OU" U5      X6'   M     U R                  SU-  5        g ! [         a     M=  f = f)Nc                 (   > TR                  SU 5      $ N
Definition)getkreaders    r-   rQ   0Fail2banRegex._dumpRealOptions.<locals>.<lambda><  s    

<3r/   c                 <   > TR                   R                  SU 5      $ r   )filterr   r  s    r-   rQ   r  >  s    )),:r/   c                     g r1   rP   )r  s    r-   rQ   r  @  s    r/   logtyper   zReal  filter options : %r)getCombined
isinstancer   r  r}   keysr   r4   )r[   r  fltOptrealoptscombopts_get_optr  s    `     r-   _dumpRealOptionsFail2banRegex._dumpRealOptions8  s    (!(%%38}}:88}%V[[](;;a	!"(+HQKHK	 < ++)H45  		s   -B
B'&B'c                    US;   d   eUS-   nU R                   R                  nUnS n0 nS nUS:X  Ga  [        R                  " SU5      (       Gag   [	        U5      u  pW[        R                  " SU5      (       d'   [        USU R                  US9nUR                  5         SUS	S  ;   a  U4n	O
XUS
-   US-   4n	U	 H  n[        R                  R                  U5      S:X  a   [        R                  R                  XF5      nOSU;  ae  [        R                  R                  U5      S:X  a   [        R                  R                  XF5      nOA[        R                  R                  USU5      nO[        R                  R                  U5      n[        R                  R                  U5      (       a    OS nM      S nU(       a  U R!                  SS<S SU< 35        U(       a  U R!                  SU-  5        U(       d  0 nU R&                  US'   UR)                  US9nU(       d  [!        SU< 35        gU R$                  S:  d&  [*        R-                  5       [.        R0                  ::  a  U R3                  X5        UR5                  SS9nGORUGbN  X@R                   R                  :X  d2  [        R                  R                  U5      S:X  d  SUS	S  ;  a  SU;  a  [        R                  R                  U5      S:X  a  [        R                  R                  U5      n[        R                  R7                  [        R                  R                  U5      5      S   nU R!                  SS<S SU< SU< 35        O_U R!                  SS<S SU< 35        S n[        R                  R9                  U5      (       d  [        R                  R;                  U5      nU(       a  U R!                  SU-  5        [=        US UU R                  US!9nS n Ub  UR                  5       nO"UR?                  S 5        URA                  5       n U(       d  [!        S#U-  5        gURC                  U R&                  5        UR)                  S 5        U R$                  S:  d&  [*        R-                  5       [.        R0                  ::  a  U R3                  X5        UR5                  5       nU(       Ga  0 nU GHw  nUS   S$:X  a  US%   nOUS   S&:X  a  US%S  nOM$   US'   S(:X  a  U H  nUU RD                  l#        M     MJ  US'   S):X  aL  URI                  S5      nU(       d  [K        5       =nUS'   U H  nURM                  [O        U5      5        M     M  US'   S*:X  aL  URI                  S+5      nU(       d  [K        5       =nUS+'   U H  nURM                  [O        U5      5        M     M  US'   S,:X  a  U H  nU RQ                  U5        M     GM  US'   S-:X  a  U H  nU RS                  U5        M     GM@  US'   S.:X  a.  U R                   RT                  c  U RW                  U5        GMt  GMw  GMz     O1U R!                  SU<S S3[[        U5      < 35        U[O        U5      /0nUR]                  5        H^  u  p.US-   n[_        U S4U-   U5        U H>  n[a        U RD                  S5URc                  5       -  5      " URe                  5       5        M@     M`     g! [         a    S n GNxf = f! [         aD  n
[!        S[#        U
5      < 35        [!        SU< 35        U R$                  (       a  U
e S n
A
gS n
A
ff = f! [         a6  n
[!        S"[#        U
5      < 35        U R$                  (       a  U
e S n
A
GNeS n
A
ff = f! [X         a)  n
[!        S/US'   < S0U< S1U< S2U
< 35         S n
A
  gS n
A
ff = f)6N)failr   r*   r  z"(?ms)^/{0,3}[\w/_\-.]+(?:\[.*\])?$z(?ms)(?:/|\.(?:conf|local)$)T)force_enabler   basedir.iz.confz.localzfilter.d/z%ERROR: Wrong filter name or options: z       while parsing: FzUse r=   z>11z jail : zUse jail/flt options : %rbackend)addOptszERROR: Failed to get jail for r   )allow_no_filesr   r  z file : z, basedir: zUse   filter options : %rzfail2ban-regex-jail)r   r  zWrong config file: zERROR: failed to load filter %sz	multi-setr6   setr	   	prefregexaddfailregexaddignoreregexr   r   r   addjournalmatchzERROR: Invalid value for z (z) read from : z line : r   z
add%sRegex)3r   configr    searchr   r   r   readr   ospathdirnamer>   basenameisfile	Exceptionr4   r!   _verboser   
getOptionslogSysgetEffectiveLevelloggingDEBUGr  convertsplitextisabsabspathr   
setBaseDirreadexplicitapplyAutoOptionsr   	prefRegexr   r}   r   rx   r   r   r   r   
ValueErrorr;   r   setattrr   titler   )r[   r   	regextyper*   r  fltNamefltFiler  jailtryNamesereadercommandsretr  regex_valuesoptoptvalstors                     r-   	readRegexFail2banRegex.readRegexK  s   	(	()	(
g
%JJ'''&	$&ii5u==%e,_WII5w??t&&9tyy{ 	wrs|hW,g.@Ah		!Z	/g/wg~
''

7
#z
1'',,w0'',,w
G<)w		 	 g & .	;;G46KK,v57
2&}}6)		(3

89
mma6335w}}D$'LLL5>**###	ww J.723<Cw$6 
ww J.www'Wggrww//89!<GKKhQS 	KK7;=G77==!!www'WKK,v57"7""G56	3	;;=S t S 
-57	4==)	T
mma6335w}}D&)NN$><s
1v!fV	Q5!"gVA+& &t|| 
a&N
"f%d74,v.&{{9V$%  a&$
$h'd4694,x0&{{9V$%  a&J
& 
a&M
!&6" 
a&%
%		 	 	(F# 
) &; L ;;x?Ay/01<!-!3!3!5iw5
4ul+u	\\IOO%%'','9'9';=  "6 
Q  t&  QAB%12Qx	f  
c!f./}}Ah}d  !!ffeQ8 :s   )\ ;&\
 !D\ 0\ ]. "!]. #^13A^1A^1#^1#^1)1^1
\\ \\ 
]+':]&&]+.
^.8+^))^.1
_$;__$c                 L    SU l         U R                  U   R                  5         g )NT)_lineIgnoredr   r   )r[   idxignoreRegexs      r-   r   Fail2banRegex._onIgnoreRegex  s!    $Cr/   Nc                 *	   U R                   R                  nU R                   R                  5       S:  a  US S  n[        U5      U R                   R                  5       :  nS=oPl         U R                   R                  X5      n/ n/ nU H  n	U R                  R                  (       dP  U	R                  [        U5      S:  5        U R                  U	S      n
U
R                  5         U
R                  U	5        U	S   R                  S5      (       d  UR                  U	5        M  SnM     U R                  R                  (       a  S US 4$ U R                   R                  (       a  U R                   R                  nUR                  5       (       a  U =R                  S-  sl        U R                   (       a  [        U R"                  5      U R$                  :  a*  U R"                  R                  UR'                  5       5        O>[        U R"                  5      U R$                  :X  a  U R"                  R                  S5        U R                   R                  5       S:  Ga  U[-        U5      S   GH  nXR                   R                  ;  d  M   U R.                  R0                  R3                  U R.                  R0                  R5                  S
R7                  U5      5      5        U R8                  (       a]  U R.                  R:                  R3                  U R.                  R:                  R5                  S
R7                  US S S2   5      5      5        U R>                  (       a`  U R8                  (       d5  U R.                  R@                  R                  S
R7                  U5      5        OUR                  US   US   -   5        U R.                  =RB                  S-  sl!        U R.                  =RD                  S-  sl"        GM     U(       a:  UR                  U R                   RG                  5       5        SR7                  U5      nXU=(       d    U R                  4$ ! [(         a  n[+        SU-  5         S nAg	S nAff = f! [<         a     GN>f = f)Nr   Fr   r6   nofailTr7   	ERROR: %s)Nr   Nr=   r	   rV   )$r   _Filter__lineBufferr   r8   rJ  processLiner   rr   r   r|   r   r   r   r7  
hasMatchedr   r*  r   r   	getGroupsr   r4   rt   r   r   popindexr>   	_debuggexr   r8  _print_all_matchedr   r   r   processedLine)r[   r   dateorgLineBuffer
fullBuffer
is_ignoredfoundlinesrB  matchr*   prer@  bufLines                 r-   	testRegexFail2banRegex.testRegex  si   ,,22-	\\!# #==!T\\%=%=%??*#((* <<##D/55	3u::>> \\#c(1*__U1X&U
YY[
^^E8<<!!ZZZ  jjnnd?
ll
,,
 
 C
~~	A	T	 4>>	1  1
d  
!T^^
3!!%( 
\\!#J 01wll666
##''$$**2777+;<>	22663399	1		 ! 	^^%%,,RWWW-=>||GAJ+,	"	!% 2& <<**,-
))E
4	Z44#4#4	555 
 	;?
  
s9   )C Q 
B8Q >Q CR
R)Q<<R
RRc                    ^^^^^ U R                   R                  mTS;   a  S nU$ TS:X  a  S nU$ TS:X  a  S nU$ TS:X  a  S nU$ S	T;  a  U4S
 jnU$ SSKJmJmJm  S mUUUUU4S jnU$ )zOPrepares output- and fetch-function corresponding given '--out' option (format))idfidc                 2    U  H  n[        US   5        M     g r   )r4   rB  rs     r-   _out+Fail2banRegex._prepaireOutput.<locals>._out/  s    AaD\ r/   ipc                 X    U  H$  n[        US   R                  SUS   5      5        M&     g )Nr6   rm  r   r4   r   ri  s     r-   rk  rl  3  s'    AaDHHT1Q4 ! r/   msgc                     U  HV  nUS   R                  S5       H;  n[        U[        5      (       d  SR                  S U 5       5      n[	        U5        M=     MX     g )Nr6   matchesr=   c              3   $   #    U  H  ov   M     g 7fr1   rP   r   rj  s     r-   r   >Fail2banRegex._prepaireOutput.<locals>._out.<locals>.<genexpr>;       .a1a   )r   r
  r!   r>   r4   ri  s     r-   rk  rl  7  sI    dhhy!377.a. qQi " r/   rowc                     U  HB  n[        SUS   < SUS   < S[        S US   R                  5        5       5      < S35        MD     g )N[r   z,	r	   c              3   <   #    U  H  u  pUS :w  d  M  X4v   M     g7f)rr  NrP   )r   r  r   s      r-   r   ru  @  s     /a,$!RSW`R`,s   
r6   z],)r4   r   r   ri  s     r-   rk  rl  >  s8    1ad4/a!A$**,/a+abc r/   <c                 R   > U  H   n[        US   R                  T5      5        M"     g )Nr6   ro  )rB  rj  ofmts     r-   rk  rl  B  s!    AaDHHTN r/   r	   )ActionsCommandAction	BanTicketc                 6    U S;  a  UR                  SS5      $ U$ )N)rp   z\x00)replace)tr   s     r-   _escOut.Fail2banRegex._prepaireOutput.<locals>._escOutG  s     IIfg&&Hr/   c                   >^^ / nSS0mU  Hk  mT	" TS   TS   TS   S9nTR                  U5      nUU4S jnXCS'   T
R                  TUTS	9nTS   (       a  UR                  TU45        M`  [        U5        Mm     U Hk  u  mnTS   R	                  S
5       HM  m[        T[        5      (       d  SR                  S T 5       5      mUR                  ST5      m[        T5        MO     Mm     g )NNLr   r   r	   r6   )timedatac                 r   > TS   (       d'  [        TS   R                  S/ 5      5      S::  a  U S   $ STS'   g)Nr  r6   rr  r    msg )r8   r   )r[   rj  wraps    r-   _get_msg=Fail2banRegex._prepaireOutput.<locals>._out.<locals>._get_msgS  s;    $ZC!B 78A=9otDzr/   rp  )	escapeValrr  r=   c              3   $   #    U  H  ov   M     g 7fr1   rP   rt  s     r-   r   ru  d  rv  rw  r  )	
ActionInforeplaceDynamicTagsr   r4   r   r
  r!   r>   r  )rB  rowsticketaInfor  r   rj  r  r  r  r  r  r~  s         @@r-   rk  rl  L  s    D8D!1Q4ad3V'U 5\		)	)$	)	IQT

kk1a&AY! $ 1dhhy!377.a. q
))M1
%aQi	 " r/   )r   rr   server.actionsr  r  r  )r[   rk  r  r  r  r  r~  s     @@@@@r-   _prepaireOutputFail2banRegex._prepaireOutput+  s    	$	]p 
+k t|"h 
+c u}` 
+U u}dR 
+M $J 
+C BA
 6 
+r/   c                    [         R                   " 5       nU R                  R                  (       a  U R                  5       nU GH  n[	        U[
        5      (       a0  U R                  US   US   5      u  pVnSR                  US   5      nODUR                  S5      nUR                  S5      (       d  U(       d  My  U R                  U5      u  pVnU R                  R                  (       a   [        U5      S:  a  U(       d  W" U5        M  U(       a  U R                  =R                  S-  sl        U R                  (       d  U R                  (       d'  U R                  R                  U R                  S-   ::  a[  U R                  R                   R#                  U5        U R$                  (       a%  U R                  R&                  R#                  U5        GO^[        U5      S:  a  U R                  =R(                  S-  sl        U R*                  (       a[  U R                  R,                  R#                  U5        U R$                  (       a%  U R                  R.                  R#                  U5        OU R                  =R0                  S-  sl        U R2                  (       d  U R4                  (       d'  U R                  R0                  U R                  S-   ::  a[  U R                  R6                  R#                  U5        U R$                  (       a%  U R                  R8                  R#                  U5        U R                  =R:                  S-  sl        GM     [         R                   " 5       U-
  U l        g )Nr   r   r=   z
#)r  r   rr   r  r
  tuplerc  r>   rstrip
startswithr8   r   r   _print_no_ignored_print_all_ignoredr   r   r   rW  r   r   rX  r   r   r   _print_no_missed_print_all_missedr   r   r   r   )r[   
test_linest0rr   r   line_datetimestrippedrB  r]  s           r-   processFail2banRegex.processj  si   yy{"	ZZ^^				3du-1^^DGT!W-M*
7747D;;vDs4-1^^D-A*

jjnn
3x!|JC!!!t'>'>$BRBRBZBZ^b^l^lop^pBp	##**40
2299:OPC1!	##**40
2299:OPq   d&<&<@P@P@W@W[_[i[ilm[m@m	""))$/
11889NOaC F yy{R'$r/   c           
      t   U R                   nUR                  UR                  UR                  UR                  -   -
  :X  d   eX!   nX!S-      nU R
                  R                  5       S:  nU(       Ga  UR                  5       < S3nU R                  (       Ga,  US:X  d  US:X  a  U R                  nOU R                  nX!S-      nX0R                  :  d  [        U SU-   5      (       a  / /nXG4 H#  n	U V
Vs/ s H  o  H  oU/-   PM
     M     nn
nM%     U Vs/ s Hg  nUS   S	-   US   R                  5       -   S
-   [        U R                  US   5      US   R                  5       XPR                   R"                  5      -   PMi     nn[%        U V
s/ s H  oR'                  5       PM     sn
U5        g [)        SXaU4-  5        g X0R                  :  d  [        U SU-   5      (       a+  [%        U V
s/ s H  oR'                  5       PM     sn
U5        g [)        SXaU4-  5        g g s  snn
f s  snf s  sn
f s  sn
f )N_linesr   z	 line(s):r   r   _lines_timeextracted_print_all_r   z | z |  z?%s too many to print.  Use --print-all-%s to print all %d lines)r   r   r   r   r   r   r   
capitalizerW  r|   r   r   r   r   r.   r   r   r   r@   r  r4   )r[   ltypelstatsr_  r:   r+   r?   	regexlistansargxyabs                 r-   
printLinesFail2banRegex.printLines  s   &	&--6>>FNN+JK	KL	K
-%X!ll&&(1,)
"--/16
nnnEY.Y""Y--.A~~}u/D!E!E4S"1s!Cq1#gCgsc1c  /2
3.1 A$%-!A$++-
-
6$""1Q4(!A$*;*;*=**##%%.1  
3 a(a((*a(&1  #)%"89 ;'$0E"F"FQ'QQ'0
 "(!78 :-  2
3 )
 (s   6H%A.H+H01H5c                   ^  T R                   R                  (       a  g[        S5        [        S5        [        S5        U 4S jnT R                  R                  (       a  T R                  R                  nUR                  5       /nT R                  (       a(  T R                   H  nUR                  SU< 35        M     [        SST R                  4-  5        [        U5        U" S	T R                  5      nU" S
T R                  5      nT R                  R                  Gb  [        S5        / nT R                  R                  R                   H  nT R                  (       d  UR                  (       d  M'  UR                  SUR                  UR                   4-  5        T R"                  (       d  Md  UR                  SUR$                  UR&                  R$                  [)        USS5      4-  5        UR                  S[)        USS5      < 35        M     [        US5        [        ST R*                  -  5        T R,                  b  [        ST R,                  -  5        [        S5        T R.                  (       a  T R1                  S5        T R2                  (       d  T R1                  S5        T R4                  (       d  T R1                  S5        g)NTr=   Resultsz=======c           
      r  > S/ p2[        U5       GH  u  pEUR                  5       nX&-  nU(       d  T
R                  (       a'  UR                  SUS-   XeR	                  5       4-  5        T
R                  (       d  Ml  [        UR                  5       5      (       d  M  UR                  5        Hg  n[        R                  " US   5      n[        R                  " SU5      n	UR                  SUS   < SU	< US   =(       a    S	=(       d    S
< 35        Mi     GM
     [        SX4-  5        [        US5        U$ )Nr   z%2d) [%d] %sr   r	   z%a %b %d %H:%M:%S %Y    z  z (multiple regex matched)r=   
%s: %d totalz" #) [# of hits] regular expression)	enumerater   r*  r   r   r8   r   r  	localtimestrftimer4   r@   )r:  failregexestotalrr   cntr   r`  rm  	timeTuple
timeStringr[   s             r-   print_failregexes3Fail2banRegex.printStats.<locals>.print_failregexes  s    2#";/~s E	NEZZ#a%0F0F0H!IIJ}}}Y00233""$..A'i==!7Cj	jj
1
2..4"467 % 0  
un,.s89
<r/   r  r  	Prefregex	FailregexIgnoreregexz
Date template hits:z[%d] %sz&    # weight: %.3f (%.3f), pattern: %sr   z    # regex:   r*   z[# of hits] date formatz

Lines: %sz[processed in %.2f sec]r   r   r   )r   rr   r4   r   r7  getRegexr*  r   r   r   r@   r|   r   dateDetector	templateshitsname_verbose_dateweighttemplater   r   r   rX  r  r  r  )r[   r  ra  rr   grpr  r   r  s   `       r-   
printStatsFail2banRegex.printStats  s   	ZZ^^D",))0 
\\			3
,,.	3
mm!!ZZC!" "	{D,?,?@@Bs K
9%t'8'89! 
\\*	"$	3<<,,66x}}ZZ	X]]HMM::;	jj9))00xB'=* * + 
jj'2(FHI 7 s-.-$**
*-	#	$t'9'99<",	??9			??9			??8	r/   c           	      ~   US S u  p#UR                  S5      (       a  SU l         U R                  US5      (       d  g[        U5      S:X  a  U R                  US   S5      (       d  g[        R                  R                  U5      (       aI   [        X R                  S	S
9nU R                  SU-  5        U R                  SU R                  -  5        GOUR                  S5      (       a  [        (       d  [        S5        gU R                  S5        U R                  SU R                  -  5        [        U5      u  pg[        S0 UD6nUR                  U R                  5        UR                  5       n	U R                   n
U R#                  S 5        U
(       a4  UR%                  U
5        U R                  SSR'                  U
5      -  5        [)        X5      nOU R*                  R-                  5       S::  a7  SU;  a1  U R                  S[/        UR1                  SS5      5      -  5        U/nOUR3                  S5      nU R                  S[        U5      -  5        [5        U5       HD  u  pUS:  a  U R                  S5          O*U R                  SUS-   <S S[/        U5      < 35        MF     U R                  S5        U R                  S5        U R7                  U5        U R9                  5       (       d  gg	! [         a  n[        SU-  5         S nAgS nAff = f! [         a  n[        U5         S nAgS nAff = f)Nr	   zsystemd-journalsystemdr  Fr6   r   rP  T)doOpenzUse         log file : %szUse         encoding : %sz,Error: systemd library not found. Exiting...zUse         systemd journalzUse    journal match : %s r   rV   zUse      single line : %sz\nz Use      multi line : %s line(s)   z| ...z| z>2.2r   z`-r=   r1   )r  r   rG  r8   r   r4   r$  r%  r(  r   r   IOErrorr
   r   setLogEncodinggetJournalReaderr   r   addJournalMatchr>   rH   r   r   r;   r  r   r  r  r  )r[   r,   cmd_log	cmd_regexr@  r  r  beArgsrE   rF   r   ir:   s                r-   startFail2banRegex.start  s   BQx')**4=
..F
+
+	$i1nT^^DGX>>
 WW^^GwtDJKK,w68KK,t~~=? +,,
-
:<;;-/;;+dnn<>#G,?7		&v	&3dnn%##%9$$<t%KK,sxx/EEG!#1: ll A%$g*=KK,xe8T/UUWJt$JKK3c*oEG*%	Q
kk7e	[[1Q346 & 	KK++r,,z			
	e 
 	;?
  
AKs5   K8 )K8 AL 8
LLL
L<'L77L<)r   r   r|   r   r   r   rJ  r   r   r   r   r   r   r   r   r1   )r^   r_   r`   ra   r   r4   r   r   r   r   r  rG  r   rc  r  r  r  r  r  rb   rP   r/   r-   r   r      sV    (T&/4K6&Zx>6@<~'(R:>FP>r/   r   c                     U [         :w  a
  U [        :w  d  UR                  S:w  a  [        R                  " XU5      $ [        R
                  " S5        g )N    r   )BrokenPipeErrorr  errnorK   __excepthook__rL   )exctyper   	tracebacks      r-   _loc_except_hookr  ;  s:    Gw$6%++:K			GI	66!r/   c                  .   [         [        l        S[        l        [        5       nUR                  " U 6 u  p / nUR                  (       a"  UR                  (       a  UR                  S5        UR                  (       a"  UR                  (       a  UR                  S5        [        U 5      S;  a  UR                  S5        U(       aZ  UR                  5         [        R                  R                  SSR!                  U5      -   S-   5        [        R"                  " S5        UR$                  (       d,  ['        S5        ['        S	5        ['        S
5        ['        S5        [)        UR*                  5      Ul        [,        R/                  UR*                  5        [        R0                  " [        R2                  5      nUR4                  S::  a  SOSnUR6                  (       a(  [8        nUR:                  =(       a    S=(       d    SU-   nO[        R<                  nUR?                  U" [A        UR4                  U5      5      5        [,        RC                  U5         [E        U5      nWRO                  U 5      (       d  [        R"                  " S5        g g ! [F         az  nUR4                  (       d&  [,        RI                  5       [        RJ                  ::  a  [,        RM                  USS9  O['        SU-  5        [        R"                  " S5         S nANS nAff = f)NTzGERROR: --print-no-missed and --print-all-missed are mutually exclusive.zIERROR: --print-no-ignored and --print-all-ignored are mutually exclusive.)r	   r6   z&ERROR: provide both <LOG> and <REGEX>.rV      r=   zRunning testsz=============r   z%(levelname)-1.1s: %(message)sz %(message)sz %(tb)sz %(tbc)s)exc_inforP  )(r  rK   
excepthookr.  exitOnIOErrorrv   
parse_argsprint_no_missedprint_all_missedr   print_no_ignoredprint_all_ignoredr8   
print_helpstderrwriter>   rL   rr   r4   r   rj   r,  setLevelStreamHandlerstdoutro   log_tracebackr   full_traceback	FormattersetFormatterr   
addHandlerr   r)  r-  r/  rk   r  )	r,   parserr   errorsr  fmtr   fail2banRegexr@  s	            r-   exec_command_liner  A  s    "

!!4($
T22--YZd44--[\ 	D	V--89
**4$))F++d23((3-",//", t~~.  




++/<<1+<'.$)				*	8jC?#) Y1$,,DEF6%- 	D!!((3- 	" 	 	\\V--/>	??1t?$	;?((3--s   J 
LA0LL)Fyes)5   r1   )=rX   
__author__rZ   __license__getoptr.  r    r$  r   rK   r  urllib.requestr&   urllib.parseurllib.erroroptparser   r   configparserr   r   r   server.filtersystemdr
   ImportErrorr   r   
jailreaderr   r   r   server.filterr   r   r   server.failregexr   r   helpersr   r   r   r   r   r   r,  r.   r4   r;   r@   rH   rM   rW   rS   rv   objectrx   r   r   r  r  rP   r/   r-   <module>r     s   & #
]    	 	  
  1 1 ) Q Q1 + = = 9 9 4  
:	D
0& 	IL 2<
~ 6: :.C	F C	L7_  s   C C"!C"