
    ogfO4                         d Z dZdZddlZddlZddlmZmZ ddlm	Z	m
Z
mZ dd	lmZmZmZmZ  ee      Zeed
Zd Z G d d      Z G d de
      Z G d de      Zy)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              #      K   t        | t        t        f      r,| D ]&  }t        |      dkD  r|\  }}}n|dc\  }}}|||f ( y| D ]  }| |   \  }}|||f  yw)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   )   s      we% $g	'lQ!(GWh#*D Wg	'8	##$  $gw'7H	'8	##$s   AAc                   ~    e Zd ZdZddZd Zd Zed        ZddZ	ddZ
d	 Zd
 ZddZd Zd ZddZdi fdZd Zy)ConfigReaderzkGeneric config reader class.

	A caching adapter which automatically reuses already shared configuration.
	Nc                     d | _         d | _        ||| _        ||| _         || _        d | _        y | j                  t	        di || _        y y )N )
_cfg_share_cfg_cfg_share_kwargs_cfg_share_basedirConfigReaderUnshared)self
use_configshare_configkwargss       r   __init__zConfigReader.__init__D   sX    $/$)49!4?"4!4yy#-f-49     c                 b    | j                   r| j                   j                  |       y || _        y N)r!   
setBaseDirr#   r%   basedirs     r   r-   zConfigReader.setBaseDirR   s#    	YY99 $4r*   c                 f    | j                   r| j                   j                         S | j                  S r,   )r!   
getBaseDirr#   r%   s    r   r1   zConfigReader.getBaseDirX   s(    	YY
))


  

!
!!r*   c                     | j                   S r,   )r    r2   s    r   r'   zConfigReader.share_config^   s    	r*   c                 R   | j                   s| j                  |       |r,| j                   j                  | j                   j                  S t        j	                  d|| j                   j                                | j                   j                  |      }|| j                   _        |S )z Overloads a default (not shared) read of config reader.

	  To prevent mutiple 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infor1   read)r%   nameoncerets       r   r9   zConfigReader.readb   s     
	dii&&2
))
"
"" 	++0$		8L8L8NO		t# !$))	*r*   c                    | j                   s| j                  | j                  j                  |      | _         | j                   sqt        dd| j                  i| j                  | _         | j
                  %| j                   j                  | j
                         | j                   | j                  |<   yyt        di | j                  | _         y)z Allocates 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   r5   zConfigReader._create_unsharedw   s     
t2""4(49
))$\$//\TE[E[\DI*	YY$112 IIDOOD	  $=d&<&<=49r*   c                 h    	 d | j                   j                         D        S # t        $ r g cY S w xY w)Nc              3   D   K   | ]  }|j                  d       r|  yw)zKNOWN/N)
startswith).0ns     r   	<genexpr>z(ConfigReader.sections.<locals>.<genexpr>   s     
I!,,x2H1
Is     )r!   sectionsAttributeErrorr2   s    r   rE   zConfigReader.sections   s3    
Idii((*
II	 
9s    # 11c                 X    	 | j                   j                  |      S # t        $ r Y yw xY w)NF)r!   has_sectionrF   )r%   secs     r   rH   zConfigReader.has_section   s.    
))


$$	 
s    	))c                     |r| j                   j                  ||      S || j                   j                  j                  |i       v S r,   )r!   
has_option	_sectionsr>   )r%   rI   optwithDefaults       r   rK   zConfigReader.has_option   sA    +6		c3	' 0tyy""&&sB//0r*   c                 V    | j                   j                         j                  |       y r,   )r!   get_defaultsupdate)r%   ds     r   merge_defaultszConfigReader.merge_defaults   s    ))!!!$r*   c                 t    	  | j                   j                  |g|i |S # t        $ r t        |      w xY wr,   )r!   merge_sectionrF   r   r%   sectionargsr(   s       r   rU   zConfigReader.merge_section   sB    !
!$))
!
!'
;D
;F
;;	 !		  !   " 7Fc                 l    	 | j                   j                  ||      S # t        $ r t        |      w xY w)zReturn a list of option names for the given section name.

		Parameter `withDefault` controls the include of names from section `[DEFAULT]`
		)r!   r   rF   r   )r%   rW   rN   s      r   r   zConfigReader.options   s8    
!
))

