
    BdO4                         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dS )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          r0| D ]+}t          |          dk    r|\  }}}n|dc\  }}}|||fV  ,dS | D ]}| |         \  }}|||fV  dS )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	'llQ!(GWhh#*D Wg	'8	#####$ $  $ $gw'7H	'8	#####$ $    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dS )ConfigReaderzkGeneric config reader class.

	A caching adapter which automatically reuses already shared configuration.
	Nc                     d | _         d | _        ||| _        ||| _         || _        d | _        d S | j        t	          di || _        d S d S )N )
_cfg_share_cfg_cfg_share_kwargs_cfg_share_basedirConfigReaderUnshared)self
use_configshare_configkwargss       r   __init__zConfigReader.__init__D   si    $/$)49!4?"4!4y#--f--4999 r   c                 Z    | j         r| j                             |           d S || _        d S N)r"   
setBaseDirr$   r&   basedirs     r   r-   zConfigReader.setBaseDirR   s6    	Y %9     $4r   c                 P    | j         r| j                                         S | j        S r,   )r"   
getBaseDirr$   r&   s    r   r1   zConfigReader.getBaseDirX   s)    	Y "
)


 
  

!!r   c                     | j         S r,   )r!   r2   s    r   r(   zConfigReader.share_config^   s
    	r   Tc                 $   | j         s|                     |           |r| j         j        | j         j        S t                              d|| 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'.
	  Nz 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     
 	 #di&2
)
"" 	++0$	8L8L8N8NOOO	t# !$)	*r    c                 F   | j         s| j        || j                            |          | _         | j         sTt          dd| j        i| j        | _         | j        | j                             | j                   | j         | j        |<   dS dS t          di | j        | _         dS )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[\\DI*	Y$1222 IDOD	& & $==d&<==4999r   c                 n    	 d | j                                         D             S # t          $ r g cY S w xY w)Nc              3   D   K   | ]}|                     d           |V  dS )zKNOWN/N)
startswith).0ns     r   	<genexpr>z(ConfigReader.sections.<locals>.<genexpr>   s3      
I
I!,,x2H2H
I1
I
I
I
I
I
Ir   )r"   sectionsAttributeErrorr2   s    r   rF   zConfigReader.sections   sM    
I
Idi((**
I
I
II	   
999s   "% 44c                 Z    	 | j                             |          S # t          $ r Y dS w xY w)NF)r"   has_sectionrG   )r&   secs     r   rI   zConfigReader.has_section   s?    
)


$
$$	   
%%s    
**c                     |r| j                             ||          n!|| j         j                            |i           v S r,   )r"   
has_option	_sectionsr?   )r&   rJ   optwithDefaults       r   rL   zConfigReader.has_option   sC    +6 
0		c3	'	'	'ty"&&sB///0r   c                 ^    | j                                                             |           d S r,   )r"   get_defaultsupdate)r&   ds     r   merge_defaultszConfigReader.merge_defaults   s*    )!!!$$$$$r   c                 j    	  | j         j        |g|R i |S # t          $ r t          |          w xY wr,   )r"   merge_sectionrG   r   r&   sectionargsr)   s       r   rV   zConfigReader.merge_section   sU    !
!$)
!'
;D
;
;
;F
;
;;	 ! ! !		 	  !    2Fc                 t    	 | 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   rG   r   )r&   rX   rO   s      r   r   zConfigReader.options   sH    
!
)

