
    =*fO4                         S r SrS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JrJrJr  \" \5      r\\S
.rS r " S S5      r " S S\
5      r " S S\5      rg)z?Cyril Jaquier, Yaroslav Halchenko, Serg G. Brester (aka sebres)z\Copyright (c) 2004 Cyril Jaquier, 2007 Yaroslav Halchenko, 2015 Serg G. Brester (aka sebres)GPL    N)NoOptionErrorNoSectionError   )sysSafeConfigParserWithIncludeslogLevel   )	getLogger_as_bool_merge_dictssubstituteRecursiveTags)boolintc              #      #    [        U [        [        45      (       a,  U  H%  n[        U5      S:  a  Uu  p!nOUSsu  p!nX!U4v   M'     gU  H  nX   u  p#X!U4v   M     g7f)zIterator over the options template with default options.

Each options entry is composed of an array or tuple with:
        [[type, name, ?default?], ...]
Or it is a dict:
        {name: [type, default], ...}
r
   N)
isinstancelisttuplelen)optionsoptnameopttypeoptvalues       >/usr/lib/python3/dist-packages/fail2ban/client/configreader.py_OptionsTemplateGenr   )   st      we%%g	'lQ!(Gh#*D W	8	##  g'7	8	## s   AA c                       \ rS rSrSrSS jrS rS r\S 5       r	SS jr
SS	 jrS
 rS rSS jrS rS rSS jrS0 4S jrS rSrg)ConfigReader>   ziGeneric config reader class.

A caching adapter which automatically reuses already shared configuration.
Nc                     S U l         S U l        Ub  Xl        Ub  X l         X0l        S U l        g U R                  c  [	        S0 UD6U l        g g )N )
_cfg_share_cfg_cfg_share_kwargs_cfg_share_basedirConfigReaderUnshared)self
use_configshare_configkwargss       r   __init__ConfigReader.__init__D   sR    $/$)9!?"!4yy#-f-49     c                 j    U R                   (       a  U R                   R                  U5        g Xl        g N)r"   
setBaseDirr$   r&   basedirs     r   r/   ConfigReader.setBaseDirR   s!    	YY99 $r,   c                 p    U R                   (       a  U R                   R                  5       $ U R                  $ r.   )r"   
getBaseDirr$   r&   s    r   r4   ConfigReader.getBaseDirX   s(    	YY
))


  

!
!!r,   c                     U R                   $ r.   )r!   r5   s    r   r(   ConfigReader.share_config^   s    	r,   c                 d   U R                   (       d  U R                  U5        U(       a-  U R                   R                  b  U R                   R                  $ [        R	                  SXR                   R                  5       5        U R                   R                  U5      nX0R                   l        U$ )zOverloads a default (not shared) read of config reader.

To prevent multiple reads of config files with it includes, reads into 
the config reader, if it was not yet cached/shared by 'name'.
z Loading configs for %s under %s )r"   _create_unsharedread_cfg_fileslogSysinfor4   read)r&   nameoncerets       r   r>   ConfigReader.readb   s|     
	dii&&2
))
"
"" 	++0$		8L8L8NO		t# !))	*r,   c                    U R                   (       d  U R                  b  U R                  R                  U5      U l         U R                   (       dr  [        SSU R                  0U R                  D6U l         U R
                  b%  U R                   R                  U R
                  5        U R                   U R                  U'   gg[        S0 U R                  D6U l         g)zAllocates and share a config file by it name.