G[
11	 !		  !s    3c                 r    	 | j                   j                  ||||      S # t        $ r t        |      w xY w)N)rawvars)r!   r>   rF   r   )r%   rI   rM   r\   r]   s        r   r>   zConfigReader.get   s<    
))--Sc-
55	 		s   ! 6c                 t    	  | j                   j                  |g|i |S # t        $ r t        |      w xY wr,   )r!   
getOptionsrF   r   rV   s       r   r_   zConfigReader.getOptions   sB    !
$))

w
8
8
88	 !		  !rY   )NN)T) F)__name__
__module____qualname____doc__r)   r-   r1   propertyr'   r9   r5   rE   rH   rK   rS   rU   r   r>   r_   r   r*   r   r   r   >   sc    
.%"  *> 0%!! # !r*   r   c                   6    e Zd ZdZdZd	dZd Zd Zd Zd
dZ	y)r$   zUnshared config reader (previously ConfigReader).

	Do not use this class (internal not shared/cached represenation).
	Use ConfigReader instead.
	z/etc/fail2banNc                 f    t        j                  | g|i | d | _        | j                  |       y r,   )r   r)   r6   r-   )r%   r/   rX   r(   s       r   r)   zConfigReaderUnshared.__init__   s.    ''>t>v>$//'r*   c                 T    |t         j                  }|j                  d      | _        y )N/)r$   DEFAULT_BASEDIRrstrip_basedirr.   s     r   r-   zConfigReaderUnshared.setBaseDir   s"    _!117..%$-r*   c                     | j                   S r,   )rm   r2   s    r   r1   zConfigReaderUnshared.getBaseDir   s    	r*   c           	         t         j                  j                  | j                        st	        d| j                  z        |j                  d      rt         j                  j                  |      }t         j                  j                  | j                  |      }t        j                  d|| j                         |dz   g}|dz   }|t        t        j                  d|z              z  }|j                  |dz          |t        t        j                  d|z              z  }t        t        t         j                  j                  |            }t        |      rt        j                  d	d
j                  |             t!        j"                  | |      }|D cg c]	  }||vs| }}|r%t        j%                  dd
j                  |             |ryt        j%                  d|| j'                                yt        j%                  d|z  d| j'                         z  dd
j                  |      z   gt)        t        |               z          yc c}w )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existsrm   
ValueErrorrA   abspathjoinr7   debugsortedglobappendr   filterr   r   r9   errorr1   r   )r%   filenamebasenameconfig_files
config_dirconfig_files_readcfmisseds           r   r9   zConfigReaderUnshared.read   s   		&	E== 
 ggooh'8WW\\$--2(,,1HdmmLg%', $*&;#;<==,h)*&<*#<=>>, fRWW^^\:;,	<<*DIIl,CD388|L'HR25F+FbH6H
LL2DIIf4EF	<<B"$
	<<:XE))$))L"99;;?L@Q;RTU V  Is   	I%Ic           
         t               }|i }t        |      D ]L  \  }}}	||v r	 | j                  |||      }
|
||<   |r%t        j                  |      }|r|
B ||
      ||<   N |S # t        $ r'}|r t
        j                  |       |	||<   Y d }~|d }~wt        $ r( |	#t
        j                  d|d|d|	       |	||<   Y t        $ r8 t
        j                  d|z   dz   |z   dz   t        |	      z   dz          |	||<   Y w xY w)Nr]   'z' not defined in 'z'. Using default one: zWrong value for 'z' in 'z'. Using default one: ')dictr   r>   	CONVERTERr   r7   r|   r   warningrt   repr)r%   rI   r   pOptionsshouldExistconvertvaluesr   r   r   vconves                r   r_   zConfigReaderUnshared.getOptions   s5   6&8$7$@  gwgH-AF7OMM'"T	
HQfWo: 
-%  

LLOF7O
  ^^C# $VG_  
NN&08;cA !#'>2478 9F7Os)   4A+A++	D	4B1D		=D	D	r,   )NFT)
rb   rc   rd   re   rk   r)   r-   r1   r9   r_   r   r*   r   r$   r$      s(     #
&
&d"r*   r$   c                   `    e Zd ZdZg Zd Zd Zd Zd Zd Z	d Z
d Zdd	Zd
 Zd ZddZd Zy)DefinitionInitConfigReaderzConfig 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                    t        j                  | fi | |j                  d      rt        j                  j                  |      }| j                  |       | j                  |       || _        t               | _
        t               | _        y )Nrp   )r   r)   rA   rq   rr   ru   setFilesetJailName	_initOptsr   _pOpts	_defCache)r%   file_jailNameinitOptsr(   s        r   r)   z#DefinitionInitConfigReader.__init__/  sh    ''