G[
1
11	 ! ! !		 	  !s    7c                 z    	 | j                             ||||          S # t          $ r t          |          w xY w)N)rawvars)r"   r?   rG   r   )r&   rJ   rN   r]   r^   s        r   r?   zConfigReader.get   sL    
)--Sc-
5
55	   			s     :c                 j    	  | j         j        |g|R i |S # t          $ r t          |          w xY wr,   )r"   
getOptionsrG   r   rW   s       r   r`   zConfigReader.getOptions   sU    !
$)
w
8
8
8
8
8
88	 ! ! !		 	  !rZ   )NN)T)r=   F)__name__
__module____qualname____doc__r*   r-   r1   propertyr(   r9   r5   rF   rI   rL   rT   rV   r   r?   r`   r    r   r   r   r   >   s!        
. . . .% % %" " "   (   *> > > >     0 0 0 0% % %! ! !! ! ! ! #    ! ! ! ! !r   r   c                   8    e Zd ZdZdZddZd Zd Zd Zdd
Z	dS )r%   zUnshared config reader (previously ConfigReader).

	Do not use this class (internal not shared/cached represenation).
	Use ConfigReader instead.
	z/etc/fail2banNc                 h    t          j        | g|R i | d | _        |                     |           d S r,   )r   r*   r6   r-   )r&   r/   rY   r)   s       r   r*   zConfigReaderUnshared.__init__   sC    '>t>>>v>>>$//'r   c                 V    |t           j        }|                    d          | _        d S )N/)r%   DEFAULT_BASEDIRrstrip_basedirr.   s     r   r-   zConfigReaderUnshared.setBaseDir   s&    _!17..%%$---r   c                     | j         S r,   )rm   r2   s    r   r1   zConfigReaderUnshared.getBaseDir   s
    	r   c           	         t           j                            | j                  st	          d| j        z            |                    d          rt           j                            |          }t           j                            | j        |          }t          	                    d|| j                   |dz   g}|dz   }|t          t          j        d|z                      z  }|                    |dz              |t          t          j        d|z                      z  }t          t          t           j        j        |                    }t          |          rt          	                    d	d
                    |                     t!          j        | |          fd|D             }|r.t                              dd
                    |                     rdS t                              d||                                            dS t                              d|z  d|                                 z  dd
                    |          z   gt)          t          |                             z              dS )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, c                     g | ]}|v|	S r    r    )rC   cfconfig_files_reads     r   
<listcomp>z-ConfigReaderUnshared.read.<locals>.<listcomp>   s$    HHHR25F+F+Fb+F+F+Fr   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   
ValueErrorrB   abspathjoinr7   debugsortedglobappendr   filterr   r   r9   errorr1   r   )r&   filenamebasenameconfig_files
config_dirmissedrs   s         @r   r9   zConfigReaderUnshared.read   sV   		&	& 	E= 
 
  (gooh''8W\\$-22(,,1HdmLLLg%', $*&;#;<<===,h)***&<*#<==>>>, fRW^\::;;, 	<<*DIIl,C,CDDD38|LLHHHH<HHH6 G
LL2DIIf4E4EFFF 4	<<B""$ $ $
%	<<:XE)))$))L"9"99;;?L@Q@Q;R;RTU V V V %r   FTc           
      l   t                      }|i }t          |          D ]\  }}}	||v r	 |                     |||          }
|
||<   |r-t                              |          }|r|
K ||
          ||<   Z# t          $ r,}|r t
                              |           |	||<   Y d }~d }~wt          $ r- |	(t
                              d|d|d|	           |	||<   Y t          $ rB t
                              d|z   dz   |z   dz   t          |	          z   dz              |	||<   Y w xY w|S )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   warningrx   repr)r&   rJ   r   pOptionsshouldExistconvertvaluesr   r   r   vconves                r   r`   zConfigReaderUnshared.getOptions   s   66&8$7$@$@   gwgH--AF7O  MM'""T  	
HQfWo
    

LLOOOF7OOOOOO
      ^^^77CCC# $ $ $VG_    
NN&08;cA !#'>>2478 9 9 9F7OOO 
-s*   =A<-A<<
D1"B--7D1&AD10D1r,   )NFT)
rb   rc   rd   re   rk   r*   r-   r1   r9   r`   r    r   r   r%   r%      s{          #   
& & &
  & & &d" " " " " "r   r%   c                   b    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dS )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 | |                    d          rt          j                            |          }|                     |           |                     |           || _        t                      | _
        t                      | _        d S )Nrp   )r   r*   rB   ru   rv   ry   setFilesetJailName	_initOptsr   _pOpts	_defCache)r&   file_jailNameinitOptsr)   s        r   r*   z#DefinitionInitConfigReader.__init__/  s    '''''