Automatically allocates unshared or reuses shared handle by given 'name' and 
init arguments inside a given shared storage.
Nr(   r    )r"   r!   getr%   r#   r$   r/   )r&   r?   s     r   r:   ConfigReader._create_unsharedw   s     
t2""4(49
))$\$//\TE[E[\DI*	YY$112 IIDOOD	  $=d&<&<=49r,   c                 j     S U R                   R                  5        5       $ ! [         a    / s $ f = f)Nc              3   T   #    U  H  oR                  S 5      (       a  M  Uv   M      g7f)zKNOWN/N)
startswith).0ns     r   	<genexpr>(ConfigReader.sections.<locals>.<genexpr>   s     
I*,,x2H11*s   (	()r"   sectionsAttributeErrorr5   s    r   rM   ConfigReader.sections   s3    
Idii((*
II	 
9s    # 22c                 Z     U R                   R                  U5      $ ! [         a     gf = f)NF)r"   has_sectionrN   )r&   secs     r   rQ   ConfigReader.has_section   s.    
))


$$	 
s    
**c                     U(       a  U R                   R                  X5      $ X R                   R                  R                  U0 5      ;   $ r.   )r"   
has_option	_sectionsrD   )r&   rR   optwithDefaults       r   rU   ConfigReader.has_option   s=    +6		c	' 0yy""&&sB//0r,   c                 V    U R                   R                  5       R                  U5        g r.   )r"   get_defaultsupdate)r&   ds     r   merge_defaultsConfigReader.merge_defaults   s    ))!!!$r,   c                 v     U R                   R                  " U/UQ70 UD6$ ! [         a    [        U5      ef = fr.   )r"   merge_sectionrN   r   r&   sectionargsr)   s       r   ra   ConfigReader.merge_section   s@    !
))
!
!'
;D
;F
;;	 !		  !   " 8Fc                 l     U R                   R                  X5      $ ! [         a    [        U5      ef = f)zReturn a list of option names for the given section name.

Parameter `withDefault` controls the include of names from section `[DEFAULT]`
)r"   r   rN   r   )r&   rc   rX   s      r   r   ConfigReader.options   s6    
!
))

G
11	 !		  !s    3c                 j     U R                   R                  XX4S9$ ! [         a    [        U5      ef = f)N)rawvars)r"   rD   rN   r   )r&   rR   rW   rj   rk   s        r   rD   ConfigReader.get   s8    
))--c-
55	 		s    2c                 v     U R                   R                  " U/UQ70 UD6$ ! [         a    [        U5      ef = fr.   )r"   
getOptionsrN   r   rb   s       r   rn   ConfigReader.getOptions   s@    !
))

w
8
8
88	 !		  !rf   )r"   r!   r$   r#   )NN)T) F)__name__
__module____qualname____firstlineno____doc__r*   r/   r4   propertyr(   r>   r:   rM   rQ   rU   r^   ra   r   rD   rn   __static_attributes__r    r,   r   r   r   >   sc    
.%"  *> 0%!! # !r,   r   c                   B    \ rS rSrSrSrSS jrS rS rS r	SS	 jr
S
rg)r%      zUnshared config reader (previously ConfigReader).