d77??5!5,,u8$.$+6$.r*   c                      || _         i | _        y r,   )_filer   )r%   fileNames     r   r   z"DefinitionInitConfigReader.setFile9  s    $*$.r*   c                     | j                   S r,   )r   r2   s    r   getFilez"DefinitionInitConfigReader.getFile=  s    	r*   c                     || _         y r,   	_jailName)r%   r   s     r   r   z&DefinitionInitConfigReader.setJailName@  s	    $.r*   c                     | j                   S r,   r   r2   s    r   getJailNamez&DefinitionInitConfigReader.getJailNameC  s    	r*   c                 B    t         j                  | | j                        S r,   )r   r9   r   r2   s    r   r9   zDefinitionInitConfigReader.readF  s    			4	,,r*   c                     | j                   s| j                  | j                         t        j                  | j                   | j                        S r,   )r!   r5   r   r   r9   r2   s    r   readexplicitz'DefinitionInitConfigReader.readexplicitJ  s6    	$	%	*	*499djj	AAr*   c                     |s
t               } j                  rt        | j                        }t        j	                   d j
                  |d       _        | _         j                  d      rz fd} j                  dd      D ]_  }|dk(  r	d }|j                  d      s| ||      }| j                  d|z   <   | j                  vsG| ||      }| j                  |<   a |r\ j                  d      rJ j                  d      D ]5  }|dk(  s| j                  v r j                  d|       j                  |<   7 y y y )	N
DefinitionF)r   Initc                 (    j                  d|       S )Nr   )r>   )rM   r%   s    r   <lambda>z7DefinitionInitConfigReader.getOptions.<locals>.<lambda>\  s    - r*   )rN   rb   zknown/)r   r   r   r   r_   _configOpts_optsr   rH   r   rA   r>   )r%   pOptsallgetoptrM   r   s   `     r   r_   z%DefinitionInitConfigReader.getOptionsO  sE    
65	^^t~~.5&&t'' ' ?$*$+	f-6ll6ul5 s
j(A>>(#		vc{1$%T^^HSL!
$.. 		vc{1T^^C 	Tl+ ll<( 2s
jC4::-xhh|S1DJJsO2 ,Sr*   c           	          t        |      D ]>  \  }}}t        j                  |      }|s|j                  |      }|3	  ||      ||<   @ y# t        $ r! t        j                  d||||       |||<   Y kw xY w)z:Convert interpolated combined options to expected type.
		Nz/Wrong %s value %r for %r. Using default one: %r)r   r   r>   rt   r7   r   )r%   opts
configOptsr   r   r   r   r   s           r   convertOptionsz)DefinitionInitConfigReader.convertOptionsm  s     %8
$C 
 gw
--
 4
Ay(!WT']
  ^^Eq'8%T']s    A'A87A8c                     	 | j                   |   S # t        $ rZ 	 | j                  j                  d|| j                        }n# t
        t        t        f$ r d}Y nw xY w|| j                   |<   |cY S w xY w)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   rt   )r%   r   r   s      r   getCombOptionz(DefinitionInitConfigReader.getCombOption|  sw    
..
!!	 		wT[[AA=*
5 A4>>'
8s2    	A4(AA4AA4AA43A4c                    | j                   }| j                  rt        || j                        }t        |      si S t	        |      j                         }|D ]H  }t        j                  j                  |      }|s%|j                         \  }}|j                  |       J t        ||| j                        }|st        d      | j                  || j                         |S )N)ignoreaddreplz/recursive tag definitions unable to be resolved)r   r   r   r   setcopyr   CONDITIONAL_REmatchgroupsaddr   r   rt   r   r   )r%   r   combinedoptsrC   condr   s         r   getCombinedz&DefinitionInitConfigReader.getCombined  s    ,	^^|T^^<<	\	
9v;& a
&
5
5
;
;A
>4
kkmGAt
JJqM	 
!
$,,
.$		E	FFdD,,-	+r*   c                     t         r,   )NotImplementedErrorr2   s    r   r   z"DefinitionInitConfigReader.convert  s    r*   Nra   )r   )rb   rc   rd   re   r   r)   r   r   r   r   r9   r   r_   r   r   r   r   r   r*   r   r   r   $  sK     -B
2< ,r*   r   )
__author____copyright____license__ry   rq   configparserr   r   configparserincr   r   r	   helpersr   r   r   r   rb   r7   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*   