d "7??5!!5,,u8$.$+66$...r   c                 "    || _         i | _        d S 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                     || _         d S 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                  S r,   )r   r9   r   r2   s    r   r9   zDefinitionInitConfigReader.readF  s    			4	,	,,r   c                     | j         s|                     | j                   t          j        | j         | j                  S r,   )r"   r5   r   r   r9   r2   s    r   readexplicitz'DefinitionInitConfigReader.readexplicitJ  s9    	 %$$$	%	*49dj	A	AAr   Fc                     |st                      } j        rt          | j                  }t                               d j        |d           _        | _                             d          rw fd} 	                    dd          D ]Z}|dk    r	d }|
                    d          s| ||          }| j        d|z   <   | j        vr| ||          }| j        |<   [|r[                     d          rH 	                    d          D ]4}|dk    s	| j        v r                     d|           j        |<   1d S d S d S )	N
DefinitionF)r   Initc                 0                         d|           S )Nr   )r?   )rN   r&   s    r   <lambda>z7DefinitionInitConfigReader.getOptions.<locals>.<lambda>\  s    -- r   )rO   rb   zknown/)r   r   r   r   r`   _configOpts_optsr   rI   r   rB   r?   )r&   pOptsallgetoptrN   r   s   `     r   r`   z%DefinitionInitConfigReader.getOptionsO  s    
 665	^ /t~..5&&t' ' ? ?$*$+	f ----6ll6ul55  s
j(A>>(## &		vvc{{1$%T^HSL!
$.  		vvc{{1T^C 2Tl++ 2 ll<(( 2 2s
jC4:--xhh|S11DJsOO2 2 2 22 2r   c           	          t          |          D ]}\  }}}t                              |          }|r[|                    |          }|:	  ||          ||<   J# t          $ r& t                              d||||           |||<   Y yw xY w~dS )z:Convert interpolated combined options to expected type.
		Nz/Wrong %s value %r for %r. Using default one: %r)r   r   r?   rx   r7   r   )r&   opts
configOptsr   r   r   r   r   s           r   convertOptionsz)DefinitionInitConfigReader.convertOptionsm  s     %8
$C$C 
 
 gw
--
 
 4
 Ay(T!WWT']]   ^^Eq'8% % %T']]]
 
s   A-B
	B
c                     	 | j         |         S # t          $ rR 	 | 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   rx   )r&   r   r   s      r   getCombOptionz(DefinitionInitConfigReader.getCombOption|  s    
.
!!	   	wT[AAAA=*
5   AAA4>'
888s/    
A+"=A+AA+AA+*A+r    c                    | j         }| j        rt          || j                  }t          |          si S t	          |                                          }|D ]O}t          j                            |          }|r,|	                                \  }}|
                    |           Pt          ||| j                  }|st          d          |                     || j                   |S )N)ignoreaddreplz/recursive tag definitions unable to be resolved)r   r   r   r   setcopyr   CONDITIONAL_REmatchgroupsaddr   r   rx   r   r   )r&   r   combinedoptsrD   condr   s         r   getCombinedz&DefinitionInitConfigReader.getCombined  s    ,	^ =|T^<<<	\		 
9v;;&  a
&
5
;
;A
>
>4
 kkmmGAt
JJqMMM	 
$,
. 
. 
.$	 G	E	F	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   $  s                    - - -B B B
2 2 2 2<        ,    r   r   )
__author____copyright____license__r}   ru   configparserr   r   configparserincr   r   r	   helpersr   r   r   r   rb   r7   r   r   r   r   r%   r   r    r   r   <module>r      sZ  . O
n  				 6 6 6 6 6 6 6 6 H H H H H H H H H H P P P P P P P P P P P P 
8		 
 	$ $ $*v! v! v! v! v! v! v! v!rj j j j j7 j j jZ         r   