Do not use this class (internal not shared/cached representation).
Use ConfigReader instead.
z/etc/fail2banNc                 h    [         R                  " U /UQ70 UD6  S U l        U R                  U5        g r.   )r   r*   r;   r/   )r&   r1   rd   r)   s       r   r*   ConfigReaderUnshared.__init__   s.    ''>t>v>$//'r,   c                 V    Uc  [         R                  nUR                  S5      U l        g )N/)r%   DEFAULT_BASEDIRrstrip_basedirr0   s     r   r/   ConfigReaderUnshared.setBaseDir   s"    _!117..%$-r,   c                     U R                   $ r.   )r   r5   s    r   r4   ConfigReaderUnshared.getBaseDir   s    	r,   c           	         [         R                  R                  U R                  5      (       d  [	        SU R                  -  5      eUR                  S5      (       a  [         R                  R                  U5      n[         R                  R                  U R                  U5      n[        R                  SXR                  5        US-   /nUS-   nU[        [        R                  " SU-  5      5      -  nUR                  US-   5        U[        [        R                  " SU-  5      5      -  n[        [        [         R                  R                  U5      5      n[        U5      (       a  [        R                  S	S
R                  U5      5        [         R"                  " X5      nU Vs/ s H  ofU;  d  M
  UPM     nnU(       a%  [        R%                  SS
R                  U5      5        U(       a  g[        R%                  SXR'                  5       5        g[        R%                  SU-  SU R'                  5       -  SS
R                  U5      -   /[)        [        U5      5         -   5        gs  snf )Nz/Base configuration directory %s does not exist ./z Reading configs for %s under %s z.confz.dz	%s/*.confz.localz
%s/*.localzReading config files: %sz, zCould not read config files: %sTz0Found no accessible config files for %r under %sFz(Found no accessible config files for %r zunder %szamong existing ones: )ospathexistsr   
ValueErrorrH   abspathjoinr<   debugsortedglobappendr   filterr   r   r>   errorr4   r   )r&   filenamebasenameconfig_files
config_dirconfig_files_readcfmisseds           r   r>   ConfigReaderUnshared.read   s   		&	&	E== 
 ggooh'8WW\\$--2(,,1HmmLg%', $*&;#;<==,h)*&<*#<=>>, fRWW^^\:;,	<<*DIIl,CD388L'H<R5F+Fb<6H
LL2DIIf4EF	<<B"$
	<<:XE))$))L"99;;?L@Q;RTU V  Is   +	I/8I/c           
      T   [        5       nUc  0 n[        U5       HX  u  pxn	X;   a  M   U R                  XUS9n
XU'   U(       a/  [        R                  U5      nU(       a  U
c  MJ  U" U
5      Xh'   MV  MX  MZ     U$ ! [         a,  nU(       a  e [
        R                  U5        XU'    S nAM  S nAf[         a/    U	b(  [
        R                  SU< SU< SU	< 35        XU'    M   M  [         a9    [
        R                  SU-   S-   U-   S-   [        U	5      -   S-   5        XU'    GM  f = f)Nrk   'z' not defined in 'z'. Using default one: zWrong value for 'z' in 'z'. Using default one: ')dictr   rD   	CONVERTERr   r<   r   r   r   r   warningrepr)r&   rR   r   pOptionsshouldExistconvertvaluesr   r   r   vconves                r   rn   ConfigReaderUnshared.getOptions   s.   6&8$7$@ gH-A7OMM'"T	
HQfo 	  %A: 
-%  

LLO7O
  \\C# $G_   
NN&08;cA !#'>2478 97Os)   :A9%
A99
D'!B**5D'%=D'&D')r   r;   r.   )NFT)rr   rs   rt   ru   rv   r   r*   r/   r4   r>   rn   rx   r    r,   r   r%   r%      s(     #
&
&d"r,   r%   c                   l    \ rS rSrSr/ rS rS rS rS r	S r
S rS	 rSS
 jrS rS rSS jrS rSrg)DefinitionInitConfigReaderi$  zConfig reader for files with options grouped in [Definition] and
[Init] sections.

Is a base class for readers of filters and actions, where definitions
in jails might provide custom values for options defined in [Init]
section.
c                 (   [         R                  " U 40 UD6  UR                  S5      (       a  [        R                  R                  U5      nU R                  U5        U R                  U5        X0l        [        5       U l
        [        5       U l        g )Nr   )r   r*   rH   r   r   r   setFilesetJailName	_initOptsr   _pOpts	_defCache)r&   file_jailNameinitOptsr)   s        r   r*   #DefinitionInitConfigReader.__init__/  si    ''
d77??5!5,,u8.$+6$.r,   c                     Xl         0 U l        g r.   )_filer   )r&   fileNames     r   r   "DefinitionInitConfigReader.setFile9  s    *$.r,   c                     U R                   $ r.   )r   r5   s    r   getFile"DefinitionInitConfigReader.getFile=  s    	r,   c                     Xl         g r.   	_jailName)r&   r   s     r   r   &DefinitionInitConfigReader.setJailName@  s    .r,   c                     U R                   $ r.   r   r5   s    r   getJailName&DefinitionInitConfigReader.getJailNameC  s    	r,   c                 @    [         R                  X R                  5      $ r.   )r   r>   r   r5   s    r   r>   DefinitionInitConfigReader.readF  s    			4	,,r,   c                     U R                   (       d  U R                  U R                  5        [        R                  " U R                   U R                  5      $ r.   )r"   r:   r   r   r>   r5   s    r   readexplicit'DefinitionInitConfigReader.readexplicitJ  s6    	$	%	*	*499djj	AAr,   c                   ^  U(       d
  [        5       nT R                  (       a  [        UT R                  5      n[        R	                  T ST R
                  USS9T l        UT l        T R                  S5      (       a  U 4S jnT R                  SSS9 Hl  nUS:X  a  M  S nUR                  S5      (       d  Uc  U" U5      nUT R                  SU-   '   UT R                  ;  d  MR  Uc  U" U5      nUT R                  U'   Mn     U(       ag  T R                  S5      (       aP  T R                  S5       H:  nUS:X  d  UT R                  ;   a  M  T R                  SU5      T R                  U'   M<     g g g )	N
DefinitionF)r   Initc                 (   > TR                  SU 5      $ )Nr   )rD   )rW   r&   s    r   <lambda>7DefinitionInitConfigReader.getOptions.<locals>.<lambda>\  s    -r,   )rX   rr   zknown/)r   r   r   r   rn   _configOpts_optsr   rQ   r   rH   rD   )r&   pOptsallgetoptrW   r   s   `     r   rn   %DefinitionInitConfigReader.getOptionsO  sD    
65	^^t~~.5&&t'' ' ?$*$+	f-6ll6ul5s
j(A>>(##		vc{1$%T^^HSL!
$.. 		vc{1T^^C 6 	Tl++ ll<(s
jC4::-xhh|S1DJJsO ) ,Sr,   c           	         [        U5       HE  u  p4n[        R                  U5      nU(       d  M$  UR                  U5      nUc  M:   U" U5      X'   MG     g! [         a    [        R                  SX7XE5        XQU'    Mr  f = f)zHConvert interpolated combined options to expected type.
                Nz/Wrong %s value %r for %r. Using default one: %r)r   r   rD   r   r<   r   )r&   opts
configOptsr   r   r   r   r   s           r   convertOptions)DefinitionInitConfigReader.convertOptionsm  s}     %8
$C g
--
 4
dAy(!WT] %D  ^^E'%']s   
A%A?>A?c                      U R                   U   $ ! [         aV     U R                  R                  SXR                  S9nO! [
        [        [        4 a    Sn Of = fX R                   U'   Us $ f = f)zGet combined definition option (as string) using pre-set and init
options as preselection (values with higher precedence as specified in section).

Can be used only after calling of getOptions.
r   r   N)r   KeyErrorr"   get_exr   r   r   r   )r&   r   r   s      r   getCombOption(DefinitionInitConfigReader.getCombOption|  ss    
..
!!	 		w[[AA=*
5 A>>'
8s2    
A1$A A1AA1AA10A1c                    U R                   nU R                  (       a  [        X R                  5      n[        U5      (       d  0 $ [	        U5      R                  5       nU HN  n[        R                  R                  U5      nU(       d  M+  UR                  5       u  p4UR                  U5        MP     [        UXR                  S9nU(       d  [        S5      eU R                  XPR                  5        U$ )N)ignoreaddreplz/recursive tag definitions unable to be resolved)r   r   r   r   setcopyr   CONDITIONAL_REmatchgroupsaddr   r   r   r   r   )r&   r   combinedoptsrJ   condr   s         r   getCombined&DefinitionInitConfigReader.getCombined  s    ,	^^|^^<<	\		
9v;&a
&
5
5
;
;A
>4
dkkmGA
JJqM	  
!
,,
.$		E	FFd,,-	+r,   c                     [         er.   )NotImplementedErrorr5   s    r   r   "DefinitionInitConfigReader.convert  s    r,   )r   r   r   r   r   r   Nrq   )r    )rr   rs   rt   ru   rv   r   r*   r   r   r   r   r>   r   rn   r   r   r   r   rx   r    r,   r   r   r   $  sK     -B
2< ,r,   r   )
__author____copyright____license__r   r   configparserr   r   configparserincr   r   r	   helpersr   r   r   r   rr   r<   r   r   r   r   r%   r   r    r,   r   <module>r      sw   . O
n  	 6 H H P P 
8	 
	$*v! v!rj7 jZ r,   